通过示例了解 Linux Inodes 基础知识

举报
Tiamo_T 发表于 2022/05/26 08:50:57 2022/05/26
【摘要】 与社会安全号码类似,在 Linux 或 *nix 系统上的所有文件中都有一个唯一存在的 Inode 号码的概念。索引节点基础一个 Inode 编号指向一个 Inode。Inode 是一种数据结构,用于存储有关文件的以下信息:文件大小设备编号文件的用户 ID文件的组 ID所有者、组和其他人的文件模式信息和访问权限文件保护标志文件创建、修改等的时间戳链接计数器以确定硬链接的数量指向存储文件内容的...

与社会安全号码类似,在 Linux 或 *nix 系统上的所有文件中都有一个唯一存在的 Inode 号码的概念。

索引节点基础

一个 Inode 编号指向一个 Inode。Inode 是一种数据结构,用于存储有关文件的以下信息:

  • 文件大小
  • 设备编号
  • 文件的用户 ID
  • 文件的组 ID
  • 所有者、组和其他人的文件模式信息和访问权限
  • 文件保护标志
  • 文件创建、修改等的时间戳
  • 链接计数器以确定硬链接的数量
  • 指向存储文件内容的块的指针

请注意,上述列表并不详尽。此外,文件的名称不存储在 Inodes 中(我们稍后会谈到)。

在目录中创建文件时,会将文件名和 Inode 编号分配给文件。这两个条目与目录中的每个文件相关联。用户可能认为该目录包含完整的文件以及与之相关的所有额外信息,但情况并非总是如此。所以我们看到一个目录将一个文件名与其 Inode 号相关联。

当用户尝试访问文件或与文件相关的任何信息时,他/她使用文件名来访问,但在内部,文件名首先与存储在表中的 Inode 编号进行映射。然后通过该 Inode 编号访问相应的 Inode。有一个表(Inode 表),其中提供了 Inode 编号与相应 Inode 的映射。

为什么 Inode 信息中没有文件名?

如前所述,在 Inode 中没有文件名条目,而是将文件名保留为与 Inode 编号平行的单独条目。将文件名从与同一文件相关的其他信息中分离出来的原因是为了维护文件的硬链接。这意味着一旦所有其他信息从文件名中分离出来,我们就可以拥有指向同一个 Inode 的各种文件名。


例如 :

$ touch a

$ ln a a1

$ ls -al
drwxr-xr-x 48 himanshu himanshu 4096 2012-01-14 16:30 .
drwxr-xr-x 3 root root 4096 2011-03-12 06:24 ..
-rw-r--r-- 2 himanshu family 0 2012-01-14 16:29 a
-rw-r--r-- 2 himanshu family 0 2012-01-14 16:29 a1

在上面的输出中,我们创建了一个文件“a”,然后创建了一个硬链接 a1。现在,当运行命令“ls -al”时,我们可以看到“a”和“a1”的详细信息。我们看到这两个文件是无法区分的。查看输出中的第二个条目。此条目指定文件的硬链接数。在这种情况下,两个文件的条目都具有值“2”。

请注意,不能在不同的文件系统上创建硬链接,也不能为目录创建硬链接。

什么时候创建索引节点?

众所周知,inode 是一个包含文件信息的数据结构。由于数据结构占用存储空间,那么一个明显的问题就是何时在系统中创建 Inode?好吧,在安装操作系统或新文件系统以及进行初始结构化时,会为 Inode 分配空间。因此,通过这种方式,我们可以看到在文件系统中,设置了最大 Inode 数,因此设置了最大文件数。

现在,上述概念带来了另一个有趣的事实。文件系统可以通过两种方式耗尽空间:

  • 没有空间用于添加新数据
  • 所有的 Inode 都被消耗掉了。

