详细了解Linux Inode与示例
Linux和其他UNIX的操作系统通过将所有内容视为文件(甚至硬件设备)来保持一致性。
键盘,鼠标,打印机,监视器,硬盘,进程,即使是目录也被视为Linux中的文件。
常规文件包含文本(文本文件),音乐,视频(多媒体文件)等数据。
除常规数据外,还有一些关于这些文件的数据,例如它们的大小,所有权,权限,时间戳等。
该元数据与称为inode(索引节点)的数据结构进行管理。
什么是Linux中的inode?
每个Linux文件或者目录(从技术角度来看,它们之间没有实际差异)具有inode,此inode包含所有文件的元数据(即读取文件所需的所有管理数据存储在其inode中) 。
例如,inode包含其中存储文件的所有块的列表,该文件的所有者信息,用于该文件为文件设置的该文件,权限和所有其他属性。
inode限制是每个文件系统,并在文件系统创建时间内决定。
依赖于文件系统的最大目录大小,因此确切的限制不同。
为了更好的性能,通过将文件排序到具有一个大目录的子目录中,使目录更小。
1.什么是inode号码?
inode号码也称为索引号。
inode是创建文件和目录的唯一编号。
inode号码将是整个文件系统的唯一。
inode是传统的UNIX样式文件系统上的数据结构,如ext3或者ext4.
存储文件和目录的属性。
Linux扩展文件系统,例如ext3或者ext4,请维护这些inode的数组,称为inode表。
此表包含该文件系统中所有文件的列表。
Inode表中的各个inode具有称为inode号码的唯一编号(唯一的文件系统)。
以下信息存储在inode中:
- 文件类型:常规文件,目录,管道等
- 该文件的权限:读取,写入,执行
- 链接计数:相对于inode的硬链接数
- 用户ID:文件所有者
- 组ID:组所有者
- 文件大小:或者某些特殊文件的主要/次要号码
- 时间戳:访问时间,修改时间和(inode)更改时间
- 属性:例如,"不可变"
- 访问控制列表:特殊用户/组的权限
- 链接到文件的位置
- 关于文件的其他元数据
请注意,inode不存储文件的名称,但仅限其内容。
inode数据结构图
2.如何在Linux中检查inode
如果要查看Inodes,请在任何EXT文件系统上使用下面的命令检查其中使用的文件系统和文件的属性。
显示文件数据信息
我们可以使用stat命令在文件或者目录上显示inode数据。
我们需要指示文件的名称如下:
# stat hello File: ‘hello’ Size: 66 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 530461 Links: 2 Access: (0774/-rwxrwxr--) Uid: ( 0/root) Gid: ( 0/root) Access: 2016-05-15 20:12:32.540352591 +0000 Modify: 2016-05-15 20:12:16.901527357 +0000 Change: 2016-05-19 17:41:37.394470321 +0000 Birth:
STAT输出告诉我们文件的各种时间戳,其所有权和权限以及存储的位置。
文件的数据保存在磁盘块中,该磁盘块在inode的stat命令输出中显示。
我们可以选择仅列出包含的文件的inode号码,如下所示:
# stat --format=%i hello 530461
打印索引文件数
LS命令用于列出文件和目录信息。
LS的"-I""选项显示每个文件的inode号码。
我们可以将其与"-l""选项相结合,以详细列出信息
# ls -il total 140984 520160 dr-xrw-rw- 2 linoadmin linoadmin 4096 Mar 9 2013 asciiquarium_1.1 263206 -rwxr-xr-x 1 linoadmin linoadmin 15436 Mar 9 2013 asciiquarium.tar.gz 519187 drwxr----- 2 root root 4096 Apr 13 01:35 baba 258717 -rwSr--r-- 1 root root 5747 Apr 25 01:45 bootstrap 655799 drwxr-xr-x 2 root root 4096 Jan 16 17:46 course 528927 drwxr-xr-x 3 root root 4096 Apr 29 00:29 environments
第一列提供inode号码。
我们可以显示特定文件的inode:
# ls -i continue.sh 519450 continue.sh
显示文件系统inode空间信息
默认情况下,DF命令总结了可用和使用的磁盘空间。
我们可以通过通过-i
或者--inodes
选项来接收有关可用和使用inonode的报告。
# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/vda1 1292800 126091 1166709 10% / devtmpfs 60205 319 59886 1% /dev tmpfs 62556 1 62555 1% /dev/shm tmpfs 62556 367 62189 1% /run /dev/vda2 128 13 115 11% /mnt/vda2 tmpfs 62556 1 62555 1% /run/user/0
如果分区具有很多小文件,此信息可能会有所帮助,这可以比它们耗尽可用的磁盘空间即可耗尽可用的inode。
列出文件系统超级块的内容
我们可以使用tune2fs -l
命令来显示与inode相关的所有信息。
# tune2fs -l /dev/sda6 | grep inode Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Free inodes: 2224350 First inode: 11 Journal inode: 8 First orphan inode: 1575905 Journal backup: inode blocks
操纵文件系统元数据
我们可以通过debugfs命令查看ext4文件系统上存在inode的内容。
我们需要使用文件系统调试器中可用的stat命令来显示inode的内容。
完成后,使用退出关闭Debugfs环境。
在Debugfs工作时无法在工作时无法访问文件系统上的文件。
我们应该考虑使用mount -o remoutt/yourfileSystem
重新安装文件系统
# debugfs /dev/sda1 debugfs 1.42.13 (17-May-2014) debugfs: stat <19> Inode: 19 Type: regular Mode: 0644 Flags: 0x0 Generation: 2632480000 User: 0 Group: 0 Size: 8211957 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 16106 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x48176267 -- Tue Apr 29 14:01:11 2008 atime: 0x485ea3e9 -- Sun Jun 22 15:11:37 2008 mtime: 0x48176267 -- Tue Apr 29 14:01:11 2008 BLOCKS: (0-11):22749-22760, (IND):22761, (12-267):22762-23017, (DIND):23018, (IND):23019, (268-523):23020-23275, (IND):23276, (524-779):23277-23532, (IND):23533, (780-1035 ):23534-23789, (IND):23790, (1036-1291):23791-24046, (IND):24047, (1292-1547): 24048-24303,(IND):24304, (1548-1803):24305-24560, (IND):24561, (1804-1818):24562
我们可以使用debugfs使用其inode并指示文件来消除文件
2.目录的inode结构
如上所述,Linux中的目录也被视为文件。
目录是将文件名映射到其inode号码的特殊文件(此映射称为目录条目或者凹陷)。
因此,当我们说一个目录包含文件和其他目录时,我们的意思是此目录正在映射这些文件和目录(目录是特殊文件,因此它们也需要将其inode号码映射到其inode号码。
这就是为什么目录无法包含两个具有相同名称的文件的原因,因为它无法使用两个不同的inode号码映射一个名称。
# ls -ld test/ drwxr-xr-x 3 root root 4096 Apr 13 01:43 test/
由于文件由其父目录映射到其inode,那么最高目录是如何映射到其inode的最高目录,(即/directory
) "/"目录的inode数是固定的,并且始终为2.
# stat / File: '/' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 806h/2054d Inode: 2 Links: 27 Access: (0755/drwxr-xr-x) Uid: ( 0/root) Gid: ( 0/root) Access: 2016-05-20 01:40:01.565097799 +0100 Modify: 2016-05-20 01:27:33.651924301 +0100 Change: 2016-05-20 01:27:33.651924301 +0100 Birth:
3. Linux中的链接和索引号
在"LS -L"的输出中,权限后的列和所有者是链路计数。
链接计数是文件的硬链接数。
要了解硬链接,我们从链接开始。
链接是另一个文件的指针。
在Linux世界中,存在两种类型的链接:
符号链接(或者软链接)
符号链接是一个单独的文件,其内容指向链接到文件。
要创建一个符号链接,请使用选项-s
的ln命令。
使用LN命令时,请确保首先引用原始文件的名称,然后指的是要创建的链接的名称。
# ln -s /home/bobbin/sync.sh filesync
这里'filesync'是"sync.sh"的符号链接。
将其视为捷径。
编辑'filesync'就像直接编辑原始文件,但它真的发生了什么。
如果我们删除或者移动原始文件,链接将被损坏,我们的"filesync"文件将不会使用。
"ls -l"命令"显示生成的文件是符号链接。
这由字母L在"LS -L"输出的第一个位置以及列表末尾的箭头中表示,这表示该名称指的文件。
# ls -l filesync lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/bobbin/sync.sh
符号链接的内容仅是目标文件的名称。
我们可以看到符号链接上的权限完全打开。
这是因为未管理权限
比较符号链接和原始文件时,我们会注意到它们之间的明显差异。
# ls -il /home/bobbin/sync.sh filesync 258674 lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/bobbin/sync.sh 517333 -rw-r----- 1 root root 5 Apr 7 06:09 /home/bobbin/sync.sh
原始文件只是直接连接到inode的名称,符号链接指的是名称。
符号链接的大小是它引用的文件名中的字节数,因为符号链路中没有其他信息可用。
硬盘链接
要了解一个硬链接是什么,重要的是要理解文件的身份是其inode号码,而不是它的名称。
硬链接是引用inode的名称。
这意味着如果'file1'具有名为'file2'的硬链接,则这两个文件都引用相同的inode。
因此,当我们为文件创建硬链接时,我们确实确实为inode添加了新名称。
为此,请使用ln命令而无需选项。
# ls -l /home/bobbin/sync.sh -rw-r----- 1 root root 5 Apr 7 06:09 /home/bobbin/sync.sh
# ln /home/bobbin/sync.sh synchro
现在让我们比较两个文件
# ls -il /home/bobbin/sync.sh synchro 517333 -rw-r----- 2 root root 5 Apr 7 06:09 /home/bobbin/sync.sh 517333 -rw-r----- 2 root root 5 Apr 7 06:09 synchro
关于硬链接的有趣事情是原始文件和链接之间没有区别:它们只是连接到同一inode的两个名称。
正如我们必须注意的那样,与软链接不同,硬链接没有特殊文件。
现在,链接计数是文件已硬链接的号码。
因此,在上面的图中创建硬链接后,链接计数会增加。
这些硬链接有两个限制:
- 目录不能持久联系。 Linux不允许以其维护目录的无循环树结构。
- 无法在文件系统中创建硬链接。两个文件都必须位于同一文件系统上,因为不同的文件系统具有不同的独立inode表(不同文件系统上的两个文件,但具有相同的inode号码将是不同的)。
3.如何在Linux中查找硬链接
我们可以检索指向inode号码的所有文件名。
这意味着我们可以检索硬链接,因为它是我们可以拥有某个指向相同内容(inode)的文件名的唯一类型的链接类型。
我们可以使用以下命令的"-inum"选项"如下所示
# find/-inum 517333 /home/bobbin/sync.sh /root/synchro
有了这个,我们可以知道哪个文件名指向数据信息所以,相对于特定inode号码检索所有硬链接
4. Linux与文件的操作及其与Inode的关系
在软链接上执行的大多数操作(例如副本)将影响实际链接文件(除RM或者MV命令外,删除(或者移动)软链接本身)
以下是一些文件操作,其中inodes扮演其重要作用:
复制文件
复制文件时,创建具有新内部inode的新文件。
# cp myfile ..
# ls -li myfile ../myfile 2501 -rw------- 1 raghu raghu 36 Jun 25 20:12 myfile 3746 -rw------- 1 raghu raghu 36 Jan 11 12:05 ../myfile
移动文件
在跨文件系统移动时,MV命令作为上面的CP命令继续,外,原始文件从其位置删除。
但是在文件系统中移动时,inode不会改变,只有inode的目录映射被更改,硬盘上的实际数据(文件的内容)不会移动。
# ls -li samplefile.txt 2497 -rw------- 1 raghu raghu 22 Jun 25 20:12 samplefile.txt
现在让我们移动文件并检查结果
# mv samplefile.txt ..
# ls -li ../samplefile.txt 2497 -rw------- 1 raghu raghu 22 Jun 25 20:12 ../samplefile.txt
删除文件
发出RM命令时,首先检查文件的链接计数。
如果链接计数大于1
,则它将删除该目录条目并减少链路计数。
仍然,数据存在,也不会影响inode。
当链路计数为"1"时,inode从inode表中删除,inode numbers是免费的,并且该文件占用的数据块被添加到空闲数据块列表中。
# ls -li myfile myfile.hardlink 2501 -rw------- 2 raghu raghu 36 Jun 25 2012 myfile 2501 -rw------- 2 raghu raghu 36 Jun 25 2012 myfile.hardlink
让我们删除文件并检查结果
# rm myfile.hardlink
# ls -li myfile 2501 -rw------- 1 raghu raghu 36 Jun 25 2012 myfile
我们可以看到inode的数量减少。