忘了到底前幾年看的一篇什麼busybox的教程,寫的極其複雜,以至於讓我這麼久以來一直不敢再去碰這個東西,直到今天又再次有了這個需求,特來再搞一次,沒想到不到倆小時,一次搞定,將這過程記錄下來,以後也好有個參考。
1 環境
宿主機: Ubuntu 18.04
交叉編譯工具鏈: aarch64-linux-gnu-gcc 7.4.0
目標機: Armv8 i.MX 8 EVK board
2 下載
busybox官網下載:https://busybox.net/,我是直接git clone
的最新的1_31_stable
分支
git clone git://git.busybox.net/busybox -b 1_31_stable
3 編譯
3.1 make defconfig
3.2 make menuconfig
這裏我們的原則是在make defconfig的基礎上儘可能少的改動這些config, 要改以下幾個地方,括號裏的是symbol,方便直接查找:
-> Settings
--- Support --long-options
[\*] Don't use /usr #不要生成usr目錄 (CONFIG_INSTALL_NO_USR)
--- Build Options
[\*] Build static binary (no shared libs) #進行靜態編譯 (CONFIG_STATIC)
--- Installation Options ("make install" behavior)
What kind of applet links to install (<choice> [=y])
(X) as soft-links (CONFIG_INSTALL_APPLET_SYMLINKS)
--- Library Tuning
[\*] Query cursor position from terminal (CONFIG_FEATURE_EDITING_ASK_TERMINAL)
結束,保存一下
3.3 make all
make ARCH=aarch64 CROSS_COMPILE=aarch64-linux-gnu- all
No Error, 必須的
3.4 make install
在當前目錄下會生成一個_install
文件夾,到此我們的編譯算是完成了。
4 建立ROOTFS目錄結構
(起始路徑爲busybox的編譯根目錄,此處文件夾名爲busybox)
#mkdir ../rootfs //創建一個rootfs目錄
#cd ../rootfs //切換到rootfs目錄下
#mkdir dev etc lib usr var proc tmp home root mnt sys
#cd ../busybox/ //切換到busybox目錄下
#cp -ra _install/* ../rootfs
#cp -ra examples/bootfloppy/etc/* ../rootfs/etc //把fstab,init.d,inittab,profile拷貝過來,需修改
#cd ../rootfs/etc //切換到rootfs的etc目錄下
#cp /etc/passwd . //拷貝宿主機的passwd文件到rootfs的etc目錄中,需修改
#cp /etc/group . //拷貝宿主機的group文件到rootfs的etc目錄中,需修改
#cp /etc/shadow . //拷貝宿主機的shadow文件到rootfs的etc目錄中,需修改
5 修改上面的幾個文件
此操作的根文件夾爲rootfs文件夾內,目錄名爲rootfs
5.1 修改inittab
原始文件爲:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改後爲:
---(1):開機免登陸直接進shell
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
---(2):開機需要登陸
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
5.2 修改profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib
/bin/hostname osee
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '
5.3 修改 etc/init.d/rc.S
/bin/mount -n -t ramfs ramfs /var
/bin/mount -n -t ramfs ramfs /tmp
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t ramfs none /dev
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/modules
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /dev/pts //telnet服務需要
/bin/mkdir -p /dev/shm //telnet服務需要
#echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自動掛載需要
/sbin/mdev -s //啓動mdev在/dev下自動創建設備文件節點
/bin/mount -a
#######配置網絡################################
/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
/sbin/ifconfig eth0 192.168.1.70
/sbin/ifconfig eth0 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
/sbin/ifconfig eth1 192.168.1.71 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth1
5.4 修改etc/fstab
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
5.5 修改passwd/group/shadow文件,只保留第一行
6 拷貝宿主機的libc到rootfs
#cp -ra /usr/aarch64-linux-gnu/lib/* rootfs/lib/
大功告成,快把卡插到目標機開發板上試下吧。
參考文獻:
1, 使用BusyBox製作嵌入式Linux根文件系統:https://www.cnblogs.com/Charles-Zhang-Blog/p/3419301.html
2, [Busybox]Busybox製作文件系統:https://www.cnblogs.com/aaronLinux/p/6886424.html