Linux中的inode及其结构
让我从一个著名的UNIX声明开始本教程,该声明强调了Linux操作系统的主要底层工作模型。
声明是“一切都是文件”。
如果我们是在Linux或者任何NIX系统上花费大量时间的人之一,那么我们可能已经了解该声明。
Linux中的所有内容都可以通过文件访问。
更清楚地说,甚至阻止诸如硬盘和CD/DVD之类的设备也不过是一个文件(是的,而是一个特殊的文件,但是是一个文件)。
现在,如果我们开始更深入地研究文件,我们将知道,文件系统内部的操作系统(Linux)文件(无论是ext2,ext3还是ext4)都无法通过其名称真正访问。
名称对人类很有帮助,但是文件系统不是通过文件名称而是通过数字来识别文件。
操作系统通过该编号到达该文件的位置和其他属性的编号称为inode编号。
现在不用担心
目录的Inode结构仅由该目录中文件和目录的Name到Inode映射组成。
因此,在上面显示的图表中,我们可以看到(.)和(..)点点的前两个条目。
每当我们列出目录的内容时,我们可能都已经看过它们。
(大多数情况下它们是隐藏的。
我们必须使用-a选项和“ ls”命令一起查看它们)。
而且更喜欢Linux或者任何NIX系统的人们都知道命令“ cd”。
会将目录更改为当前目录本身(这意味着它不执行任何操作。
因为我们已经在该目录中了。
)。
命令“ cd ..”将带我们到上一个目录或者将其称为当前目录的父目录。
现在为什么会这样?
让我们通过一个例子来理解为什么会发生这种情况。
想象一下,我在系统上的目录/var/log中。
[root@theitroad1 log]# ls -ia 3633723 . 3633786 faillog 3634889 rpmpkgs.3 3633697 .. 3634727 gdm 3634893 rpmpkgs.4 3634833 acpid 3633883 httpd 3633813 samba
现在,记下.(点)和..(点点)的索引节点号。
.(点)= 3633723
..(点点)= 3633697
现在,让我们列出/var /目录的目录并查看其中的inode。
[root@theitroad1 var]# ls -ia 3633697 . 3634275 cvs 3633698 lib 3633733 nis 3633737 spool 2 .. 3633724 db 3633729 local 3633734 opt 3633700 tmp 3633844 account 3633725 empty 3633730 lock 3633735 preserve 3634278 tux 3633701 cache 3633726 games 3633723 log 3633838 racoon 3633884 www 3634135 crash 3634624 gdm 3633732 mail 3633736 run 3633740 yp
现在,记下/var目录列表中的日志目录和.(点)的索引节点号。
.(点)= 3633697
日志= 3633723
因此,我们可以清楚地注意到/var/log目录中。
(dot)的inode等于log目录的inode。
/var/log /中的..(dot dot)的inode等于/var /目录中的..(dot)的inode。
.(点)始终表示当前目录,因为它的inode与目录的inode相同。
..(点点)表示父目录inode,因为它的inode与先前的(父)目录相同。
现在让我们看一下文件的索引节点的结构。
模式:
这保留了有关两件事的信息,一是权限信息,另一是inode的类型,例如,inode可以是文件,目录或者块设备等。
所有者信息:访问详细信息,例如文件所有者,文件组等。
大小:此位置以字节为单位存储文件的大小。
时间戳记:它存储索引节点的创建时间,修改时间等。
现在,重要的是要了解如何借助inode将文件保存在分区中。
块大小:每当使用文件系统格式化分区时,通常使用默认块大小对其进行格式化。
现在,块大小是其中数据的块大小
将会传播。因此,如果块大小为4K,则对于15K的文件,它将占用4个块(因为4K * 4 16),从技术上来讲,我们浪费了1K。
直接块指针:
在ext2文件系统中,一个inode仅由15个块指针组成。
前12个块指针称为直接块指针。
这意味着这些指针指向包含文件数据的块的地址。
12个块指针可以指向12个数据块。
因此,直接块指针总共只能寻址48K(12 * 4K)数据。
这意味着如果文件的大小只有48K或者以下,则inode本身可以寻址所有块
包含文件的数据。
现在,如果文件大小超过48K怎么办?
间接块指针:
每当数据大小超过48k(通过将块大小视为4k)时,inode中的第13个指针将指向数据之后的下一个块(48k数据之后的相邻块),而该块又将指向下一个要复制数据的块地址。
现在我们将块大小设为4K,间接块指针可以指向包含数据的1024个块(通过将块指针的大小设为4个字节,一个4K块可以指向1024个块,因为4字节* 1024 = 4K )。
这意味着一个间接的块指针可以寻址多达4MB的数据(4K块中4字节的块指针,可以指向和寻址1024个4K块,这使得数据大小为4M)
双间接块指针:
现在,如果文件大小超过4MB + 48K,则索引节点将开始使用双间接块指针来寻址数据块。
inode中的Double Indirect Block指针将指向紧接4M + 48K数据之后的块,该intern将指向存储数据的块。
Double Indirect块指针也位于4K块中,因为每个块均为4K,现在块指针的大小为4个字节,如前所述,因此Double间接块指针可以寻址1024个Indirect块指针(这意味着1024 * 4M = 4G)。因此,借助双间接块指针,数据大小可以达到4G。
三重间接块指针:
现在,此三重间接块指针可以处理的文件大小最大为4G * 1024 = 4TB。
inode中的第15个块指针将指向4G数据之后的块,而intern则将指向1024个Double Indirect块指针。
因此,在12个直接块指针之后,inode中的第13个块指针用于间接块指针,第14个块指针用于双间接块指针,第15个块指针用于三重间接块指针。
现在,这是文件系统中可以限制单个文件的完整大小的主要原因。
现在要了解的一个有趣事实是,在创建文件系统时未创建索引节点的总数。这意味着文件系统中可以具有的inode数量有上限。现在,达到该限制后,即使分区上有剩余空间,我们也将无法在文件系统上创建更多文件。
如何检查Inode利用率?
[root@theitroad1 ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 10246368 124075 10122293 2% / tmpfs 64431 1 64430 1% /dev/shm
可以通过在Linux中使用beow命令来检查inode的利用率。
[root@theitroad1 ~]# tune2fs -l /dev/sda1 tune2fs 1.39 (29-May-2006) Filesystem volume name: /1 Last mounted on: <not available> Filesystem UUID: 86898399-4550-4b08-8196-7444ea953c96 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 10246368 Block count: 10239421 Reserved block count: 511971
从上面的输出中可以清楚地看到,可以在/dev/sda1上创建的最大索引节点数为10246368.
如何使用inode查找文件?
[root@theitroad1 log]# find /var/-inum 3634906 -exec ls -l {} \; -rw------- 1 root root 1272 Dec 2 10:13 /var/log/maillog.1 [root@theitroad1 log]#
我们可以使用其inode查找文件并对其执行操作,例如列出该inode的文件名,使用其inode删除该文件等。
[root@theitroad1 log]# find /var/-inum 3634906 -exec rm -f {} \; [root@theitroad1 log]#
我们可以使用以下命令使用其inode查找和删除文件。
如何使用inode更改目录?
[root@theitroad1 log]# cd $(find -inum 3633883) [root@theitroad1 httpd]#
我们可以使用其索引节点号更改到目录,如下所示。
我们可以看到我已经通过使用其索引节点号将目录更改为httpd。