===========================================================================
一、根文件系统和busybox
1) 在~目录下,创建一个rootfs目录,将其制作为nfs,目录结构如下(写一个脚本script.sh):
mkdir bin dev etc lib mnt opt proc sbin srv sys tmp usr var
cd etc
mkdir init.d network
cd network
touch if-down.d if-post-down.d if-pre-up.d if-up.d
cd ../../usr
mkdir bin lib sbin
cd ../var
mkdir run
cd ../
2) 解压 mc2440 下的 busybox-1.9.1.tar.bz2 到 /home/akaedu/下,得到文件夹busybox-1.9.1
$ tar zxvf busybox-1.9.1.tar.bz2
3) 进入内核目录
$ cd busybox-1.9.1
4) 修改Makefile,找到 (此处需修改Makefile)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为:
ARCH ?= arm (后面不能有空格)
CROSS_COMPILE ?= arm-linux-
5) 以缺省配置为起点做进一步的配置
$ make defconfig
$ make menuconfig
在菜单中做如下配置:
#1 选中 BusyBox Settings——> Installation Options——>BusyBox installation prefix,设置为/home/akaedu/rootfs,busybox编译后安装到这个目录
#2 根据需要裁剪各命令。但是Shell——>Choose your default shell选项一定要保留一个默认shell(如ash),
(如果没有默认shell,将不会创建/bin/sh这个链接,而一般的shell脚本都是以#!/bin/sh开头的,若找不到/bin/sh就不能执行。)
6) 编译和安装busybox
$ make
$ make install
7) linuxrc需读取设备文件/dev/console和/dev/null,我们手动创建这些设备文件:
$ cd rootfs/dev
$ sudo mknod -m 600 console c 5 1
$ sudo mknod -m 666 null c 1 3
常见设备文件的设备号可以从内核代码的Documentation/devices.txt文件中查到
8) 创建一个启动配置文件:~/rootfs/etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty 115200 s3c2410_serial0
::restart:/sbin/init
::shutdown:/bin/umount -a -r
9) 启动的过程首先执行rcS启动脚本,创建这个脚本~/rootfs/etc/init.d/rcS (根据/etc/fstab配置文件提供的信息mount一些fs)
#!/bin/sh
mount -a
这个脚本需加可执行权限:chmod +x rcS
10) 创建/etc/fstab配置文件
proc /proc proc defaults 0 0
sys /sys sysfs defaults 0 0
11) 执行完rcS,要执行respawn(如上8)),需创建s3c2410_serial0设备文件
$ cd rootfs/dev
$ sudo mknod -m 600 s3c2410_serial0 c 204 64
这个设备号在内核代码的Documentation/arm/Samsung-S3C24XX/Overview.txt中可查到
12) 打开终端会提示输入用户名和密码后才启动shell,需创建帐号文件passwd和group
~/rootfs/etc/passwd文件内容为:
root::0:0:root:/:/bin/sh
~/rootfs/etc/group文件内容为:
root::0:
现在就创建了一个root帐号,没有密码。如需密码,可以把主机上的/etc/shadow文件中的root帐号的那一行放到开发板的根系统中。
二、glibc
由于busybox需要glibc共享库的支持,下面将在根文件系统中安装glibc。
1) 解压crosstool.tar.bz2到/opt/目录下,得到文件夹crosstool
$ tar zxvf crosstool.tar.bz2
2) 把共享库拷到根文件系统哦~/rootfs/lib目录下
$ cd /opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/lib
$ cp -dp * /home/akaedu/rootfs/lib
3) 到~/rootfs/lib目录下删除掉所有的静态库和一些不常用的库。
$ rm *.a
$ rm *.o
现在通过NFS启动开发板,应该可以成功启动到shell下了。
三、mdev
先前我们在根文件系统的/dev目录下手动创建了三个设备文件:console、null和s3c2410_serial0,内核里还有很多设备驱动需要通过设备文件提供给应用程序访问,若一个个手动创建太麻烦且容易出错,busybox提供mdev程序可以从sysfs中读出内核提供的设备驱动信息,在/dev目录下自动创建相应的设备文件并为这些设备文件命名。
1) 把以下几行附加到启动脚本~/rootfs/etc/initd/rcS的末尾
mount -t tmpfs mdev /dev
mdev -s
mkdir /dev/input
ln -s /dev/mice /dev/input/mice
2) mdev还需要一个配置文件mdev.conf,用于指定各设备文件的所有者和权限,其格式可参考busybox源代码中的docs/mdev.txt。我们不做特别的设置,但这个文件需存在,因此创建一个空文件。
$ touch rootfs/etc/mdev.conf
现在重新启动开发板,从minicom可以看到/dev目录下创建了很多设备文件,而主机上查看NFS目录~/rootfs/dev却仍然只有先前的三个设备文件,想一想为什么?
四、系统时钟
1) 将主机上的时区文件拷贝到开发板根文件系统
$ cp /etc/localtime ~/rootfs/etc
2) 在启动脚本~/rootfs/etc/init.d/rcS中添加一条命令
hwclock --hctosys
3) 修改开发板系统时钟
#data 051815232012
Wed May 15:23:00 CST 2011
这时关闭系统,时钟信息还是会丢失。若在上述命令后用hwclock命令写到硬件RTC时钟,在系统断电期间RTC时钟由电池维持,下次启动通过hwclock --hctosys仍然可以将系统时钟设定正确。
五、网络配置
在bootloader中设置的开发板IP地址仅在bootloader阶段与主机通信时起作用。
若是NFS Root方式启动,系统启动后的IP地址是由内核启动参数中的NFS设置决定的,这样系统启动后仍然可以读取主机的NFS导出目录。
若是Nand Flash根文件系统启动,则启动后需重新配置IP地址和激活网络接口,我们可以把配置写在启动脚本~/rootfs/etc/init.d/rcS中:
1) 在启动脚本~/rootfs/etc/init.d/rcS添加
ifup -a
2) 添加一个配置文件~/rootfs/etc/network/interfaces:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
六、httpd
busybox自带了一个Web服务器程序httpd
1) 在在启动脚本~/rootfs/etc/init.d/rcS添加如下一行
httpd -h /srv/www
2) 在根文件系统中创建服务目录
$ mkdir -p rootfs/srv/www/cgi-bin
现在启动开发板系统,试验以下功能
#1 编辑一个index.html放在~/rootfs/srv/www下,从主机上打开浏览器,输入开发板的IP地址看能否浏览
hello,man!
how do you do!
3) 编译一个shell脚本,加可执行权限,放在~/rootfs/srv/www/cgi-bin,从主机打开浏览器,输入该脚本的地址(如:)
#!/bin/sh
echo "Content-Type:text/plain"
echo
ls -l
七、将自己定制的根文件系统下载到开发板上运行