我试图了解 inode 编号(如 所示ls -i
)如何与 ext4 分区配合使用。
我试图了解它们是否是 Linux 内核的构造并映射到磁盘上的索引节点,或者它们实际上是否是存储在磁盘上的相同数字。
问题:
- 计算机重启后inode号会改变吗?
- 当两个分区被挂载时,
ls -i
只要两个不同的文件位于不同的分区上,就可以产生相同的 inode 号。 - 可以在不重新启动或重新安装分区的情况下回收索引节点号吗?
我为什么要问...
我想在包含 1.5TB 数据和大约 2000 万个文件(文件名)的 USB 硬盘上创建二级索引。文件大小从 10 个字节到 100 GB 不等。其中许多是多次硬链接的,因此单个文件(磁盘上的 blob)可能具有最多 200 个文件名。
我的任务是通过检测重复项并用更多硬链接替换重复项来节省磁盘空间。
现在作为一个练习,我想我可以为磁盘上的每个文件创建一个数据库,它是 shasum、权限等......一旦构建,检测重复应该是微不足道的。我需要确定我使用的是正确的唯一密钥。由于存在大量现有硬链接,文件名不合适。我希望我可以使用索引节点号。
我想了解的是,当我下次重新启动机器时,索引节点号是否会改变。或者如果它们更加不稳定(当我构建数据库时它们会改变吗?)
我读过的所有文档都模糊了内核提供的索引节点号和磁盘上的索引节点号之间的区别。根据我已经读过的文章,尚不清楚它们是否是同一件事。
答案1
我试图了解 inode 编号(如 ls -i 显示)如何与 ext4 分区配合使用。
/etc/passwd
本质上,inode 是文件系统的引用(!),是磁盘上的实际数据(位和字节)和与该数据关联的名称(例如)之间的桥梁。文件名被组织成目录,其中目录条目是带有相应索引节点的文件名。
然后,inode 包含实际信息 - 权限、磁盘上占用的块、所有者、组等。UNIX 文件系统中的目录结构是如何存储的,有一个非常好的图表,它更好地解释了文件和索引节点之间的关系:
当另一个目录中有一个文件指向相同的 inode 号时,您就拥有了所谓的硬链接。
现在,请注意我已经强调了 inode 是特定于文件系统的引用,并且这就是原因请注意:
任何给定文件的索引节点号对于文件系统来说都是唯一的,但对于给定主机上安装的所有文件系统来说不一定是唯一的。当你有多个文件系统时,你会看到文件系统之间有重复的索引节点号,这是正常的。
这与设备。您可能在同一设备上有多个文件系统,例如/var
文件系统 和/
,但它们位于同一驱动器上。
现在,inode 号可以改变吗?有点。文件系统负责管理 inode,因此除非文件系统存在根本问题,否则 inode 编号不应更改。在某些棘手的情况下,例如vim 文本编辑器,
重命名旧文件,然后用原始名称写入一个新文件(如果它认为可以重新创建原始文件的属性)。如果您想重用现有的 inode(因此可能会丢失数据,或浪费更多时间制作备份副本),请将 set backupcopy yes 添加到您的 .vimrc 中。
要记住的关键点是,当数据对用户来说可能相同时,实际上它会被写入磁盘上的新位置,因此 inode 号会发生变化。
所以,简而言之:
- 计算机重启后inode号会改变吗?
除非重新启动后文件系统出现问题,否则不会
2.挂载两个分区时,ls -i 是否可以为两个不同的文件生成相同的 inode 号,只要它们位于不同的分区上即可。
是的,因为两个不同的分区将有不同的文件系统。我不太了解左心室容量,但在这种类型的存储管理下,两个物理卷可以组合成单个逻辑卷,根据我的理论猜测,这将是ls -
每个文件生成一个索引节点的情况
- 可以在不重新启动或重新安装分区的情况下回收索引节点号吗?
当文件被删除时,文件系统会执行此操作(即,当所有链接to file 被删除,并且没有任何内容指向该 inode)。
我的任务是通过检测重复项并用更多硬链接替换重复项来节省磁盘空间。
好吧,检测重复可以通过md5sum
或其他校验和命令来完成。在这种情况下,您正在检查实际数据,这些数据可能位于也可能不位于磁盘上的不同 inode 下。一个例子来自希梅尔回答:
find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
答案2
ext4
不会,当计算机重新启动时,索引节点号不会改变,至少对于索引节点存储在磁盘上的POSIX 文件系统(例如 )不会改变。是的,不同分区上的两个不同文件可以具有相同的索引节点号。看两个独立文件系统上的两个文件可以共享相同的索引节点号吗?和为什么 /home、/usr、/var 等目录都有相同的 inode 号 (2)?了解详情。 (在给定系统中,唯一的是设备号-inode 对。)
是的,如果您删除了一个文件,它的索引节点可以重新使用,而无需重新启动或重新挂载。