你想知道的关于linux上inodes的一切

Linux文件系统依赖于inode。文件系统内部工作的这些重要部分经常被误解。让我们看看他们到底是什么,他们做了什么。...

Linux文件系统依赖于inode。文件系统内部工作的这些重要部分经常被误解。让我们看看他们到底是什么,他们做了什么。

文件系统的元素

根据定义,文件系统需要存储文件,而且它们还包含目录。文件存储在目录中,这些目录可以有子目录。在某个地方,必须记录文件系统中所有文件的位置、它们的名称、它们所属的帐户、它们拥有的权限等等。此信息称为元数据,因为它是描述其他数据的数据。

在LinuxExt4文件系统中,inode和目录结构共同提供了一个基础框架,用于存储每个文件和目录的所有元数据。它们使元数据对任何需要它的人都可用,无论是内核、用户应用程序还是Linux实用程序,如ls、stat和df。

inode和文件系统大小

虽然确实存在一对结构,但文件系统需要的远不止这些。每座建筑都有成千上万的建筑。每个文件和目录都需要一个inode,因为每个文件都在一个目录中,所以每个文件也需要一个目录结构。目录结构也被称为目录条目,或“dentries”

每个inode都有一个inode编号,该编号在文件系统中是唯一的。同一inode编号可能出现在多个文件系统中。但是,文件系统ID和inode编号结合起来就形成了一个唯一的标识符,而不管您的Linux系统上安装了多少个文件系统。

请记住,在Linux中,您不需要挂载硬盘驱动器或分区。您可以挂载分区上的文件系统,因此很容易在没有意识到的情况下拥有多个文件系统。如果在一个驱动器上有多个硬盘驱动器或分区,则会有多个文件系统。例如,它们可能与所有ext4的类型相同,但它们仍然是不同的文件系统。

所有索引节点都放在一张桌子上。使用inode编号,文件系统可以轻松地计算inode所在inode表的偏移量。你可以理解为什么inode中的“i”代表索引。

包含inode编号的变量在源代码中声明为32位无符号长整数。这意味着inode数是一个最大值为2^32的整数值,它的计算结果是4294967295,远远超过了40亿个inode。

这是理论上的最大值。实际上,ext4文件系统中inode的数量是在文件系统以每16kb文件系统容量一个inode的默认比率创建时确定的。目录结构是在文件系统使用时动态创建的,因为文件和目录是在文件系统中创建的。

有一个命令可以用来查看您的计算机上的文件系统中有多少索引节点。df命令的-i(inodes)选项指示它以inodes的数量显示其输出。

我们将查看第一个硬盘上第一个分区上的文件系统,因此键入以下内容:

df -i /dev/sda1

你想知道的关于linux上inodes的一切

输出给我们:

  • 文件系统:报告的文件系统。
  • Inodes:此文件系统中Inodes的总数。
  • IUsed:正在使用的inode数。
  • IFree:可供使用的剩余inode数。
  • IUse%:使用的inode的百分比。
  • 挂载于:此文件系统的挂载点。

我们在这个文件系统中使用了10%的inode。文件以磁盘块的形式存储在硬盘上。每个inode指向存储它们所代表的文件内容的磁盘块。如果你有数百万个小文件,你可以在用完硬盘空间之前用完索引节点。然而,这是一个非常困难的问题。

在过去,一些邮件服务器将电子邮件存储为离散文件(这会迅速导致大量小文件的收集)存在此问题。当这些应用程序将其后端更改为数据库时,这就解决了问题。一般的家庭系统不会耗尽inode,这是因为在ext4文件系统中,如果不重新安装文件系统,就不能添加更多inode。

要查看文件系统上磁盘块的大小,可以使用blockdev命令和--getbsz(get block size)选项:

sudo blockdev --getbsz /dev/sda

你想知道的关于linux上inodes的一切

块大小为4096字节。

让我们使用-B(块大小)选项指定4096字节的块大小,并检查常规磁盘使用情况:

df -B 4096 /dev/sda1

你想知道的关于linux上inodes的一切

此输出显示:

  • 文件系统:我们报告的文件系统。
  • 4K块:此文件系统中4KB块的总数。
  • 已用:使用了多少个4K块。
  • 可用:可供使用的剩余4 KB块数。
  • 使用%:已使用的4 KB块的百分比。
  • 挂载于:此文件系统的挂载点。

在我们的示例中,文件存储(以及inode和目录结构的存储)已经占用了这个文件系统上28%的空间,代价是inode的10%,所以我们的状态很好。

inode元数据

要查看文件的inode编号,可以使用ls和-i(inode)选项:

ls -i geek.txt

