深度解析Linux根文件系统的挂载过程
《深度解析Linux根文件系统的挂载过程》要点: 在前面的文章中介绍《Linux操作系统启动过程》,而Linux系统的根文件系统(root file system)的挂载过程则是其中一个重要环节,下面这部分内容来自于网络,经整理分享如下,希望能给这部份知识点比较迷茫的朋友一点帮助. 一、rootfs的种类总的来说,rootfs分为两种:虚拟rootfs和真实rootfs.现在kernel的发展趋势是将更多的功能放到用户空间完成.以保持内核的精简.虚拟rootfs也是各linux发行厂商普遍采用的一种方式.可以将一部份的初始化工作放在虚拟的rootfs里完成.然后切换到真实的文件系统.
二、rootfs文件系统的挂载过程这里说的rootfs不同于上面分析的rootfs.这里指的是系统初始化时的根结点.即/结点.它是其于内存的rootfs文件系统.这部份之前在>和文件系统中已经分析过.为了知识的连贯性这里再重复一次. [code lang=”c”] Init_rootfs的代码如下: [code lang=”c”] err = bdi_init(&ramfs_backing_dev_info); err = register_filesystem(&rootfs_fs_type); return err; 这个函数很简单,就是注册了rootfs的文件系统. [code lang=”c”]static void __init init_mount_tree(void) mnt = do_kern_mount("rootfs","rootfs",NULL); init_task.nsproxy->mnt_ns = ns; root.mnt = ns->root; set_fs_pwd(current->fs,&root); 在这里,将rootfs文件系统挂载.它的挂载点默认为”/”.最后切换进程的根目录和当前目录为”/”.这也就是根目录的由来.不过这里只是初始化.等挂载完具体的文件系统之后,一般都会将根目录切换到具体的文件系统.所以在系统启动之后,用mount命令是看不到rootfs的挂载信息的. 三、虚拟文件系统的挂载根目录已经挂上去了,可以挂载具体的文件系统了. [code lang=”c”]static int __init kernel_init(void * unused) if (sys_access((const char __user *) ramdisk_execute_command,0) != 0) { /* do_basic_setup()是一个很关键的函数,所有直接编译在kernel中的模块都是由它启动的.代码片段如下: [code lang=”c”]static void __init do_basic_setup(void) Do_initcalls()用来启动所有在__initcall_start和__initcall_end段的函数,而静态编译进内核的modules也会将其入口放置在这段区间里. [code lang=”c”]rootfs_initcall(populate_rootfs);[/code] 也就是说会在系统初始化的时候会调用populate_rootfs进行初始化.代码如下: (编辑:ASP站长网) |