inode数如何在linux根文件系统中分发?

时间:2011-11-08 03:27:24

标签: linux filesystems inode

关于如何在linux文件系统中使用inode编号,我有几个问题。这些问题可能是相关的,但为了清楚起见,我会逐一问他们。

Q1:以EXT2 / 3为例,来自“Design and Implementation of the Second Extended Filesystem”我知道块组中有inode表,我知道inode会显示文件,但是如果文件太多而inode数字会怎么样?还不够吗? 我最好的猜测是,如果文件系统的所有inode编号都用尽了,那么它就什么都不做。如果某个文件稍后被删除,其inode可能会被回收。

Q2:我在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)都挂载到root file system。我猜每个文件系统都有自己的inode表,但不同文件系统的inode编号分布在不同的范围内,如根文件系统是[0,N],tmpfs是[N + 1,M]?

如果不同文件系统的inode编号在不同的范围内(我不这么认为),文件系统如何就范围划分达成一致?

如果基于相同的规则生成不同文件系统的inode号(就像从0开始一样),如果我们将它们安装在一起,不同的文件系统会发生冲突吗?据我所知,inode在运行的操作系统中显示文件,如果根文件系统中的文件的inode编号为N,而另一个文件系统中的另一个文件(如tmpfs)的inode编号为N,操作系统会执行什么操作?

PS。我对Linux很陌生,我不是来自英语国家,对不起,如果我没有表达清楚的话。提前谢谢。

1 个答案:

答案 0 :(得分:5)

文件的完整唯一标识符为(st_dev, st_ino)。这意味着inode编号不必在文件系统中是唯一的,并且每个文件仍然是唯一标识的。

这就是为什么你不能拥有跨设备的硬链接。目录条目仅包含inode编号,而不是设备编号。因此,目录条目只能引用与目录所在文件系统相同的文件。

即使您在目录条目中添加了设备字段,它也没有意义,当您添加或删除驱动器时设备编号可能会更改,并且在系统运行时仅引用特定设备。此外,您将如何唯一地编号整个世界中的所有设备。例如,使用USB驱动器,您可以在一台机器之间使用给定的设备。您如何确保设备编号保持不变,以便链接仍然有效?

最后,并非所有文件系统类型都具有固定数量的inode编号。 reiserfs和(我相信)btrfs根据需要动态分配新的inode,因此文件系统的总inode字段并不真正反映任何有用的值。