Linux根文件系统中inode编号是如何分配的?

3

我对Linux文件系统中inode编号的使用有几个问题。这些问题可能相关,但为了清晰起见,我将逐一提出。

问题1:以EXT2/3为例,从“设计和实现第二个扩展文件系统”中我知道,在块组中有inode表,我也知道inode表示文件,但如果文件太多而inode编号不足怎么办? 我最好的猜测是,如果所有inode编号都用完了,文件系统就什么也不做。如果稍后删除某个文件,则其inode可能会被回收。

问题2:我在我的Linux服务器上运行“df -i”,结果如下:

Filesystem            Inodes       IUsed   IFree      IUse% Mounted on    
    /dev/sda1          1313280    7853 1305427    1%     /
    devtmpfs                   0       0       0              -       /dev
    tmpfs                 525298       4  525294        1%    /dev/shm
    /dev/sda2              65808      50   65758       1%    /boot
    /dev/sda5            1313280     146 1313134    1%   /opt
    /dev/sda6             655776      37  655739      1%   /tmp
    /dev/sda7             655776    5219  650557    1%   /home
    /dev/sda8            1313280     840 1312440    1%  /var
    /dev/sda9             655776   36529  619247    6%  /usr
    /dev/sda10              6432      11    6421        1%  /crash
    /dev/sda12            135488      11  135477     1%  /usr/local/instances
    tmpfs                 525298       3  525295    1% /var/run/xenstored
    tmpfs                 525298       3  525295    1% /var/lib/xenstored
    tmpfs                 525298       3  525295    1% /var/lib/xend/socket
    tmpfs                 517536       3  517533    1% /var/run/libvirt/socket

我看到每个文件系统都有自己的inode计数,并且这些文件系统(比如devtmpfs和tmpfs)都挂载到根文件系统。我猜每个文件系统都有它们自己的inode表,但是不同文件系统的inode编号是否分布在不同的范围内,比如根文件系统是[0,N],而tmpfs是[N+1,M]?
如果不同文件系统的inode编号在不同的范围内(我认为不是这样),那么文件系统如何就范围划分达成协议?
如果不同文件系统的inode编号是基于相同规则生成的(比如全部从0开始),那么如果我们将它们一起挂载,不同的文件系统是否会冲突?据我所知,inode表示运行OS中的文件,如果根文件系统中的一个文件具有inode编号N,而另一个文件系统(比如tmpfs)中的另一个文件也具有inode编号N,那么OS会怎么做?
PS. 我对Linux还比较新,我不是来自英语国家,如果我的表述不清楚,请谅解。提前致谢。

尝试在“unix”或“ubuntu”论坛上提问。你会得到更好的答案 :-}。我们只是程序员,通常不关心“System.IO.WriteLine()”之后发生了什么。 - James Anderson
这是一个很难回答的问题。我认为它应该属于这里,因为这是关于Unix通用的有趣实现细节。 - Omnifarious
请一次只提一个问题。 - user229044
@meagar - 如果你要挑剔这个问题的规则违规,那么也许你应该请求删除我提出的大约75%的问题。如果你想对有多个“?”标记的问题进行追究,那么你最终会删除Stack Overflow上相当大比例的问题。 - Omnifarious
@meagar - 点头 我对这里的问题被轻易关闭感到烦恼。我会说,我看到的大约15%的问题并不真正应该被关闭。 - Omnifarious
显示剩余7条评论
1个回答

5
文件的完整唯一标识符是 (st_dev, st_ino)。这意味着inode号不必在所有文件系统中都是唯一的,并且每个文件仍然可以被唯一地识别。
这就是为什么不能跨设备创建硬链接。目录条目只包含一个inode号,而没有设备号。因此,目录条目只能引用与目录所在文件系统相同的文件。
即使向目录条目添加设备字段,它也是没有意义的。设备号可能会随着添加或删除驱动器而更改,并且只在系统运行时才涉及特定设备。此外,如何对全世界所有设备进行唯一编号?例如,对于USB驱动器,您可以将给定设备从一台机器带到另一台机器。如何确保设备号保持不变以便链接仍然有效?
最后,不是所有文件系统类型都有固定数量的inode号。reiserfs和(btrfs我认为)根据需要动态分配新的inode,因此文件系统的总inode数字段实际上不反映任何有用的值。

“(st_dev, st_ino)” 这里是非常有用的信息,还有硬链接的解释。谢谢。 - xanpeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接