inode表结构浅析
下图以ext文件系统为参考,以4k块大小分区,简单描述一下ext文件系统的数据结构原理,如果有任何错误,烦请各位指出
inode 索引节点
硬盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。
扇区的大小,是2的N次方倍。分区的大小可以有多样,1k、2k、4k…以4k块大小来说明。4k块大小分为8个扇区,每个扇区对应512字节。每一块也称为block,文件以block为单位进行存储,并且每一个bolck只能属于一个文件,若文件大小不足4k,也按照4k大小的块来存储。inode的数量是格式化的时候指定的,理论上来说,inode的数量和block的数量是越接近越好,但是在实际过程中一一对应是很难的,所以一般格式化的时候会按照服务器的用途来指定一定比例的inode数量。
#df 查看系统每个分区bolck的数量
#df -i 查看系统每个分区inode的数量
每个分区都有一个独立的inode table
元数据也是在inode里面,元数据也是会占用磁盘空间的。
指针:数据块的路径
直接指针:有12个指针,一个4k, 可以存储4*12=48K的数据块。
间接指针:第十三个指针,指向下一个文件块的指针,也是4k块大小,4k块来说,可以划分1024个指针,里面的指针才是指向真正的数据块。一共可以存储1024*4k=4M的数据块,那么文件在4M左右范围里面,可以用间接指针就可以完成。
两重指针:第十四个指针。也是指向一个4k指针数据块,4k指针块再指向1024个指针数据块,
每个指针可以存放1024个4k数据,所以可以存储1024*1024*4k=4G的数据块。
三重指针:跟两重指针工作原理类似,最后可以存放1024*1024*1024*4k=4t的数据块。
inode table是缓存在内存里面的,所以查询速度还是很快的。一般来说,在系统里面删掉文件的操作并不是删掉数据块,而是删掉inode table里面的元数据,这里解释一下元数据,元数据就是数据块的属性,例如:名字,身高等这些就可以理解为元数据。所以,这个就是为什么删掉了文件以后,只要没有新的文件覆盖掉原有的数据块,数据一般都可以恢复的原因。很多文件系统,例如windows下面的fat和ntfs也是同样的原理。一般来说,在磁盘里面的数据都是连续写入,由于有时候会删除掉部分数据,使得磁道里面有些空位置并不能一下子连续的存储下一个文件,一般这样都是分散存储在不同的磁道里面,当读取这一部分的数据,磁盘的指针要来回转多几个圈,造成性能下降,这就是文件碎片的由来。所以隔一段时间进行碎片整理是必须的。但是现在一些新的硬盘,如SSD固态硬盘,就没有磁道这些说法,所以就并不需要像传统的机械硬盘一样进行碎片整理。
磁盘里的数据块有文件和目录,这两者的inode的存储方式也是不同的。
在inode table里面文件是直接引用一个inode的号码,而目录则是在inode table里面的目录项下面存储文件名和文件inode之间的映射。
复制、删除、移动对inode的影响
cp 复制:新的文件会分配一个空闲的inode号,在inode表中生成新条目
在目录中创建一个目录项,将名称与inode编号关联
拷贝数据生成新的文件,是两个完全不相同的数据块。
rm 删除:链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖,如果恢复inode的元数据的时候文件就会马上链接恢复。
mv 移动:如果mv命令的目标和源在相同的同一个分区下面,作为mv命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!所以在同一个分区里面移动文件的速度是非常的快的原因。
如果目标和源在一个不同的文件系统,mv相当于cp和rm
硬链接和软链接的区别
什么是硬链接?
硬链接:指向同一个inode的多个文件路径。(简单理解的意思就是一个人有两个名字,例如张三,他的外号叫老张,又叫小三,其实都是同一个人)
特性:
1 目录不支持硬链接
2 硬链接不能跨文件系统(不能跨分区)
3 创建硬链接会增加inode引用计数;
创建硬链接文件命令
ln 源文件 硬链接文件…
1
2
|
ln [OPTION]... [-T] TARGET LINK_NAME (1st form) ln - make links between files |
删掉其中一个硬链接文件,其他硬链接文件不受影响
什么是软链接(符号链接)
软链接:指向同一个文件路径的另一个文件路径;
特性:
1 符号链接于文件是两人各自独立的文件,各有自己的inode;对原文件创建符号链接
不回增加引用计数;
2 支持对目录创建符号链接,可以跨文件系统;
3 删除符号链接文件不影响原文件;但删除原文件,符号指定的路径即使不存在,此时会
变成无效链接。
注意:符号链接文件的大小是其指定的文件的路径字符串的字节数
创建软链接文件命令
1
2
3
4
|
#ln -s 原始文件路径文件1 软链接文件1..2..创建软链接 -s, --symbolic make symbolic links instead of hard links |
创建软链接的时候,必须要用绝对路径!
原始文件相对于软链接文件路径,而不是相对于当前工作目录。
两者区别:
这里以个人理解做了一个小表格
练习题
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
1
|
# ls -ld /var/l*[0-9]*[[:lower:]] |
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
1
|
# ls -ld /etc/[0-9]*[^0-9] |
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
1
|
# ls -ld /etc/[^[:alpha:]][[:alpha:]]* |
4、显示/etc目录下所有以m开头以非数字结尾的文件或目录
1
|
# ls -ld /m*[^0-9] |
5、显示/etc目录下,所有以.d结尾的文件或目录
1
|
# ls -ld /etc/*.d |
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
1
|
# ls -ld /etc/[mnrp]*.conf |
7、使用别名命令,每日将/etc/目录下所有文件,备份到/testdir/下独立的新目录下,并要求新目录格式为backupYYYY-mm-dd,备份过程可见
1
2
|
# alias bkday='cp -av /etc/ /testdir/backup`date +%F`' # bkday |
8、先创建/testdir/rootdir目录,再复制/root所有下文件到该目录内,并要求保留原有权限
1
|
#cp -av /root /testdir/rootdir |
9、如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
1
|
# mkdir -p /testdir/dir1/{x,y}/{a,b} |
10、如何创建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
1
|
# mkdir -pv /testdir/dir2/{x/{a,b},y} |
11、如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
1
|
# mkdir -p /testdir/dir{3,4,5/dir{6,7}} |
原创文章,作者:~微风~,如若转载,请注明出处:http://www.178linux.com/28244