忘了到底前几年看的一篇什么busybox的教程,写的极其复杂,以至于让我这么久以来一直不敢再去碰这个东西,直到今天又再次有了这个需求,特来再搞一次,没想到不到俩小时,一次搞定,将这过程记录下来,以后也好有个参考。
1 环境
宿主机: Ubuntu 22.04
交叉编译工具链: riscv64-linux-gnu-gcc 11.3.0
2 下载
busybox官网下载:https://busybox.net/,我是直接git clone
的最新的1_31_stable
分支
git clone https://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=riscv CROSS_COMPILE=riscv64-linux-gnu- all
No Error, 必须的
3.4 安装到指定目录
mkdir -p ./installed //创建指定目录
make CONFIG_PREFIX=./installed install //安装到指定目录
在当前目录下会生成一个installed
文件夹,到此我们的编译算是完成了。
注意:以下均已弃用,最新的方法见:
[busybox] busybox生成一个最精简rootfs
提供一个打包好的riscv64 linux可用的rootfs: https://download.csdn.net/download/wangyijieonline/85235425
提供一个打包好的arm64 linux可用的rootfs:[TBD]
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 installed/* ../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/rcS
/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.6 修改passwd/group/shadow文件,只保留第一行
6 拷贝宿主机的libc到rootfs
# cp -ra /usr/aarch64-linux-gnu/lib/* rootfs/lib/
7 拷贝编译安装内核模块到目标机
make modules make modules_install INSTALL_MOD_PATH=/rootfs/lib/modules
8 打包
$ cd rootfs $ find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio $ cd .. $ gzip initramfs.cpio
9 解压cpio
$ cpio -idmv < initramfs.cpio
大功告成,快把卡插到目标机开发板上试下吧。
参考文献:
1, 使用BusyBox制作嵌入式Linux根文件系统:https://www.cnblogs.com/Charles-Zhang-Blog/p/3419301.html
2, [Busybox]Busybox制作文件系统:https://www.cnblogs.com/aaronLinux/p/6886424.html