内核版本:
Linux-2.6.34.10
交叉编译器版本:
arm-linux-gcc 3.4.1
操作系统平台:
Linux Fedora 12
开发板平台:
飞凌 OKIII2440
使用的工具:
Busybox-1.15.2.tar.bz2
使用busybox定制一个很小的文件系统。
步骤为:
一、 准备制作
建立根目录,该目录就要我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin。
cd /home/rock/rootfs
cd rootfs
用shell脚本创建根文件系统的目录结构
首先 touch build_fs.sh
然后进行编辑,用vim,键入以下内容:
#!/bin/sh
echo "------Create rootfsdirectons......"
mkdir rootfs
cd rootfs
echo "--------Createroot,dev......"
mkdir root dev etc bin sbin mnt sys proclib home tmp var usr
mkdir usr/sbin usr/bin usr/lib usr/modules
mkdir mnt/usb mnt/nfs mnt/etcmnt/etc/init.d
mkdir lib/modules
chmod 1777 tmp
cd ..
echo "-------make directiondone---------"
二、 编译busybox
把Busybox-1.15.2.tar.bz2拷贝到home/rock/
下载解压
BusyBox下载地址:http://www.busybox.net/
lingd@ubuntu:~/arm2410s$ tar xjvfbusy-1.15.2.tar.bz2
lingd@ubuntu:~/arm2410s$ cd busybox-1.15.2
lingd@ubuntu:~/arm2410s/busybox-1.15.2$ viMakefile
首先修改 Makefile ,将以下两项改为
CROSS_COMPILE = arm-linux-
ARCH = arm
配置busybox,修改以下选项(其他选项默认就可以了,或者根据需要再裁减一下):
lingd@ubuntu:~/arm2410s/busybox-1.15.2$make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
[ ] Build with Large File Support (for accessing files > 2 GB)
Installation Options --->
[*] Don't use /usr #这项必选选上,否则BusyBox默认安装路径是/usr,原/usr下的东西可能会被覆盖了
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
[*] Command line editing
(1024) Maximum length of input
[*] vi-style line editingcommands
(15) History size
[*] History saving
[*] Tab completion
[*] Username completion
[*] Fancy shell prompts
这两项必须选上,不然BusyBox将无法识别环境变量PS1里的参数。
Linux Module Utilities --->
[*] insmod
[*] Enable load map (-m)option
[*] Symbols in load map
[*] rmmod
[*] lsmod
[*] Pretty output for 2.6.xLinux kernels
[*] modprobe
[ ] Multiple optionsparsing
[ ] Fancy alias parsing
[ ] Blacklist support
--- Options common to multiplemodutils
[ ] Support tainted module checking with new kernels
[ ] Support version 2.2.x to 2.4.x Linux kernels
[*] Support version 2.6.x Linux kernels
(/lib/modules) Default directory containing modules
(modules.dep) Default name of modules.dep
保存退出 Busybox
lingd@ubuntu:~/arm2410s/busybox-1.15.2$make
lingd@ubuntu:~/arm2410s/busybox-1.15.2$make install
编译BusyBox时,可能会出现以下错误:
1. inotifyd出错
交叉编译busybox-1.15.2时,出现以下错误:
CC miscutils/inotifyd.o
miscutils/inotifyd.c:31:27:linux/inotify.h: No such file or directory
miscutils/inotifyd.c: In function`inotifyd_main':
miscutils/inotifyd.c:61: error:`IN_ALL_EVENTS' undeclared (first use in this function)
miscutils/inotifyd.c:61: error: (Eachundeclared identifier is reported only once
miscutils/inotifyd.c:61: error: for eachfunction it appears in.)
miscutils/inotifyd.c:129: error:dereferencing pointer to incomplete type
miscutils/inotifyd.c:139: error:dereferencing pointer to incomplete type
miscutils/inotifyd.c:140: error:dereferencing pointer to incomplete type
miscutils/inotifyd.c:140: error:dereferencing pointer to incomplete type
miscutils/inotifyd.c:143: error: invalidapplication of `sizeof' to incomplete type `inotify_event'
miscutils/inotifyd.c:143: error:dereferencing pointer to incomplete type
make[1]: *** [miscutils/inotifyd.o] Error 1
make: *** [miscutils] Error 2
网上说这是busybox的一个bug,解决方法:去掉对inotifyed的支持,具体步骤如下:
# make menuconfig
Miscellaneous Utilities --->
[]inotifyd
还有另一个bug是taskset,也要将它去掉,不然编译时又会出错。
Miscellaneous Utilities --->
[]taskset
2. 未定义ARPHRD_INFINIBAND
错误信息如下:
networking/interface.c:818: error:'ARPHRD_INFINIBAND' undeclared here (not in a function)
make[1]: *** [networking/interface.o] Error1
make: *** [networking] Error 2
通过查看内核源代码目录中的“include/linux/ifarp.h”文件可知“ARPHRD_INFINIBAND”的值为“32”。然后修改“networking/interface.c”文件,在其中添加:
#define ARPHRD_INFINIBAND 32 /* InfiniBand */
make ARCH=arm CROSS_COMPIL=arm-linux- CONFIG_PREFIX=/home/rock/rootfsall install
3. mkfs_vfat.o错误
错误信息
In file included fromutil-linux/mkfs_vfat.c:13:
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342:error: variable or field `__user' declared void
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342:error: parse error before '*' token
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:360:error: parse error before '}' token
make[1]: *** [util-linux/mkfs_vfat.o] 错误 1
make: *** [util-linux] 错误 2
解决办法
修改/usr/local/arm/3.4.1/arm-linux/sys-include/linux中fd.h
添加#include <linux/compiler.h>
三、 制作文件系统
在dev目录下,创建两个设备节点:
#mknod console c 5 1
#mknod null c 1 3
进入etc 目录,添加文件:
1. 拷贝Busybox-1.15.2/examples/bootfloopy/etc/* 到当前目录下。
#cp -r ../../busybox-1.15.2/examples/bootfloopy/etc/* ./
包括的文件:fstab、init.d、inittab、profile
2. 拷贝/etc/passwd、/etc/group、/etc/shadow到当前目录下。
# cp /etc/passwd ./
# cp /etc/group ./
# cp /etc/shadow ./
把passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成/bin/ash,因为文件
系统的bin目录下没有bash这个命令,而是用ash代替bash,所以在用用户名密码登录的时候(如
telnet),会出现“cannot run/bin/bash: No such fileor directory”的错误。
3. 修改inittab文件:
内容如下:
console::sysinit:/etc/init.d/rcS
ttyS0::respawn:-/bin/sh
s3c2410_serial0::askfirst:-/bin/sh
::once:/usr/sbin/telnetd -l /bin/login
::ctrlaltdel:/bin/umount -a -r
4. 修改fstab文件,内容如下:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
5. 修改init.d/rcS文件,内容如下:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
#echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
ifconfig eth0 192.168.0.15 up
/sbin/telnetd
6. 修改profile文件,内容如下:
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
echo " Processing /etc/profile..."
echo "Done"
export USER LOGNAME PS1 PATH
7. 新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:OK2440
8. 拷贝库文件:
进入lib目录,拷贝交叉编译器的库文件到lib目录下
写一个cp.sh脚本
#!/bin/sh
cd /usr/local/arm/3.4.1/arm-linux/lib
for file in libc libcrypt libdl libmlibpthread libresolv libutil
do
cp $file-*.so /home/rock/rootfs/lib/
cp -d $file.so.[*0-9] /home/rock/rootfs/lib/
done
cp -d ld*.so* /home/rock/rootfs/lib/
由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留常用的库文
件。
arm-linux-strip -s /home/rock/rootfs/lib/lib*
四、 制作调试工具strace
使用strace可以跟踪程序执行时系统调用的相关信息,因此它是一个功能非常强大的调试和分析诊断工具。由于Linux系统中并没有包含程序,所以需要自己移植,整个移植过程非常简单。
1. 从SourceForge上下载strace的代码,http://sourceforge.net/projects/strace/
2. 解压 tar xvjf strace-4.5.20.tar.bz2
3. 配置 ./configure --host=arm-linux CC=arm-linux-gcc LD=arm-linux-ld
4. 编译,直接敲make即可,不用选择“-static”链接选项
5. strip,arm-linux-strip./strace
6.最后使用 file ./strace查看编译结果,编译好的strace程序只有200多K。
最后将strace拷贝到/home/rock/rootfs/usr/sbin目录下,即可使用。
五、 制作文件系统镜像
找一个mkyaffs2image工具
cd /home/rock
./mkyaffs2image rootfs/ rootfs.yaffs