Linux文件系统属性解读

原文分享:https://bbs.deepin.org/post/281192

一、ls -ihl 每一列的含义

image.png

二、inode和block

理解inode要从文件存储说起。

文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区存储512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block),这种由多个扇区组成的“块”,是文件存取的最小单位。

“块”的大小,常见的是4KB,即连续8个sector组成一个block。

block(块)

            连续的8个扇区组成一个block

            是文件存取地最小单位
​

inode(索引节点)

            中文译名为:索引节点,也叫i节点

            用于存储文件元信息
​

525ed71e-22d4-4068-b4a4-b24698da5a1d.png

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 编号是唯一的。

f41cbeb7-e758-4f41-9af3-db87a3bed384.png

Unix/Linux系统内部不是用文件名,而使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别名。表面上用户是通过文件名打开文件,实际上系统内部分成三个步骤:

  1. 系统找到这个文件名对应的inode号;
  2. 通过inode号,获取inode信息;
  3. 根据inode信息,找到文件数据所在的block,读出数据。

其实系统还要根据inode信息,看用户是否具有访问的权限,由就指向对应的数据block,没有就返回权限拒绝。

查看 inode 信息

使用 stat 命令查看inode信息

image.png

ls -i 直接查看文件 i 节点号

也可以通过 stat 查看文件 inode 信息,查看 i 节点号

image.png

df -i 查看硬盘分区的 inode总数 和 已使用 情况

image.png

上述文件字段解释:

  • 文件系统:文件系统
  • inodes:文件系统中的inodes总数量
  • 已用I:inodes已经使用了的数量
  • 可用I:inodes 可供使用的数量
  • 已用I%:已经使用了的inodes百分比
  • 挂载点:文件系统的挂载点

inode 特性带来的问题

由于 inode 号码和文件名分离,导致一些Unix/Linux 系统具备以下几种特有的现象。

  1. 文件名包含特殊符号,可能无法正常删除。这时直接删除 inode ,能够起到删除文件的作用;
find ./* -inum 节点号 -delete
​
  1. 移动文件或重命名文件,只是改变文件名,不影响 inode号码;
  2. 打开一个文件以后,系统就以 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 链接数不会因此发生变化。

posted @ 2024-11-13 14:58  Yuezc  Views(107)  Comments(0)    收藏  举报