基本结构
- 超级块
- 在ext4文件系统最开头的部分
- 记录了整个文件系统中所包含的文件的元数据,
df
命令读取的就是超级块中的内容,所以执行很快
- 超级块副本
- inode
- 记录每个文件的大小(非实际大小,用于
ls
命令)、权限、编号等信息,但文件名是记录在父目录的inode中 - 文件的
r
权限,是读取文件内容;而目录的r
权限,是读取目录下的文件名称
- 记录每个文件的大小(非实际大小,用于
- datablock
- 记录数据,inode和datablock是链式结构
ls
统计的是inode里面的文件大小,而du
统计的是文件datablock的总大小
1 | [root@localhost ~]# ls -li anaconda-ks.cfg |
ext4
1 | [root@localhost sdb1]# df -Th |
touch
文件大小为0(此时只有inode,没有datablock),inode编号为12
1 | [root@localhost sdb1]# touch afile |
ls
命令是4字节(包含换行符),du
命令是4K(ext4中的默认数据块大小是4K),因此如果存储很多小文件,存储空间的开销也会很大,因此会有专门针对小文件的网络文件系统
1 | [root@localhost sdb1]# echo 123 > afile |
cp
afile和afile2的inode编号是不一样的(datablock也是不一样的),所以修改afile不会影响到afile2
1 | [root@localhost sdb1]# cp afile afile2 |
mv
afile2改名为afile3,但inode编号没有发生改变(对应的datablock也没有发生变化),实际修改的是/mnt/sdb1
目录的datablock(文件名和inode的对应关系),因此在同一个分区内mv大文件也非常快(因为inode和datablock是由分区内的文件系统统一管理的)
1 | [root@localhost sdb1]# mv afile2 afile3 |
vim
1 | # 写入123 |
1 | # Session A,追加aaa |
rm
rm的本质:使得inode与文件名的链接断开,时间复杂度为O(1)
1 | [root@localhost sdb1]# rm afile4 |
ln
ln的本质:使得更多的文件名指向inode
1 | # 1表示有一个文件名与该inode建立了链接 |
硬链接(不能跨文件系统/分区)
1 | # 2表示afile和bfile都与同一个inode建立了链接,也称为硬链接(inode相同!!) |
软链接(符号链接,可以跨文件系统/分区)
1 | [root@localhost sdb1]# ls -li afile |
facl
1 | [root@localhost sdb1]# ls -li afile |