在制作根文件系统之Busybox init进程的启动过程分析中我们知道了制作嵌入的根文件系统需要:
1、Busybox这个UNIX程序集合
2、/ect/inittab这个配置文件
3、/ect/inittab指定的命令或者脚本
4、/dev/console、/dev/null设备节点
5、C库
下面是自己移植的过程
1、编译、安装Busybox
a、将从网上下载的压缩包解压:tar xjf busybox-1.7.0.tar.bz2
b、切换到解压后文件夹路径cd busybox-1.7.0/。
c、配置busybox,执行make menuconfig,增加一些功能
1)、设置“tab”键补全,设置路径为:
Busybox Settings --->
Busybox Library Tuning --->
[*] tab completion
2)、连接/编译选项设置,选择动态连接
Busybox Settings --->
Build Options --->
[ ]Buid Busybox as a static binary (no shared libs)
3)、支持mdev
Linux System Utilities --->
[*] mdev
d、编译Busybox
1)、更改顶层Makefile ARCH ?= arm;CROSS_COMPILE ?= arm-linux
2)、执行make编译Busybox
e、安装Busybox,注意千万不能直接make install,这样会导致当前乌班图系统崩溃,因为我们需要再开发板上运行,所有安装以下步骤进行:
1)、在目录下新建一个/work/nfs_andy/first_fs
2)、回到Busybox目录,执行make CONFIG_PREFIX=/work/nfs_andy/first_fs install
3)、完成后将在/work/nfs_andy/first_fs目录下生成bin linuxrc sbin usr目录,其中linuxrc指向/bin/busybox/init_main程序,是挂接根文件系统后执行的第一个程序
2、使用glibc库,glibc库的位置在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib,这个在制作交叉编译工具时就已经生成了。
a、进入刚才建立的根文件系统目录/work/nfs_andy/first_fs
b、建立一个lib文件夹:mkdir -p lib
c、切换到glibc库所在目录:cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
d、将加载器与动态库文件复制到/work/nfs_andy/first_fs/lib:cp *.so* /work/nfs_andy/first_fs/lib -d。-d表示所有的链接还是链接,不复制成源文件。节省空间。
3、构建第一个根文件系统
a、构造dev/console、dev/null:
1)、在/work/nfs_andy/first_fs/目录下创建dev文件夹:mkdir -p dev
2)、进入dev文件夹,构造字符设备节点console、null:sudo mknod console c 5 1、sudo mknod null c 1 3
b、构造etc/inittab配置文件:
1)、在/work/nfs_andy/first_fs/目录下创建etc文件夹:mkdir -p etc
2)、进入etc目录,创建配置文件inittab,里面填入console::askfirst:-/bin/sh
c、制作最小根文件系统映像:
1)、将从网上下载的压缩包解压:tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
2)、进入解压缩后的目录Development_util_ok/yaffs2/utils目录,然后make。
3)、将编译出的工具mkyaffs2image拷贝到系统目录:sudo cp mkyaffs2image /usr/local/bin/
4)、加上可执行熟悉:sudo chmod +x /usr/local/bin/mkyaffs2image
5)、切换到 /work/nfs_andy目录执行:mkyaffs2image first_fs first_fs.yaffs2,这样就制作成功了第一个最小根文件系统
4、将制作出来的最小根文件系统first_fs.yaffs2烧写到开发板,然后运行成功
5、继续完善根文件系统,使其支持虚拟文件系统。如果在移植好根文件系统的开发板上ps命令,内核不能执行,因为缺少虚拟文件系统。所以 执行mount -t proc none /proc挂接虚拟文件系统
a、在/work/nfs_andy/first_fs/目录下创建proc文件夹:mkdir -p proc
b、在ect/inittab文件中再添加一行::sysinit:/etc/init.d/rcS。表示调用rcS这个脚本文件
c、在/etc/init.d/rcS这个脚本文件里添加mount -a这个命令,mount -a这个命令会去读取etc/fstab文件的内容
d、增加etc/fstab文件,里面填入
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
f、执行mkyaffs2image first_fs first_fs.yaffs2,将生成的文件印象烧入开发板运行成功。再执行ps命令可以看到
PID Uid VSZ Stat Command 1 0 3092 S init 2 0 SW< [kthreadd] 3 0 SWN [ksoftirqd/0] 4 0 SW< [watchdog/0] 5 0 SW< [events/0] 6 0 SW< [khelper] 55 0 SW< [kblockd/0] 56 0 SW< [ksuspend_usbd] 59 0 SW< [khubd] 61 0 SW< [kseriod] 73 0 SW [pdflush] 74 0 SW [pdflush] 75 0 SW< [kswapd0] 76 0 SW< [aio/0] 710 0 SW< [mtdblockd] 745 0 SW< [kmmcd] 769 0 3096 S -sh 771 0 3096 R ps
6、继续完善使其自动构建dev/设备节点。使用udev机制,在busybox里面是mdev机制,需要增加sys文件系统、tmpfs文件系统
a、建立sys文件夹:mkdir sys
b、修改/etc/init.d/rcS这个脚本文件。加入下面几行
mount -a //读取etc/fstab文件,挂接文件系统 mkdir /dev/pts // mount -t devpts devpts /dev/pts // /dev/pts用来支撑外部网络连接的虚拟终端 echo /sbin/mdev > /proc/sys/kernel/hotplug //设置内核当有热插拔设备时调用/sbin/mdev 程序 mdev -s //在dev目录下生成内核所有的支持的设备节点
c、修改etc/fstab文件,它用来控制mount -a的行为,挂接以下所有的文件系统
#device mount-point type options dump fsck order proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
d、制作成文件系统映像后运行成功,可以看到在dev目录下新建了很多设备节点
7、移植nfs文件系统。
a、从flash上启动根文件系统,再用命令挂接NFS
1)、在服务器上配置支持被挂接的目录,配置文件为etc/exports,增加想要挂接的目录:/work/nfs_andy/first_fs *(rw,sync,no_root_squash)
2)、重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart
3)、试着在服务器上将mmt目录挂接到/work/nfs_andy/first_fs:sudo mount -t nfs 192.168.1.108:/work/nfs_andy/first_fs /mnt
4)、第三步成功后再利用开发板挂接到/work/nfs_andy/first_fs,首先在开发板上创建一个mnt目录:mkdir mnt
5)、在开发板上输入 mount -t nfs -o nolock 192.168.1.108:/work/nfs_andy/first_fs /mnt。挂接成功
b、直接从nfs启动,修改命令行参数
1)、原先的参数为:bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
2)、现在改为:set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.108:/work/nfs_andy/first_fs ip=192.168.1.111:192.168.1.105:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
3)、nfs参数在linux-2.6.22.6Documentation
fsroot.txt里面有说明
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
服务器ip 被挂接目录 配置参数省略
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
客户端ip 服务器ip 网关 子网掩码 主机名省略 设备eth0 自动配置关闭
4)、启动内核挂接成功。