Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435513
  • 博文数量: 117
  • 博客积分: 3003
  • 博客等级: 中校
  • 技术积分: 1221
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 14:11
文章分类

全部博文(117)

文章存档

2011年(7)

2010年(110)

我的朋友

分类: LINUX

2010-08-20 09:44:00


一、实验目标
用busybox 定制一个很小的文件系统,并且运行用户编译的hello(动态链接)。
二、软件包
busybox:
bash: ftp://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz
三、实验步骤
3.1、建立工作目录
设定工作目录为/root/build_rootfs/, 该目录主要用来编译busybox,bash 等制造根文件系统的软
件,下载busybox,bash 到该目录;
mkdir /root/build_rootfs
3.2、建立根目录
该目录就是我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括
bin,dev,etc,usr,lib,sbin,proc,sys,tmp;这里设定根目录是/root/rootfs;busybox、bash 编译
之后,安装到该目录下;
mkdir /root/rootfs
mkdir /root/rootfs/{bin,dev,etc,usr,lib,sbin,proc,sys,tmp}
mkdir /root/rootfs/usr/{bin,sbin,lib}
创建节点
以root 用户执行,创建节点
mknod dev/console c 5 1
mknod dev/null c 1 3
3.3、拷贝动态链接库
交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib 目录下;
我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这
里我们用到的交叉工具链的路径是/usr/local/arm/3.4.4/, 所以链接库的目录是
/usr/local/arm/3.4.4/sysroot/lib。
#进入链接库目录
cd /usr/local/arm/3.4.4/sysroot/lib
#编写一个shell 文件,用于copy 实际的共享链接库;主修订版本的符合链接;动态连接器及其符
号链接到目标板根目录下的lib(/root/rootfs/lib)。
vi cp.sh


#内容如下:
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so /root/rootfs/lib
cp -d $file.so.[*0-9] /root/rootfs/lib
done
cp -d ld*.so* /root/rootfs/lib
#保存退出
#第一个cp 命令会复制实际的共享库
#第二个cp 命令会复制符合链接本身
#第三个cp 命令会复制动态连接器及其符合链接
#执行刚编写的shell。
source cp.sh
#这样就把链接库复制到/root/rootfs/lib 目录下。
#接着我们还要缩小复制过来的链接库的体积,如下:
arm-linux-strip –s /root/rootfs/lib/lib*
3.4、交叉编译busybox
busybox 的源码可以从下载,这里我们下载一个1.10.3
版本的源码。
我们在配置busybox 的时候是基于默认配置之上来配置的;先make defconfig 就是把busybox
配置成默认,然后再make menuconfig 来配置busybox。
说明:我们在配置一个源代码包之前,可以先阅读源码包目录下的README 和INSTALL 文件以
及Makefile 的注释部分,也可以到 网站以获取帮助。
/FAQ.html#configure 的第二个问题2 How do I configure busybox?
有介绍怎么去配置。
#解压
tar jxvf busybox-1.10.3.tar.ba2
mv busybox-1.10.3 busybox
cd busybox
#修改Makefile,指定ARCH,CROSS_COMPILE 环境变量
vi Makefile
ARCH ?= arm
CROSS_COMPILE=/usr/local/arm/3.4.4/bin/arm-linux-
#配置busybox
make defconfig
make menuconfig
#配置时,我们基于默认配置,再配置它为静态编译,安装时不要/usr 路径,指定一个安装路径,
#如下:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)


Installation Options --->
[*] Don't use /usr
(/root/rootfs) BusyBox installation prefix
输入"/root/rootfs",指定安装路径为/root/rootfs
#保存退出,编译安装;
make && make install
#安装完成后,busybox 会在安装目录上安装linuxrc 文件,用户可以根据自身需要进行跟换该文件。
3.5、交叉编译bash
Bash 是一个交互程序,其源码可以从ftp://ftp.gnu.org/gnu/bash/下载;
步骤如下:
cd /root/build_rootfs
解压源码;
tar zxvf bash-3.2.tar.gz
cd bash-3.2
export PATH=/usr/local/arm/3.4.4/bin:$PATH
./configure –-host=arm-linux –-enable-static-link
make
arm-linux-strip –s bash
编译的结果得到静态链接的bash 程序,将其拷贝到根目录下;
cp bash /root/rootfs/bin
3.6、建立系统配置文件
3.6.1、etc/inittab 文件
首先inittab 文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。
cd /root/rootfs
vi etc/inittab
添加如下内容
#first: run the system script file
::sysinit:/etc/init.d/rcS
#second:run the local script file
::on
ce:/etc/rc.local
#third run the bash shell prosecc
::respawn:/bin/bash
#restart init process
::restart:/sbin/init
#umount all file system
::shutdown:/bin/umount -a -r
上面的这个inittab 文件决定的启动流程是:
1 执行“/etc/init.d/rcS”脚本;
2 执行“/etc/rc.local”脚本;
3 执行“/bin/bash”交互程序,进入交换界面;


