每个inode节点的大小,一般是128字节或256字节。磁头一次至少读取一整个block的数据。硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个block。
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
通过文件名找到inode,以"/dev/tty1"为例说明:
a.首先看路径的首字符是不是/,判断是相对路径还是绝对路径,绝对路径是从root的inode开始找
b. 通过读root的inode的数据块(放在super_block中),里面是一堆dir_entry,看有没有跟dev这个name字符串匹配的,若有则返回dev的inode_nr,即dir_entry中的inode_nr
c.有了dev的inode_nr,读取dev的inode
d.有了dev的inode就可以读取dev的数据块,因为dev是一个目录,再查找目录里面有没有跟tty1匹配的name字符串,
若有则返回tty1的inode_nr,即dir_entry中的inode_nr
f. 有了tty1的inode_nr,就可以读取tty1中的数据,这儿是一个设备文件,只有一个设备号存在i_zone[0]中
总结:通过文件名的根目录,或相对目录开始,经过inode和data block的循环,逐步找到完整文件名对应的inode,进一步找到文件数据所在block。
在同一个文件分区,inode唯一;在不同文件分区,inode可能重复。
硬链接
Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hardlink)。
ln命令可以创建硬链接:ln 源文件 目标文件 运行这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。
inode信息中,一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。
软链接
除了硬链接以外,还有一种特殊情况。
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
inode使得我们在Linux系统中使用find等文件操作的命令时,完虐Windows速度。Unix/Linux系统中,“一切都是文件”,目录(directory),管道、套接字也都是是一种文件。
Linux采用VFS(VirtualFile System)虚拟文件系统,VFS是异构的文件系统之上的软件粘合层,因为VFS可以无缝的使用多个不同类型的文件系统,通过VFS,可以访问文件系统的的系统调用提供统一的抽象接口,使得操作目录、管道、套接字等,都是通过open()、write()、read()、close()完成,而不用考虑底层。通过VFS就可以抽象的访问接口而屏蔽了底层文件系统和物理介质之间的差异。
硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
28bytes能记录的block块是有限的,因此inode采用12直接地址映射,1个一级地址,1个二级地址,1个三级地址,因此1k的block文档最大值为12k+256k+256*256k+256*256*256k约等于16G。相当于:直接12个叶子,一棵256叶子的一层树,一棵256*256的二层树,一棵三层树。
相关命令:
可以用stat命令,查看某个文件的inode信息:
stat example.txt
软链接命令为:
ln -s 源文文件或目录 目标文件或目录
硬链接命令为:
ln 源文件 目标文件
使用ls -i命令,可以看到文件名对应的inode号码:
ls -i example.txt
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
df -i
查看每个inode节点的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
Dumpe2fs命令可以查看inode,block大小,数量。感觉是超级块的信息。
当inode满,但bolock剩余很多时:
删除tmp文件:find /tmp -type f -exec rm {} \;
删除0字节文件:sudo find /home -type f -size 0 -exec rm {} \;
调整inode节点数目(调整inode数会格式化磁盘):
1。卸载文件系统 umount /data0
2。建立文件系统,指定inode节点数 mkfs.ext3 /dev/sda6 -N 18276352
3。修改fstab文件 vi /etc/fstab /dev/sda6 /data0 ext3 defaults 1 2
4,挂载文件系统 mount -a
5。查看修改后的inode参数 dumpe2fs -h /dev/sda6 | grep node
参考:
https://bbs.csdn.net/topics/392046537?locationNum=3&fps=1
https://blog.csdn.net/ljheee/article/details/70173771?locationNum=13&fps=1
https://www.zhihu.com/question/59658850/answer/168164077