声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是关于file system 实现的介绍!
一个文件系统只有mount之后才可以使用,每次mount之后,内核里都构造了一个vfsmount结构。
vfsmount结构很重要,先看看代码
struct vfsmount { struct list_head mnt_hash; /* 用于hash散列表的list */ struct vfsmount *mnt_parent; /* 指向父文件系统的 vfsmount */ struct dentry *mnt_mountpoint; /* 指向安装点的dentry */ struct dentry *mnt_root; /* 指向mount的文件系统的根目录的dentry */
struct super_block *mnt_sb; /* 指向该文件系统的 superblock */ struct list_head mnt_mounts; /* 所有mount到该文件系统的 vfsmount 的 list */ struct list_head mnt_child; /* 子文件系统的 list */ int mnt_flags; /* mount 标记,只读,共享等 */ /* 4 bytes hole on 64bits arches */ const char *mnt_devname; /* 设备名称 e.g. /dev/dsk/hda1 */ struct list_head mnt_list; /* 用于加入到namespace的链表 */ struct list_head mnt_expire; /* 用于加入期限链表 */ struct list_head mnt_share; /* 用于加入到共享链表 */ struct list_head mnt_slave_list;/* 所有slave 都加入到这个链表 */ struct list_head mnt_slave; /* 用于加入到mnt_slave_list */ struct vfsmount *mnt_master; /* 指向master 的指针 */ struct mnt_namespace *mnt_ns; /* 指向mount文件系统的进程的 namespace */ int mnt_id; /* mount 唯一的标识 */ int mnt_group_id; /* group 唯一的标识 */ /* * We put mnt_count & mnt_expiry_mark at the end of struct vfsmount * to let these frequently modified fields in a separate cache line * (so that reads of mnt_flags wont ping-pong on SMP machines) */ atomic_t mnt_count; /* 引用计数 */ int mnt_expiry_mark; int mnt_pinned; int mnt_ghosts; #ifdef CONFIG_SMP int __percpu *mnt_writers; #else int mnt_writers; #endif };
|
先看看他加入到namespace的链表
当前进程中,所有mount命令执行后,vfs都通过struct list_head mnt_list加入到这个进程的struct list_head list链表里。
struct list_head mnt_hash 用于hash散列表的list,是用父vfsmount和安装点的dentry算出的hash值。
hash链表结构如下
通过struct list_head mnt_hash链如hash表,这样mount到同一目录的文件系统将被链入
到同一链表上,因为他们的hash值相同。
再来看看vsfmount父子关系结构图
指针mnt_parent指向安装点在安装前的vfsmount数据结构,就是上一层的vfsmount数据结构。
在各种所谓的根下,这个指针指向该数据结构自身。为什么说所谓的根呢?因为这个根是可以设置的。
所以任何一个文件系统都可以设置成根文件系统。当然通过chroot命令就可以改变了。
同时,vfsmount数据结构中还有mnt_child和mnt_mounts两个队列头,只要上一层的vfsmount数据结构存在,
就通过mnt_child链入上一层vfsmount结构的mnt_mounts队列中。这样通过mnt_mounts队列,可以找到所有安装到这个文件系统下的所有其他文件系统了。
再来看看主从关系图
指针mnt_master指向这个文件系统从属的文件系统的vfsmount 结构。
同时,vfsmount数据结构中还有mnt_slave_list和mnt_slave两个队列头,只要mnt_master数据结构存在,
就通过mnt_slave链入它从属的vfsmount结构的mnt_slave_list队列中。这样通过mnt_slave_list队列,
可以找到所有从属于这个文件系统下的所有其他文件系统了。
为什么有master 和slave 呢?这主要为了解决文件系统mount安全问题.每个用户可以有自己的mount的文件系统。
而且其他用户看不到这个用户mount的文件系统。为了,让cdrom这样的文件系统mount时,各个用户都能看到他,
所以又把说有的vfsmount用mnt_share链接到一个链表上,这样cdrom自动mount程序mount完成后,其他用户也可以看到这个
cdrom文件系统。当然,master下挂载其他文件系统时会传播到他的slave文件系统。而slave下挂载其他文件系统不会传播
到master文件系统。稍微有点绕滕,就是为了解决隔离用户间的文件系统。
阅读(1426) | 评论(0) | 转发(0) |