目录
- inode
- inode与文件
- inode与目录
- inode与文件系统
- inode与cp、rm、mv
inode索引节点
- inode( index node)表中包含文件系统所有文件列表
- 一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括:
- 文件类型,权限, UID, GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳(atime,ctime,mtime)
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
inode中的指针
直接指针
- 直接指向数据块,最多12个指针(前12个指针都是直接指针),即12*data_block大小,若数据块大小为4K,则,12*4 K = 48K的数据
间接指针
- 若一个数据块大小为4K,一个指针所占大小4Byte,所以一个间接指针指向一个数据块,就有4K/4Byte = 1024个指针,一个指针又指向4K数据块,即4K*1024 = 4M
双重指针
-类同双重指针,指针数为,4K/4B * 4K/4B =1024*1024个,每个又指向4K数据块,所以一个双重指针最大的数据块为4K*1024*1024 = 4G
三重指针
- 同理,三级指针,有1024*1024*1024个指针,最大大小为4G*1024 = 4TB
文件和目录与inode的关系
- 文件的引用是通过inode号来寻找的,但人是通过文件名寻找文件的
- 一般inode表占用文件系统1%的空间
- 每个分区都会有自己的inode编号
- 目录中存放目录项,目录项存放文件名列表,inode表放对应文件名的inode号,inode号映射磁盘数据
graph LR
目录项中的文件名-->inodeTable中的inode
inodeTable中的inode-->文件数据
inode与文件系统空间
- inode编号占磁盘空间,它是有限的,当inode编号使用完之后,系统会认为磁盘利用率100%
- df -i可以看到文件系统的inode使用情况
实验
把分区/boot的inode使用完,再磁盘空间并没有用完,但系统依然认为文件系统使用率100%,文件系统空间增加是因为文件虽然没有数据,但是会生成元数据,也会占文件系统空间
[root@centos7 boot]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 49G 5.6G 44G 12% /
devtmpfs 896M 0 896M 0% /dev
tmpfs 911M 7.8M 904M 1% /dev/shm
tmpfs 911M 35M 877M 4% /run
tmpfs 911M 0 911M 0% /sys/fs/cgroup
/dev/sda1 1014M 440M 575M 44% /boot
/dev/sda3 30G 106M 30G 1% /data
tmpfs 183M 28K 183M 1% /run/user/0
/dev/sr0 8.8G 8.8G 0 100% /run/media/root/CentOS 7 x86_64
[root@centos7 boot]#df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 25600000 688160 24911840 3% /
devtmpfs 229181 425 228756 1% /dev
tmpfs 233163 3 233160 1% /dev/shm
tmpfs 233163 1007 232156 1% /run
tmpfs 233163 16 233147 1% /sys/fs/cgroup
/dev/sda1 524352 524352 0 100% /boot
/dev/sda3 15360000 4190 15355810 1% /data
tmpfs 233163 18 233145 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
[root@centos7 boot]#touch f11111
touch: cannot touch ‘f11111’: No space left on device
cp命令和inode
- 在目标分区中的inode表中生成一个inode号
- 在目的目录中创建一个目录项,将名称与新的inode号映射
- 将数据拷贝到新的文件
rm命令和inode
- 链接数递减,释放inode号
- 把数据块放在空闲列表中,标注其空闲,但是不删除数据,直到有其他数据占用
- 在目录项中删除文件名
mv命令和inode
- 如果mv命令的目标和源在相同的文件系统
- 在新的目录项中创建新的文件名,新的文件名映射给文件的inode
- 删除文件inode映射,删除旧的目录条目中的旧文件名
- 因为在同一个文件系统中,inode号不变,只是改变了目录项和文件名,inode指向不变,没有数据移动
- 如果目标和源在不同的文件系统,mv相当于先做cp再做rm