嗯,第一种方式很明显,但我们需要看看第二种方式。是的,可能会出现这样一种情况:我们有可用的存储空间,但由于所有 Inode 都已消耗,我们仍然无法在文件系统中添加任何新数据。这可能发生在文件系统包含大量非常小的文件的情况下。这将消耗所有 Inode,尽管从硬盘驱动器的角度来看会有可用空间,但从文件系统的角度来看,没有 Inode 可用于存储任何新文件。

上述用例是可能的,但很少遇到,因为在典型系统上,平均文件大小超过 2KB,这使得它更容易首先耗尽硬盘空间。但是,仍然存在一种用于在文件系统中创建多个 Inode 的算法。该算法考虑了文件系统的大小和平均文件大小。用户可以在创建文件系统时调整 Inode 的数量。

访问 Inode 编号的命令

以下是一些用于访问文件 Inode 编号的命令:

1) ls -i 命令

正如我们之前在Unix LS 命令:15 个实际示例文章中所解释的,标志 -i 用于打印每个文件的 Inode 编号。

$ ls -i
1448240 a 1441807 Desktop 1447344 mydata 1441813 Pictures 1442737 testfile 1448145 worm
1448240 a1 1441811 Documents 1442707 my_ls 1442445 practice 1442739 test.py
1447139 alpha 1441808 Downloads 1447278 my_ls_alpha.c 1441810 Public 1447099 Unsaved Document 1
1447478 article_function_pointer.txt 1575132 google 1447274 my_ls.c 1441809 Templates 1441814 Videos
1442390 chmodOctal.txt 1441812 Music 1442363 output.log 1448800 testdisk.log 1575133 vlc

看到 'a' 和 'a1' 的 Inode 编号与我们创建的 'a1' 作为硬链接相同。

2) df -i 命令

df -i 命令显示文件系统的inode信息。

$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            1875968  293264 1582704   16% /
none                  210613     764  209849    1% /dev
none                  213415       9  213406    1% /dev/shm
none                  213415      63  213352    1% /var/run
none                  213415       1  213414    1% /var/lock
/dev/sda2            7643136  156663 7486473    3% /home

标志 -i 用于显示 Inode 信息。

3) 统计命令

Stat 命令用于显示文件统计信息,同时显示文件的 inode 编号

$ stat a
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 805h/2053d Inode: 1448240 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/himanshu) Gid: ( 1001/ family)
Access: 2012-01-14 16:30:04.871719357 +0530
Modify: 2012-01-14 16:29:50.918267873 +0530
Change: 2012-01-14 16:30:03.858251514 +0530

Inode 编号的使用场景示例

  1. 假设存在一个包含一些特殊字符的文件名。例如:“ab*
  2. 尝试使用 rm 命令正常删除它,您将无法删除它。
  3. 但是,您可以使用此文件的 inode 编号将其删除。

让我们看看这个例子中的这些步骤:

1)检查文件是否存在:

$ ls -i
1448240 a 1447274 my_ls.c
1448240 a1 1442363 output.log
1448239 "ab* 1441813 Pictures
1447139 alpha

所以我们在这个目录中有一个名为“ab*”的文件

2)尝试正常删除:

$ rm "ab*
> ^C
$ rm "ab*
> ^C
$

看到我尝试了几次删除文件但不能。

3) 使用 Inode 号删除文件:

正如我们之前在查找命令示例文章中所讨论的,您可以使用 inode 编号搜索文件并将其删除。

$ find . -inum 1448239 -exec rm -i {} \;
rm: remove regular empty file `./"ab*'? y
$ ls -i
1448240 a 1447274 my_ls.c
1448240 a1 1442363 output.log
1447139 alpha 1441813 Pictures

所以我们使用 find 命令指定我们需要删除的文件的 Inode 号。文件被删除了。虽然我们也可以通过使用命令 rm \”ab* 来删除文件,而不是使用上面复杂的 find 命令示例,但我仍然使用它来演示用户使用 Inode 编号的方法之一。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。