理解linux中inode与block、硬链接与软链接

什么是inode和block?

1. inode和block概述

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

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

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

小结:

block(块)

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

                是文件存取地最小单位

inode(索引节点)

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

                用于存储文件元信息

  • block的作用:用来存真正的数据内容
  • inode的作用:用来存数据的元信息的,所谓元信息指的就是该数据的一些属性,特性。
  • inode可以记录的信息有哪些?可以是文件权限(rwx)的记录,文件的属组,属主,文件大小,时间戳等,这种存储文件元信息的区域聚焦做inode,中文译名“索引节点”,,也叫 i 节点。因此一个文件必须占用一个inode,但至少占用一个block
  • 注:inode并不包括文件名,其实文件名是存放在目录当中的,linux系统中一切皆文件,因此目录也是一种文件即查看目录中的文件,cd 跳转到指定目录后通过 ls 查看目录中的文件名,儿而我们每个inode都有一个号码,系统用inode号码识别不同的文件,系统内部不使用文件名,而使用inode号码来识别文件。对于用户,文件名只是inode号码便于识别的别称。

2. inode的内容

1. inode包含文件的元信息,具体来说有以下内容:

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳: ctime :指inode上一次变动的时间,mtime :指文件内容上一次变动的时间atime :指文件上一次打开的时间
  • 链接数:即有多少个文件名指向这个inode
  • 文件数据block的位置

2. 磁盘分区中block存储区和inodes存储区图示:

3. inode编号

       每一个 inode 都有一个编号,系统根据 inode 编号可以快速的计算出 inode 信息在磁盘 inodes 存储区的偏移,然后从中获取 inode 信息,再根据 inode信息中记录的 Block 块位置,从Block存储区读出文件内容每个inode都有一个号码,操作系统用inode号来识别不同的文件。

        inode 编号在一个文件系统中是唯一的,多个文件系统之间可能会出现相同的编号,前面的磁盘存储结构示意图中 /dev/vda1 和 /dev/vda2 在各自的文件系统中 inode 编号是唯一的

       创建一个新文件的时候,文件名和对应的 inode 编号会存储在目录文件的Block块中(关于目录文件后面会讲到)

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

1. 系统找到这个文件名对应的inode号;

2. 通过inode号,获取inode信息;

3. 根据inode信息,找到文件数据所在的block,读出数据。

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

stat

  • 查看inode信息
[root@hero oldboy]# stat oldboy.txt
  File: ‘oldboy.txt’
  Size: 230       	Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d	Inode: 14519       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2023-03-15 21:05:17.564903045 +0800
Modify: 2023-03-15 21:04:21.671590859 +0800
Change: 2023-03-15 21:04:21.673590870 +0800
 Birth: -

ls -i

  • 直接查看文件 i 节点号,也可以通过 stat 查看文件 inode 信息,查看 i 节点号
[root@hero oldboy]# ls -i oldboy.txt
14519 oldboy.txt

4. inode的大小

       inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。每个 inode 的大小,一般是128字节或256字节。通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。inode总数在格式化的时候就确定了。

df -i 

  • 查看硬盘分区的 inode总数 和 已使用 情况
[root@hero oldboy]# df -i 
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sda3      50753024 60278 50692746    1% /
devtmpfs         230190   393   229797    1% /dev
tmpfs            232902     1   232901    1% /dev/shm
tmpfs            232902   732   232170    1% /run
tmpfs            232902    16   232886    1% /sys/fs/cgroup
/dev/sr0              0     0        0     - /mnt
/dev/sda1        102400   327   102073    1% /boot
tmpfs            232902     1   232901    1% /run/user/0

字段解释:

Filesystem:文件系统

Inodes:文件系统中inodes总数量

IUsed:inodes已经使用了的数量

IFree:inodes 可供使用的数量

IUse%:已经使用了的inodes百分比

Mounted on:文件系统的挂载点


5. inode耗尽故障

       文件系统中的inodes数量在安装系统或格式化磁盘分区的时候就已经分配好了,也就是说 inodes 数量是有限的,所以 inodes 数量有可能耗尽的,耗尽之后就会出现磁盘还有空间,但是无法创建新文件的情况。

       同时,这也是一种攻击的方式,所以一些共用的文件系统就要做磁盘限额,以防止影响到系统的正常运行。

       至于修复,很简单,只要找出哪些大量占用 i 节点的文件删除就可以了。

demo:

1. 先准备一个比较小的磁盘分区,并格式化挂载,这里挂载到了/data目录下。

[root@hero ~]# df -hT /data/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      ext4   29M  731K   26M   3% /data

 2. 先测试可以正常创建文件。

[root@hero ~]# touch /data/test{01..05}.txt
[root@hero ~]# ls /data/
lost+found  test01.txt  test02.txt  test03.txt  test04.txt  test05.txt

3. 查看 i 节点的使用情况。

[root@hero ~]# df -i /data/
文件系统          Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/sda3      50753024   60280 50692744       1% /

4. 编写一个测试程序,创建大量空文件按,用于耗尽此分区中的 i 节点数。

[root@hero ~]# vim killinode.sh 
#!/bin/bash
i=1
while [ $i -le 16376 ]
do
touch /data/file$i
let i++
done 

 5. 运行测试程序,结束后查看 i 节点占用情况,磁盘分区空间使用情况。

[root@hero ~]# sh killinode.sh
[root@hero ~]# df -i /data/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sdb1       16384 16384     0  100% /data
[root@hero ~]# df -hT /data/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      xfs    29M   11M   19M  36% /data

 6. 虽然还有很多剩余空间,但是 i 节点耗尽了,也无法1创建此乃文件,这就是 i 节点耗尽故障

[root@hero ~]# touch /data/newfile.txt
touch: cannot touch ‘/data/newfile.txt’: No space left on device

6. 特有现象

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

1. 文件名包含特殊符号,可能无法正常删除。这时直接删除 inode ,能够起到删除文件的作用;

find ./* -inum 节点号 -delete

2. 移动文件或重命名文件,只是改变文件名,不影响 inode号码;

3. 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。

       这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的 inode ,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。

硬链接与软链接

1. 硬链接

        通过文件系统的 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 ..表示的就是当前目录的父目录。

2. 软链接

类似于Windows的快捷方式功能的文件,可以快速链接到目标文件或目录,称为软练级二。

ln -s 源文件或目录 目标文件或目录

        软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。例如,文件A 文件B 的 inode 号码虽然不一样,但是 文件A 的内容是 文件B 的路径。读取 文件A 时,系统会自动将访问者导向 文件B 。这时,文件A 就称为 文件B 的软链接soft link 或者符号链接 symblic link

        这意味着,文件A 依赖于 文件B 而存在,如果删除了 文件B,打开 文件A 就会报错。这是软链接与硬链接最大的不同:文件A 指向 文件B 的文件名,而不是 文件Binode 号码,文件Binode 链接数不会因此发生变化。  

参考文件:Linux inode 详解 - LinSenGeGe - 博客园 (cnblogs.com)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小天才。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值