一、什么是根文件系统

根文件系统首先是内核启动时所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根文件系统学习总结相关推荐

  1. linux根文件系统配置,Linux学习笔记__ Linux根文件系统详解

    Linux根文件系统详解 文件系统: rootfs:根文件系统 FHS:Linux boot:系统启动相关的文件,如内核.initrd.以及grub(bootloader) /dev: 设备文件 块 ...

  2. 嵌入式软件开发之------浅析linux根文件系统挂载(九)

    Linux代码版本:linux4.4 导读:前些天拿到供应商的一块arm64开发板,需要对其新CPU进行测试评估.需要将公司自己的系统移植上去测试一些参数.在挂载公司的cpio包的时候,出现解压失败. ...

  3. 构建基本的嵌入式Linux根文件系统

    构建基本的嵌入式Linux根文件系统 其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的<Linux全线移植文档>做的.有些东西我也不清楚,只是跟着做,做 ...

  4. 嵌入式开发之linux根文件系统移植

    目录 前言 一.创建根文件系统目录 二.添加命令与实用程序 2.1 编译和安装 busybox 2.2 拷贝busybox内的小程序 三.添加lib库文件 3.1 拷贝工具链内的动态库 3.2 拷贝工 ...

  5. 制作嵌入式Linux根文件系统

    文章目录 1. 根文件系统布局 2. 使用BusyBox生成二进制工具 2-1. 获取BusyBox源码 2-2. 配置BusyBox 2-2-1. 选择编译静态库 2-2-2. 选择交叉编译工具链 ...

  6. 采用busybox的嵌入式Linux根文件系统的的制作方法

    在嵌入式Linux操作系统越中文件系统作为操作系统的重要组成部分,用于控制对数据文件及设备的存取,提供对文件和目录的分层组织形式,数据缓冲以及对文件存取权限的控制.根文件系统一直是Linux系统不可或 ...

  7. 嵌入式Linux根文件系统制作

    嵌入式Linux根文件系统制作 一.根文件系统简介 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的 ...

  8. TQ210 —— 嵌入式Linux根文件系统的设计与实现

    嵌入式Linux根文件系统的设计与实现 1.Linux文件系统基本概念 文件系统类型:FAT32.NTFS.EXT2. EXT3. JFFS2. YAFFS2. NFS Linux根文件系统目录结构: ...

  9. 嵌入式Linux 根文件系统rootfs的构建

    前言 最近翻出来十年前的ARM9开发板:AT91SAM9261EK,芯片是原Ateml的AT91系列,之前开发的资料,因为更换电脑,基本上找不到了,还好部分经验记录在了[博客]上,所以,这次为了继续学 ...

最新文章

  1. Google Guice使用入门
  2. 支付宝服务商子商户_支付宝服务商新功能,无需商家花钱的消费券怎么参与
  3. [AHOI2008] 紧急集合
  4. Linux 双显卡 黑屏,Ubuntu16.04安装 双显卡安装Nvidia驱动 登录循环 黑屏(通用 终结此类问题)转载...
  5. Angular应用ng build的一些边界情况boundary condition
  6. 如何阅读一本书 pdf_如何快速阅读一本书?
  7. (转)利用MS AJAX 扩展服务器端控件
  8. 论文浅尝 - ICML2020 | 跨域对齐的图最优运输算法
  9. 12.20今日头条实习面试总结-算法工程师
  10. 1.5编程基础之循环控制 32 求分数序列和 python
  11. JavaSelenium处理页面Table以及Table中随机位置的数据
  12. 操作系统概述 操作系统第一章知识点归纳总结
  13. 【研发设计】多人开发模式下的Git工作流介绍
  14. ssm高仿bilibili视频网站
  15. Nginx的keeplive
  16. NumPy下载与安装
  17. 新经济的50个新热点(转自:商务部网站)
  18. 正则判断手机号地区_手机号码验证方法(正则验证)
  19. 管家婆服务器端口修改,211端口被占用,如何设置
  20. input中使用pattern属性

热门文章

  1. GCN代码超详解析Two-stream adaptive graph convolutional network for Skeleton-Based Action Recognition(三)
  2. PAT练习之字符串处理
  3. 1.9 函数-C++编程模块
  4. count/distinct/group by的用法总结
  5. Mybatis分页插件PageInfo
  6. 达梦数据库DM8飞腾版本、芯版本获取地址,最新达梦数据库各国产化版本获取方法,达梦数据库DM8使用手册、产品文档获取
  7. Python re(正则表达式)简明教程
  8. matlab中textread 函数
  9. Python基础09 面向对象的进一步拓展
  10. 注视点估计(二维法)