Linux文件系统属性解读
原文分享:https://bbs.deepin.org/post/281192
一、ls -ihl
每一列的含义
二、inode和block
理解inode要从文件存储说起。
文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区存储512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block),这种由多个扇区组成的“块”,是文件存取的最小单位。
“块”的大小,常见的是4KB,即连续8个sector组成一个block。
block(块)
连续的8个扇区组成一个block 是文件存取地最小单位
inode(索引节点)
中文译名为:索引节点,也叫i节点 用于存储文件元信息
inode和block的作用
- block的作用:用来存真正的数据内容;
- inode的作用:用来存数据的元信息的,所谓元信息指的就是该数据的一些属性,特性。
inode 详细介绍
inode可以记录的信息有哪些?
可以是文件权限(rwx)的记录,文件的属组,属主,文件大小,时间戳等,这种存储文件元信息的区域聚焦做inode,中文译名“索引节点”,也叫 i 节点。因此一个文件必须占用一个inode,但至少占用一个block。
注1:inode并不包括文件名,其实文件名是存放在目录当中的,linux系统中一切皆文件,因此目录也是一种文件。即查看目录中的文件,cd
跳转到指定目录后,通过 ls
查看目录中的文件名。每个inode都有一个号码,系统用inode号码识别不同的文件。对于用户,文件名只是inode号码便于识别的别称。
注2:inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。每个 inode 的大小,一般是128字节或256字节。通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。inode总数在格式化的时候就确定了。
inode编号
每一个 inode 都有一个编号,系统根据 inode 编号可以快速的计算出 inode 信息在磁盘 inodes 存储区的偏移,然后从中获取 inode 信息,再根据 inode信息中记录的 Block 块位置,从Block存储区读出文件内容每个inode都有一个号码,操作系统用inode号来识别不同的文件。
inode 编号在一个文件系统中是唯一的,多个文件系统之间可能会出现相同的编号,下图磁盘存储结构示意图中 /dev/vda1 和 /dev/vda2 在各自的文件系统中 inode 编号是唯一的。
Unix/Linux系统内部不是用文件名,而使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别名。表面上用户是通过文件名打开文件,实际上系统内部分成三个步骤:
- 系统找到这个文件名对应的inode号;
- 通过inode号,获取inode信息;
- 根据inode信息,找到文件数据所在的block,读出数据。
其实系统还要根据inode信息,看用户是否具有访问的权限,由就指向对应的数据block,没有就返回权限拒绝。
查看 inode 信息
使用 stat
命令查看inode信息
ls -i
直接查看文件 i 节点号
也可以通过 stat 查看文件 inode 信息,查看 i 节点号
df -i 查看硬盘分区的 inode总数 和 已使用 情况
上述文件字段解释:
- 文件系统:文件系统
- inodes:文件系统中的inodes总数量
- 已用I:inodes已经使用了的数量
- 可用I:inodes 可供使用的数量
- 已用I%:已经使用了的inodes百分比
- 挂载点:文件系统的挂载点
inode 特性带来的问题
由于 inode 号码和文件名分离,导致一些Unix/Linux 系统具备以下几种特有的现象。
- 文件名包含特殊符号,可能无法正常删除。这时直接删除 inode ,能够起到删除文件的作用;
find ./* -inum 节点号 -delete
- 移动文件或重命名文件,只是改变文件名,不影响 inode号码;
- 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的 inode ,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。
硬链接与软链接
硬链接
通过文件系统的 inode 链接来产生新的文件名,而不是产生新的文件,称为硬链接。
一般情况下,每个 inode 号码对应一个文件名,但是 linux 允许多个文件名指向同一个 inode 号码。意味着可以使用不同的文件名访问相同的内容。
ln 源文件 目标文件(名)
运行该命令之后,源文件与目标文件的 inode 号码相同,都指向同一个 inode。inode 信息中的链接数这时就会增加1。
当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。删除一个文件名,只会使得 inode 中的链接数减1.
需要注意的是:不能对目录做硬链接。
通过 mkdir命令创建一个新目录,其硬连接数应该有2个,应为常见的目录本身为1个硬链接,而目录下的隐藏目录 .(点号)是该目录的又一个硬链接,也算是1个硬链接数。
[root@hero ~]# mkdir /oldboy/oldboy
[root@hero ~]# ll -d /oldboy/oldboy
drwxr-xr-x. 2 root root 6 3月 17 09:11 /oldboy/oldboy
[root@hero ~]# ll -a /oldboy/oldboy
总用量 0
drwxr-xr-x. 2 root root 6 3月 17 09:11 .
drwxr-xr-x. 3 root root 181 3月 17 09:11 ..
隐藏目录中的 .
表示当前目录,它是当前目录的一个硬链接,和当前目录拥有相同的inode编号。我们执行一个文件需要输入类似 ./test
的命令,命令中的 .
表示的就是当前目录; ..
表示当前目录的父目录,它是父目录的一个硬链接,和父目录拥有相同的inode编号。还记得返回上一层的命令 cd ..
吗?这里的 cd ..
表示的就是当前目录的父目录。
软链接
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。
ln -s 源文件或目录 目标文件或目录
例如,文件A 和 文件B 的 inode 号码虽然不一样,但是 文件A 的内容是 文件B 的路径。读取 文件A 时,系统会自动将访问者导向 文件B 。这时,文件A 就称为 文件B 的软链接 soft link 或者符号链接 symblic link。
这意味着,文件A 依赖于 文件B 而存在,如果删除了 文件B,打开 文件A 就会报错。这是软链接与硬链接最大的不同:文件A 指向 文件B 的文件名,而不是 文件B 的 inode 号码,文件B 的 inode 链接数不会因此发生变化。