你想知道的关于linux上inodes的一切

这个文件的inode编号是1441801,所以这个inode保存了这个文件的元数据,而且,传统上是指向文件所在硬盘上的磁盘块的指针。如果文件是碎片、非常大或两者都是,inode指向的某些块可能会包含指向其他磁盘块的进一步指针。其他一些磁盘块也可能包含指向另一组磁盘块的指针。这克服了inode大小固定并且能够容纳有限数量的指向磁盘块的指针的问题。

这个方法被一个新的方案所取代,这个方案使用“扩展数据块”来记录用于存储文件的每组连续数据块的开始和结束数据块。如果文件未分段,则只需存储第一个块和文件长度。如果文件是分段的,则必须存储文件每个部分的第一个和最后一个块。这种方法(显然)更有效。

如果要查看文件系统是否使用磁盘块指针或扩展数据块,可以查看inode内部。为此,我们将使用带有-R(request)选项的debugfs命令,并将感兴趣的文件的inode传递给它。这要求debugfs使用其内部的“stat”命令来显示inode的内容。因为inode编号只在文件系统中是唯一的,所以我们还必须告诉debugfs inode所在的文件系统。

下面是这个示例命令的样子:

sudo debugfs -R "stat <1441801>" /dev/sda1

你想知道的关于linux上inodes的一切

如下所示,debugfs命令从inode中提取信息,并以较少的时间将其呈现给我们:

我们显示了以下信息:

  • Inode:我们正在查看的Inode的编号。
  • 类型:这是一个常规文件,不是目录或符号链接。
  • 模式:文件权限以八进制表示。
  • 标志:表示不同特性或功能的指示符。0x80000是“extents”标志(下面将详细介绍)。
  • 生成:当有人通过网络连接访问远程文件系统时,网络文件系统(NFS)会使用此功能,就好像它们安装在本地计算机上一样。inode和生成号用作文件句柄的一种形式。
  • 版本:inode版本。
  • 用户:文件的所有者。
  • 组:文件的组所有者。
  • 项目:应始终为零。
  • 大小:文件的大小。
  • 文件ACL:文件访问控制列表。它们的目的是允许您对不在所有者组中的人进行受控访问。
  • 链接:指向文件的硬链接数。
  • Blockcount:分配给这个文件的硬盘空间量,以512字节块表示。我们的文件已经分配了其中的8个,即4096字节。因此,我们的98字节文件位于一个4096字节的磁盘块中。
  • 片段:此文件不是片段。(这是一个过时的标志。)
  • Ctime:创建文件的时间。
  • Atime:上次访问此文件的时间。
  • Mtime:上次修改此文件的时间。
  • Crtime:创建文件的时间。
  • 额外inode字段的大小:ext4文件系统引入了在格式化时分配更大的磁盘inode的能力。此值是inode正在使用的额外字节数。这个额外的空间还可以用来满足未来对新内核的需求,或者存储扩展属性。
  • Inode checksum:这个Inode的校验和,可以检测Inode是否损坏。
  • 扩展数据块:如果正在使用扩展数据块(在ext4上,默认情况下是这样),则有关文件的磁盘块使用情况的元数据有两个数字,表示碎片文件每个部分的开始块和结束块。这比存储文件每个部分占用的每个磁盘块更有效。我们有一个盘区,因为我们的小文件位于一个磁盘块中的这个块偏移量处。

文件名在哪里?

我们现在有很多关于文件的信息,但是,正如您可能注意到的,我们没有得到文件名。这就是目录结构发挥作用的地方。在Linux中,就像文件一样,目录也有inode。目录inode不是指向包含文件数据的磁盘块,而是指向包含目录结构的磁盘块。

与inode相比,目录结构包含的文件信息量有限。它只保存文件的inode编号、名称和名称长度。

inode和目录结构包含您(或应用程序)需要了解的关于文件或目录的所有信息。目录结构在一个目录磁盘块中,所以我们知道文件所在的目录。目录结构为我们提供了文件名和inode编号。inode告诉我们关于文件的所有其他信息,包括时间戳、权限以及在文件系统中从何处找到文件数据。

目录索引节点

您可以很容易地看到目录的inode编号,就像您可以看到文件的inode编号一样。

在下面的示例中,我们将ls与-l(长格式)、-i(inode)和-d(目录)选项一起使用,并查看工作目录:

ls -lid work/

你想知道的关于linux上inodes的一切

因为我们使用了-d(directory)选项,ls报告的是目录本身,而不是它的内容。这个目录的inode是1443016。

要对主目录重复此操作,请键入以下内容:

ls -lid ~

