一.嵌入式 Linux 文件系统概述
Linux 文件系统的根目录“/”位于 Linux 文件系统的目录结构的最顶层。根文件系统通常存放于内存和存储介质中,Linux系统启动后,Linux 内核会挂载一个设备到根目录上,这个设备中的文件系统被称为根文件系统。根文件系统中存放了所有的系统命令、系统配置以及其他文件系统的挂载点以及嵌入式系统使用的所有应用程序和库。Linux 系统启动时,第一个必须挂载的是根文件系统;若不能从指定设备上挂载根文件系统,Linux 系统会出错而终止启动过程。
(1)嵌入式 Linux 根文件系统目录
嵌入式 Linux 根文件系统中一般有如下的几个目录:
/bin目录:该目录下存放所有用户都可以使用的基本命令。
/sbin 目录:该目录下存放的是只有管理员能够使用的系统命令。
/dev 目录:该目录下存放的是 Linux 特有的设备文件。
/etc 目录:该目录下存放着 Linux 系统各种配置文件。
/lib 目录:该目录下存放共享库文件。
/root 目录:该目录是根用户的目录,普通用户的目录是在/home 下的某个子目录。
/proc 目录:该目录通常作为 proc 文件系统的挂接点。
/sys 目录: Linux 内核总线、设备以及驱动程序的虚拟文件系统目录。
/mnt 目录:该目录用作临时挂载某个文件系统的挂接点,一般用来临时挂载光盘、盘。
/tmp 目录:该目录一般用于存放临时文件。
/usr 目录:该目录存放的是共享、只读的程序和数据。
/var 目录:该目录目录一般存放可变的数据,例如 log文件,临时文件等
(2)嵌入式常用的文件系统介绍
在嵌入式 Linux 系统中,主要使用的存储设备可以分为 2 类,一类是使用基于RAM 的存储设备(例如内存),另外一类是使用基于 ROM 的存储设备(例如 FLASH存储器)。常用的 基于存储设备的文件系统类型有:jffs2, yaffs2, ubifs, cramfs, initramfs,ramdisk,ramfs/tmpfs,nfs 等。从大的方面可以分为基于 RAM 的文件系统和基于 FLASH 的文件系统。不同的文件系统类型有不同的特点,要根据存储设备的硬件特性、系统需求等来选择。
基于RAM 的文件系统有 initramfs,ramdisk, ramfs/tmpfs,nfs 等。initramfs 文件系统使用 cpio 包格式,它可以编译链接到系统中去,可以直接使用而不需要另外挂接文件系统。ramdisk 文件系统是一种基于内存的虚拟文件系统,它使用内存中一部分固定大小的内存当作硬盘的一个分区来使用。Ramfs/tmpfs 文件系统把所有的文件都放在内存中,可以用ramfs/tmpfs 来存储一些临时性或经常要修改的数据,这样可以避免对 Flash 存储器的读写损耗,还可以提高数据读写速度。NFS 网络文件系统用于在不同机器、不同操作系统之间通过网络共享文件,在嵌入式 Linux 系统的开发调试阶段,可以在主机上建立基于 NFS 的根文件系统挂载到嵌入式设备上,这样可以很方便地修改根文件系统的内容。
基于 FLASH 的文件系统主要有 jffs2, yaffs2, ubifs,cramfs 等。jffs2 文件系统是基于哈希表的日志型文件系统,主要用于NOR 型闪存,其特点是可读写的、支持数据压缩、提供了崩溃/掉电安全保护和“写平衡”等;其缺点主要是当文件系统已满或接近满时,使 jffs2 文件系统的运行速度大大降低。yaffs/yaffs2(Yet Another Flash File System)文件系统是专为嵌入式系统使用 NAND 型闪存而设计的一种日志型文件系统,自带了 NAND 芯片的驱动,并且提供了直接访问文件系统的 API,用户可以通过 API 直接对文件系统进行操作。ubifs 文件系统是用在固态硬盘存储设备上,相对于 yaffs/yaffs2 和 jffs2 文件系统来说,ubifs 文件系统在设计与性能更适合 MLC NAND FLASH。Cramfs 文件系统是一种只读的压缩文件系统,其压缩比高达 2:1,可以使用更低容量的 FLASH 设备存储相同的文件,降低嵌入式系统的成本。
二.嵌入式文件系统制作工具 Busybox 简介
Busybox 是一个开源项目,遵循 GPL v2 协议。Busy Box 是一个集成了一百多个最常用 Linux 命令和工具的软件,例如 ls、cat 和 echo 等等;还包含了一些更大、更复杂的工具,例 grep、find、mount 以及 telnet。有人将 Busy Box 称为 Linux 工具里的瑞士军刀。
Busy Box 将许多具有共性的小版本的 UNIX 工具结合到一个单一的可执行文件,使用动态链接的 Busybox 只有几百 K 大小,采用静态链接也只有 1M 左右。Busybox可以替代大部分常用工具比如 GNU fileutils , shellutils 等工具,Busy Box 提供了一个比较完善的环境,可以适用于任何小的嵌入式系统。使用 Busybox 在创建根文件系统的时候需要在/dev 目录下创建必要的设备节点,并且在/etc 目录下增加相应的配置文件;如果 Busybox 使用动态链接,那么还需要再/lib 目录下包含相关的库文件。
三.制作嵌入式 Linux Ramdisk 文件系统
定制根文件系统的方法很多,最常用的是使用 Busybox 来构建。使用 Busybox可以迅速方便地建立一套相对完整、功能丰富的文件系统,它集成压缩了 Linux 的许多工具和命令,其中还包含了大量常用的应用程序。下面详细介绍有关 Busybox定制根文件系统。
1.制作 Linux 根文件系统
(1)建立根文件系统目录(rootfs)。在宿主开发机上建立 rootfs 目录及其子目录,具体的命令如下:
$ mkdir /home/felix/rootfs
$ cd /home/felix/rootfs
$ mkdir root home bin sbin etc dev usr lib tmp mnt sys proc
$ mkdir usr/lib usr/bin
(2)从 Busybox 官网 Index of /downloads下载 Busybox 源代码并解压。下载和解Busybox 源码的如下命令:
$ mkdir /home/felix/Busybox
$ cd /home/felix/Busybox
$ wget https://busybox.net/downloads/busybox-1.25.0.tar.bz2
$ tar -jxvf busybox-1.25.0.tar.bz2
(3)Busybox 的配置和编译。执行如下命令进入 Busybox 配置界面:
$ make distclean
$ make defconfig
$ make menuconfig ARCH=arm
弹出配置界面,如图 所示:
Busybox 配置界面
在配置界面进行相应的配置。相关的配置如下:
选择 Busybox Settings—>Build Options—>
选中[*] Build Busybox as a static binary(no shared libs);
Cross Compiler prefix 配置为arm-linux- gnueabi- (指定交叉编译器);
选择 Busybox Settings —> Installation Options —>Busy Box installation prefix(在
里面输入Busy Box的安装目录,我是保存在/home/felix/rootfs 下);
选择 Busybox Settings —> 选中[*] Don’t use /usr。
配置完成后按照提示保存并退出。执行如下命令编译和安装 Busybox:
$ make
$ make install
(4)把 Busybox 源码 etc 目录下的所有文件拷贝到/home/felix/rootfs/etc 目录下,具体命令如下:
$ cp –raf /home/felix/busybox-1.25.0/examples/bootfloppy/etc/* /home/felix/-
rootfs/etc
(5)修改配置文件。
A.修改fstab配置文件为:
B.修改profile文件为:
C.修改 inittab 文件为:
D.配置系统的 hostname。在 etc 目录下执行如下命令:
$ mkdir sysconfig
$ cd sysconfig
$ touch HOSTNAME
$ echo tiny4412 > HOSTNAME
E.配置 init.d/rc S 文件为:
并修改 init.d/rc S 文件权限为:
$ chmod 777 init.d/rc S
(6)添加 dev 目录下的设备文件。dev 目录下必须有 console 和 null 这两个设备文件,使用 mknod 来创建这两个设备文件。
$ sudo mknod -m 666 console c 5 1
$ sudo mknod -m 666 null c 1 3
完成上面六个步骤后,制作好的 Linux 根文件系统放在 rootfs 目录中。
2.制作 Ramdisk 文件系统
在上述已经建立好的 Linux 根文件系统上制作 Ramdisk 文件系统。整个Ramdisk 文件系统制作过程可以使用 mk_ramdisk.sh 脚本来完成,mk_ramdisk.sh 脚本代码内容如下:
把 mk_ramdisk.sh 脚本放在/home/felix/目录下,执行如下命令执行该脚本:
$ cd /home/felix/
$ chmod 755 mk_ramdisk.sh
$ ./mk_ramdisk.sh
脚本执行完最后生成的 ramdisk.img 就是我们需要的 Ramdisk 文件系统了。
四、修改 U-boot 启动参数启动 Linux 内核
把 ramdisk.img 拷贝进 SD 卡,目标开发板选择从 SD 卡启动,使其进入 U-boot命令行状态。设置 bootcmd 参数如图所示,并保存 bootcmd 参数:
6 设置 bootcmd 参数
输入 boot 命令并按回车键,U-boot 会把 u Image、exynos4412-tiny4412SDK.dtb和 ramdisk.img 加载到内存,并跳转到内存执行 Linux 内核,启动信息如图 所示:
Linux 内核启动信息
内核启动完成后,在串口终端输入 ls 命令,可以看到 Linux 根文件系统目录:
Linux 根文件系统目录