ELF 2开发板基于瑞芯微RK3588高性能处理器设计,拥有四核ARM Cortex-A76与四核ARM Cortex-A55的CPU架构,主频最高可达2.4GHz,内置6TOPS算力的NPU,这一设计让它能够轻松驾驭多种深度学习框架,高效处理各类复杂的AI任务。
ELF 2开发板已经适配了Linux 5.10及Elf2 Desktop 22.04操作系统,其中Elf2 Desktop 22.04系统是专为嵌入式设计的Ubuntu base。虽然其apt-get 等命令支持在线安装软件,但存在明显缺陷:重新烧写镜像后软件会丢失,需再次安装。 这在批量部署多块开发板时,工作量巨大。因此,将软件预先集成到镜像中,实现烧录后无需重新安装,成为亟待解决的问题。
本文将围绕如何在 【RK3588】ELF 2开发板上基于 Ubuntu 22.04 操作系统进行根文件系统的定制展开详细阐述。
QEMU 是一款轻量级硬件模拟器,支持多种架构,如 ARM、x86 和 x86-64。 它应用广泛,是 Xen 虚拟化平台和 Android 模拟器等项目的底层基础。在嵌入式领域,开发者常利用 QEMU 深入研究 Linux 系统,进行文件系统优化等工作。
下面我们开始在开发环境(需要开发环境能上网)中安装QEMU,如下:
(1)更新下载源
elf@ubuntu:~sudo apt-getupdate
(2)执行命令安装
elf@ubuntu:~sudo apt-getinstall qemu-user-static
将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=12x1024x1024=12582912K=3145728x4K,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/
(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
通过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:/#
前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,下面就可以安装我们所需要的软件了。
(1)更新下载源
root@ubuntu:/# apt update
(2)软件安装与卸载
至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
root@ubuntu:/# exit
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$
此外通过dpkg --list命令查看所有安装的软件,如果想裁剪文件系统,可以使用【apt-get remove 软件包名称】进行卸载相关软件。
(3)安装完成后,exit退出QEMU
root@ubuntu:/# exit
(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
elf@ubuntu:~/work/ELF2-linux-source/ubuntu$ cd ..
elf@ubuntu:~/work/ELF2-linux-source$ ./build.sh updateimg
在ELF2-linux-source/rockdev路径下会生成新的update.img。
通过以上步骤,我们成功完成了 【RK3588】ELF 2开发板上进行根文件系统的定制工作,这一过程不仅简化了批量生产中的软件安装流程,还显著提升了开发效率。各位小伙伴如果在实践过程遇见各种问题,欢迎随时留言探讨。
关注
6067文章
44969浏览量
649138免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com