你想知道的关于linux上inodes的一切

主目录的inode是1447510,工作目录在主目录中。现在,让我们看看工作目录的内容。我们将使用-a(all)选项,而不是-d(directory)选项。这将向我们显示通常隐藏的目录项。

我们键入以下内容:

ls -lia work/

你想知道的关于linux上inodes的一切

因为我们使用了-a(all)选项,所以将显示单点(.)和双点(..)条目。这些条目表示目录本身(单点)和其父目录(双点)

如果您查看单点条目的inode编号,您会发现它是1443016—与我们发现工作目录的inode编号时得到的inode编号相同。此外,双点条目的inode编号与主目录的inode编号相同。

所以你可以用这张cd。。命令在目录树中向上移动一级。同样,当在应用程序或脚本名称前面加上./时,可以让shell知道从何处启动应用程序或脚本。

索引节点和链接

如前所述,要在文件系统中拥有格式良好且可访问的文件,需要三个组件:文件、目录结构和inode。文件是存储在硬盘上的数据,目录结构包含文件名及其inode号,inode包含文件的所有元数据。

符号链接是看起来像文件的文件系统条目,但实际上是指向现有文件或目录的快捷方式。让我们看看他们是如何管理的,以及如何使用这三个元素来实现这一点。

假设我们有一个包含两个文件的目录:一个是脚本,另一个是应用程序,如下所示。

你想知道的关于linux上inodes的一切

我们可以使用ln命令和-s(符号)选项创建到脚本文件的软链接,如下所示:

ls -s my_script geek.sh

你想知道的关于linux上inodes的一切

我们已经创建了一个链接到我的_脚本.sh打电话极客。我们可以键入以下内容并使用ls查看两个脚本文件:

ls-li*.sh文件

你想知道的关于linux上inodes的一切

的条目极客以蓝色显示。权限标志的第一个字符是“l”,表示链接-&gt;指向我的_脚本.sh. 所有这些都表明极客是一个链接。

正如您可能预期的,这两个脚本文件具有不同的inode编号。不过,更令人惊讶的是,软连接,极客,没有与原始脚本文件相同的用户权限。实际上,的权限极客所有的用户都有完全的权限。

的目录结构极客包含链接及其inode的名称。当您尝试使用链接时,它的inode会被引用,就像普通文件一样。链接inode将指向磁盘块,但磁盘块不包含文件内容数据,而是包含原始文件的名称。文件系统重定向到原始文件。

我们将删除原始文件,并查看在键入以下内容以查看极客:

rm my_script.sh cat geek.sh

你想知道的关于linux上inodes的一切

符号链接断开,重定向失败。

我们现在键入以下内容以创建指向应用程序文件的硬链接:

ln special-app geek-app

你想知道的关于linux上inodes的一切

要查看这两个文件的inode,请键入以下内容:

ls -li

你想知道的关于linux上inodes的一切

两个看起来都像普通文件。没有任何关于geek应用程序的信息表明它是ls列表中的一个链接极客做。另外,geek应用程序拥有与原始文件相同的用户权限。然而,令人惊讶的是,这两个应用程序都有相同的inode编号:1441797。

geek app的目录条目包含名称“geek app”和inode编号,但它与原始文件的inode编号相同。因此,我们有两个不同名称的文件系统条目,它们都指向同一inode。事实上,任意数量的项都可以指向同一inode。

我们将键入以下内容并使用stat程序查看目标文件:

stat special-app

你想知道的关于linux上inodes的一切

我们看到两个硬链接指向这个文件。它存储在inode中。

在下面的示例中,我们删除原始文件并尝试使用带有秘密、安全密码的链接:

rm special-app ./geek-app correcthorsebatterystaple

你想知道的关于linux上inodes的一切

令人惊讶的是,应用程序按预期运行,但是如何运行呢?它之所以有效,是因为当你删除一个文件时,inode是可以自由重用的。目录结构被标记为inode编号为零,然后磁盘块可用于存储在该空间中的另一个文件。

但是,如果指向inode的硬链接数大于1,则硬链接计数将减少1,并且已删除文件的目录结构的inode数将设置为零。硬盘和inode上的文件内容对现有的硬链接仍然可用。

我们将键入以下内容,并再次在极客应用程序上使用stat:

stat geek-app

你想知道的关于linux上inodes的一切

这些细节与前面的stat命令来自同一inode(1441797)。链接数减少了一个。

因为这个inode只有一个硬链接,如果我们删除geek应用程序,它会真正删除这个文件。文件系统将释放inode并用inode为零标记目录结构。一个新文件可以覆盖硬盘上的数据存储。

相关:如何在Linux上使用stat命令

