-10 +

vfs

vfs 介绍

Unix 的设计哲学就是 一切皆文件,但是由于存在多种文件系统,如 FAT,ZFS,btrfs 等, 为了保证用户层的视图统一, 就出现了 VFS。

vfs 相关 API

首先我们来看看于文件系统相关的一些对象,和对应的数据结构:

看完相关的数据结构,我们来看看各个结构是如何组织的:

我们根据上图来解释一下各个数据结构:

我们可以通过下面的 systemtap 脚本来验证上面的这个图中的信息:

stap -e '
    probe syscall.read { 
        file = @cast(task_current(), "task_struct")->
            files->fdt->fd[fd] & ~3; 
        if(!file) 
            next; 
        dentry = @cast(file, "file")->f_path->dentry;  
        inode = @cast(dentry, "dentry")->d_inode;
        
        printf("READ %d: file '%s' of size '%d' on device %s\n", 
            fd, d_name(dentry), @cast(inode, "inode")->i_size,
            kernel_string(@cast(inode, "inode")->i_sb->s_id)); 
    } '  -c 'cat /etc/passwd > /dev/null'

看完了 vfs 在 linux kernel 中的代码结构,我们来看看 vfs 使用时,kernel 内部都做了些什么操作:

vfs in systemtap

我们首先来看看 vfs 在 systemtap 中的已经定义的一些别名:

[root@docker221 tapset]# pwd
/usr/share/systemtap-2.9-3823/share/systemtap/tapset

[root@docker221 tapset]# grep 'probe vfs' -R linux/vfs.stp
probe vfs.do_sync_read = kernel.function("do_sync_read") !,
probe vfs.do_sync_read.return = kernel.function("do_sync_read").return !,
probe vfs.do_sync_write = kernel.function("do_sync_write") !,
probe vfs.do_sync_write.return = kernel.function("do_sync_write").return !,
probe vfs.block_sync_page = kernel.function("block_sync_page") ?
probe vfs.block_sync_page.return = kernel.function("block_sync_page").return ?
probe vfs.buffer_migrate_page = kernel.function("buffer_migrate_page") ?
probe vfs.buffer_migrate_page.return =
probe vfs.__set_page_dirty_buffers = kernel.function("__set_page_dirty_buffers")
probe vfs.__set_page_dirty_buffers.return =
probe vfs.do_mpage_readpage = kernel.function("do_mpage_readpage")
probe vfs.do_mpage_readpage.return = kernel.function("do_mpage_readpage").return
probe vfs.add_to_page_cache =
probe vfs.add_to_page_cache.return =
probe vfs.remove_from_page_cache =
probe vfs.remove_from_page_cache.return =
probe vfs.read = kernel.function("vfs_read")
probe vfs.read.return = kernel.function("vfs_read").return
probe vfs.readv = kernel.function("vfs_readv")
probe vfs.readv.return = kernel.function("vfs_readv").return
probe vfs.write = kernel.function("vfs_write")
probe vfs.write.return = kernel.function("vfs_write").return
probe vfs.writev = kernel.function("vfs_writev")
probe vfs.writev.return = kernel.function("vfs_writev").return
probe vfs.open = kernel.function("vfs_open") ?
probe vfs.open.return = kernel.function("vfs_open").return ?

参考

关于我

85 后程序员, 比较熟悉 Java,JVM,Golang 相关技术栈, 关注 Liunx kernel,目前痴迷于分布式系统的设计和实践。 研究包括但不限于 Docker Kubernetes eBPF 等相关技术。

Blog

Code

Life

Archive