| |
What is rootfs? --------------- Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems. You can't unmount rootfs for approximately the same reason you can't kill the init process; rather than having special code to check for and handle an empty list, it's smaller and simpler for the kernel to just make sure certain lists can't become empty. Most systems just mount another filesystem over rootfs and ignore it. The amount of space an empty instance of ramfs takes up is tiny.
3 rootfs 的一般结构
整个根文件系统包含的目录如下:
Bin目录:所有的命令程序,用busybox来实现的。
Dev目录:系统启动时,一些必须的设备。
Etc目录:这是一个存放配置文件的目录。
Initrd目录:目录为空。它是一个临时的根文件系统。
Lib目录:系统所用的库。
Lost+found目录: 这个目录在大多数情况下都是空的。
Mnt目录: 这个目录在一般情况下也是空的。可以临时将别的文件系
统挂在这个目录下。
Proc目录:这个目录一般也是空的。
Sbin目录:这个目录是用来存放系统管理员的系统管理程序。
Tmp目录:用来存放不同程序执行时产生的临时文件。
Tools目录:分别指向bin,etc,lib,sbin,share目录。
Usr目录:这是linux系统中占用硬盘空间最大的目录。用户的很多应
用程序和文件都存放在这个目录下。
Var目录:目录为空,是用户使用产生的日志文件
4 rootfs的启动基本步骤:
* 嵌入式系统中主要的存储介质 Flash 是稀有资源,为数不多的 RAM 也是。在嵌入式
系统开发中,开发人员十分珍惜这两种资源,也想出了许多办法解决资源短缺的问题。
* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(
Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启
动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从
Flash 读取的 Cramfs,更复杂的是在 Flash 上分区,并构建 JFFS2 等文件系统。
* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到
RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压
缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。
* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入
了 cpio-initrd,大大简化了 Linux 的启动过程,附合 Linux 的基本哲学:Keep it
simple, stupid(KISS). 不过,cpio-initrd 作为新的格式,还没有经过广泛测试,
嵌入式 Linux 中主要采用的还是 image-initrd。
* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上
运行,不须 load 到 RAM 中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运
行时修改的目录(如: /etc, /var, /tmp)多有不便,因此,一般将这些目录做成
ramfs 等可写的 fs。
* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使
用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是一种
新方法,在嵌入式系统采用之前,需要经过更多的测试。
* XIP(exece-in-place,就地运行) 是一种不须将应用程序 load 到 RAM 就可以运行
的技术,无疑可以减少 RAM 的使用。不过在嵌入式系统我还没有遇到这种技术的使用