在嵌入式开发领域,定制根文件系统是一项至关重要的工作,它不仅能够显著提升生产效率,还能有力保障系统的一致性。ELF 2 Desktop(Ubuntu)系统运行的是 Ubuntu 官方专为嵌入式设备打造的 ubuntu base 操作系统,其配备的 apt-get、ldd 等常用命令,使得众多软件能直接通过 apt-get 在线安装,无需进行交叉编译移植等繁杂操作。但该系统存在明显不足,每次重新烧写镜像后已安装软件均会丢失需重新安装,尤其在开发板数量较多时,每块都需单独 apt-get 安装,这不仅大幅增加工作量,还严重影响批量化生产。因此,将软件预先集成到镜像中,实现烧写后无需再次 apt-get 在线安装的需求,就成为亟待解决的问题。本文将围绕如何在 ELF2(RK3588)平台上基于 Ubuntu 22.04 进行根文件系统的定制展开详细阐述。
1. 开发环境安装QEMU
这里简单介绍下QEMU,它是一个小巧的模拟器,可以模拟很多硬件:ARM、x86、AMD64/Intel64等。QEMU用途广泛,比如Xen、Android模拟器等都是基于QEMU的。在嵌入式领域,很多人使用QEMU来深研Linux,比如研究文件系统、优化等。
下面我们开始在开发环境(需要开发环境能上网)中安装QEMU,如下:
1)更新下载源
elf@ubuntu:~ sudo apt-get update
2)执行命令安装
elf@ubuntu:~ sudo apt-get install qemu-user-static
2. 文件系统挂载
将SDK中ELF 2 Desktop 文件系统镜像jammy-rootfs.img进行挂载,挂载后可以被访问操作。
1)文件系统备份
操作前先对文件系统镜像备份,如若操作出现异常,可回退使用最初镜像。
elf@ubuntu:~$ cd work/ELF2-linux-source/ubuntu/ #SDK源码路径需修改为个人路径
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ mkdir bak
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ cp jammy-rootfs.img bak/
2)文件系统扩容
文件系统扩容的大小不超过根分区大小(默认根分区为14G)
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ e2fsck -f jammy-rootfs.img
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ resize2fs jammy-rootfs.img 3145728
resize2fs IMAGE SIZE
IMAGE为要修改的镜像名称;
SIZE为块的数量,一个块的大小为4K。
(例如扩容到12G,12G = 12 x 1024 x 1024 = 12582912 K = 3145728 x 4K,SIZE参数为 3145728)
3)创建挂载目录,并将文件系统挂载到该目录
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ mkdir rootfs
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo mount jammy-rootfs.img rootfs/
3. 修改配置
1)将开发环境中的qemu-arm-static拷贝到desktop文件系统中,如下:
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
2)将开发环境中的DNS配置拷贝到desktop文件系统中,因为安装程序时要用络:
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo cp -b /etc/resolv.conf rootfs/etc/resolv.conf
3)修改下载源:
$ sudo vim rootfs/etc/apt/sources.list
添加:
deb http://ports.ubuntu.com/ubuntu-ports/ jammy main universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy main universe
4. 文件系统隔离
通过chroot进行虚拟化隔离,将隔离步骤写入到ch-mount.sh脚本中。
#!/bin/bash
function mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
sudo chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard/"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi
ch-mount.sh脚本放到ELF2-linux-source/ubuntu目录下,赋予权限后,通过参数-m指定挂载路径:
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo chmod a+x ch-mount.sh
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo ./ch-mount.sh -m rootfs/
root@ubuntu:/#
5. 文件系统修改
前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,下面就可以安装我们所需要的软件了。
1)更新下载源
root@ubuntu:/# apt update
2)软件安装与卸载
至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
root@ubuntu:/# apt-get install minicom
此外通过dpkg --list命令查看所有安装的软件,如果想裁剪文件系统,可以使用【apt-get remove 软件包名称】进行卸载相关软件。
3)安装完成后,exit退出QEMU。
root@ubuntu:/# exit
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$
4)执行ch-mount.sh脚本卸载文件系统,指定参数-u,后打印如下:
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo ./ch-mount.sh -u rootfs/
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ sudo umount rootfs
6. 打包镜像
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ cd ..
elf@ubuntu:~/work/ELF2-linux-source$ ./build.sh updateimg
在ELF2-linux-source/rockdev路径下会生成新的updateimg。
通过以上步骤,我们成功完成了 ELF2(RK3588) Desktop22.04 根文件系统的定制工作。这一过程不仅简化了批量生产中的软件安装流程,还显著提升了开发效率。
|
|