详细了解Linux Inode与示例

时间:2020-03-05 15:28:32  来源:igfitidea点击:

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的数量减少。