浅谈linux中的根文件系统(rootfs的原理和介绍)【转】

news2024/9/30 15:34:51

浅谈linux中的根文件系统(rootfs的原理和介绍)【转】
转自:https://www.cnblogs.com/sky-heaven/p/13742173.html

linux中有一个让不少初学者都不是特别清楚的概念,叫作“根文件系统”。我接触linux前先后后也好几年了,可是对这个问题,至今也不是特别的清楚,至少无法给出一个很全面很到位的解释。因而,今天咱们就来理一理这个话题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、先交代一下文件系统linux

在开始讨论根文件系统这个话题以前,咱们必首先交代一下文件系统这个概念。毕竟,根文件系统只是文件系统中的一种比较特殊的形式而已。根据伟大的百度百科:web

文件系统是操做系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操做系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操做和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户创建文件,存入、读出、修改、转储文件,控制文件的存取,当用户再也不使用时撤销文件等。shell

文件系统的重要性,我想你们都很清楚,不用多说了。这里有一句话,我以为很是精辟并且到位的点出了文件系统在linux中的重要性:数据结构

尽管内核是linux的核心,但文件倒是用户与操做系统交互所采用的主要工具。这对linux来讲尤为如此,这是由于在UNIX传统中,它使用文件I/O机制管理硬件设备和数据文件。svg

2、什么是根文件系统工具

而后来解释一下“根文件系统”这个名词的基本概念。一样引自百度百科的解释:操作系统

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

展开来细说就是,根文件系统首先是一种文件系统,该文件系统不只具备普通文件系统的存储数据文件的功能,可是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载以后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。咱们要明白文件系统和内核是彻底独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操做系统的,会出现没法加载文件系统的错误。

3、根文件系统为何这么重要

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

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

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

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

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

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();

一、sysfs文件系统目前尚未挂载到rootfs的某个挂载点上,后续init程序会把sysfs挂载到rootfs的sys挂载点上;

二、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文件系统。

[1*]处设置了根目录的名字为“/”;
[2*]处设置了vfsmount中的root目录;
[3*]处设置了vfsmount中的超级块;
[4*]处设置了vfsmount中的文件挂载点,指向了本身;
[5*]处设置了vfsmount中的父文件系统的vfsmount为本身;

5、根文件系统各个经常使用目录简介

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

/etc/:存储重要的配置文件。
/bin/:存储经常使用且开机时必须用到的执行文件。
/sbin/:存储着开机过程当中所需的系统执行文件。
/lib/:存储/bin/及/sbin/的执行文件所需的连接库,以及Linux的内核模块。
/dev/:存储设备文件。

注:五大目录必须存储在根文件系统上,缺一不可。

6、顺便说下linux文件系统的经常使用目录

Linux文件系统中通常有以下几个目录:

/bin目录
该目录下存放全部用户均可以使用的、基本的命令,这些命令在挂接其它文件系统以前就可使用,因此/bin目录必须和根文件系统在同一个分区中。
/bin目录下经常使用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,咱们在利用Busybox制做根文件系统时,在生成的bin目录下,能够看到一些可执行的文件,也就是可用的一些命令。

/sbin 目录
该目录下存放系统命令,即只有管理员可以使用的命令,系统命令还能够存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录类似,在挂接其余文件系统以前就可使用/sbin,因此/sbin目录必须和根文件系统在同一个分区中。
/sbin目录下经常使用的命令有:shutdown,reboot,fdisk,fsck等,本地用户本身安装的系统命令放在/usr/local/sbin目录下。

/dev目录
该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各类设备,即经过读写某个设备文件操做某个具体硬件。好比经过”dev/ttySAC0”文件能够操做串口0,经过”/dev/mtdblock1”能够访问MTD设备的第2个分区。

/etc目录
该目录下存放着各类配置文件,对于PC上的Linux系统,/etc目录下的文件和目录很是多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否须要配置文件。在嵌入式系统中,这些内容能够大为精减。

/lib目录
该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,好比:/bin /sbin 目录下的程序。

/home目录
用户目录,它是可选的,对于每一个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。

/root目录
根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

/usr目录
/usr目录的内容能够存在另外一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这代表/usr目录下的内容能够在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其余主机相关的,可变的文件应该保存在其余目录下,好比/var。/usr目录在嵌入式中能够精减。

/var目录
与/usr目录相反,/var目录中存放可变的数据,好比spool目录(mail,news),log文件,临时文件。

/proc目录
这是一个空目录,常做为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也能够操做其中的文件控制系统。

/mnt目录
用于临时挂载某个文件系统的挂接点,一般是空目录,也能够在里面建立一引发空的子目录,好比/mnt/cdram /mnt/hda1 。用来临时挂载光盘、硬盘。

/tmp目录
用于存放临时文件,一般是空目录,一些须要生成临时文件的程序用到的/tmp目录下,因此/tmp目录必须存在并能够访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hystrix-熔断机制

