inode介绍
文章插图
linux
在Linux操作系统中,将文件系统分为2部分,一部分为数据区,一部分为元数据区,这里的元数据就是inode,它存取文件的创建者,文件的创建日期,修改日期,访问日期,文件大小等信息 。
获取inode节点内容只要在某个文件系统下,创建一个文件,用stat命令就可以获取到inode节点内容 。
[MySQL@mysql test]$ stat test.log文件:"test.log"大小:9块:8IO 块:4096普通文件设备:fd02h/64770dInode:8393435硬链接:1权限:(0664/-rw-rw-r--)Uid:( 2001/mysql)Gid:( 4001/mysql)最近访问:2020-09-28 15:34:05.452763004 +0800最近更改:2020-09-28 15:34:05.452763004 +0800最近改动:2020-09-28 15:34:05.517763243 +0800
读取文件原理当你执行cat test.log命令时,Linux是如何读取到文件内容的呢 。其实在Linux系统内部,是不使用文件名的,真正使用的是inode节点号,首先系统会通过文件名找到对应的inode节点号,然后通过inode节点号,获取到inode节点信息,最后,通过获取的inode节点信息,读取需要数据内容 。
文章插图
文件系统inode计算方式在这里用xfs类型的文件系统举例 。
[mysql@mysql test]$ df -Th|grep -i home文件系统类型1K-块已用可用 已用% 挂载点/dev/mApper/centos-home xfs10G324M9.7G4% /home
可以看到/home的文件系统类型为xfs,那如何知道/home文件系统的inode节点数呢 。[mysql@mysql test]$ df -i|grep -i home文件系统Inode 已用(I)可用(I) 已用(I)% 挂载点/dev/mapper/centos-home524288035452425261% /home
从上面的结果可以看到/home文件系统的inode节点总数为5242880,你是否想知道5242880是怎么计算出来的呢,在这里可以用xfs_info命令来获取更详细的信息了 。[mysql@mysql test]$ xfs_info /homemeta-data=https://www.isolves.com/dev/mapper/centos-home isize=512agcount=4, agsize=655360 blks=sectsz=512attr=2, projid32bit=1=crc=1finobt=0 spinodes=0data=bsize=4096blocks=2621440, imaxpct=25=sunit=0swidth=0 blksnaming=version 2bsize=4096ascii-ci=0 ftype=1log=internalbsize=4096blocks=2560, version=2=sectsz=512sunit=0 blks, lazy-count=1realtime =noneextsz=4096blocks=0, rtextents=0
在这里可以获取到isize=512,这个就是一个inode占用0.5k字节,maxpct=25代表占用整个文件系统总大小的25% 。所以inode总数可以这样计算:2621440 * 4 * 0.25 / 0.5= 5242880
在一个文件系统里,inode节点资源是有限的,如果小文件过多,将inode节点数用光了,就算此时文件系统还有空余磁盘空间,也无法创建新文件的,这个时候要不删除无用的文件,要不就扩容inode节点总数 。
在这里在扩展一个知识点,当你有在文件系统里创建了一个带特殊符号的文件时,直接用文件名是无法删除的,在这里就来测试一下 。
wen[mysql@mysql test]$ ls -l总用量 0-rw-rw-r-- 1 mysql mysql 0 9月28 16:13 -test.jldfa[mysql@mysql test]$ rm -test.jldfarm:无效选项 -- tTry 'rm ./-test.jldfa' to remove the file "-test.jldfa".Try 'rm --help' for more information. [mysql@mysql test]$ [mysql@mysql test]$ rm "-test.jldfa"rm:无效选项 -- tTry 'rm ./-test.jldfa' to remove the file "-test.jldfa".Try 'rm --help' for more information.
怎么办,这里可以通过2种方式删除第一种,根据系统提示用rm ./-test.jldfa进行删除
第二种,利用inode号进行删除
j [mysql@mysql test]$ ls -li 总用量 08393433 -rw-rw-r-- 1 mysql mysql 0 9月28 16:13 -test.jldfa[mysql@mysql test]$ pwd/home/mysql/test[mysql@mysql test]$ find /home/mysql/test -inum 8393433/home/mysql/test/-test.jldfa[mysql@mysql test]$ find /home/mysql/test -inum 8393433 -delete[mysql@mysql test]$ ll总用量 0
可以看到文件已经删除了 。【带你重新认识Linux系统的inode】
推荐阅读
- 从Linux源码看Socket的listen及连接队列
- linux网络编程常见API详解
- 一文带你了解Notta是什么
- CPU越来越热吗 一文带你看懂怎么选
- 2 种从 Linux 终端下载文件的方法
- 在 Ubuntu 和其他 Linux 发行版上使用 Yarn
- Linux 软链接和硬链接
- Linux下diff的操作详解
- 带你实现一个静态服务器,超详细
- Linux|优麒麟22.04 LTS正式发布:全新桌面、10多款自研应用