
Linux中有一个概念对于许多初学者来说并不是特别清楚,它被称为“根文件系统”. 我已经与linux接触了几年了,但是到目前为止,这个问题仍然不是很清楚,至少我不能给出非常全面和就地的解释. 因此,今天我们将处理这个主题.
首先,首先说明文件系统
在开始讨论根文件系统主题之前,我们必须首先解释文件系统的概念. 毕竟,根文件系统只是文件系统的一种相对特殊的形式. 根据伟大的百度百科全书:
文件系统是操作系统用来指定存储设备(通常是基于NAND Flash的磁盘和固态驱动器)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法. 负责在操作系统中管理和存储文件信息的软件组织称为文件管理系统,或简称为文件系统. 文件系统由三个部分组成: 文件系统的界面,用于对象操作和管理的软件集合,对象和属性. 从系统角度来看,文件系统是为文件存储设备组织和分配空间,负责文件存储以及保护和检索存储的文件的系统. 具体来说,它负责为用户创建文件,存储,读取,修改,转储文件,控制文件访问以及在不再使用用户时撤消文件.
我认为文件系统的重要性对每个人都很清楚. 这是一个句子根文件系统 原理,我认为这很敏锐,指出了Linux中文件系统的重要性:
尽管内核是Linux的核心,但文件是用户与操作系统进行交互的主要工具. 对于Linux尤其如此,因为在UNIX传统中,它使用文件I / O机制来管理硬件设备和数据文件.
第二,什么是根文件系统
然后解释术语“根文件系统”的基本概念. 也引用了百度百科的解释:
首先,根文件系统是内核启动时挂载的第一个文件系统. 内核代码映像文件保存在根文件系统中,并且系统引导程序在挂载后将从根文件系统初始化一些基本初始化. 脚本和服务被加载到内存中以运行.
详细扩展它,根文件系统首先是文件系统. 该文件系统不仅具有存储普通文件系统的数据文件的功能,而且与普通文件系统相比,其特殊之处在于它是内核启动时安装的第一个文件系统. 内核代码的映像文件存储在根文件系统中. 挂载根文件系统后,系统引导程序将加载一些初始化脚本(例如rcS等). inittab)和服务加载到内存中以运行. 我们需要了解文件系统和内核是完全独立的部分. 将内核以嵌入式下载方式移植到开发板上,无法真正启动Linux操作系统,将出现无法加载文件系统的错误.
三,为什么根文件系统如此重要
根文件系统前面有一个“根”,表示加载其他文件系统的是“根”,因此,如果没有这样的根,则无法加载其他文件系统.
根文件系统包含系统启动所需的目录和关键文件,以及挂载其他文件系统所需的文件. 例如:
init进程的应用程序必须在根文件系统上运行;根文件系统提供根目录“ /”; Linux在挂载分区时所依赖的信息存储在根文件系统/ etc / fstab中; shell该命令程序必须在根文件系统上运行,例如ls,cd和其他命令;
简而言之: 一组linux系统,只有内核本身不能工作,必须具有rootfs(配置文件位于etc目录的顶部,shell命令位于/ bin / sbin目录,/库位于/ lib目录文档等)一起工作.
Linux启动时,必须挂载的第一个文件系统是根文件系统. 如果系统无法从指定的设备挂载根文件系统,则系统将退出并启动并显示错误. 成功后,您可以自动或手动挂载其他文件系统. 因此,一个系统中可以同时存在不同的文件系统. 在Linux中将文件系统与存储设备相关联的过程称为mount. 使用mount命令将文件系统附加到当前文件系统层次结构(根). 执行挂载时,请提供文件系统类型,文件系统和挂载点. 将根文件系统装入根目录“ /”后,根文件系统在根目录下有多个目录,文件: / bin / sbin / mnt等,然后将其他分区装入到/ mnt目录在/ mnt目录下的此分区中,有许多目录和文件.
四,如何在内核中挂载根文件系统
init / main.c->
start_kernel()-> vfs_caches_init(totalram_pages)–>

mnt_init()–>
/ * sysfs用于记录和显示linux驱动程序模型. 在rootfs之前先挂载sysfs,以准备全面显示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 =根; [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_init,NULL,CLONE_FS);
在执行kernel_init之前,将建立Roofs文件系统.
在[1 *]处,根目录的名称设置为“ /”;

vfsmount中的根目录设置为[2 *];
vfsmount中的超级块设置为[3 *];
vfsmount中的文件安装点设置为[4 *]并指向自己;
[5 *]将vfsmount中的父文件系统的vfsmount设置为其自身;
五,介绍根文件系统的每个公用目录
通常,根文件系统至少包含以下目录:
/ etc /: 存储重要的配置文件. / bin /: 存储启动时必须使用的常用执行文件. / sbin /: 存储引导过程中所需的系统执行文件. / lib /: 链接库,用于存储/ bin /和/ sbin /的执行文件以及Linux的内核模块. / dev /: 存储设备文件.
注意: 五个主要目录必须存储在根文件系统上,并且是必不可少的.
六个. 顺便说一下,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目录为: 关闭,重新引导,fdisk,fsck等. 本地用户安装的系统命令位于/ usr / local / sbin目录中.
/ dev目录

设备文件存储在此目录中. 设备文件是Linux中唯一的文件类型. 在Linux系统下,各种设备都作为文件来访问根文件系统 原理,即,特定的硬件通过读写特定的设备文件来操作. 例如,可以通过“ dev / ttySAC0”文件来操作串行端口0,而可以通过“ / dev / mtdblock1”来访问MTD设备的第二个分区.
/ etc目录
此目录中有各种配置文件. 对于PC上的Linux系统,/ etc目录中有许多文件和目录. 这些目录文件是可选的,并且取决于系统中的应用程序. 取决于这些程序是否需要配置文件. 在嵌入式系统中,这些内容可以大大减少.
/ lib目录
共享库和可装载(驱动程序)存储在此目录中,并且共享库用于启动系统. 在根文件系统中运行可执行程序,例如: / bin / sbin目录中的程序.
/主目录
用户目录,这是可选的. 对于每个普通用户,/ home目录中都有一个以该用户命名的子目录,该子目录存储与用户相关的配置文件.
/根目录
root用户的目录,与之对应,普通用户的目录是/ home下的子目录.
/ usr目录
/ usr目录的内容可以存储在另一个分区中,然后在系统启动后附加到根文件系统中的/ usr目录. 它存储共享和只读程序以及数据,这表明/ usr目录的内容可以在多个主机之间共享,这些主机主要符合FHS标准. / usr中的文件应该是只读的,并且与其他主机有关,并且变量文件应该保存在其他目录中,例如/ var. 可以在嵌入式目录中减少/ usr目录.
/ var目录
与/ usr目录相反,/ var目录存储变量数据,例如假脱机目录(邮件,新闻),日志文件和临时文件.
/ proc目录
这是一个空目录,通常用作proc文件系统的安装点. proc文件系统是虚拟文件系统. 它没有实际的存储设备. 其中的目录和文件由内核临时生成,用于指示系统的运行状态也可以操作文件控制系统.
/ mnt目录
用于临时挂载文件系统的挂载点通常是一个空目录. 您还可以在其中创建一个空的子目录,例如/ mnt / cdram / mnt / hda1. 用于临时安装CD和硬盘驱动器.
/ tmp目录
用于存储临时文件,通常是一个空目录. 一些需要生成临时文件的程序使用/ tmp目录,因此/ tmp目录必须存在并且可以访问.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-169557-1.html
有没有给美帝抓住的内容