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