1. 引言
根文件系统作为类unix系统至关重要的一部分,服务于用户层和操作系统,相信很多接触这类操作系统的工程师知道这个概念的存在,并且随时在和它打交道,但相当一部分人对它知之甚少。本文通过目录说明、busybox工具集、初始化脚本、镜像制作等几部分简单说明一下根文件系统的组成及挂载后的系统初始化过程。
实验环境:
主机系统--ubuntu 12.04
busybox版本—1.25.0
arm交叉编译工具链—arm-linux-gnueabi
目标平台--qemu模拟arm平台vexpress-a9开发板
2. linux根文件系统目录概述
linux文件系统中每个目录都有自己的使命,对它们的定义和使用规范来自于FHS(filesystem hierarchy standard),该文档是根文件系统基本指导思想,这里不做过多描述。本文主要是应用方面的说明,我在linux的用户手册里摘抄并翻译了这些目录的描述,部分常见目录的描述如下:
/
整个目录树的起点,根目录
/boot
包含bootloader需要的静态文件。该目录只包含在系统引导过程中需要的文件,映射安装工具和配置文件应该在/sbin和/etc目录中。
/dev
特定文件或设备文件,比如物理设备文件
/etc
包含本机的配置文件。比较大的软件包,例如X11,也可以在该目录下创建单独的子目录。
所有的配置文件可能在该目录或是/usr/etc目录。但是程序应该在该目录定位配置文件,你可以链接/usr/etc中的文件到该目录中。
/home
直接或间接的存放不同机器不同用户的家目录。该目录结构取决于本地系统管理员的决定。
/lib
该目录下存放共享库和可加载驱动程序,共享库用于启动系统。运行根文件系统中的可执行程序
/media
该目录包含可移动存储设备的挂载点,例如CD、DVD或USB设备
/mnt
该目录是一个用于临时挂载的文件系统的挂载点,在一些linux发行版中,含有若干子目录,目的是为不同的临时文件系统提供挂载点。
/opt/
该目录应该存放包含静态文件的软件包。
/proc
proc文件系统的挂载点,proc文件系统提供了运行中的进程和内核的信息。
/root
root用户的家目录。
/sbin
类似于/bin,包含系统引导所需要的命令,这些命令普通用户不能执行。
/tmp
该目录用于存储临时性的文件,可能是不需要通知用户所删除的文件,常规性处理或系统引导时所产生的文件。
/usr
该目录通常挂载一个单独的分区,他应该只包含可分享的,只读的的数据,这样才能让运行linux的不同机器挂载。
/usr/bin
该目录是可执行程序的主目录。大多数程序用于普通用户执行,这些程序不用于引导系统或是修复系统,而且也不是本地安装的。
/usr/etc
分享到全站的配置文件可能存储在这个目录。然后,所有命令都应该在/etc目录中索引这些配置文件,在/etc/中的链接文件应该指向该目录中的配置文件
/usr/include
C编译器所用的头文件
/usr/lib
该目录存放目标库,包括动态库或不直接调用的增强程序。复杂程序可能有单独的子目录。
/usr/local
用于系统管理员安装软件的目录
/usr/local/bin
存储本地的二进制程序
/usr/local/doc
存储本地文档
/usr/local/etc
存储本地安装程序的配置文件
/usr/local/lib
存储本地安装程序的相关库文件
/usr/local/include
本地C编译器的头文件
/usr/local/info
本地安装程序的信息页
/usr/local/man
本地安装程序的用户手册
/usr/local/sbin
系统管理员安装系统程序到这个目录
/usr/local/share
本地应用数据,用于不同架构相同系统共享数据
/usr/sbin
该目录包含用于系统管理的二进制可执行程序,但不是用于引导、修复系统的基础程序
/usr/share
该目录存储特定应用程序数据的子目录,可用于不同架构相同os的机器之前实现分享。
/var
用于存储可能会有大小变化的文件,例如spool或log文件
/var/cache
程序数据缓存
/var/lib
程序的可变的状态信息
/var/lock
用于存储lock文件
/var/log
存储各种各样的log
/var/run
运行时可变文件,像存储进程PID或者是记录用户信息的文件
/var/spool
存储不同程序的spooled文件
更详细的说明请参考https://linux.die.net/man/7/hier
3. 创建文件系统必要的目录
创建根目录
mkdir rootfs
cd rootfs
创建系统目录
mkdir bin boot dev etc lib mnt proc root sbin sys tmp usr var
创建一些常用二级目录
mkdir etc/init.d etc/rc.d
mkdir usr/sbin usr/bin usr/lib usr/modules
mkdir var/lib var/lock var/run /tmp
4. busybox工具集
busybox下载
wgethttp://www.busybox.Net/downloads/busybox-1.25.0.tar.bz2 –no-check-certificate
编译器安装
sudo apt-get install gcc-arm-linux-gnueabi
环境变量设置
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
另外还可以使用下面的方法设置,只针对busybox设置,不影响其他的编译环境,在busybox根目录的Makefile中做如下修改:
CROSS_COMPILE ?= arm-linux-gnueabi-
#ARCH ?= $(SUBARCH)
ARCH ?= arm
配置busybox
make defconfig
执行make menuconfig定制自己的busybox,然而,可能会遇到的下面的问题:
图 4.1 busybox的menuconfig问题
这是你的主机系统没安装过ncurses软件包导致的,该软件包用于终端显示,menuconfig必须用到的,我们这里安装下好了:
sudo apt-get install libncurses5-dev libncursesw5-dev
尽管这里说明了可以通过menuconfig定制busybox,但是我们的实验中不需要做任何修改,默认配置已经满足需求。
在配置busybox的同时,有一个重要的部分需要说明,就是根文件系统下/dev目录下设备节点的创建,通过互联万网罗一下常见方法,其中有一篇文章写的比较清楚,基本有三种方法可以胜任这个工作,原文摘抄如下:
1. 手动创建:在制作根文件系统的时候,就在dev目录下