您想要了解的有关Linux上的inode的所有信息
Linux文件系统依赖于inode。文件系统内部运作的这些至关重要的部分通常会被误解。让我们确切地看一下它们是什么,以及它们是做什么的。
文件系统的要素
根据定义,文件系统需要存储文件,并且它们还包含目录。文件存储在目录中,并且这些目录可以具有子目录。某个地方的某处必须记录所有文件在文件系统中的位置,它们的名称,它们属于的帐户,它们具有的权限等等。此信息称为元数据,因为它的数据描述了其他数据。
在Linux ext4文件系统中,inode和目录结构协同工作以提供一个基础框架,该框架存储每个文件和目录的所有元数据。它们使元数据可供需要它的任何人使用,无论是内核,用户应用程序还是Linux实用程序,例如 ls
, 统计
, 和 df
.
索引节点和文件系统大小
确实有一对结构,但是文件系统需要的不仅如此。每个结构都有成千上万个。每个文件和目录都需要一个索引节点,并且由于每个文件都在目录中,因此每个文件也都需要目录结构。目录结构也称为目录条目或“牙科”。
每个索引节点都有一个索引节点号,该索引号在文件系统中是唯一的。同一inode号可能出现在多个文件系统中。但是,文件系统ID和索引节点号组合在一起可以构成唯一的标识符,而不管您的Linux系统上安装了多少个文件系统。
请记住,在Linux中,您不会挂载硬盘驱动器或分区。您安装了分区上的文件系统,因此很容易拥有多个文件系统而没有意识到。如果单个驱动器上有多个硬盘驱动器或分区,则您将有多个文件系统。它们可能是相同的类型(例如,全部为ext4),但它们仍将是不同的文件系统。
所有inode都保存在一个表中。使用一个索引节点号,文件系统可以轻松地计算该索引节点所在的索引节点表的偏移量。您可以看到为什么inode中的“ i”代表索引。
包含inode编号的变量在源代码中声明为32位无符号长整数。这意味着索引节点数是一个整数值,最大大小为2 ^ 32,计算得出的结果为4,294,967,295,远远超过40亿个索引节点。
这是理论上的最大值。实际上,当以默认比率(每16 KB文件系统容量一个索引节点的比率)创建文件系统时,确定ext4文件系统中索引节点的数目。使用文件系统时会动态创建目录结构,因为文件和目录是在文件系统中创建的。
您可以使用一个命令来查看计算机上文件系统中的inode数。这 -一世
的(inodes)选项 df
命令指示它以inode数量显示其输出。
我们将查看第一个硬盘驱动器上第一个分区上的文件系统,因此我们键入以下内容:
df -i / dev / sda1
输出给我们:
- 文件系统:正在报告的文件系统。
- 索引节点:此文件系统中的索引节点总数。
- 我用了:正在使用的索引节点数。
- 我自由:可供使用的剩余索引节点数。
- 我用%:已使用的inode的百分比。
- 镶嵌在:此文件系统的安装点。
在此文件系统中,我们已经使用了10%的索引节点。文件存储在硬盘驱动器上的磁盘块中。每个inode指向存储它们所代表的文件内容的磁盘块。如果您有数百万个微小的文件,则可以先用完inode,然后再用尽硬盘空间。但是,这是一个非常困难的问题。
过去,某些将电子邮件消息存储为离散文件的邮件服务器(迅速导致大量小文件集合)出现了此问题。但是,当这些应用程序将后端更改为数据库时,就解决了问题。普通的家用系统不会用完inode,这也是一样,因为ext4文件系统无法在不重新安装文件系统的情况下添加更多inode。
要查看文件系统上磁盘块的大小,可以使用 块开发
命令与 --getbsz
(获取块大小)选项:
须藤blockdev --getbsz / dev / sda
块大小为4096字节。
让我们使用 -B
(块大小)选项以指定4096字节的块大小并检查常规磁盘使用情况:
df -B 4096 / dev / sda1
此输出向我们显示:
- 文件系统:我们要报告的文件系统。
- 4K块:此文件系统中4 KB块的总数。
- 用过的:正在使用多少个4K块。
- 可用的:可用的剩余4 KB块数。
- 用%:已使用的4 KB块的百分比。
- 镶嵌在:此文件系统的安装点。
在我们的示例中,文件存储(以及索引节点和目录结构的存储)已占用了此文件系统上28%的空间,而成本仅是索引节点的10%,因此我们处于良好状态。
索引节点元数据
要查看文件的索引节点号,我们可以使用 ls
与 -一世
(inode)选项:
ls -i geek.txt
该文件的索引节点号为14418801,因此此索引节点保存该文件的元数据,并且在传统上是指向文件驻留在硬盘驱动器上的磁盘块的指针。如果文件是碎片,非常大或两者兼有,则inode指向的某些块可能包含指向其他磁盘块的进一步的指针。而且其中一些其他磁盘块也可能包含指向另一组磁盘块的指针。这克服了索引节点的大小固定且能够容纳指向磁盘块的有限数量的指针的问题。
该方法已被使用“范围”的新方案所取代。这些记录了用于存储文件的每组连续块的开始和结束块。如果文件没有碎片,则只需存储第一个块和文件长度。如果文件是零散的,则必须存储文件各部分的第一个和最后一个块。这种方法(显然)更有效。
如果要查看文件系统是使用磁盘块指针还是扩展盘区,可以查看inode内部。为此,我们将使用 调试文件
命令与 -R
(请求)选项,然后将其传递给感兴趣文件的索引节点。这问调试文件
使用其内部的“ stat”命令显示索引节点的内容。因为索引节点号仅在文件系统中唯一,所以我们还必须告诉 调试文件
索引节点所在的文件系统。
该示例命令如下所示:
sudo debugfs -R“状态” / dev / sda1
如下图所示 调试文件
命令从inode中提取信息并将其呈现给我们 较少的
:
显示以下信息:
- 索引节点:我们正在查看的inode的编号。
- 类型:这是一个常规文件,而不是目录或符号链接。
- 模式:八进制的文件权限。
- 标志:代表不同特征或功能的指示器。 0x80000是“ extents”标志(有关此信息,请参见下文)。
- 一代:当某人通过网络连接访问远程文件系统时,就像它们已安装在本地计算机上一样,网络文件系统(NFS)会使用此文件。 inode和世代号用作文件句柄的一种形式。
- 版本:inode版本。
- 用户:文件的所有者。
- 团体:文件的组所有者。
- 项目:应始终为零。
- 尺寸:文件的大小。
- 文件ACL:文件访问控制列表。这些设置旨在使您可以对不在所有者组中的人员进行控制访问。
- 链接:文件的硬链接数。
- 区块数:分配给此文件的硬盘驱动器空间量,以512字节块为单位。我们的文件已分配了其中的8个,即4,096字节。因此,我们的98字节文件位于单个4,096字节磁盘块中。
- 分段:此文件没有碎片。 (这是一个过时的标志。)
- 时报:创建文件的时间。
- 时光:上次访问该文件的时间。
- 时光:上次修改此文件的时间。
- Crtime:创建文件的时间。
- 额外的inode字段的大小:ext4文件系统引入了在格式化时分配更大的磁盘inode的功能。该值是索引节点正在使用的额外字节数。这个额外的空间还可以用来适应将来对新内核的需求或存储扩展属性。
- 索引节点校验和:此索引节点的校验和,从而可以检测索引节点是否已损坏。
- 范围:如果正在使用扩展区(在ext4上,默认情况下为扩展区),则有关文件磁盘块使用情况的元数据有两个数字,指示分段文件每个部分的开始和结束块。这比存储文件每个部分占用的每个磁盘块更为有效。我们有一个范围,因为我们的小文件位于此磁盘块偏移量的一个磁盘块中。
文件名在哪里?
现在,我们有很多有关该文件的信息,但是,正如您可能已经注意到的那样,我们没有得到文件名。这是目录结构起作用的地方。在Linux中,目录就像文件一样,具有一个索引节点。但是,目录索引节点不是指向包含文件数据的磁盘块,而是指向包含目录结构的磁盘块。
与inode相比,目录结构包含有关文件的有限数量的信息。它仅保存文件的inode编号,名称和名称的长度。
索引节点和目录结构包含您(或应用程序)需要了解的有关文件或目录的所有内容。目录结构位于目录磁盘块中,因此我们知道文件所在的目录。目录结构为我们提供了文件名和索引节点号。索引节点会告诉我们有关文件的所有其他信息,包括时间戳,权限以及在文件系统中查找文件数据的位置。
目录索引节点
您可以像查看文件一样轻松地看到目录的inode编号。
在以下示例中,我们将使用 ls
与 -l
(长格式), -一世
(inode),和 -d
(目录)选项,然后查看 工作
目录:
ls -lid work /
因为我们使用了 -d
(目录)选项,ls
报告目录本身,而不是目录内容。该目录的inode是1443016。
为了重复 家
目录,我们键入以下内容:
ls -lid〜
的索引节点 家
目录是1447510,并且 工作
目录位于主目录中。现在,让我们看一下 工作
目录。而不是-d
(目录)选项,我们将使用 -一种
(全部)选项。这将向我们显示通常隐藏的目录条目。
我们输入以下内容:
ls -lia work /
因为我们使用了 -一种
(全部)选项,将显示单(。)和双点(..)条目。这些条目代表目录本身(单点)和其父目录(双点)。
如果您查看单点条目的inode编号,则为1443016,这是我们在发现单点条目的inode编号时获得的相同的inode编号。 工作
目录。此外,双点条目的索引节点号与 家
目录。
因此,您可以使用 光盘..
命令在目录树中上移一个级别。同样,当您在应用程序或脚本名称前加上./
,您可以让Shell知道从何处启动应用程序或脚本。
索引节点和链接
如前所述,在文件系统中拥有一个格式良好且可访问的文件需要三个组件:文件,目录结构和索引节点。文件是存储在硬盘驱动器上的数据,目录结构包含文件名及其索引节点号,索引节点包含文件的所有元数据。
符号链接是看起来像文件的文件系统条目,但它们实际上是指向现有文件或目录的快捷方式。让我们看看他们是如何管理的,以及如何使用这三个要素来实现这一目标。
假设我们有一个包含两个文件的目录:一个是脚本,另一个是应用程序,如下所示。
我们可以使用ln命令和 -s
(符号)选项可创建到脚本文件的软链接,如下所示:
ls -s my_script geek.sh
我们创建了一个指向 my_script.sh
叫 极客
。我们可以输入以下内容并使用ls
查看两个脚本文件:
ls -li * .sh
的条目 极客
显示为蓝色。权限标志的第一个字符是链接的“ l”,而->
指着 my_script.sh
。所有这些都表明 极客
是一个链接。
如您所料,两个脚本文件具有不同的inode编号。不过,更令人惊讶的是软链接, 极客
,其用户权限与原始脚本文件不同。实际上,对于极客
更加自由-所有用户都具有完全权限。
目录结构 极客
包含链接的名称及其索引节点。当您尝试使用链接时,其索引节点被引用,就像常规文件一样。链接索引节点将指向磁盘块,但该磁盘块包含原始文件的名称,而不是包含文件内容数据。文件系统重定向到原始文件。
我们将删除原始文件,并查看当我们键入以下内容以查看其中的内容时会发生什么极客
:
rm my_script.sh
猫怪胎
符号链接断开,并且重定向失败。
现在,我们键入以下内容以创建指向应用程序文件的硬链接:
ln特殊应用程序geek-app
要查看这两个文件的索引节点,我们输入以下内容:
ls -li
两者看起来都像常规文件。没什么 极客应用
表示这是链接的方式 ls
列出 极客
做过。加,极客应用
具有与原始文件相同的用户权限。但是,可能令人惊讶的是,两个应用程序都具有相同的inode编号:1441797。
目录条目 极客应用
包含名称“ geek-app”和一个索引节点号,但与原始文件的索引节点号相同。因此,我们有两个名称不同的文件系统条目,它们均指向同一索引节点。实际上,任何数量的项目都可以指向同一inode。
我们将输入以下内容并使用 统计
程序来查看目标文件:
stat特殊应用
我们看到两个硬链接指向此文件。这存储在inode中。
在以下示例中,我们删除了原始文件,并尝试使用带有秘密安全密码的链接:
rm特殊应用
./geek-appcorrecthorsebatterystaple
令人惊讶的是,该应用程序按预期运行,但是如何运行?之所以起作用,是因为在删除文件时,索引节点可以自由重用。目录结构被标记为索引号为零,然后磁盘块可用于另一个文件存储在该空间中。
但是,如果到inode的硬链接数大于一,则硬链接数将减少一,并且已删除文件的目录结构的inode数将设置为零。硬盘驱动器和inode上的文件内容仍可用于现有的硬盘链接。
我们将输入以下内容并再次使用stat(这次是 极客应用
:
stat geek-app
这些细节是从与前一个相同的inode(1441797)中提取的 统计
命令。链接数减少了一个。
因为我们只有一个到该索引节点的硬链接,所以如果我们删除极客应用
,它将真正删除该文件。文件系统将释放索引节点并将索引节点标记为零。然后,新文件可以覆盖硬盘驱动器上的数据存储。
有关的:如何在Linux上使用stat命令
索引节点开销
这是一个整洁的系统,但有额外的开销。要读取文件,文件系统必须执行以下所有操作:
- 找到正确的目录结构
- 读取索引节点编号
- 找到正确的索引节点
- 阅读索引节点信息
- 跟随索引节点链接或扩展盘区到相关磁盘块
- 读取文件数据
如果数据不连续,则需要多跳一些。
想象一下要做的工作ls
执行许多文件的长格式文件列表。有很多来回的目的 ls
获取生成其输出所需的信息。
当然,加快文件系统访问速度是Linux尝试执行尽可能多的抢先文件缓存的原因。这很有帮助,但有时(与任何文件系统一样),开销可能会变得很明显。
现在,您将知道为什么。