明明白白我的心--fs series(11)
时间:2010-08-23 来源:mtloveft
|
struct vfsmount {
struct super_block *mnt_sb; /* 指向该文件系统的 superblock */ |
当前进程中,所有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文件系统。稍微有点绕滕,就是为了解决隔离用户间的文件系统。










