环 境- Ubuntu8.10 发行版
- FS2410平台以及开发板中移植好的u-boot-1.3.1,编译好的 Linux-2.6.22.6 内核
- 交叉编译器 arm-linux-gcc-3.4.1
步 骤 从
下载 busybox-1.15.3.tar.bz2 。进入 busybox-1.15.3 目录,运行 make menuconfig,进入配置接口,并作出如下配置:
#tar -zxvf busybox-1.15.3.tar.gz #cd busybox-1.15.3 #make menuconfig 配置如下
·Busybox Setting ---> Build Options ---> [*] Build BusyBox as a static binary(no shared libs) //静态编译 [] Force NOMMU build [] Build with Large File Support(for accessing files > 2GB//大文件支持 (arm-linux-)Cross Compiler prefix () Additional CFLAGS 退出配置界面,并保存配置。
运行 make 命令,编译 busybox
#make 过程中会出现错误,意思是说在coreutils/fsync.c文件里O_NOATIME没有找到。
我们在/usr/include/bits的源码中找一下O_NOATIME哪里定义的(输入
grep -rn O_NOATIME ./* .可以找到在哪个.h文件中定义了),在fcntl.h里,拷贝/usr/include/bits/fcntl.h里#define O_NOATIME 01000000行到coreutils/fsync.c的头文件定义之后。其他的错误同理。最后会出现
里不能将 __user 定义为空的错误,解决方法是将编译器里的 fd.h 文件拷贝到 busybox的 include目录,最后在包含 的头文件改为 “fd.h” 再 make 即可成功。
运行 make install,将在 busybox 目录下生成 _install 的目录,里面就是 busybox 生成的工具。
#make install
- 创建目录结构
进入 _install 目录,建立目录:
#cd _install/
#mkdir dev etc lib mnt proc var tmp sys root
2· 建立初始化启动所需文件
··创建 inittab 文件
进入 _install/etc 目录,建立 inittab 文件,文件内容:
#this is first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
#/bin/sh invocations on selected ttys
#Start an "askfirst" shell on the console(whatever that may be)
::askfirst:-/bin/sh
#Stuff to do when restarting the init process
::restart:/sbin/init
#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
注:Busybox的init实现了 init 的大部分程序,Runlevel 是不支持的
Busybox init 执行的几个阶段:设置init信号句柄
初始化 console(s)
解析 inittab 文件,/etc/inittab
(如果 /etc/inittab不存在,Busybox使用缺省值)
运行系统初始化脚本(Busybox use /etc/init.d/rcS为缺省)
运行 inittab 中所有 action 为 wait 的命令
运行 inittab 中所有 action 为once的命令
循环运行:运行inittab中所有action为 respawned 的命令
运行inittab中所有action为 askfirst 的命令
action定义:
上面内容中 sysinit 为 provide init with the path to the initialization script
askfirst 为 程序执行前询问,要求按 ENTER 键
restart 为 系统重新启动时执行的程序,通常是 init 程序
ctrlaltdel 为 当按下 Ctrl-Alt-Delete组合键时执行的程序
其中还有 sespawn 为 程序终止后重新执行
wait 为 init等待执行的程序结束后再继续执行
once 为 只运行程序一次,并且不等待程序运行完就继续执行
shutdown 为 系统关机时执行的程序
··创建 fstab 文件
进入 _install/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 /tmp tmpfs defaults 0 0
主意:这里挂载了tmpfs,所以我们在内核中必须把tmpfs配置上
修改内核配置:
File systems --->
Pseudo filesystems --->
[*] Virtual memory file system support(former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译内核
··创建 init.d/rcS
进入 _install/etc 下创建 init.d/rcS文件,添加如下内容
#!/bin/sh
#This is the first script called by init process
/bin/mount -a
··创建 profile 文件
进入 _install/etc 下创建 profile 文件,添加如下内容:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
#export PS1="\[\u@\h\W\]\$"
cd root
export PS1="[$USER@HOSTNAME \W]\#"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
··在 dev 下创建终端设备节点 console
进入 _install/dev 创建设备节点 console
#mknod console c 5 1
··建立嵌入式系统库
#cp /usr/local/arm/3.4.1/arm-linux/lib/* _install/lib -a
#cd _install/lib
删除所有无用的目录和静态库(所有的目录和 .a 文件)
然后减小库的体积,运行:
#arm-linux-strip *.so
1·进入 /source 目录
#cd /source
2·将系统中的原有的rootfs改名,备份。
#mv rootfs rootfs_default
3·拷贝我们制作好的文件系统到 /source 下,并改名为 rootfs
#cp -a _install /source/rootfs
4·设置 uboot 环境变量
在uboot下输入 #tftp 30008000 zImage\;go 30008000
#setenv bootargs root=nfs nfsroot=192.168.2.5:/source/rootfs
init=/linuxrc console=ttySAC0,115200 ip=192.168.2.100
注:192.168.2.5为Ubuntu的ip,192.168.2.100为uboot下载到的板子的ip
重新启动 NFS 服务,然后启动目标平台,挂载 NFS 文件系统;直到文件系统测试通过。
#/etc/init.d/nfs-kernel-server restart //重启nfs
通过 NFS 测试以后,就可以制作 ramdisk 文件系统了,具体如下:
1·制作一个大小为10M的虚拟磁盘,在Ubuntu的目录下输入
#dd if=/dev/zero of=initrd.img bs=1k count=8192 // initrd.img为8M
注:以dd命令建立一个了一个8192KB文件系统映象,存于initrd.img中,并以/dev/zero对它进行初始化。用这种方式对文件系统进行初始化,稍后当我们使用gzip命令压缩整个映象时,将让文件系统中未使用的部分获得最大压缩比。
2·格式化这个虚拟磁盘为 ext2
#mkfs.ext2 -F initrd.img
注:此处-F选项将可迫使mkfs.ext2在文件上运行
3·在 mount 下面创建 initrd 目录作为挂载点
#mkdir /mnt/initrd
4·将这个虚拟磁盘挂载到 /mnt/initrd 下
#mount -t ext2 -o loop initrd.img /mnt/initrd
注:initrd.img 不要和 Ubuntu 根目录下的 initrd.img 弄混了,同时 initrd.img不能存放rootfs目录中。loop 挂载“回旋设备”以及“ISO镜像文件”。
5·将我们的文件系统写入 initrd.img中,将测试好的文件系统里的内容全部拷贝到 /mnt/initrd目录下面
#cp /source/rootfs/* /mnt/initrd -a
6·卸载 initrd
#umount /mnt/initrd
7·压缩 initrd.img 为 initrd.img.gz
#gzip --best -c initrd.img > initrd.img.gz
8·配置内核支持 RAMDISK
制作完 initrd.img.gz 后,需要配置内核支持 RAMDISK 作为启动文件系统
Device Drivers
SCSI device support --->
<*> SCSI disk support
Block devices --->
<*> RAM disk support
(1)Default number of RAM disks
(8192)Default RAM disk size(kbytes) //修改为8M
General setup --->
[*] Initial RAM filesystem and RAM disk()support
9·在 U-BOOT 命令行重新设置启动参数:
#setenv bootcmd tftp 30008000 zImage\;tftp 30800000 initrd.img.gz\;go 30008000
#setenv bootargs root=/dev/ram rw init=/linuxrc initrd=0x30800000,8M
console=ttySAC0,115200 display=sam240
#saveenv
因系统提供制作 cramfs 文件系统的工具,则可以利用,具体操作如下:
/source#mkfs.cramfs rootfs rootfs.cramfs
将 NFS测试好的文件系统 rootfs 通过上述命令制作成为只读的 cramfs 文件系统 rootfs.cramfs.将其下载到 flash 的第一块分区上(视开发板分区情况来指定)。
在 U-BOOT 终端:
#tftp 30008000 rootfs.cramfs
#nand erase 200000 300000
#nand write 30008000 200000 300000
这样指定启动参数:
#setenv bootargs root=/dev/mtdblock/2 init=/linuxrc console=ttySAC0,115200
devfs=mount display=sam240
启动开发板测试
#mkdir test
mkdir:Cannot create directory 'test':Read-only file system
这是由 cramfs 文件系统决定的,cramfs 格式的文件系统是只读文件系统。
待续···
阅读(4459) | 评论(1) | 转发(1) |