明明白白我的心--fs series(11)
时间:2010-08-23 来源:mtloveft
struct vfsmount {
struct super_block *mnt_sb; /* 指向该文件系统的 superblock */ |



在各种所谓的根下,这个指针指向该数据结构自身。为什么说所谓的根呢?因为这个根是可以设置的。
所以任何一个文件系统都可以设置成根文件系统。当然通过chroot命令就可以改变了。
同时,vfsmount数据结构中还有mnt_child和mnt_mounts两个队列头,只要上一层的vfsmount数据结构存在, 就通过mnt_child链入上一层vfsmount结构的mnt_mounts队列中。这样通过mnt_mounts队列,可以找到所有安装到这个文件系统下的所有其他文件系统了。 再来看看主从关系图

同时,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文件系统。稍微有点绕滕,就是为了解决隔离用户间的文件系统。