Busybox 配置、编译与文件系统构建

宿主机: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,如下图:
Busybox 配置、编译与文件系统构建_第1张图片
(2)
在主界面,
选择并进入 Busybox Setings--->选项,
可以看到 General Configuration --->
选项,按默认配置即可,如下图:
Busybox 配置、编译与文件系统构建_第2张图片

,返回 Busybox Settings 菜单。

(3)在 Busybox Settings 菜单,选择并进入 Build Options--->选项:

这里可选择静态编译或动态编译 busybox,


可根据需要任选一种编译方式进行编译。
(说明:
动态编译的 busybox 在构建文件系统时需要加入一些必须的动态库,而静态编译的 busybox 不
依赖动态库便可执行,构建文件系统时可省略拷贝动态库的步骤。
)
a)静态编译:
选择 Build Busybox as a static binary (no shared libs)选项,如下图:
Busybox 配置、编译与文件系统构建_第3张图片

进 入 Cross Compiler prefix 选 项 , 修 改 本 地 交 叉 工 具 链 的 路 径 , 如
“/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-”
,如下图:
154

Busybox 配置、编译与文件系统构建_第4张图片

b)动态编译:
选空 Build Busybox as a static binary (no shared libs)选项,如下图:
Busybox 配置、编译与文件系统构建_第5张图片


选择 Build shared libbusybox 选项,如下图:
Busybox 配置、编译与文件系统构建_第6张图片

进入 Cross Compiler prefix 选项,修改本地交叉工具链的路径,如下图:

Busybox 配置、编译与文件系统构建_第7张图片
(4)按,返回 Busybox Settings 菜单,选择 Installation Options("make
install"behavior)--->选项,如下图:
Busybox 配置、编译与文件系统构建_第8张图片

(5)进入 Installation Options("make install"behavior)--->选项,配置链接类型与安装路径,
这里使用默认配置,如下图:
Busybox 配置、编译与文件系统构建_第9张图片

(6)按,返回 Busybox Settings 菜单,选择并进入 Busybox Library Turing--->选项,如下图
Busybox 配置、编译与文件系统构建_第10张图片

(7)选择 vi-style line editing commands(NEW)选项,如下图
Busybox 配置、编译与文件系统构建_第11张图片

(8)选上 Fancy shell prompts(NEW)选项,如下图:

Busybox 配置、编译与文件系统构建_第12张图片

(9)按,一直返回主界面选择并进入 Init Utilities--->选项,如下图(这里使用默认
配置)
:Busybox 配置、编译与文件系统构建_第13张图片
选择如下:
[*]init
[*]Suport reading an inittab file


[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)

(10)按,返回主界面,下面是需要编译进 busybox 的功能选项,它们都是一些 linux
基本命令选项,需要哪些命令就编译进去,一般用默认的就可以了,如下图:
[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)

(10)按,返回主界面,下面是需要编译进 busybox 的功能选项,它们都是一些 linux
基本命令选项,需要哪些命令就编译进去,一般用默认的就可以了,如下图:
Busybox 配置、编译与文件系统构建_第14张图片

11)以上几个步骤基本上是配置完成了,但为了解决某些系统的 inoice 出错,需要进行
如下配置:
选空 Miscellaneous Utilities-->中的[]inoice 选项,如下图:
Busybox 配置、编译与文件系统构建_第15张图片

(12)但为了解决某些系统的 ubi 出错,需要进行如下配置:
选空 Miscellaneous Utilities-->中的[]ubi*选项,如下图:

Busybox 配置、编译与文件系统构建_第16张图片

(13)按,一直返回到保存配置,按< Yes >保存,如下图:

Busybox 配置、编译与文件系统构建_第17张图片

图形化配置完成


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 以免自动启动时不能进入界面


.

你可能感兴趣的:(Linux内核和文件系统)