这两天自己动手焊了块9261的工业级ARM板,然后就打算在上面搭建系统。相应的bootloader和内核(linux-2.6.24)都是从相应的9261光盘里得到并成功烧写,至于文件系统,我自己就打算搭建NFS网络文件系统,一来方便调试,二来是自己从头开始搭建的系统,用起来肯定非常顺手,而且也知根知底。我的步骤如下:
编译所用交叉编译器版本:arm-2007q1(来自9261光盘)
一,编译busybox
从网上下载busybox-1.11.2-tar.bz2
解压busybox,进入相关目录,修改Makefile:
CROSS_COMPILE ?=arm-none-linux-gnueabi-
ARCH ?= arm
然后make menuconfig,进入busybox配置界面,配置时需要注意几点:
1.添加如下两个选项
Busybox Settings --->
BusyboxLibrary Tuning --->
[*]Username completion
[*]Fancy shell prompts
如果不添加,文件系统是不识别PS1这个环境变量的参数的,也就无法修改shell终端的提示行(本人血和泪的教训,足足折腾了两天才搞明白这点)
2.选上静态编译
网上很多人说这样在make时会出现很多警告和莫名其妙的错误,但是本人这里却很正常
3.[ ]Don't user usr
如果选上这项,假如你选的默认的安装路径_install,那么busybox安装的时候就会在_install下生成bin、sbin、linuxrc,不生成usr目录;如果不选的话,就会生成bin、sbin、linuxrc、usr四个文件和目录。
有文说如果不选此项的话安装时就会覆盖宿主系统的/usr,经验证这种说法有误。
make menuconfig后保存退出
make
make install 就可以在设定的目录下生成bin,sbin.usr等目录,里面放的都是到busybox程序的软链接
二. 制作根文件系统
1.建立根文件系统结构
编译busybox的时候我已经设置安装路径在/opt/at9261/myrootfs目录下,make install后已经生成了bin,sbin,usr,linuxrc,因此用mkdir命令生成其他的目录:
mkdir -p dev etc home lib mnt proc sbin sys tmp var root
2.复制文件
复制所用交叉编译器的库文件(一般在相应编译器目录的arm-none-linux-gnueabi/libc/armv4t/lib下)到myrootfs的lib目录下。
3.建立相关文件
首先删除myroofs下的linuxrc文件。linuxrc是到busybox init 的链接,这里不需要,因此删除不要。
(1)inittab
inittab脚本告诉init在它的每个运行级别上需要做那些事情,详情见
参考文章:http://blog.csdn.net/madding/article/details/4337316 inittab文件详解
但是上面链接里详解的是PC上的inittab文件,busbox的init对inittab的解析不同,
详解见参考文章http://linfengdu.blog.163.com/blog/static/1177107320111186458110/
嵌入式linux启动时运行的inittab文件 或
http://blog.sina.com.cn/s/blog_5f26cfd20100x3ox.html
BusyBox init及其inittab文件分析
(2)fstab
本文件配置了系统启动后自动挂载的文件系统。 至于fstab里的文件系统何时挂载,bootloader与kernel载入内存时以只读挂载一次
这样才有/etc/rc.d/rc.sysinit里写的目录结构 ;然后执行/etc/rc.d/rc.sysinit时以可读写方式再挂载一次。
(3)passwd,group
passwd文件记录linux用户的信息,每行代表一个用户;group记录相应的组的信息,每行代表一个组。
(4)host.conf,hosts,resolv.conf
host.conf文件记录了解析器解析IP地址的顺序,hosts文件记录了主机名和IP地址的对应关系,resolv.conf设置了DNS
(5)ld.so.conf
配置除/lib,/usr/lib外系统自动查找的库信息
(6)mdev.conf
mdev的配置文件,新建为一个空文件即可
(7)profile
系统设置环境变量的文件,对每个用户都有效。
(8)init/rcS
该文件一般是自启动文件,设置在inittab里。
这一切都做好后根文件系统就建立完毕了。
注:NFS挂载时uboot设置的bootargs环境变量如下:(以本人的IP地址202.4.155.188为例)
setenv bootargs 'mem=64M console=ttyS0,115200 root=/dev/nfs rw nfsroot=202.4.155.188:/opt/at9261/myrootfs ip=202.4.155.98:202.4.155.1:255.255.255.0:eth0:off'
saveenv.