Linux根文件系统学习总结

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux根文件系统学习总结相关的知识,希望对你有一定的参考价值。

一、什么是根文件系统

根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。

二、根文件系统作用

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。

根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。例如:

init进程的应用程序必须运行在根文件系统上;
根文件系统提供了根目录“/”;
linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab这个文件中;
shell命令程序必须运行在根文件系统上,譬如ls、cd等命令;
总之:一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin /sbin等目录下的shell命令,还有/lib目录下的库文件等···)相配合才能工作。

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录和文件。

三、如何在内核中挂载根文件系统

init/main.c->
 
 start_kernel()->vfs_caches_init(totalram_pages)–>
 
   mnt_init()–>
 
     /* sysfs用来记录和展示linux驱动模型,sysfs先于rootfs挂载是为全面展示linux驱动模型做好准备 */ 
     /* mnt_init()调用sysfs_init()注册并挂载sysfs文件系统,然后调用kobject_create_and_add()创建fs目录 */ 
     sysfs_init();
 
     /* init_rootfs()注册rootfs,然后调用init_mount_tree()挂载rootfs */ 
     init_rootfs();
 
     init_mount_tree();

1、sysfs文件系统目前还没有挂载到rootfs的某个挂载点上,后续init程序会把sysfs挂载到rootfs的sys挂载点上;
2、rootfs是基于内存的文件系统,所有操作都在内存中完成;也没有实际的存储设备,所以不需要设备驱动程序的参与。基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统。
 
start_kernel 
  vfs_caches_init 
    mnt_init 
      init_rootfs注册rootfs文件系统 
      init_mount_tree 挂载rootfs文件系统 
        vfs_kern_mount 
          mount_fs 
            type->mount其实是rootfs_mount 
              mount_nodev 
                fill_super 其实是ramfs_fill_super 
                  inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0); 
                  sb->s_root = d_make_root(inode); 
                    static const struct qstr name = QSTR_INIT(“/”, 1);[1*] 
                    __d_alloc(root_inode->i_sb, &name); 
          … 
          mnt->mnt.mnt_root = root;[2*] 
          mnt->mnt.mnt_sb = root->d_sb;[3*] 
          mnt->mnt_mountpoint = mnt->mnt.mnt_root;[4*] 
          mnt->mnt_parent = mnt;[5*] 
root.mnt = mnt; 
        root.dentry = mnt->mnt_root; 
        mnt->mnt_flags |= MNT_LOCKED; 
        set_fs_pwd(current->fs, &root); 
        set_fs_root(current->fs, &root); 
  … 
  rest_init 
  kernel_thread(kernel_init, NULL, CLONE_FS);
在执行kernel_init之前,会建立roofs文件系统。

四、根文件系统各个常用目录简介

正常来说,根文件系统至少包括以下目录:

/etc/:存储重要的配置文件。
/bin/:存储常用且开机时必须用到的执行文件。
/sbin/:存储着开机过程中所需的系统执行文件。
/lib/:存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。
/dev/:存储设备文件。
注:五大目录必须存储在根文件系统上,缺一不可。

以上是关于Linux根文件系统学习总结的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统目录名称命名规则以及用途总结

目录及常命令总结

linux内核文件系统

从ramdisk根文件系统启动Linux 二

从ramdisk根文件系统启动Linux成功

根文件系统构建