Linux内核文件系统-虚拟文件系统-举几个例子

建议点击这里查看个人主页上的最新原文

一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。

第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是

因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。

虚拟文件系统英文全称Virtual file system,缩写为VFS,又称为虚拟文件切换系统(virtual filesystem switch)。所有的文件系统都要先经过虚拟文件系统层,虚拟文件系统相当于制定了一套规则,如果你想写一个新的文件系统,只需要遵守这套规则就可以了。

VFS虽然是用C语言写的,但使用了面向对象的设计思路。

inodei_nlink

调试补丁为

0001-debug-vfs.patch

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文件夹,父目录dir1inode->i_nlink增加的流程如下:

mkdir // 系统调用
  do_mkdirat
    vfs_mkdir
      ext2_mkdir // ext2_dir_inode_operations 的.mkdir方法
        inode_inc_link_count
          inc_nlink
            inode->__i_nlink++

super_blocks_mounts

调试补丁为

0001-debug-vfs.patch

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得到完整路径

调试补丁为

0001-debug-vfs.patch

src/0001-debug-vfs.patch

,看其中的debug_get_full_path()函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值