手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux虚拟文件系统(安装根文件系统)

[日期:2012-02-10] 来源:Linux社区  作者:bullbat [字体: ]

mount_root操作

[cpp]
  1. void __init mount_root(void)  
  2. {  
  3. #ifdef CONFIG_ROOT_NFS   
  4.     if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {  
  5.         if (mount_nfs_root())  
  6.             return;  
  7.   
  8.         printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");  
  9.         ROOT_DEV = Root_FD0;  
  10.     }  
  11. #endif   
  12. #ifdef CONFIG_BLK_DEV_FD   
  13.     if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {  
  14.         /* rd_doload is 2 for a dual initrd/ramload setup */  
  15.         if (rd_doload==2) {  
  16.             if (rd_load_disk(1)) {  
  17.                 ROOT_DEV = Root_RAM1;  
  18.                 root_device_name = NULL;  
  19.             }  
  20.         } else  
  21.             change_floppy("root floppy");  
  22.     }  
  23. #endif   
  24. #ifdef CONFIG_BLOCK/*这里是一般流程*/   
  25.     create_dev("/dev/root", ROOT_DEV);/*用系统调用创建"/dev/root"*/  
  26.     mount_block_root("/dev/root", root_mountflags);  
  27. #endif   
  28. }  
[cpp]
  1. void __init mount_block_root(char *name, int flags)  
  2. {  
  3.     /*从cache中分配空间*/  
  4.     char *fs_names = __getname_gfp(GFP_KERNEL  
  5.         | __GFP_NOTRACK_FALSE_POSITIVE);  
  6.     char *p;  
  7. #ifdef CONFIG_BLOCK   
  8.     char b[BDEVNAME_SIZE];  
  9. #else   
  10.     const char *b = name;  
  11. #endif   
  12.     /*获得文件系统类型,如果在bootoption里有, 
  13.     则就为这个文件系统类型,如果没有指定, 
  14.     则返回ilesytem链上所有类型,下面再对每个进行尝试.*/  
  15.     get_fs_names(fs_names);  
  16. retry:  
  17.     for (p = fs_names; *p; p += strlen(p)+1) {  
  18.         /*实际的安装工作,这里调用了mount系统调用 
  19.         将文件系统挂到/root目录,p为文件系统类型,由get_fs_names得到 
  20.         */  
  21.         int err = do_mount_root(name, p, flags, root_mount_data);  
  22.         switch (err) {  
  23.             case 0:  
  24.                 goto out;  
  25.             case -EACCES:  
  26.                 flags |= MS_RDONLY;  
  27.                 goto retry;  
  28.             case -EINVAL:  
  29.                 continue;  
  30.         }  
  31.             /* 
  32.          * Allow the user to distinguish between failed sys_open 
  33.          * and bad superblock on root device. 
  34.          * and give them a list of the available devices 
  35.          */  
  36. #ifdef CONFIG_BLOCK   
  37.         __bdevname(ROOT_DEV, b);  
  38. #endif   
  39.         printk("VFS: Cannot open root device \"%s\" or %s\n",  
  40.                 root_device_name, b);  
  41.         printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");  
  42.   
  43.         printk_all_partitions();  
  44. #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT   
  45.         printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "  
  46.                "explicit textual name for \"root=\" boot option.\n");  
  47. #endif   
  48.         panic("VFS: Unable to mount root fs on %s", b);  
  49.     }  
  50.   
  51.     printk("List of all partitions:\n");  
  52.     printk_all_partitions();  
  53.     printk("No filesystem could mount root, tried: ");  
  54.     for (p = fs_names; *p; p += strlen(p)+1)  
  55.         printk(" %s", p);  
  56.     printk("\n");  
  57. #ifdef CONFIG_BLOCK   
  58.     __bdevname(ROOT_DEV, b);  
  59. #endif   
  60.     panic("VFS: Unable to mount root fs on %s", b);  
  61. out:  
  62.     putname(fs_names);  
  63. }  
  64.    
[cpp]
  1. static int __init do_mount_root(char *name, char *fs, int flags, void *data)  
  2. {  
  3.     /*mount系统调用来做实际的安装文件系统工作*/  
  4.     int err = sys_mount(name, "/root", fs, flags, data);  
  5.     if (err)  
  6.         return err;  
  7.     /*改变当前路径到根目录*/  
  8.     sys_chdir("/root");  
  9.     ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;  
  10.     printk("VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",  
  11.            current->fs->pwd.mnt->mnt_sb->s_type->name,  
  12.            current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ?  
  13.            " readonly" : "", MAJOR(ROOT_DEV), MINOR(ROOT_DEV));  
  14.     return 0;  
  15. }  

到此,根文件系统的安装过程算是完成了,中间关于mount等系统调用将在后面分析。可以看出总的步骤主要有:

1,创建一个rootfs,这个是虚拟的rootfs,是内存文件系统(和ramfs),后面还会指向具体的根文件系统;

2,从系统启动参数中获取设备文件名以及设备号;

3,调用系统调用创建符号链接,并调用mount系统调用进程实际的安装操作;

4,改变进程当前目录;

5,移动rootfs文件系统根目录上得已经安装文件系统的安装点;
rootfs特殊文件系统没有被卸载,他只是隐藏在基于磁盘的根文件系统下了。

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款