深入了解linux inode

inode

文件是储存在硬盘上的,硬盘最小的存储单位叫做扇区sector,每个扇区存储512个字节。操作系统读取硬盘的时候,不会一个个扇区地读取,而是一次性地读取多个扇区,这个逻辑单位叫做块block。由多个扇区构成的快,才是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block

文件数据存储在块中,那么就需要一个地方来存储文件的元信息(meta information),比如文件的创建者、创建日期、大小等关键信息。在linux系统中,存储文件元信息的区域就叫做inode,中文译名为索引结点,也叫i结点

  • 元信息 -> inode
  • 数据 -> block
inode内容

inode包含除文件名以外的很多文件元信息,例如:字节数、属主UserID、属组UserGroup、读写执行权限、时间戳等。

文件名存放在目录中,但linux系统内部并不使用文件名,而是使用inode号标识文件。也就是说linux系统里文件名其实是inode号便于识别的别称。

stat

stat命令查看inode存储的文件信息。

>> mkdir test
>> echo "this is test file" > test.txt
>> stat test.txt

  File: ‘test.txt’
  Size: 18              Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 33574994    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2019-08-28 19:55:05.920240744 +0800
Modify: 2019-08-28 19:55:05.920240744 +0800
Change: 2019-08-28 19:55:05.920240744 +0800
 Birth: -
file

可以使用file命令查看文件类型

>> file test
test: directory
>> file test.txt
test.txt: ASCII text

Linux如何通过inode读取文件

在UI层面,用户通过文件名来打开文件,实际上,Linux内部将该过程分为四步:

  1. 系统找到这个文件名对应的inode号
  2. 通过inode号,获取inode信息;
  3. 根据inode信息,判断当前用户是否具有访问权限,有就指向对应的数据block,没有就返回权限拒绝。
  4. 根据inode信息,找到文件数据所在的block,并读出数据。
ls -i

ls -i命令可以查看目录下所有文件对应的inode号

>> ls -i
33574991 anaconda-ks.cfg      2086 test  33574994 test.txt
inode

inode本身也需要占据硬盘存储空间。linux系统在格式化的时候,操作系统会自动将硬盘分为两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或者256字节。通常情况下不需要关注单个inode的大小,只需要计算inode的总数。而inode总数需要在格式化的时候确定。

df -i

df -i命令可以查看硬盘分区的inode总数和已使用情况。

>> df -i
Filesystem               Inodes IUsed   IFree IUse% Mounted on
/dev/mapper/centos-root 8910848 26029 8884819    1% /
devtmpfs                 230602   384  230218    1% /dev
tmpfs                    233378     1  233377    1% /dev/shm
tmpfs                    233378   487  232891    1% /run
tmpfs                    233378    16  233362    1% /sys/fs/cgroup
/dev/sda1                524288   328  523960    1% /boot
tmpfs                    233378     1  233377    1% /run/user/0

linux使用inode机制所产生的特有现象

linux inode号与文件名分离,因为会导致Linux系统会出现不同于window的特殊现象。

  1. 文件名如果包含特殊字符,可能无法正常删除。这时可以通过直接删除inode,就能够起到删除文件的作用。
find ./* -inum 节点号 -delete
  1. 移动文件或者重命名文件,只是改变文件名,并不会影响inode号。
  2. 打开一个文件以后,系统就以inode号来识别这个文件,不再考虑文件名。

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

inode耗尽故障

前面提到过,硬盘分区的inode总数在格式化之后就已经固定,而每个文件必须要有一个inode,因此就有可能发生inode节点耗光的情况,但硬盘空间还剩不少,却无法创建新文件。同时这也是一种攻击方式,所以一些共用的文件就必须做磁盘限额,以防止系统正常运行被干扰。

修复该故障需要找出大量占用inode的文件并删除。

硬链接与软链接

硬链接

通过文件系统的inode链接来产生新的文件名,而不是产生新的文件,这称为为硬链接。

一般情况下,每个inode号对应一个文件名,但是Linux允许多个文件名指向同一个inode号。这意味着可以使用不同的文件名访问同一个文件。

ln命令可以实现这一点。

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

运行该命令之后,源文件与目标文件的inode号相同,都指向同一个inodeinode信息中的链接数会增加1。

注意:不能对目录使用硬链接。
通过mkdir命令创建一个新目录,其硬链接数只能有2个:目录本身为1个硬链接,目录下面的隐藏目录.(点号)是该目录的又一个硬链接,也占一个链接数。

软链接

软连接类似于windows的快捷方式,可以快速链接到文件或目录。

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

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

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

参考

Linux inode 详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值