Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629437
  • 博文数量: 120
  • 博客积分: 2284
  • 博客等级: 大尉
  • 技术积分: 1330
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-25 10:49
个人简介

http://guliqun1983.blog.163.com/blog/static/501116852011730535314/

文章分类
文章存档

2013年(23)

2012年(23)

2011年(74)

分类: LINUX

2013-04-24 10:30:19

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见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) |
给主人留下些什么吧!~~