busybox移植:全能脚本版
因为有个ssh的问题要分析,所以移植busybox。因为干净,避免其他的问题的干扰。本篇文章将初始化需要创建的内容全都放到了一个脚本文件中,极大的简化了根文件系统的创建过程。
源码下载
官网:
https://busybox.net/
下载最新的版本:
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
解压文件:
tar jxvf busybox-1.36.1.tar.bz2
编译脚本 build.sh
export PATH=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
MAKE="make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"
if [ -f ".config" ];then
echo ".config is found"
else
echo ".config is not found"
$MAKE defconfig
fi
$MAKE menuconfig
$MAKE -j`nproc`
rootpath=`pwd`
install_path=`pwd`/myrootfs
echo $install_path
mkdir -p $install_path
$MAKE install CONFIG_PREFIX=$install_path
cp `pwd`/done.sh $install_path
cd $install_path
$install_path/done.sh
tar -vcjf rootfs.tar.bz2 *
mv rootfs.tar.bz2 $rootpath
cd $rootpath
ls -lsh rootfs.tar.bz2 -lsh
mkdir -p ~/nfsroot/
cp $install_path ~/nfsroot/ -rfu
ls -lshd ~/nfsroot/myrootfs
执行完脚本后,进入myrootfs/bin目录,查看busybox的格式,如下:
myrootfs/bin$ file busybox
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=ae8a8e6bc4b577519d81cfb7c46e2814c2767415, stripped
编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中, rootfs 目录内容如下所示:
myrootfs$ ls bin linuxrc sbin usr
可以看出, rootfs 目录下有 bin、 sbin 和 usr 这三个目录,以及 linuxrc 这个文件。前面说过 Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从而切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。
busybox 的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,我们继续来完善 rootfs。
完成初始配置的脚本done.sh
该脚本完成如下功能
1 必要的文件夹的创建
2 必要的初始化文件和文件系统的挂载配置
编写创建目录以及复制库的脚本:
CUR_DIR=`pwd`
mkdir -p $CUR_DIR/sys
mkdir -p $CUR_DIR/sbin
mkdir -p $CUR_DIR/tmp
mkdir -p $CUR_DIR/root
mkdir -p $CUR_DIR/dev
mkdir -p $CUR_DIR/proc
mkdir -p $CUR_DIR/lib
mkdir -p $CUR_DIR/var
mkdir -p $CUR_DIR/run
mkdir -p $CUR_DIR/mnt
mkdir -p $CUR_DIR/home/root
mkdir -p $CUR_DIR/opt
mkdir -p $CUR_DIR/etc
mkdir -p $CUR_DIR/usr/lib
mkdir -p $CUR_DIR/home/root/bin
mkdir -p $CUR_DIR/mmcblk1p2
mkdir -p $CUR_DIR/mmcblk1p1
mkdir -p $CUR_DIR/dev/pts/
mkdir -p $CUR_DIR/etc/init.d/
touch $CUR_DIR/etc/init.d/rcS
touch $CUR_DIR/etc/fstab
touch $CUR_DIR/etc/inittab
touch $CUR_DIR/etc/resolv.conf
chmod +x $CUR_DIR/etc/init.d/rcS
echo "CUR_DIR=$CUR_DIR"
if [ -z "$CUR_DIR" ];then
echo "dir is null"
exit 0
else
echo "dir not null"
fi
ARM_GCC_PATH=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/*.a $CUR_DIR/lib/ -d
ls -l $CUR_DIR/lib/ld-linux-armhf.so.3
rm $CUR_DIR/lib/ld-linux-armhf.so.3
cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 $CUR_DIR/lib/
ls -l $CUR_DIR/lib/ld-linux-armhf.so.3
cp $ARM_GCC_PATH/arm-linux-gnueabihf/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/lib/*.a $CUR_DIR/lib/ -d
cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/usr/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/libc/usr/lib/*.a $CUR_DIR/usr/lib/ -d
du $CUR_DIR/lib -sh
du $CUR_DIR/usr/lib -sh
du $CUR_DIR -sh
cat << EOF > $CUR_DIR/etc/init.d/rcS
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:\$PATH
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
mount -a
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -t ext4 /dev/mmcblk1p2 /mmcblk1p2/
mount -t vfat /dev/mmcblk1p1 /mmcblk1p1/
#ifconfig eth1 up
#ifconfig eth1 192.168.5.103
#udhcpc -i eth1
#ifconfig eth1 192.168.5.103 netmask 255.255.255.0
#route add default gw 192.168.5.1 dev eth1
EOF
cat << EOF > $CUR_DIR/etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
EOF
cat << EOF > $CUR_DIR/etc/inittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
EOF
cat << EOF > $CUR_DIR/etc/resolv.conf
nameserver 114.114.114.114
nameserver 0.0.0.0
EOF
echo "finish"
测试:
设置bootcmd和bootargs
setenv bootcmd 'fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 82000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 82000000;'
挂载NFS文件系统setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.111:/home/lkmao/nfsroot/myrootfs,proto=tcp rw ip=192.168.5.103:192.168.5.111:192.168.5.1:255.255.255.0:::'
挂载emmc的文件系统:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
测试结果: