欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unix/Linux系统中的inode总结

程序员文章站 2022-05-09 21:14:26
...

iNode结构

文件系统创建(格式化)时,就把存储区域分为两大连续的存储区域。一个用来保存文件系统对象的元信息数据,这是由inode组成的表,每个inode默认是256字节或者128字节。另一个用来保存“文件系统对象”的内容数据,划分为512字节的扇区,以及由8个扇区组成的4K字节的块。块是读写时的基本单位。一个文件系统的inode的总数是固定的。这限制了该文件系统所能存储的文件系统对象的总数目。典型的实现下,所有inode占用了文件系统1%左右的存储容量。

Unix/Linux系统中的inode总结

Unix/Linux系统中的inode总结

      iNode的元信息大概包括上述几项。

文件系统中每个“文件系统对象”对应一个“inode”数据,并用一个整数值来辨识。这个整数常被称为inode号码(“i-number”或“inode number”)。由于文件系统的inode表的存储位置、总条目数量都是固定的,因此可以用inode号码去索引查找inode表。

        Inode存储了文件系统对象的一些元信息,如所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等。知道了1个文件的inode号码,就可以在inode元数据中查出文件内容数据的存储地址。

在 Linux 中文件的 inode 中是不记录文件名的,文件名是记录在目录的 block 中。因此在新增/删除/重命名文件的时候,与目录的w权限有关。另一个直观的感受就是,你可以对正在使用的文件改名,换目录,甚至放到废纸篓,都不会影响当前文件的使用,这在 Windows 里是无法想象的。比如你打开个 Word 文件,然后对其进行重命名操作,Windows 会告诉你先给我关闭文件!

        这里我用一个命令查看一个目录的inode具体信息

NAME
       stat - display file or file system status
SYNOPSIS
       stat [OPTION]... FILE...

# stat /data
  File: `/data'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 805h/2053d      Inode: 2           Links: 3
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-19 05:10:33.652318432 +0800
Modify: 2017-01-19 05:10:32.487325693 +0800
Change: 2017-01-19 05:10:32.487325693 +0800



# stat /data/a
  File: `/data/a'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 13          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-19 03:29:26.353328360 +0800
Modify: 2017-01-19 03:29:26.353328360 +0800
Change: 2017-01-19 03:29:26.353328360 +0800

除了上述的命令,还可以使用ls -li来列出一个目录的属性:

$ls -li  /home/wuchong
141494  drwxr-xr-x 18 wuchong wuchong    4096 12月  2  2013 hadoop-1.1.1
1715845 drwxrwxr-x  2 wuchong wuchong    4096  7月 12 09:07 input
1718481 -rw-rw-r--  1 wuchong wuchong       0  7月 12 16:11 test.txt
1718478 -rw-r--r--  1 root    root    1780292  6月 16 19:04 etc.jar.bz2
……

文件名与目录名是“文件系统对象”便于使用的别名。一个文件系统对象可以有多个别名,但只能有一个inode,并用这个inode来索引文件系统对象的存储位置。

  • inode不包含文件名或目录名的字符串,只包含文件或目录的“元信息”。

  • Unix的文件系统的目录也是一种文件。打开目录,实际上就是读取“目录文件”。目录文件的结构(在block中存放的)是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件或目录的名字,以及该文件或目录名对应的inode号码。

  • 文件系统中的一个文件是指存放在其所属目录的“目录文件”中的一个目录项,其所对应的inode的类别为“文件”;文件系统中的一个目录是指存放在其“父目录文件”中的一个目录项,其所对应的inode的类别为“目录”。可见,多个“文件”可以对应同一个inode;多个“目录”可以对应同一个inode。

  • 文件系统中如果两个文件或者两个目录具有相同的inode号码,那么就称它们是“硬链接”关系。实际上都是这个inode的别名。换句话说,一个inode对应的所有文件(或目录)中的每一个,都对应着文件系统某个“目录文件”中唯一的一个目录项。

  • 创建一个目录时,实际做了3件事:在其“父目录文件”中增加一个条目(从父目录可以找到该目录及inode号);分配一个inode(用于找到目录文件存放位置);再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。被创建的“目录文件”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的"硬链接"总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文件”中的“..”条目,加上它自身的“目录文件”中的“.”条目,再加上“父目录文件”中的对应该目录的条目。

  • 通过文件名打开文件,实际上是分成三步实现:首先,操作系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

    当我们读取一个文件时,实际上是在目录中找到了这个文件的 inode 编号,然后根据 inode 中的 block 指针,把各个 block 数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

还有一个问题: 为什么删除比复制快?

删除的过程是我开始的时候以为是删除inode。其实应该是释放占据的inode的信息。而复制。是生成新的inode。block也发生变化。

为什么说删除是释放了inode值呢。因为,在系统创建文件系统的时候,inode表和block就已经存在了。就好比:你去洗澡。你有个柜子的钥匙,你有几号柜子的钥匙(inode值)。你就可以使用那个柜子(block)。当你洗完了,你交出钥匙(释放inode值)。管理人员不关心:你曾使用过的柜子(block)。但是,还会有另一位顾客使用你曾使用过度这个柜子钥匙(占用你释放的inode值)。占用你曾使用过的柜子(block)。

之所以说是释放不说删除:因为那个inode本身就存在,不是我们创建的。我们只是使用带有inode数值对应位置的磁盘空间(block块)。所以用释放更加准确。

这样会产生一个问题:文件系统可能会用尽inode。这导致文件系统还有空闲的存储空间,但已经没有空闲的inode可供使用了。例如,一个电子邮件服务器可能会被大量的小文件用尽所有inode,但是却没有填满文件存储空间。这是可以释放inode(rm ) 也可以利用其余目录 的剩余空间。

硬链接与软链接

当文件出现在一个目录文件中时,我们就把文件接入到文件系统中(在目录中写入该文件的文件名和 inode 号),我们称建立一个到文件的硬链接(hard link)。一个文件允许出现在多个目录中,这样,它就有多个硬链接。当硬链接的数目(link count)降为0时,文件会被 Linux 删除。所以很多时候,unlink 与 remove 在 Linux 操作系统中是一个意思。引入硬链接的目的是为了“安全”,如果你将任何一个“文件名”删除,其实 inode 与 block 都还是存在的。此时可以通过另一个“文件名”来读取到正确的文件数据。此外,不论你使用哪个“文件名”来编辑,最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改。

至于软链接(soft link),其实就是 Windows 上的快捷方式。基本上,软链接就是在创建一个新的独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是利用文件来作为指向的操作,所以,当源文件被删除后,软链接的文件会打不开。由于软链接(soft link)的广泛使用不会影响 link count,而且可以跨越文件系统,现在较少手动建立硬连接。

创建硬链接与软链接使用 ln 命令即可。

$ln [-s] 源文件 目标文件
-s : 如果不加任何参数就是硬链接,加上 -s 就是软链接

~$ln -s /etc/crontab .    
~$ln /etc/crontab crontab2
~$ ll -i /etc/crontab ~/crontab ~/crontab2
1310870 -rw-r--r-- 2 root    root    722  6月 15  2012 /etc/crontab

1310870 -rw-r--r-- 2 root    root    722  6月 15  2012 /home/wuchong/crontab2
1718696 lrwxrwxrwx 1 wuchong wuchong  12  7月 12 16:42 /home/wuchong/crontab -> /etc/crontab

可以看到硬链接文件的 inode 是同一个,并且连接数变成了 2。而软链接是一个新的文件,拥有自己的 inode 号。

参考:

http://wuchong.me/blog/2014/07/21/linux-file-manage/

相关标签: 文件系统