这个题目太大了,其实我哪个也搞不清楚.只是追随前人的脚步,把这个平台搭建起来了.在这里只是纪录以下我工作的过程,和遇到的问题.
首先,
cd ~
wget -c http://www.busybox.com/downloads/busybox-1.2.1.tar.bz2 得到busybox的1.2.1版
tar -jvxf busybox-1.2.1.tar.bz2
cd busybox-1.2.1
make menuconfig
设置几个地方
1. install option --> [ ] use /usr/bin 不要选中,否则make install 会把相应的命令安装到/usr/bin下覆盖系统原有的命令
2. build options --> [*]build busybox as a static binary(no shared libs) 把busybox编译成能独立运行的程序。
[*]do you want to build busybox with a cross compiler?然后填上交叉编译器的路径和头
/usr/arm/3.3.2/bin/arm-linux-
3. 在集成的工具里加入几个必须的 initrd ls cd mkdir mount umount gzip guzip cp mv telnet tftp ps 等命令。尝试一下,命令过多老是出古怪的编译错误,其他命令过几天加上。
4. make ; make install 在./目录出现_install目录,下面有linuxrc bin/ sbin/ 3个文件
5. make shell ramdisk
cd ~
dd if=/dev/zero of=initrd.img bs=1k count=8192 在./目录生成initrd.img文件
losetup /dev/loop2 ramdisk 还不知道什么意思
mkfs.ext2 /dev/loop2 格式化loop2为ext2格式
mount -t ext2 /dev/loop2 /mnt/local 挂载ramdisk至/mnt/local
6.做个脚本 make_rd_lib
#!/bin/sh
TEMP_LIB=/tmp/lib
DEST_LIB=/mnt/local/lib
SOURCE_LIB=/usr/local/arm/3.3.2/arm-linux/lib
mkdir -p $TEMP_LIB
cd $SOURCE_LIB
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so $TEMP_LIB
cp -d $file.so.[*0-9] $TEMP_LIB
done
cp -d ld*.so* $TEMP_LIB
#去除符号标志,使库文件尽量减小,值得一提的是通过strip,使得原来的库文件由19M减小到了1.8M,效果非常好
cd $TEMP_LIB
PATH=$PATH:/usr/local/arm/3.3.2/bin
arm-linux-strip *
mkdir -p $DEST_LIB
cp -rf $TEMP_LIB/* $DEST_LIB/
rm -rf $TEMP_LIB
#EOF
7. chomd a+x make_rd_lib
./make_rd_lib copy库文件
8. cp -rf busybox-1.2.1/_install/* /mnt/local copy linux bin/ sbin/文件
9. 现在/mnt/local/下 有 linuxrc /bin /sbin /lib 了
cd /mnt/local
mkdir etc
cd etc
vim inittab
内容如下
::sysinit:/etc/init.d/rcS #系统初始化时执行/etc/init.d/rcS
#::wait:/etc/rc.d/rclocal #等待系统初始化动作结束后执行/etc/rc.d/rclocal
::respawn:/sbin/getty 115200 ttyS0 #getty进程结束时重新启动,并设置tty为串口
::restart:/sbin/init #当init进程重新启动时,执行初始化程序/sbin/init
::shutdown:/bin/umount -a -t #系统关机时执行的进程
::respawn:/bin/sh #当sh进程结束时,自动运行/bin/sh
mkdir init.d
cd init.d
vim rc.S
内容
#!/bin/sh
#Remount the root filesystem in read-write (require /etc/fstab)
/bin/mount -a
#Mount /proc filesystem
mount /proc
#Start the network interface
/sbin/ifconfig eth0 192.168.0.42
#EOF
10. 至此/mnt/local/有etc/ bin/ sbin/ linuxrc dev/还不能构成最小文件系统
mkdir proc var tmp usr dev
mkdir dev/fd
cd /dev
cp -avf mem ram0 zero null ttyS0 ramdisk random /mnt/local/dev
这样一个比较完整的文件系统就建立完毕了。在根目录下有bin/ sbin/ etc/ var/ tmp/ dev/ proc/ linuxrc
cd ~
umount /dev/loop2
losetup -d /dev/loop2
gzip -9 initrd.img
生成了 initrd.img.gz
cp initrd.img.gz /tftpboot/
至此,busybox 和ramdisk基本安装完毕
明天再写linux的配置吧。
编译busybox-1.2.1遇到的问题,当insmod命令选用时,就会出现
undefined reference to `query_module' 这个错误,在网上搜索发现是交叉编译器的版本不够,要3.4以上才能顺利编译过去。只好返回去下载了busybox-1.00,发现里面有反向移植的支持2.6内核的insmod,而且用3.3的编译器也可以编译过去,于是最终选用了busybox-1.00.