浅谈linux中的根文件系统(rootfs的原理和介绍)【转】
linux中有一个让不少初学者都不是特别清楚的概念,叫作“根文件系统”。我接触linux前先后后也好几年了,可是对这个问题,至今也不是特别的清楚,至少无法给出一个很全面很到位的解释。因而,今天咱们就来理一理这个话题。node
1、先交代一下文件系统linux
在开始讨论根文件系统这个话题以前,咱们必首先交代一下文件系统这个概念。毕竟,根文件系统只是文件系统中的一种比较特殊的形式而已。根据伟大的百度百科:web
文件系统是操做系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操做系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操做和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户创建文件,存入、读出、修改、转储文件,控制文件的存取,当用户再也不使用时撤销文件等。shell
文件系统的重要性,我想你们都很清楚,不用多说了。这里有一句话,我以为很是精辟并且到位的点出了文件系统在linux中的重要性:数据结构
尽管内核是linux的核心,但文件倒是用户与操做系统交互所采用的主要工具。这对linux来讲尤为如此,这是由于在UNIX传统中,它使用文件I/O机制管理硬件设备和数据文件。svg
2、什么是根文件系统工具
而后来解释一下“根文件系统”这个名词的基本概念。一样引自百度百科的解释:操作系统
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载以后从中把一些基本的初始化脚本和服务等加载到内存中去运行。rest
展开来细说就是,根文件系统首先是一种文件系统,该文件系统不只具备普通文件系统的存储数据文件的功能,可是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载以后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。咱们要明白文件系统和内核是彻底独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操做系统的,会出现没法加载文件系统的错误。xml
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目录必须存在并能够访问。
上一篇: 嵌入式Linux开发:本地挂载根文件系统
下一篇: Linux文件系统的目录结构重构
推荐阅读
-
紧急模式问题处理 - 图 1 紧急模式 根本原因分析 应急模式提供了尽可能小的环境,即使无法进入应急模式,也可以在其中修复系统。在应急模式下,系统只安装根文件系统供读取,不尝试安装任何其他本地文件系统,不激活网络接口,只启动一些基本服务。 进入应急模式的原因通常是 /etc/fstab 文件中存在错误,导致文件系统挂载失败。 文件系统中存在错误,导致。 约束和限制 本节适用于 Linux 操作系统紧急模式。程序涉及修复文件系统。修复文件系统有丢失数据的风险,因此请先备份数据,然后再执行修复操作。 处理方法 输入根密码,然后进入修复模式。 在应急模式下,根分区以只读模式挂载。要修改根目录中的文件,需要执行以下命令以读写模式重新挂载根分区。# mount -o rw,remount / 请执行以下命令首先检查 fstab 文件是否有误,然后尝试挂载所有未挂载的文件系统。# mount -a 如果挂载点不存在,请创建一个挂载点。 如果不存在此类设备,请注释或删除挂载行。 如果指定了不正确的挂载选项,请将挂载参数更改为正确的参数。 如果没有发生错误,但出现 UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY 消息(通常是由文件系统错误引起的),请跳至第 7 步。 执行以下命令打开 /etc/fstab 以修改相应的错误。# vi /etc/fstab /etc/fstab 文件包含以下字段,以空格分隔:[文件系统] [dir] [type] [options] [dump] [fsck] 表 1 /etc/fstab 参数 说明 参数 说明 [文件系统] 要挂载的分区或存储设备。 文件系统]列建议以 UUID 的形式写入。执行 blkid 命令可查询设备文件系统 UUID。 参考格式如下: # <device> <dir> <type> <options> <dump> <fsck>; UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2 使用 UUID 的好处是,它们与磁盘顺序无关。如果你在 BIOS 中更改了存储设备的顺序,或重新插入了存储设备,或者因为某些 BIOS 可能会随机更改存储设备的顺序,那么使用 UUID 会更有效率。 [文件系统] 文件系统]的挂载位置。 类型 挂载设备或分区的文件系统类型,支持多种不同的文件系统:ext2、ext3、ext4、reiserfs、xfs、jfs、smbfs、iso9660、vfat、ntfs、swap 和 auto。 设置为自动类型后,挂载命令会猜测所使用的文件系统类型,这对 CDROM 和 DVD 等移动设备非常有用。 选项 挂载时要使用的参数,有些参数是特定文件系统特有的。例如,默认值参数使用文件系统的默认挂载参数,ext4 的默认参数为:rw、suid、dev、exec、auto、nouser、async。 有关更多参数,请执行以下命令查看 man 手册:# man mount
-
Linux设备驱动开发详解——学习笔记-设备驱动来联系。在没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口。而在有操作系统的情况下,驱动的架构则由相应的操作系统来定义。驱动存在的意义就是给上层应用提供便利。 驱动针对的对象是存储器和外设。Linux将存储器和外设分为 3 个基础大类:字符设备、块设备、网络设备。 字符设备和块设备都被 Linux 映射到文件系统的文件和目录中,通过文件系统的接口(open、read、write、close等)来访问。其中,块设备可以通过类似 dd 命令对应的原始块设备来访问,也可以通过建立文件系统,以文件路径来访问。 学习 Linux 设备驱动,要求非常好的硬件基础、非常好的软件基础、一定的 Linux 内核基础和非常好的多任务并发控制和同步的基础。学习 Linux 设备驱动要将学习的函数、数据结构等放到整体架构中去理解,才能理清驱动中各组成部分之间的关系。 驱动设计的硬件基础 驱动工程师需要掌握 处理器、存储器、接口和总线、可编程门电路、原理图、硬件时序、芯片手册、仪器使用 等方面的内容。 处理器
-
详细解析Linux系统中rootfs切换至真实根文件系统的源码(包含手动创建根文件实例的工作项目)
-
在Linux系统中,了解如何制作和挂载根文件系统rootfs的基本操作
-
浅谈linux中的根文件系统(rootfs的原理和介绍)【转】
-
浅谈linux中的根文件系统(rootfs的原理和介绍)【转】
-
Linux中的根文件系统:rootfs的解析