(注:本文参考资料:朱有鹏嵌入式课程。本文为个人学习记录,如有错误,欢迎指正。)
1. busybox简介
Busybox是一个开源项目,它将众多的UNIX命令集合进一个很小的可执行程序中。Busybox中各种命令与相应的GNU工具相比,所能提供的选项比较少,但是也足够一般的应用了。Busybox按模块设计,可以很容易地加入、去除某些命令,或增减命令的某些选项。Busybox主要用于嵌入式系统。
本文应用busybox来构建一个简易的嵌入式Linux根文件系统。目的在于通过搭建过程,了解根文件系统的工作原理。
2. 搭建步骤
Step1:获取busybox源码
从busybox官网下载busybox的源码文件,本文选取的busybox版本号为:busybox-1.24.0。
Step2:配置、编译、安装busybox
1)修改busybox根目录下的Makefile文件,重新定义CPU架构、交叉编译工具链的前缀。
ARCH = arm CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- |
2)在Ubuntu终端运行“make menuconfig”命令,进入busybox配置图形界面配置busybox。具体进行如下配置:
Busybox Settings ---> //配置busybox的编译过程为静态编译 Build Options ---> [*]Build BusyBox as a static binary(no shared libs) //优化busybox的shell界面 Busybox Library Tuning ---> [*]vi-style line editing commands [*]Fancy shell prompts //配置busybox的安装路径 Installation Options ("make install" behavior) ---> (/home/sai/rootfs-test/rootfs/myrootfs) BusyBox installation prefix Linux Module Utilities---> [ ]Simplified modutils [*]insmod [*]rmmod [*]lsmod [*]modprobe [*]depmod Linux System Utilities---> [*]mdev [*]Support /etc/mdev.conf [*]Support subdirs/symlinks [*]Support regular expressions substitutions when renaming dev [*]Support command execution at device addition/removal [*]Support loading of firmwares |
3)编译busybox,在Ubuntu终端执行“make”命令。
4)在Ubuntu执行“make install”命令,busybox将被安装至指定目录。安装完成后,进入安装目录,其中新增了一些子目录,/bin、/linuxrc、/sbin、/usr。
Step3:添加inittab文件
手工创建/etc目录,并在/etc目录下添加inittab文件。
内核成功挂载根文件系统之后,运行根目录下的第一个用户进程linuxrc。linuxrc将解析inittab文件,运行操作系统的配置脚本,对Linux系统进行初始化。inittab文件的具体介绍详见。
本文的inittab文件具体内容如下:
#first:run the system script file ::sysinit:/etc/init.d/rcS #系统开机或重新启动,执行rcS文件 ::askfirst:-/bin/login #系统启动后,运行登录程序 ::ctrlaltdel:-/sbin/reboot #按下组合键“ctrl+alt+del”,重启Linux系统 #umount all filesystem ::shutdown:/bin/umount -a -r #系统关机时,卸载所有文件系统 #restart init process ::restart:/sbin/init #重启init进程 |
Step4:添加rcS脚本文件
手工创建/etc/init.d目录,并在/etc/init.d目录下添加rcS脚本文件,该文件是系统的初始化文件。本文的rcS脚本文件具体内容如下:
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序 runlevel=S #将系统设置为单用户模式 prevlevel=N #将系统设置为单用户模式 umask 022#指定当前用户在创建文件时的默认权限 export PATH runlevel prevlevel #导出环境变量 mount -a #挂载/etc/fstab文件中指定的文件系统 echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #生成相应的/dev目录下的设备文件 #从/etc/sysconfig/HOSTNAME文件中读取主机名,命令行下运行hostname即可显示当前系统的主机名 /bin/hostname -F /etc/sysconfig/HOSTNAME |
手工创建/etc/sysconfig/HOSTNAME文件,并在其中写入主机名。
210Linux //自定义主机名 |
Step5:添加fstab文件
在/etc目录下添加fstab文件,该文件中指定了系统需要挂载的文件系统。本文的fstab文件内容如下:
# /etc/fstab: static file system information. # # Use 'vol_id --uuid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /var tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 |
为保证挂载成功,在根目录下手工创建/proc、/sys、/var、/tmp、/dev目录。Step6:添加profile文件
profile文件也将被linuxrc进程调用,在Linux终端命令行提示符中显示主机名。本文的profile文件内容如下:
# Ash profile # vim: syntax=sh # No core files by default ulimit -S -c 0 > /dev/null 2>&1 USER="`id -un`" LOGNAME=$USER PS1='[u@h W]# ' PATH=$PATH HOSTNAME=`/bin/hostname` export USER LOGNAME PS1 PATH |
Step6:添加用户登录文件(passwd、shadow文件)
passwd文件中存储的是用户的密码设置,shadow文件中存储的是加密后的密码。
直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件到当前制作的根目录下,然后再做修改即可。
修改后passwd文件内容如下:
root:x:0:0:root:/root:/bin/sh #登录成功后,进入/root目录 |
修改后passwd文件内容如下:
root::17680:0:99999:7::: #root用户密码为空 |
在根目录下创建/root目录。重新启动即可使用 root 登录,登录后使用 passwd root 命令设置用户密码。
Step7:拷贝动态链接库
//*so*是过滤掉非动态链接库的文件,-rdf是保证符号链接仍是符号链接 cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/*so* ./ -rdf |
3. 测试
(1)挂载测试
将所创建的根文件系统的文件夹拷贝至NFS服务器所在目录,并在uboot中设置bootargs参数。启动后即可进入Linux终端。详细步骤见。
(2)应用程序运行测试
编写helloword程序,并将其分别编译为一个动态链接可执行程序、静态链接可执行程序。
arm-none-linux-gnueabi-gcc hello.c -o hello_statci -static //静态编译 arm-none-linux-gnueabi-gcc hello.c -o hello_dynamic //动态编译 |
将可执行程序拷贝至/root目录下,在开发板的Linux终端运行,两个程序都运行成功。