問題:
1.目前busybox和bootstrap兩種方案制作文件系統,哪種開發周期更短,更加簡單?
2.如果需要在文件系統中添加某個package,要怎么做,如vim/udhcpd等?
轉自:http://blog.csdn.net/happy_stars_2016/article/details/52620577
定制根文件系統的方法很多,最常用的是使用BusyBox來構建。它能使用戶迅速方便地建立一套相對完整、功能豐富的文件系統,其中包括大量常用的應用程序。它集成壓縮了Linux的許多工具和命令。下面詳細介紹有關BusyBox定制根文件系統。
一、系統環境:
1、操作系統:Ubuntu12.04
2、交叉編譯工具:arm-linux-gcc4.4.3
3、busybox源碼包:busybox-1.25.0.tar.bz2
二、制作rootfs
- 建立rootfs目錄
本人在/home/zxx下建立rootfs目錄
#mkdir rootfs #cd rootfs #mkdir root home bin sbin etc dev usr lib tmp mnt sys proc //建立常用目錄 #mkdir usr/lib usr/bin #pwd /home/zxx/rootfs
- 解壓源碼包:
#tar -jxvf busybox-1.25.0.tar.bz2
- 修改Makefile配置
進入busybox-1.25.0目錄,修改Makefile文件如下:
ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/4.4.3/bin/arm-linux- (與你自己主機的arm-linux-gcc安裝目錄一樣)
- 編譯BusyBox
#make menuconfig
選擇Busybox Settings--->Build Options--->,選擇[*] Build Busybox as a static binary(no shared libs)
選擇Busybox Settings ---> Installation Options --->BusyBox installation prefix(在里面輸入BusyBox的安裝目錄,我是保存在/home/zxx/rootfs下)
Shells --->Choose your default shell (ash) ---> --- ash
保存並退出
- 編譯安裝
#make
#make install
- 把busybox源碼目錄下的etc的內容拷貝到rootfs目錄下的etc下
# cd /home/zxx/rootfs/etc # cp -a /home/zxx/Downloads/busybox-1.25.0/examples/bootfloppy/etc/* ./
- 從本機拷貝passwd、shadow、group文件
# cp /etc/passwd . # cp /etc/shadow . # cp /etc/group .
修改passwd文件,把第一行和最后一行的bash修改成ash。
- 修改初始化文件inittab和fstab
# vim inittab
::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff –a
# vim fstab
proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 mdev /dev ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0
- rootfs下lib的制作
將交叉編譯環境下lib庫拷貝到/rootfs/lib
#cd /home/zxx/rootfs/lib #cp /usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/lib./
三、編譯錯誤解決參考
- make出現如下錯誤:
miscutils/nandwrite.c: In function 'nandwrite_main': miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this?function) miscutils/nandwrite.c:151: error: (Each undeclared identifier is reported only once miscutils/nandwrite.c:151: error: for each function it appears in.) scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed make[1]: *** [miscutils/nandwrite.o] Error 1 Makefile:742: recipe for target 'miscutils' failed make: *** [miscutils] Error 2
解決辦法:
MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定義。將/usr/include/mtd/mtd-abi.h拷貝到busybox的include文件中。
#gedit miscutils/nandwrite.c
修改頭文件如下:
#include "libbb.h" #include "mtd-abi.h" #include <mtd/mtd-user.h>
編譯可以通過。
- 繼續make,出現如下錯誤:
util-linux/blkdiscard.c: In function 'blkdiscard_main': util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function) util-linux/blkdiscard.c:72: error: (Each undeclared identifier is reported only once util-linux/blkdiscard.c:72: error: for each function it appears in.) scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failed make[1]: *** [util-linux/blkdiscard.o] Error 1 Makefile:742: recipe for target 'util-linux' failed make: *** [util-linux] Error 2
解決辦法:
BLKSECDISCARD在/usr/include/linux/fs.h中定義,方法如上所述,將/usr/include/linux/fs.h拷貝到busybox的include文件中linux下。
#gedit util-linux/blkdiscard.c
修改內容如下:
#include <linux/fs.h>
編譯通過。
到這里rootfs基本上已經制作出來,有些內容需要的,可根據自己rootfs的需要進行自己增加。最后將rootfs目錄制作成鏡像后,就可以燒寫到開發板上了。