宿主机:Fedora13
目标机:tiny6140
交叉编译器:arm-linux-gcc-4.5.1
交叉编译器路径:/opt/FriendlyARM/toolschain/4.5.1/bin
busybox版本:1.22.1
一 制作根文件系统
1. 配置、编译 Busybox
Busybox 的配置方法类似于 linux 内核的配置。下载解压 Busybox-1.22.1tar.gz 工具包后,进
入 busybox-1.22.1 目录,运行“make menuconfig”
,根据需要选择需使用的模块,保存退出后
会在本地生成一个.config 文件,它指定 busybox 在编译的过程中需要包含哪些功能。
2. 安装图形化配置的依赖工具 Ncurses
安装 Ncurses 有两种方式:有互联网时使用 apt-get 命令来安装(默认方式)
;无互联网时
使用源码包来安装。
限
a)使用 apt-get 命令安装(有互联网)
#apt-get install libncurses5-dev
3 . 图形化配置
Busybox 文件存放目录:Loongson/share 龙芯服务器上 或者直接在网上下载最新版本:http://www.busybox.net/
提示:调整终端窗口到合适大小或者最大化。
#tar zxf busybox-1.22.2-default.tar.gz
#cd busybox-1.22.1-default
#make menuconfig
配置选择为:
Busybox Setings--->
General Configuration ---> (默认)
Build Options--->
[ ] Build Busybox as a static binary (no shared libs)
[*] Build shared libbusybox
(/opt/gcc-3.4.6-2f/bin/mipsel-linux-)Cross Compiler prefix (需要编辑)
Installation Options("make install"behavior)---> (默认)
Busybox Library Turning--->
[*] vi-style line editing commands(NEW)
[*] Fancy shell prompts(NEW)
限
Init Utilities---> (默认)
[*]init
[*]Suport reading an inittab file
[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)
Miscellaneous Utilities-->
[ ] inoice
[ ] ubiattach
[ ] ubidetach
[ ] ubimkvol
[ ] ubirmvol
[ ] ubirsvol
[ ] ubiupdatevol
图例说明:
(1)进入主界面 Busybox Configuration,如下图:
(2)
在主界面,
选择并进入 Busybox Setings--->选项,
可以看到 General Configuration --->
选项,按默认配置即可,如下图:
按
(3)在 Busybox Settings 菜单,选择并进入 Build Options--->选项:
限
这里可选择静态编译或动态编译 busybox,
可根据需要任选一种编译方式进行编译。
(说明:
动态编译的 busybox 在构建文件系统时需要加入一些必须的动态库,而静态编译的 busybox 不
依赖动态库便可执行,构建文件系统时可省略拷贝动态库的步骤。
)
a)静态编译:
选择 Build Busybox as a static binary (no shared libs)选项,如下图:
进 入 Cross Compiler prefix 选 项 , 修 改 本 地 交 叉 工 具 链 的 路 径 , 如
“/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-”
,如下图:
154
b)动态编译:
选空 Build Busybox as a static binary (no shared libs)选项,如下图:
选择 Build shared libbusybox 选项,如下图:
进入 Cross Compiler prefix 选项,修改本地交叉工具链的路径,如下图:
(4)按
install"behavior)--->选项,如下图:
(5)进入 Installation Options("make install"behavior)--->选项,配置链接类型与安装路径,
这里使用默认配置,如下图:
(6)按
(7)选择 vi-style line editing commands(NEW)选项,如下图
(8)选上 Fancy shell prompts(NEW)选项,如下图:
(9)按
配置)
:
选择如下:
[*]init
[*]Suport reading an inittab file
[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)
限
(10)按
基本命令选项,需要哪些命令就编译进去,一般用默认的就可以了,如下图:
[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)
限
(10)按
基本命令选项,需要哪些命令就编译进去,一般用默认的就可以了,如下图:
11)以上几个步骤基本上是配置完成了,但为了解决某些系统的 inoice 出错,需要进行
如下配置:
选空 Miscellaneous Utilities-->中的[]inoice 选项,如下图:
(12)但为了解决某些系统的 ubi 出错,需要进行如下配置:
选空 Miscellaneous Utilities-->中的[]ubi*选项,如下图:
(13)按
图形化配置完成
4 编译 Busybox
配置完成后,编译 Busybox:
#make clean all
安装到目录:
#make install
在 Busybox1.19.2 目录下生成子目录_inistall,里面的内容:
其中可执行文件 busybox 在 bin 目录下,其他的都是指向它的符号链接。
二 . 构建根文件系统
在busybox-1.22.1里面
1 建立系统根目录
#mkdir /root/rootfs
#cd /root/rootfs
#mkdir dev home proc tmp var etc lib mnt sys usr etc/rc.d
2 建立系统配置文件
限
注意:以下的配置文件不是在 Ubuntu 操作系统的根目录下创建的。
(1)etc/inittab 文件
说明:inittab 文件是 init 进程的配置文件,系统启动后所访问的第一个脚本文件,后续启
动的文件都由它指定。
#cd /root/ rootfs
#vi etc/inittab
添加如下内容:
::sysinit:/etc/rc.d/rc.sysinit
//指定系统启动后首先执行的文件
#Example of how to put a getty on a seria line(for a terminal)
ttyS2::respawn:-/bin/sh
#no login(启动后进入 shell 环境)
#::respawn:/sbin/getty -L ttyS2 115200 vt100 #use login
#tty::respawn:-/bin/sh
#Stuff to do when restarting the init porcess
::restart:/sbin/init
#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
::shutdown:/sbin/swapoff –a
//捕捉 ctrl+alt+del 键,重启文件系统
//当关机时卸载所有文件系统
(2)etc/rc.d/rc.sysinit 文件
说明:这是一个脚本文件,可以在里面添加想自动执行的命令。以下命令配置环境变量、
主机名、dev 目录环境、挂接/etc/fstab 指定的文件系统、建立设备节点与设置 IP。
#vi etc/rc.d/rc.sysinit
添加如下内容
#!/bin/sh
#Set binary path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
#Config dev enviornment
mount -t tmpfs -o size=64k,mode=0755 tmpfs /dev
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
#mount all filesystem defined in /etc/fstab
echo "#mount all....."
/bin/mount -a
#Set ip
#ifconfig eth0 192.168.3.160up
ifconfig lo 127.0.0.1
限
#Set hostname
/bin/hostname "Loongson-gz"
export LAGNAME=root
echo "#Starting mdev....."
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
(说明:eth0 的 ip 地址可根据需要自行配置)
(3)etc/fstab 文件
说明:执行 mount –a 时挂接/etc/fstab 指定的文件系统。
#vi etc/fstab
添加如下内容
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /mnt tmpfs defaults 0 0
tmpfs /root tmpfs defaults 0 0
tmpfs /var/log tmpfs defaults 0 0
(4)etc/profile 文件
说明:inittab 中执行了这样一个语句“::respawn:-/bin/sh”
。
启动/bin/sh 程序时会启动 ash 的配置信息,
而它就是/etc/profile, 会把 profile 的所有配置全
sh
部都运行一遍,因此用户可以把自己的启动程序放在这里。
#vi etc/profile
添加如下内容
#!/bin/sh
#/etc/profile:system-wide .profile file for the Bourne shells
echo "Processing /etc/profile....."
#set search library path
export LD_LIBRARY_PATH=/lib:/usr/lib:/qte/lib
#set user path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/exe/
#Set PS1
export PS1='[\u@\h:\w]\$'
alias ll="ls -l"
echo "Done!"
(5)修改系统配置文件权限
#chmod 755 etc/*
#chmod 755 etc/rc.d/rc.sysinit
5.2.3 拷贝库文件
(6)拷贝 Busybox 文件
将安装好的 Busybox 文件拷贝到/root/rootfs/目录:
#cp ./Busybox1.22.1/_install/* /root/rootfs -rf
提示:配置 Busybox 若选择静态编译则省略此步骤。
在 x86 系 统中,动 态编译 Busybox 制作 文件系统 ,需将下 列几个必 须库从工 具 链
gcc-3.4.6-2f/mipsel-linux/lib 拷贝到 lib 目录。
ld.so.1, ld-2.3.6.so,
libcrypt.so.1, libc.so.6, libdl.so.2, libgcc_s.so.1, libm.so.6, libpthread.so.0,
libstdc++.so.6
#cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/库文件名 /root/rootfs/lib/
注:
如果制作完成,
运行出现错误,
则将目录 Loongson_1B/Tools/Lib/下的 ld.so.1 和 ld-2.3.6.so
拷贝到/root/rootfs/lib 下替代从 arm-none-linux-gnueabi 拷贝过去的库文件。
可以使用脚本,快速地拷贝所需的基本动态库:
#cd /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib
#vi cplib.sh
添加内容:
for file in libcrypt libc libdl libgcc_s libm libpthread libstdc++
do
cp -d $file.so.[*0-9] /root/rootfs/lib
done
cp -d ld*.so* /root/rootfs/lib
保存退出。
运行 cplib.sh SHELL 脚本:
#source cplib.sh
为了减少根文件系统的库大小,使用交叉编译工具即 gcc-3.4.6-2f 的 strip 工具来处理库文
件,把二进制文件中的包含的符号表和调试信息删除掉,可有效减少库文件大小。
例:
#cd /opt//gcc-3.4.6-2f/bin
#./mipsel-linux-strip /root/rootfs/lib/*.so
限
至此根文件系统(目录/root/rootfs)制作完成
(7)在/dev 下建立设备节点:Console null
mknod dev/console c 5 1
mknod dev/null c 1 3
(e)将编译busybox生成的/bin和/sbin下的工具拷贝到myroot下的/bin和/sbin下
三 . 制作文件系统镜像
1 镜像文件制作工具
(1) cramfs-1.1.tar.gz (制作 cramfs 文件系统工具
(2) mtd-utils-1.0.0.tar.gz (制作 jffs2 文件系统工具)
(3) yaffs2-d43e901.tar.gz (制作 yaffs2 文件系统工具)
(4) zlib-1.2.3.tar.gz (依赖工具
2 镜像文件制作工具本机安装
mkfs.cramfs 为 Ubuntu 自带的制作 cramfs 格式文件系统的工具。
在主机上编译安装镜像文件制作工具,无须交叉编译。可以使用 apt-get 安装,也可使用
源码安装,下面使用源码包安装。
(1)安装依赖工具 zlib:
#tar zxf zlib-1.2.3.tar.gz
#cd zlib-1.2.3
#./configure && make && make install
(2)制作 cramfs 文件系统工具 mkcramfs:
#tar zxf cramfs-1.1.tar.gz
#cd cramfs-1.1
#make
当前目录生成 mkcramfs,可以拷贝到/usr/bin:
#cp mkcramfs /usr/bin
(3)制作 jffs2 文件系统工具 mkfs.jffs2
#tar zxf mtd-utils-1.0.0.tar.gz
#cd mtd-utils-1.0.0
#make
当前目录下生成 mkfs.jffs2,可以拷贝到/usr/bin:
#cp mkfs.jffs2 /usr/bin
(4)制作 yaffs2 文件系统工具 mkyaffs2image
#tar zxf yaffs2-d43e901.tar.gz
#cd yaffs2-d43e901/utils
#make
在当前目录 yaffs2-d43e901/utils 下生成 mkyaffs2image,可以拷贝到/usr/bin:
#cp mkyaffs2image /usr/bin
3 制作文件系统镜像文件
(1)Cramfs:
#mkcramfs /root/rootfs rootfs-cramfs.img
#chmod 777 rootfs-cramfs.img
//修改文件系统权限,防止出现无法烧写的情况
或者使用自带的工具:
#mkfs.cramfs /root/rootfs rootfs-cramfs.img
#chmod 777 rootfs-cramfs.img
//修改文件系统权限,防止出现无法烧写的情况
限
(2)Jffs2:
#mkfs.jffs2 -r /root/rootfs -o rootfs-jffs2.img -e 0x20000 --pad=0x2000000 -n
#chmod 777 rootfs-jffs2.img
//修改文件系统权限,防止出现无法烧写的情况
mkfs.jffs2 各参数的意义:
-r:指定要生成 image 的目录名。
-o:指定输出 image 的文件名。
-e:每一块要擦除的 block size,不同的 flash,其 block size 会不一样。这里为 128KB。
--pad:用 16 进制来表示所要输出文件的大小,也就是 rootfs-jffs2.img 的大小,如果实
际大小不足此设定的大小,则用 0xFF 补足。
-n,-no-cleanmarkers:指明不添加清楚标记(nandflash 有自己的校检块,存放相关的
信息)
。
(3)Yaffs2:
#mkyaffs2image /root/rootfs rootfs-yaffs2.img
#chmod 777 rootfs-yaffs2.img
//修改文件系统权限,防止出现无法烧写的情况
四 . 用USB烧写内核跟文件系统镜像文件
1 在宿主机上 输入:
1 ./dnw linux-2.6.28.6/arch/arm/boot/zImage 0
./dnw busybox/mkfs-tools/yaffs2/d43e901/utils/rootfs-yaffs2.img 0
烧写之前最好把之前烧写过的文件系统 先格式化 以免写入错误
2 .上电开发板 选择K 下载Linux-2.6.28.6 内核 。
. 选择Y下载制作好的文件系统镜像文件: rootfs-yaffs2.img
注意:当系统跑起来是需要改一下之前创建在busybox目录下 /root/rootfs/etc 的 inittabled
vi busybox/root/rootfs/etc/inittable 把ttyS2 改成s3c2410-serial0 以免自动启动时不能进入界面
.