免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4403 | 回复: 17
打印 上一主题 下一主题

[文件系统] fs_struct结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-11 19:31 |只看该作者 |正序浏览
struct fs_struct
{
        atomic_t count;
        rwlock_t lock;
        int umask;
        struct dentry *root,*pwd,*altroot;
        struct vfsmount *rootmnt,*pwdmnt,*altrootmnt;
};
请问此结构体中的指针*root与*rootmnt是否指向整个系统的根节点,还是指向当前进程所在文件系统的根节点?
我的理解觉得是第一种情况,但是有书上说是第2种情况,所以只好请教大家了

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
18 [报告]
发表于 2013-12-16 08:46 |只看该作者
asuka2001 发表于 2013-12-13 16:56
回复 14# humjb_1983

假设init进程开始时通过"root="传参挂载了/dev/sda1为根文件系统,/dev/sda1上的文 ...

相当的专业~,明白了,感谢指点,以后相关问题再向你请教!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
17 [报告]
发表于 2013-12-13 16:56 |只看该作者
回复 14# humjb_1983

假设init进程开始时通过"root="传参挂载了/dev/sda1为根文件系统,/dev/sda1上的文件系统是ext4。挂载时其挂载点将由mount系统调用创建,记录为ext4_vfsmnt。

那么对于所有的进程,假设它们不再更改自己的名字空间:

fs_struct->root.dentry ==ext4_vfsmnt->mnt_root
fs_struct->mnt == ext4_vfsmnt

而ext4_vfsmnt->mnt_root,则是挂载/dev/sda1时,由ext4 super block创建出来的。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
16 [报告]
发表于 2013-12-13 16:47 |只看该作者
本帖最后由 asuka2001 于 2013-12-13 16:48 编辑

回复 14# humjb_1983

我所看的内核3.11.5中,fs_struct是这样定义的:

struct path {
        struct vfsmount *mnt;
        struct dentry *dentry;
};
struct fs_struct {
        int users;
        spinlock_t lock;
        seqcount_t seq;
        int umask;
        int in_exec;
        struct path root, pwd;
};


对于名字空间中的节点,path->vfsmount代表了该节点所处的文件系统。如果没有这个信息,假设paht->dentry对应的是目录,继续检索目录下的其他文件内核就只有抓瞎了!除非所有的目录项都在dcache中。

所以在名字空间中,每当经过一个文件系统的挂载点的时候,path->vfsmount都会改变为它所处的实际文件系统。


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
15 [报告]
发表于 2013-12-13 16:37 |只看该作者
回复 14# humjb_1983

A filesystem is a hierarchical storage of data adhering to a specific structure.

In Unix, filesystems are mounted at a specific mount point in a global hierarchy known as a namespace.

严格来说:我们经常混用根文件系统这个名词,有得时候指的是挂载到名字空间中"/"的文件系统。有得时候我们用它代指名字空间。它们实际上是有区别的!


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
14 [报告]
发表于 2013-12-13 16:26 |只看该作者
asuka2001 发表于 2013-12-13 14:56
回复 12# humjb_1983

1. 虽然 fs_struct->root与 fs_struct->rootmnt->mnt_root没有必然联系,但是一般 ...

感谢指点~~
namespace通常仅用在基于容器的虚拟化场景吧,当所有进程都处于同一个namespace时,情况应该就比较简单了吧。
这种情况下,能否再总结下这几个字段的关系~,呵呵

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
13 [报告]
发表于 2013-12-13 14:56 |只看该作者
本帖最后由 asuka2001 于 2013-12-13 14:58 编辑

回复 12# humjb_1983

1. 虽然 fs_struct->root与 fs_struct->rootmnt->mnt_root没有必然联系,但是一般而言两者相等是常态。我们挂载文件系统时,一般是从根开始将整个文件系统树挂载到进程的名字空间(namespace,虽然大部分时候我们将其与根文件系统含混使用)中的某个节点。

2. 这个是错误的。因为进程的根文件系统所处的文件系统不一定是父进程的根文件系统。

例如父进程的根文件系统是nfs。我们chroot到/mnt/ext4/child_root时。子进程的fs_struct->rootmnt对应的就应该是ext4文件系统,而不是父进程fs_strcut->rootmnt对应的nfs文件系统。

3. 这个是错误的:fs_struct->root一定是代表进程名字空间中"/"所对应的dentry。

只不过子进程的名字空间中"/"可以与父进程名字空间中"/"对应不同的dentry。

4. 当子进程chroot到了/mnt/ext4/child_root时,fs_struct->rootmnt对应的是ext4文件系统。

假设我们此时再挂载ntfs到子进程名字空间中的"/mnt/ntfs" (从父进程的名字空间来看应该是"/mnt/ext4/child_root/mnt/ntfs/")。

进入该目录,此时:子进程的pwdmnt对应的就是ntfs文件系统了。而rootmnt仍然对应的是ext4文件系统。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
12 [报告]
发表于 2013-12-13 12:44 |只看该作者
asuka2001 发表于 2013-12-13 10:35
回复 10# humjb_1983

在进程中,fs_struct->root 决定了路径的检索起点。但是进程的根文件系统类型是什 ...

是否可以这样理解?
1、当未作chroot的时候,fs_struct->root==fs_struct->rootmnt->mnt_root
2、当chroot后,fs_struct->root==chroot设置的root,而fs_struct->rootmnt->mnt_root保持不变
3、fs_struct->root并不一定是/,仅当fs_struct->rootmnt->mnt_mountpoint==/时,fs_struct->root才==/  ?
4、rootmnt和pwdmnt之间是啥关系?还能明示下?
感谢!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
11 [报告]
发表于 2013-12-13 10:35 |只看该作者
回复 10# humjb_1983

在进程中,fs_struct->root 决定了路径的检索起点。但是进程的根文件系统类型是什么,由fs_struct->rootmnt来决定。

fs_struct->root可以是fs_struct->rootmnt这个文件系统树的根节点,也同样可以是该文件系统树中的任意一个目录节点。
所以fs_struct->root与fs_struct->rootmnt->mnt_root没有必然联系。

至于文件系统的mnt_root和mnt_mountpoint的区别我想上面已经解释的很清楚了!LZ的问题只要理解了这几者的区别也就不言而喻了。
   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2013-12-13 09:54 |只看该作者
asuka2001 发表于 2013-12-13 09:21
回复 6# humjb_1983

总结一下,那么mount->vfsmount->mnt_root是对于挂载的文件系统树自己的根路径。

明白了,感谢~
另外请再确认下,fs_struct->root跟fs_struct->rootmnt->mnt_mountpoint或mnt_root具体有啥关系?
楼主的问题:fs_struct->root是根文件系统的根,还是当前挂载的文件系统的根?fs_struct->rootmnt和pwdmnt的关系?
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP