Linux文件系统之inode与软硬连接(2)

查看每个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与目录关系图:

d9208ece2fd046ee.png

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.log

ls -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编号关联拷贝数据生成新的文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14363.html