0. 前提
开发机ubuntu上已经搭建好了NFS服务器,《搭建NFS服务器》。
1. busybox源码下载和编译
(1)busybox是一个开源项目,各个版本差异不大,版本新旧无所谓。下载busybox可以去linuxidc等镜像网站,也可以去www.busybox.net官方网站下载
(2)修改Makefile
ARCH = arm
CROSS_COMPILE = /usr/local/arm/arm-linu/bin/arm-none-linux-gnueabi-
#如果交叉编译工具链的路径已经添加到了PATH环境变量,也可以不指定全路径
(3)make menuconfig配置(Xshell中也可以进行,如果不行应该是操作权限不够)
因为我是新装的Ubuntu,所以make menuconfig时会报错如下:
In file included from scripts/kconfig/lxdialog/checklist.c:24:0:
scripts/kconfig/lxdialog/dialog.h:32:20: fatal error: curses.h: No such file or directory
compilation terminated.
make[1]: *** [scripts/kconfig/lxdialog/checklist.o] Error 1
make: *** [menuconfig] Error 2
解决办法是Ubuntu需要安装libncurses5-dev:sudo apt-get install libncurses5-dev,然后就可以正常make menuconfig,然后按照以下步骤进行配置
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
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
(4)make编译
(5)make install安装(其实是执行busybox顶层目录下的install目标),在make install之前通过make menuconfig配置安装路径为/home/sijifan/mine/nfs/X210_rootfs,即把生成的根文件系统放到NFS服务器的工作目录,方便开发板挂载。
Busybox Settings--->
Installation Options ("make install" behavior)--->
BusyBox installation prefix
(6)设置uboot的bootargs:
#注意:指定nfsroot目录,后续往文件系统中添加文件都是添加到这个目录
setenv bootargs root=/dev/nfs nfsroot=192.168.1.100:/home/sijifan/mine/nfs/X210_rootfs ip=192.168.1.10:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
恢复:
setenv bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
(7)配置内核支持nfs文件系统启动
1、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项
Networking support
Networking options
TCP/IP networking
IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
2、配置开启nfs服务
File systems --->
Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4 (EXPERIMENTAL)
[*] NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*] Root file system on NFS
2. bootm启动开发板,此时已经可以正常启动了,但是会显示无法打开一些文件
can't run '/etc/init.d/rcS': No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
3. 添加配置文件
(1)在/home/sijifan/mine/nfs/X210_rootfs 目录下创建/etc文件夹,然后创建inittab文件,文件内容如下(经典版):【到此为止已经完成了一个最简文件系统,可以进入控制台】
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
(2)添加/etc/init.d/rcS文件,内容如下(经典版):
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname -F /etc/sysconfig/HOSTNAME
ifconfig eth0 192.168.1.10
(3)创建/etc/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
(4)找不着挂载点(注意和上一步的fstab文件的<mount point>对比),报错如下:
mount: mounting proc on /proc failed: No such file or directory
mount: mounting sysfs on /sys failed: No such file or directory
mount: mounting tmpfs on /var failed: No such file or directory
mount: mounting tmpfs on /tmp failed: No such file or directory
mount: mounting tmpfs on /dev failed: No such file or directory
解决办法就是在/home/sijifan/mine/nfs/X210_rootfs目录下创建/proc,/sys,/var,/tmp,/dev。然后重新启动开发板,神奇的是:在/home/sijifan/mine/nfs/X210_rootfs目录下的/proc和/sys文件夹下是没有内容的,但是开发板端的/proc和/sys下是有内容的。
(5)创建/etc/sysconfig/HOSTNAME,内容随便填,比如sijifan210
(6)创建/etc/profile,内容如下:(这里完成后就会显示hostname)
# 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
(7)配置使系统有登录界面
1> 首先,在inittab中修改,去掉/bin/sh,换上/bin/login或者/sbin/getty,这两个东西的具体区别不祥,但是在busybox中都是链接文件,指向busybox。
#::askfirst:-/bin/sh
::sysinit:/bin/login
2> 然后直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件,前者用来存储密码的设置,后者用来存储加密后的密码。
3> 将两个文件中的root一行留下,其余删除,然后创建/root;最后将passwd文件中的/bin/bash改为/bin/sh,因为busybox中使用的是shell脚本。
root:x:0:0:root:/root:/bin/sh
root后面的/bin/sh表示root用户登录后执行的第一个程序,补充一句,busybox是没有普通用户的。
4> 指定系统使用的串口
s3c2410_serial2::sysinit:/bin/login
5> 用getty方式登录,inittab文件做以下修改即可:
#s3c2410_serial2::sysinit:/bin/login
s3c2410_serial2::respawn:/sbin/getty -L s3c2410_serial2 115200 vt100
4. 拷贝动态链接库
首先,arm-2009q3这个交叉编译工具链的动态链接库在/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib目录下。
然后,复制动态链接库到/home/sijifan/mine/nfs/X210_rootfs/lib目录下。复制时要注意参数用-rdf,主要目的就是符号链接复制过来还是符号链接。
cp lib/*so* /home/sijifan/mine/nfs/X210_rootfs/lib -rdf
再然后,使用strip工具去掉库中符号信息(执行这一步之后lib文件从7.5M减少到5.9M)
arm-linux-strip *so*
最后交叉编译测试程序
静态链接:arm-linux-gcc hello.c -o hello_satic -static
动态链接:arm-linux-gcc hello.c -o hello_dynamic
5. 制作ext2格式的文件系统镜像并烧录启动
(1)制作ext2格式的镜像,大小为1024*10240个字节即10M,可以通过修改count改变大小,确保能够放下自己制作的文件系统。退回到/home/sijifan/mine/nfs/目录,创建rootfs文件夹,然后执行如下操作
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 10240
mount -t ext2 /dev/loop1 ./rootfs/ #挂载到rootfs目录下
(2)然后进入rootfs文件夹,向./rootfs中复制内容,用cp ../X210_rootfs/* ./ -rf
cp ../X210_rootfs/* ./ -rf
cd ..
umount /dev/loop1 #取消挂载
losetup -d /dev/loop1
(3)/home/sijifan/mine/nfs目录下生成的rootfs.ext2即文件系统镜像
6. 烧写文件系统镜像
(1)使用fastboot烧录制作好的rootfs.ext2到开发板inand中
fastboot flash system rootfs.ext2
(2)烧录完成后重启系统,设置bootargs为:
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2