目录
一、inode和block概述
文件是存储在硬盘上的,硬盘的最小存储单位叫做 “扇区” (sector),每个扇区存储 512 字节。一般连续八个扇区组成一个 “块” (block),一个块是 4K 大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在 “块” 中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做 inode。 因此,一个文件必须占用一个 inode,并且至少占用一个 block。inode 不包含文件名,文件名是存放在目录当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件。Linux 系统内部不使用文件名,而使用 inode 号码来识别文件。对于系统来说,文件名只是 inode 号码便于识别的别称,文件名和 inode 号码是一一对应关系,每个 inode 号码对应一个文件名。所以当用户在 Linux 系统中试图访问一个文件时,系统会先根据文件名去查找它对应的 inode 号码,通过 inode 号码获取 inode 信息,根据 inode 信息看该用户是否具有访问这个文件的权限,如果有就指向对应的数据 block,并读取数据。
二、inode的内容
inode 包含文件的元信息,具体来说有以下内容:
- 文件的字节数
- 文件拥有者的 User ID
- 文件的 Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:
简写 | 全名 | 中文名 | 含义 |
---|---|---|---|
atime | access time | 访问时间 | 文件内容最后被访问的时间 |
mtime | modify time | 修改时间 | 文件内容最后被修改的时间 |
ctime | change time | 变化时间 | 文件的元数据发生变化的时间(比如权限,所有者等) |
- 链接数,即有多少文件名指向这个 inode
- 文件数据 block 的位置
三、查看文件的 inode 号码
查看文件名对应的 inode 号码有两种方式:
ls -i 文件名
stat 文件名
示例:
[root@localhost ~]# touch test1
[root@localhost ~]# ls -i test1
134315755 test1
[root@localhost ~]# stat test1
文件:"test1"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:134315755 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2022-04-17 22:45:06.440591747 +0800
最近更改:2022-04-17 22:45:06.440591747 +0800
最近改动:2022-04-17 22:45:06.440591747 +0800
创建时间:-
四、 inode的大小
inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。每个inode的大小,一般是 128 字节或 256 字节。假定在一块 1GB 的硬盘中,每个 inode 节点的大小为 128 字节,每 1KB 就设置一个 inode,那么 inode table 的大小就会达到 128MB,占整块硬盘的 12.8%。
通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。inode 的总数在格式化时就给定了,执行 “df-i” 命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的 inode 数量。
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3 50124288 157092 49967196 1% /
devtmpfs 478743 389 478354 1% /dev
tmpfs 482689 1 482688 1% /dev/shm
tmpfs 482689 1476 481213 1% /run
tmpfs 482689 16 482673 1% /sys/fs/cgroup
/dev/sda2 256000 10 255990 1% /home
tmpfs 482689 6 482683 1% /run/user/42
tmpfs 482689 19 482670 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
由于 inode 号码与文件名分离,导致 Linux 系统具备以下几种特有的现象:
- 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用
- 移动文件或重命名文件,只是改变文件名,不影响 inode 号码
- 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名
- 文件数据被修改保存后,会生成一个新的 inode 号码
[root@localhost ~]# touch test
[root@localhost ~]# ls -i
134315715 anaconda-ks.cfg 134315755 test1 67844519 视频 202716132 下载
134315723 initial-setup-ks.cfg 67844518 公共 81779 图片 202716133 音乐
134315757 test 81778 模板 134315767 文档 134315766 桌面