建立NFS根文件系统,主要是因为在开发的时候,很方便。在PC机上把需要的文件拷贝到共享目录下,在开发板的文件系统里就可以对应看到此文件。
本文旨在建立一个最小的根文件系统。大家熟知的根文件系统,都包含一/bin、/sbin、/usr、/etc、
/lib等目录。通过busybox工具来编译生成根文件系统下的可执行文件。
本编译器是arm-linux-gcc 3.4.5版本的。
1.下载busybox-1.7.0,从下载,之后解压。
tar xjf busybox-1.7.0.tar.bz2
2.配置busybox,跟配置内核的界面差不多。
若使用静态编译,可以选择
Build Options
[]Build Busybox as a static binary(no shared libs)
本文件系统采用动态编译的方法。
3.编译和安装busybox
首先修改busybox的根目录下的Makefile,
将ARCH CROSS_COMPILE变量修改如下
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
然后可执行make命令来进行编译。最后是安装 make install,就会在busybox根目录下的_install 目录下生成如下文件:
drwxr-xr-x 2 yuaf yuaf 4096 2009-07-30 11:01 bin
lrwxrwxrwx 1 yuaf yuaf 11 2009-07-30 11:01 linuxrc -> bin/busybox
drwxr-xr-x 2 yuaf yuaf 4096 2009-07-30 11:01 sbin
drwxr-xr-x 4 yuaf yuaf 4096 2009-07-30 11:01 usr
把此文件下所有的文件拷贝到你的NFS共享文件夹下,如我的共享文件夹是:/home/yuaf/root_nfs
4.建立/lib目录。使用动态链接库连接,把你所安装的交叉编译器路径下的lib目录拷贝到此目录下就行。
$pwd
/usr/local/arm/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
$cp *.so* /home/yuaf/root_nfs/lib/
5.构建/etc目录
init进程根据/etc/inittab文件来创建其他子进程。
创建etc/inittab文件,仿照Busybox的examples/inittab文件。内容如下:
#/etc/inittab
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlatldel:/sbin/reboot
::shutdown:/bin/umount -a -r
创建etc/init.d/rcS文件,内容如下:
#!/bin/sh
ifconfig eth0 192.168.0.100
mount -a
最后还得改变它的属性,使它能够执行
$chmod +x etc/init.d/rcS
创建etc/fstab文件,其内容如下:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
其具体的每个字段的意思可以上网去搜。
6.构建/dev目录
通过mdev,读取内核信息来创建设备文件。要使用mdev,需要内核支持sysfs文件系统,为了减少对Flash的读写,还要支持tmpfs文件系统。确保内核支持CONFIG_SYSFS、CONFIG_TMPFS配置项。
要自动运行mdev,需要修改etc/fstab文件。其修改后的文件,见其上面etc/fstab内容。
修改etc/init.d/rcS
在其后面加入下面几行
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s
修改etc/inittab文件
因为开发板通过mdev生成的/dev目录中,s3c2410的串口名是s3c2410_serial0、s3c2410_serial1,不是ttySAC0、ttySAC1等。
建立/dev/console /dev/null 设备文件
$sudo mknod console c 5 1
$sudo mknod null c 1 3
7.构建其他目录
$mkdir proc mnt tmp sys root
这样一个最小的根文件系统就建立起来啦。
在U-Boot启动时,设置linux内核启动参数,挂载nfs文件系统。
其u-boot设置启动参数如下:
setenv linux_arg "console=ttySAC0 root=/dev/nfs init=/linuxrc nfsroot=192.168.0.50:/home/yuaf/root_nfs ip=192.168.0.100:192.168.0.50:192.168.0.1:255.255.255.0:"
其中init=/linuxrc,很重要。初始化文件系统。我就因为没有加这条启动参数,耽误了几天时间。