1.1. 雪崩效应 熔断发生在服务端,降级发生在客户端; 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程…

使用pysimplegui+opencv编写一个摄像头的播放器

需求 使用pysimplegui和opencv实现一个播放器,播放 摄像头的画面。 代码实现 import cv2 import time from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: i…

【英文干货】【Word_Search】找单词游戏(第1天)

本期主题:Mindfulness(意识力) 本期单词: Awareness 意识 Breathing 呼吸 Calm 平静的 De-Stress 减压 Feelings 感受,情感 Inspection 调查 Meditation 冥想 Peace 和平 Quiet 安静的 Recollection 回忆 R…

深入理解java对象的内存布局

概述: 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 在HotSpot虚拟机里,…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点: 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容:…

vmware 安装Rocky-9.3系统

安装系统截图 安装完成,启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限,输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容:#PermitRootLogin prohibit-password 添加&#xff1a…

13个常见的 WordPress 块编辑器问题以及如何修复它们

您在使用 WordPress 块编辑器时遇到过错误吗? WordPress 在 2019 年用名为 Gutenberg 的全新内容编辑器取代了旧的经典编辑器。该编辑器使用块在 WordPress 中创建内容。然而,有时,在使用它时可能会遇到恼人的问题。 在本文中,我…

知识图谱的广泛应用与价值

目录 前言1 语义搜索2 知识问答2.1 问答对的深度关联2.2 文本挖掘与答案精准性2.3 知识图谱问答的全面服务 3 辅助推荐4 辅助大数据分析4.1 知识图谱推理的应用4.2 知识图谱的数据分析4.3 动态本体技术的引入 5 故障诊断5.1 故障诊断系统的应用5.2 知识图谱在语言理解中的作用5…

【Android12】Android Framework系列---Adb和PMS安装apk源码流程

Adb和PMS安装apk源码流程 adb install命令 通过adb install命令可以将apk安装到Android系统(注意:特定类型的apk,比如persist类型是无法通过adb安装的) 下述命令中adb解析install命令,并调用Android PackageManagerS…

S2-08 ESP-IDF开发 : 存储

S2-06 和 S2-07 暂时先不发,课上没给同学们将,分别是 DMA 和 USB 章节,作为专项讲 存储 ESP32 系列芯片中,不同型号的芯片所携带的 ROM、SRAM、RCT SRAM、PSRAM 以及 Flash大小不同,他们的作用如下: SRAM…

centos 启动nacos pg版本

背景:支持国产化需求,不再使用mysql 1.修改插件 git clone https://github.com/wuchubuzai2018/nacos-datasource-extend-plugins.git cd nacos-datasource-extend-plugins/nacos-postgresql-datasource-plugin-ext mvn package编译成功后,…

虚拟机将1.15版本的nginx推送到阿里云镜像仓库

1、docker images 2、docker login --usernamealiyun7279061146 registry.cn-shenzhen.aliyuncs.com 3、docker tag 53f3fd8007f7 registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15 docker push registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15

C++实战:类的包含编译模型

文章目录 一、实战概述二、实战步骤(一)C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序,查看结果 (二)C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

【Leetcode 144.二叉树的前序遍历】将二叉树每个节点的值以前序遍历的顺序存入数组中

int* preorderTraversal( struct TreeNode*root, int* returnSize) { }解答代码: int TreeSize(struct TreeNode*root){return rootNULL?0:TreeSize(root->left)TreeSize(root->right)1;}void Prevorder(struct TreeNode*root,int*a,int*pi){if(rootNULL)re…

内网穿透的应用-如何使用Docker部署Redis数据库并结合内网穿透工具实现公网远程访问

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

代码随想录算法训练DAY25|回溯2

算法训练DAY25|回溯2 216.组合总和III 力扣题目链接 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n …

【并发编程】synchornized原理

📝个人主页:五敷有你 🔥系列专栏:并发编程 ⛺️稳重求进,晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下: 注意: 原理之synchornized 轻量…

压力容器多开孔结构静力分析APP

压力容器多开孔结构静力分析APP对带有多个接管的容器结构在内压作用下进行静力分析,考察相邻接管开孔对容器及接管强度的影响。通过对容器和接管的几何尺寸、材料属性、载荷等进行参数化,以方便设计工程师对不同参数下的此类结构进行仿真分析。 近年来&a…

透明拼接屏方案,从底层设计到应用尽情了解

一、引言 随着科技的飞速发展,显示技术也在不断创新。透明拼接屏方案作为一种新型的显示技术,以其独特的透明设计和灵活的拼接特性,在商业展示、广告、建筑等领域得到广泛应用。本文将深入探讨透明拼接屏方案的设计、实现方式、技术逻辑、应…

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写:RTC。显示年、月、日、时、分、秒、星期,自动计算闰年,能够区分每个月的天数。 RTC特点:能从RTC获取到具体的日期时间,断掉后再开机时间仍然准确(需要纽扣电池&#xff…