inode开销

这是一个整洁的系统,但有间接费用。要读取文件,文件系统必须执行以下所有操作:

  • 找到正确的目录结构
  • 读取inode编号
  • 找到正确的inode
  • 读取inode信息
  • 跟随inode链接或区段到相关磁盘块
  • 读取文件数据

如果数据是不连续的,就需要多跳一点。

想象一下ls要执行一个包含许多文件的长格式文件列表所要做的工作。对于ls来说,为了获得生成输出所需的信息,需要进行大量的来回操作。

当然,加快文件系统访问速度是Linux尽可能多地进行抢占式文件缓存的原因。这非常有帮助,但有时与任何文件系统一样,开销会变得很明显。

现在你知道为什么了。

  • 发表于 2021-04-02 18:04
  • 阅读 ( 163 )
  • 分类:互联网

你可能感兴趣的文章

分区表:错误的含义及避免方法

... 但就我们目前的目的而言,只要知道文件分布在这些部门就足够了。当您保存一个文件时,您的操作系统开始将其数据一次一个扇区地写入硬盘,直到完全存储为止。稍后打开文件时,arm将一次读取一个...

  • 发布于 2021-03-13 14:42
  • 阅读 ( 217 )

关于chromebook开发者模式,你需要知道的一切

...自己的操作系统或者你自己想要安装的Linux发行版?也许你想把Chromebook用作媒体服务器或机顶盒?也许你只是需要外壳?在所有这些情况下,开发者模式是您的朋友。 ...

  • 发布于 2021-03-13 17:01
  • 阅读 ( 616 )

13 df linux命令及其示例

... 如果你想知道在你的Linux电脑上有多少可用的磁盘空间,你的第一反应是什么?对于许多人来说,可能需要检查Linux发行版的磁盘管理工具,但这不是最好的选择。正如有一个...

  • 发布于 2021-03-18 03:04
  • 阅读 ( 173 )

如何像专业人员一样在linux上管理照片

... 如果你想换个方向,你可以试试荔枝。这个应用程序可以让你在自己的电脑或互联网上设置自己的照片服务器。如果你在多年来看到太多的云服务关闭后对云存储保持警惕,那...

  • 发布于 2021-03-21 18:20
  • 阅读 ( 167 )

linux正在吃掉你的公羊吗?如何管理你的记忆

...缓存的RAM。很明显,这样做会对性能产生负面影响。如果你想让你的系统以最佳方式运行,那就让事情顺其自然吧。 ...

  • 发布于 2021-03-23 08:31
  • 阅读 ( 310 )

在计算机上安装linux最简单的方法是什么?

... 幸运的是,安装Linux并不像你想象的那么难。事实上,只要你挑选一款对初学者友好的Linux,第一次通常是绝对的轻松。下面介绍如何在您的计算机上轻松安装Linux,并将Windows或macOS永久保留。 ...

  • 发布于 2021-03-23 16:43
  • 阅读 ( 243 )

10款酷派raspberry pi+windows 10款物联网核心项目

... 如果你想运行各种各样的特定windows应用程序,那么windows10iot是一个不错的选择。如果你想建立一个DIY魔镜或简单的Python脚本,那么windows10iot就太过分了。 ...

  • 发布于 2021-03-24 08:01
  • 阅读 ( 211 )

什么是linux?你需要知道的一切

... 剩下的就看你了。从现在开始,你可以用puppylinux做任何你想做的事情。许多人选择puppylinux而不是传统的发行版,因为它工作正常,运行速度快,并且对于轻量级发行版来说有很好的图形。因此,您可以快速完成更多的工作,...

  • 发布于 2021-03-30 17:42
  • 阅读 ( 226 )

如何用testdisk恢复linux上删除的文件

...,这太容易了。通配符的一个小错误,你可以消除很多比你想要的。 默认的Linux文件系统ext4使用inode保存每个文件的数据,并使用inode表跟踪inode。inode包含有关文件的元数据,例如文件名、文件所有者、权限等。 它还包含指向...

  • 发布于 2021-04-01 08:34
  • 阅读 ( 310 )

如何使用linux的man命令:隐藏的秘密和基础知识

你需要知道的关于Linux的一切都在它的手册页中。例如,您可以搜索一个命令来完成一个任务,即使您不知道它叫什么。但是你怎么能找到手册页呢?这里有一些技巧。 linux的内置手册 有一个古老的(来自Unix黄金时代)Linux笑...

  • 发布于 2021-04-02 10:46
  • 阅读 ( 193 )
秦业傥镢墨7403
秦业傥镢墨7403

0 篇文章

相关推荐