4、构建根文件系统
a、Linux 内核在系统启动期间进行的最后操作之一就是安装根文件系统,它是Linux 系统不可缺少的组件,含有 Linux 运行必需的文件。根据 Filesystem Hierarchy Standard 文档,根文件设置如下:
bin 目录:必要的用户命令(二进制程序)
dev 目录:设备文件
etc 目录:系统配置文件,包括启动文件
lib 目录:链接库,例如 C 链接库、内核模块
mnt 目录:挂载点
opt 目录:非系统软件套件
proc 目录:内核向用户提供内核与进程信息的虚拟文件系统
sbin 目录:系统管理员命令(二进制程序)
tmp 目录:临时文件
usr 目录:在第二层包含对大多数用户都有用的应用程序和文件
b、BusyBox 移植
busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,甚至还集成了 http 服务器和 telnet 服务器,而所有这一切功能却只有 1M 左右大小。如果把 x86 linux 命令比作分离式电子元件,busybox 就是一个集成电路,把常用的工具和命令集成在一个可执行文件,功能基本不变,大小却小很多倍,在嵌入式 linux 应用中有非常广的应用。移植 BusyBox 的过程如下:
(1)解包源代码
tar jxvf busybox-1.10.0.tar.bz2
cd busybox-1.10.0
(2) 修改 Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-softfloat-linux-gnu-
(3) 编译配置
make defconfig # 启用默认配置,再修改
make menuconfig
确认编译选项:
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs) # 使用共享库
Installation Options --->
[*] Don't use /usr # 必需选中,否则 make install 后 busybox
#将安装在原系统的/usr 下,这将覆盖掉系统原有的命令
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Linux System Utilities --->
[*] mdev # mdev 可以自动的创建设备节点,以免手工 mknod
[*] Support /etc/mdev.conf
[*] Support subdirs/symlinks
[*] Support command execution at device addition/removal
[*] Support loading of firmwares
Shells --->
Choose your default shell (ash) --->
[*] Job control # Job control 功能(例如 Ctrl+C 终止进程)
(4).编译、安装
make
编译信息末尾提示:
Library crypt is needed
Library m is needed
表示 Busybox 需要 libcrypt 和 libm 库。不用理会,稍后制作的根文件会含有
所有动态链接库。
make install
编译程序将生成的文件拷贝到_install 目录
c、构建根文件系统
根文件系统存储 Linux 内核运行时需要访问的资源,包括许多链接库文件和系统初始化脚本,也用来存储用户文件。根文件系统的构建过程如下
(1) 创建根目录
mkdir rootfs
cd rootfs
(2) 把 busybox 的二进制文件拷贝 rootfs 目录
cp -r $busybox/_install/* .
把 QTopi 的库文件拷贝到 rootfs 目录
cp -rfd /opt/qtopia-core-4.3.5 ${ROOTFS}/opt
把 TSLib 库文件拷贝到 ROOTFS/usr 目录
cp –rfd /home/valkyrie/tslib-build/lib ${ROOTFS}/usr/
把 Linux 的驱动模块拷贝 rootfs/lib 目录
cp –rfd modules ${ROOTFS}/lib
(3) 修改 busybox 默认的 linuxrc
busybox 默认的 linuxrc 是个符号链接,实际上它是简单地调用/sbin/init,删
除原来的 linuxrc,创建新的 linuxrc 脚本,添加更多初始化语句。
rm -f linuxrc
vim linuxrc
下面是 linuxrc 脚本的内容,#后面为注释:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/lib:/usr/lib
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel # 输出环境变量
#TSLIB 环境变量
export TSLIB_ROOT=/usr/tslib
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export HOME=/root
未完待续。。。