第18章 busybox根文件系统构建
编译busybox构建根文件系统
准备busybox源码
网盘路径:\开发板光盘A-基础资料\1、程序源码\6、BusyBox源码\busybox-1.32.0.tar.bz2
在Ubuntu创建busybox文件夹用于存放busybox源码
mkdir ~/linux/busybox
解压busybox源码包可以得到如下目录
tar -vxjf busybox-1.32.0.tar.bz2
cd busybox-1.32.0

修改Makefile,添加编译器
添加ARCH和CROSS_COMPILE,使用绝对路径防止编译出错。(如果怕写错可以在


中文字符支持
修改文件 busybox-1.32.0/libbb/printable_string.c的函数 printable_string2,禁止字符大于0X7F 以后break 和输出‘?’

注意 if( c < ' ' ) 这里, ' ' 是两个单引号,中间有个空格
修改文件 busybox-1.32.0/libbb/unicode.c

同样注意单引号问题
配置busybox
使用默认配置
make defconfig
打开图形化配置
make menuconfig






保存为stm32mp1_atk_defconfig文件

最后编译配置文件
make stm32mp1_atk_defconfig
编译busybox
编译busybox
在Ubuntu的nfs目录下创建一个rootfs目录,用于存放等下编译得到的busybox源码
返回到busybox源码下进行编译根文件系统
make
make install CONFIG_PREFIX=/home/alientek/linux/nfs/rootfs
编译结果如下图左图所示,编译得到的rootfs目录如下图右边所示

可以看到除了有三个目录外,还有一个 linuxrc 文件
此文件的作用:如果bootargs 设置init=/linuxrc,那么linuxrc 就是可以作为用户空间的init 程序,所以用户态空间的init 程序是busybox 来生成的。
向根文件系统添加lib 库
向rootfs 的“/lib”目录添加库文件
应用程序需要用到动态库,在rootfs目录(根文件系统)中创建一个 lib 的文件夹
拷贝交叉编译器的库文件到rootfs目录的lib中,首先去到/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib
cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib
cp *so* /home/alientek/linux/nfs/rootfs/lib/ -d
有个 ld-linux-armhf.so.3 和别的库文件不同,它是软连接,需要进行以下操作
首先进入到/nfs/rootfs/lib目录下把拷贝过来的 ld-linux-armhf.so.3 文件删了
cd ~/linux/nfs/rootfs/lib
rm ld-linux-armhf.so.3
再到/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib目录,拷贝文件
cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib
cp ld-linux-armhf.so.3 /home/alientek/linux/nfs/rootfs/lib/
到/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/lib目录去拷贝其他库文件
cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/lib
cp *so* *.a /home/alientek/linux/nfs/rootfs/lib/ -d
向rootfs的 usr/lib 目录添加库文件
在rootfs目录下创建lib目录
cd ~/linux/nfs/rootfs/usr
mkdir lib
将/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib目录下的文件拷贝到rootfs/lib
cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/alientek/linux/nfs/rootfs/usr/lib/ -d
查看拷贝后的目录大小

创建其他文件夹
mkdir dev proc mnt sys tmp etc root

根文件系统初步测试
修改Ubuntu的nfs配置
vi /etc/default/nfs-kernel-server
添加如下版本2、3、4

改完重启NFS
sudo /etc/init.d/nfs-kernel-server restart
设置bootargs环境变量
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.1.208:/home/alientek/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.250:192.168.1.208:192.168.1.1:255.255.255.0::eth0:off'
saveenv
boot
如果想擦除环境变量,可以执行eraseenv指令
完善根文件系统
创建/etc/init.d/rcS 文件
在rootfs中创建/etc/init.d/rcS 脚本文件,内容如下
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
然后要给rcS脚本文件可执行权限
创建/etc/fstab文件
在rootfs目录下创建/etc/fstab文件,内容如下
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
创建/etc/inittab文件
在rootfs目录下创建/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
使能内核uevet helper
回到内核源码目录下打开图形配置
cd ~/linux/atk-mp1/my_linux
make menuconfig

然后执行 make uImage LOADADDR=0XC2000040 -j16 编译内核,用新内核挂载启动
根文件系统功能测试
烧写根文件系统到EMMC
根文件系统打包
新建ext4格式磁盘
在别的目录下新建一个rootfs目录,在此目录下创建ext4格式磁盘,将根文件系统拷贝到此ext4格式磁盘
mkdir ~/linux/rootfs
cd ~/linux/rootfs
dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024
mkfs.ext4 -L rootfs rootfs.ext4
挂载ext4磁盘后,将系统镜像拷贝到ext4磁盘
sudo mkdir /mnt/rootfs
cd ~/linux/rootfs
sudo mount rootfs.ext4 /mnt/rootfs/
cd ~/linux/nfs/rootfs
sudo cp * /mnt/rootfs/ -drf
sudo umount /mnt/rootfs
至此,根文件系统的ext4磁盘制作完成,在windows下可以打开看到此磁盘内容是否有根文件系统

烧写到EMMC
将rootfs.ext4拷贝到 images 文件夹下,修改 flashlayout 成如下

使用STM32CubeProgrammer软件进行烧录
设置bootcmd和bootargs环境变量,用于启动EMMC里的系统
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
saveenv
boot
这里根文件系统存放在/dev/mmcblk1p3(mmcblk1的第3个分区)
出厂系统是存放在/dev/mmcblk2p3(mmcblk2的第3个分区)
因为出厂系统使用了SDIO WIFI,这个是SDIO接口,使能了SDIO WIFI则SDIO接口会变成mmcblk1,因此出厂系统是mmcblk2。