文件是储存在硬盘上的,硬盘最小的存储单位叫做扇区sector
,每个扇区存储512
个字节。操作系统读取硬盘的时候,不会一个个扇区地读取,而是一次性地读取多个扇区,这个逻辑单位叫做块block
。由多个扇区构成的快,才是文件存取的最小单位。块的大小,最常见的是4KB
,即连续八个sector
组成一个block
。
文件数据存储在块中,那么就需要一个地方来存储文件的元信息(meta information),比如文件的创建者、创建日期、大小等关键信息。在linux系统中,存储文件元信息的区域就叫做inode
,中文译名为索引结点
,也叫i结点
。
inode
包含除文件名以外的很多文件元信息,例如:字节数、属主UserID
、属组UserGroup
、读写执行权限、时间戳等。
文件名存放在目录中,但linux系统内部并不适用文件名,而是使用inode号
标识文件。也就是说linux系统里文件名其实是inode号
便于识别的别称。
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 test
test: directory
>> file test.txt
test.txt: ASCII text
在UI层面,用户通过文件名来打开文件,实际上,Linux内部将该过程分为四步:
inode号
;inode号
,获取inode信息;inode
信息,判断当前用户是否具有访问权限,有就指向对应的数据block
,没有就返回权限拒绝。inode
信息,找到文件数据所在的block
,并读出数据。ls -i
命令可以查看目录下所有文件对应的inode号
>> ls -i
33574991 anaconda-ks.cfg 2086 test 33574994 test.txt
inode
本身也需要占据硬盘存储空间。linux系统在格式化的时候,操作系统会自动将硬盘分为两个区域。一个是数据区,存放文件数据;另一个是inode
区,存放inode
所包含的信息。每个inode
的大小,一般是128字节
或者256字节
。通常情况下不需要关注单个inode
的大小,只需要计算inode
的总数。而inode
总数需要在格式化的时候确定。
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系统会出现不同于window的特殊现象。
inode
,就能够起到删除文件的作用。find ./* -inum 节点号 -delete
inode
号。inode号
来识别这个文件,不在考虑文件名。这种情况下软件更新会变得简单,可以在不关闭软件的情况下进行更新,而不需要重启。因为系统通过inode
号,识别运行中的文件,不通过文件名。更新时就以同样的文件名,生成一个新的inode
,不会影响运行中的文件。等到下一次运行这个软件的时候,文件名自动指向新的inode
,旧版文件的inode
则被回收。
前面提到过,硬盘分区的inode
总数在格式化之后就已经固定,而每个文件必须要有一个inode
,因此就有可能发生inode
节点耗光的情况,但硬盘空间还剩不少,却无法创建新文件。同时这也是一种攻击方式,所以一些共用的文件就必须做磁盘限额,以防止系统正常运行被干扰。
修复该故障需要找出大量占用inode
的文件并删除。
通过文件系统的inode
链接来产生新的文件名,而不是产生新的文件,这称为为硬链接。
一般情况下,每个inode
号对应一个文件名,但是Linux允许多个文件名指向同一个inode
号。这意味着可以使用不同的文件名访问同一个文件。
ln
命令可以实现这一点。
ln 源文件或目录 目标文件或目录
运行该命令之后,源文件与目标文件的inode
号相同,都指向同一个inode
。inode
信息中的链接数会增加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
链接数不会因此发生变化。