第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

在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




posted @ 2021-02-19 17:18  orangebear  阅读(188)  评论(1)    收藏  举报