查看每个inode节点的大小,可以用如下命令:
[root@localhost ~]# dumpe2fs -h /dev/sda1 | grep 'Inode size' dumpe2fs 1.41.12 (17-May-2010) Inode size: 128或者 # tune2fs -l /dev/sda7 | grep "Inode size" Inode size: 256
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
四、inode号码每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:
[root@localhost ~]# ls -i anaconda-ks.cfg 131083 anaconda-ks.cfg 五、目录文件Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
inode与目录关系图:
ls命令只列出目录文件中的所有文件名: [root@localhost ~]# ls /var/log anaconda.ifcfg.log anaconda.yum.log cron maillog secure anaconda.log audit dmesg messages spooler anaconda.program.log boot.log dmesg.old ntpstats tallylog anaconda.storage.log btmp dracut.log prelink wtmp anaconda.syslog ConsoleKit lastlog sa yum.logls -i命令列出整个目录文件,即文件名和inode号码:
[root@localhost ~]# ls -i /var/log 524312 anaconda.ifcfg.log 524293 ConsoleKit 524305 prelink 524308 anaconda.log 524322 cron 524302 sa 524310 anaconda.program.log 524318 dmesg 524299 secure 524311 anaconda.storage.log 524314 dmesg.old 524301 spooler 524309 anaconda.syslog 524307 dracut.log 524292 tallylog 524313 anaconda.yum.log 524294 lastlog 524295 wtmp 524306 audit 524300 maillog 524342 yum.log 524319 boot.log 524298 messages 524296 btmp 524303 ntpstats如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
[root@localhost ~]# ls -l /var/log total 1328 -rw-------. 1 root root 2646 Dec 26 15:29 anaconda.ifcfg.log -rw-------. 1 root root 23138 Dec 26 15:29 anaconda.log -rw-------. 1 root root 45436 Dec 26 15:29 anaconda.program.log -rw-------. 1 root root 113674 Dec 26 15:29 anaconda.storage.log ...理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。
六、inode的特殊作用由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1.有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
2.打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
3.cp与inode:分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联拷贝数据生成新的文件。