关于如何在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很陌生,我不是来自英语国家,对不起,如果我没有表达清楚的话。提前谢谢。
答案 0 :(得分:5)
文件的完整唯一标识符为(st_dev, st_ino)
。这意味着inode编号不必在文件系统中是唯一的,并且每个文件仍然是唯一标识的。
这就是为什么你不能拥有跨设备的硬链接。目录条目仅包含inode编号,而不是设备编号。因此,目录条目只能引用与目录所在文件系统相同的文件。
即使您在目录条目中添加了设备字段,它也没有意义,当您添加或删除驱动器时设备编号可能会更改,并且在系统运行时仅引用特定设备。此外,您将如何唯一地编号整个世界中的所有设备。例如,使用USB驱动器,您可以在一台机器之间使用给定的设备。您如何确保设备编号保持不变,以便链接仍然有效?
最后,并非所有文件系统类型都具有固定数量的inode编号。 reiserfs和(我相信)btrfs根据需要动态分配新的inode,因此文件系统的总inode字段并不真正反映任何有用的值。