3.6.2、etc/init.d/rcS 文件
etc/init.d/rcS 文件参考:该脚本主要是挂载proc、sysfs 和ramfs 文件系统,建立必要的设备文
件或其符号连接;
mkdir etc/init.d
vi etc/init.d/rcS
内容如下:
#!/bin/sh
#mount fs
/bin/mount -t ramfs ramfs /tmp
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
3.6.3、etc/rc.local 文件
/etc/rc.local 文件参考:该脚本主要是配置IP 地址;
vi etc/rc.local
内容如下:
#!/bin/sh
# set ip
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 172.22.60.223 netmask 255.255.0.0 up
/sbin/route add default gw 172.22.60.1 eth0
3.6.4、.bashrc 文件
最后启动的是bash 交换程序,进入交换界面;bash 程序的启动会读取.bashrc 脚本文件;.bashrc
文件参考:
vi .bashrc
#!/bin/bash
# set env
export PATH=/bin:/sbin:/usr/bin
export LD_LIBRARY_PATH=/lib:/usr/lib
/bin/hello &
3.7、添加一个用户程序
进入工作目录
cd /root/build_rootfs/
编辑源文件
vi hello.c
内容如下
#include
main()


{
printf(“welcome to my rootfs\n”);
}
保存退出;
交叉编译
arm-linux-gcc hello.c –o hello
复制到目标板的根目录
mv hello /root/rootfs/usr/bin
4、制作cramfs 根文件系统映像
Red hat EL4 自带了mkcramfs 工具,这个工具是用来制作cramfs 文件系统映象的;
cd /root/
mkcramfs rootfs rootfs.cramfs
rootfs.cramfs 就是我们要烧写到目标板的映像文件
烧写rootfs.cramfs 到2 分区,启动开发板,运行hello 程序。
rootfs.cramfs 文件拷贝到tftp 下载的目录下,如拷贝到linux 系统中的/tftpboot 目录;
开发板的u-boot 通过tftp 命令下载;
根据分区表来烧写;
在uboot 下设置传递给内核的命令行参数:
setenv bootargs root=/dev/mtdblock2 init=/sbin/init console=ttySAC0,115200
5、制作JFFS2 根文件系统映像
制作JFFS2 根文件系统需要用到MTD 工具,其下载地址是:
ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.0.0.tar.gz
MTD 工具的编译安装步骤如下:
cd /root/build_rootfs
拷贝MTD 源码到该目录下;
tar zxvf mtd-utils-1.0.0.tar.gz
cd mtd-utils-1.0.0
make
编译通过之后会生成mkfs.jffs2 工具,这个工具就是用来制作jffs2 文件系统映象的。把
mkfs.jffs2 拷贝到/root/目录下;
cp mkfs.jffs2 /root/
使用mkfs.jffs2 工具生成生成jffs2 文件系统的命令:
cd /root/
./mkfs.jffs2 -r rootfs -o rootfs.jffs2 -p -l -n -e 0x4000 -m size
-r 指定内含根文件系统的目录
-o 指定文件系统映象的输出文件名称
-p 表示在映像的结尾用0x0 补全到block
-l 存储格式为小端格式
-n 每个擦除的block 中不添加clreanmarker


-e 擦除block 的大小
Uboot 下设置传递给内核的命令行参数:
setenv bootargs root=/dev/mtdblock2 init=/sbin/init console=ttySAC0,115200
rootfstype=jffs2
6、挂载网络根文件系统
在虚拟PC 机上,设置NFS 共享目录
vi /etc/exports
添加共享目录(将根文件系统目录设置为共享目录):
/root/rootfs *(rw,sync,no_root_squash)
设置ip,重启NFS 服务
ifconfig eth0 192.168.2.88 up
/etc/init.d/nfs reboot
在开发板的uboot 上设置命令行参数:
setenv bootargs root=/dev/nfs nfsroot=192.168.2.88:/root/rootfs ip=192.168.2.65
init=/sbin/init console=ttySAC0,115200
其中:root 指定根文件系统为”/dev/nfs”网络跟文件系统
nfsroot 指定网络根文件系统的路径是ip 地址为192.168.2.88 主机上
的”/root/rootfs”目录,
ip 指定开发板的IP 地址
saveenv
阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~