- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩教学视频: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。
第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是
因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。
虚拟文件系统英文全称Virtual file system,缩写为VFS,又称为虚拟文件切换系统(virtual filesystem switch)。所有的文件系统都要先经过虚拟文件系统层,虚拟文件系统相当于制定了一套规则,如果你想写一个新的文件系统,只需要遵守这套规则就可以了。
VFS虽然是用C语言写的,但使用了面向对象的设计思路。
inode
的i_nlink
调试补丁为
src/0001-debug-vfs.patch
,看其中的debug_inode_nlink()
函数。
在ext2文件系统下测试:
fallocate -l 100M image
mkfs.ext2 -F image
mount -t ext2 image /mnt
cd /mnt
echo "i love os" > file
cat file # 这时文件的i_nlink为1,只有一个dentry
ln file link # 创建硬链接i_nlink加1
cat file # 这时文件的i_nlink为2,有两个dentry
ln -s file slink # 创建软链接i_nlink不变
cat file # 这时文件的i_nlink不变还是为2
ls # 这时目录的i_nlink为3
mkdir dir # 只有创建文件夹i_nlink才会增加,创建文件不会
ls # 这时目录的i_nlink为4
对文件创建硬链接时ln file link
,增加inode->i_nlink
的流程如下:
linkat // 系统调用
do_linkat
vfs_link
ext2_link // ext2_dir_inode_operations的.link方法
inode_inc_link_count
inc_nlink
inode->__i_nlink++
不能对目录创建硬链接。在目录dir1
下创建dir2
文件夹,父目录dir1
的inode->i_nlink
增加的流程如下:
mkdir // 系统调用
do_mkdirat
vfs_mkdir
ext2_mkdir // ext2_dir_inode_operations 的.mkdir方法
inode_inc_link_count
inc_nlink
inode->__i_nlink++
super_block
的s_mounts
调试补丁为
src/0001-debug-vfs.patch
,看其中的debug_sb_mounts()
函数。
每个挂载路径下有3个struct mount
,分别是一次调用vfs_create_mount()
和两次调用clone_mnt()
创建的:
mount
do_mount
path_mount
do_new_mount
do_new_mount_fc
vfs_create_mount
list_add_tail(&mnt->mnt_instance, &mnt->mnt.mnt_sb->s_mounts)
do_add_mount
graft_tree
attach_recursive_mnt
propagate_mnt
propagate_one
copy_tree
clone_mnt // 调用了两次
list_add_tail(&mnt->mnt_instance, &sb->s_mounts)
通过inode
得到完整路径
调试补丁为
src/0001-debug-vfs.patch
,看其中的debug_get_full_path()
函数。