告别黑盒:手把手教你为Pico PC RK3588S定制自己的Ubuntu 20.04根文件系统

张开发
2026/4/20 17:20:26 15 分钟阅读

分享文章

告别黑盒:手把手教你为Pico PC RK3588S定制自己的Ubuntu 20.04根文件系统
告别黑盒手把手教你为Pico PC RK3588S定制自己的Ubuntu 20.04根文件系统当拿到一块Pico PC RK3588S开发板时很多开发者都会面临一个选择是直接使用厂商预置的固件还是从零开始构建一个完全可控的根文件系统前者虽然方便但却像使用一个黑盒你无法确切知道里面装了什么也无法进行深度定制。而后者虽然需要投入更多时间和精力却能让你对系统的每一个细节了如指掌真正做到我的系统我做主。本文将带你一步步从Ubuntu Base开始构建一个精简、高效且完全符合你项目需求的根文件系统。不同于简单的搭建流程我们将重点关注如何根据实际需求选择软件包、优化系统服务配置、解决依赖和兼容性问题最终打造一个真正属于你的嵌入式Linux系统。1. 准备工作与环境搭建在开始构建根文件系统之前我们需要做好充分的准备工作。这包括获取必要的工具链、准备开发环境以及理解RK3588S平台的特殊需求。1.1 硬件与软件需求为了顺利完成根文件系统的构建你需要准备以下硬件和软件开发板Pico PC RK3588S开发板主机环境运行Ubuntu 20.04或更高版本的x86_64主机物理机或虚拟机必要工具qemu-user-static用于在x86主机上模拟arm64环境RKDevToolRockchip官方烧录工具远程连接工具如MobaXterm或Minicom安装基础工具链的命令如下sudo apt update sudo apt install qemu-user-static binfmt-support1.2 获取Ubuntu Base镜像Ubuntu官方提供了最小化的基础镜像这是我们构建根文件系统的起点。访问Ubuntu官方镜像站点下载适用于arm64架构的Ubuntu Base 20.04.6镜像wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04.6/release/ubuntu-base-20.04.6-base-arm64.tar.gz下载完成后创建一个工作目录并解压镜像mkdir -p ~/rk3588s/ubuntu_rootfs sudo tar -xpf ubuntu-base-20.04.6-base-arm64.tar.gz -C ~/rk3588s/ubuntu_rootfs注意解压时必须使用root权限以确保文件权限和属性正确保留。2. 基础系统配置有了基础镜像后我们需要对其进行初步配置使其能够在RK3588S平台上正常运行。2.1 配置QEMU模拟器为了让x86主机能够运行arm64环境的命令我们需要配置QEMU用户态模拟sudo cp /usr/bin/qemu-aarch64-static ~/rk3588s/ubuntu_rootfs/usr/bin/2.2 网络与软件源配置为了能够在chroot环境中安装软件我们需要配置网络和软件源拷贝主机的DNS配置sudo cp -b /etc/resolv.conf ~/rk3588s/ubuntu_rootfs/etc/配置国内镜像源以提高下载速度。编辑~/rk3588s/ubuntu_rootfs/etc/apt/sources.list替换为阿里云镜像源deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ focal universe deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates universe deb http://mirrors.aliyun.com/ubuntu-ports/ focal multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security universe deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security multiverse2.3 挂载与进入chroot环境为了方便操作我们创建一个挂载脚本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 mount -o bind /dev/pts ${2}dev/pts sudo chroot ${2} } function umnt() { echo UNMOUNTING sudo umount ${2}proc sudo umount ${2}sys sudo umount ${2}dev/pts 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 Usage: $0 -m /path/to/rootfs/ (mount) echo $0 -u /path/to/rootfs/ (umount) echo fi赋予执行权限后可以这样使用chmod x mount.sh ./mount.sh -m ~/rk3588s/ubuntu_rootfs/3. 系统定制与优化进入chroot环境后我们就可以开始对系统进行深度定制了。这一部分是整个过程中最具挑战性也最有价值的部分。3.1 基础软件包安装首先更新软件包列表并安装基础工具apt update apt upgrade -y apt install -y apt-utils dialog vim sudo bash-completion接下来安装网络相关工具apt install -y net-tools iputils-ping ifupdown ethtool \ wireless-tools network-manager ssh rsync3.2 系统本地化配置配置时区和语言环境apt install -y locales tzdata dpkg-reconfigure tzdata # 选择Asia/Shanghai dpkg-reconfigure locales # 选择en_US.UTF-8和zh_CN.UTF-83.3 用户与权限管理创建一个普通用户并设置密码useradd -s /bin/bash -m -G adm,sudo ubuntu passwd ubuntu passwd root配置主机名echo RK3588S /etc/hostname echo 127.0.0.1 localhost RK3588S /etc/hosts3.4 系统服务优化RK3588S作为嵌入式平台我们需要对系统服务进行优化以减少资源占用和启动时间。禁用不必要的服务systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target缩短网络等待时间sed -i s/TimeoutStartSec5min/TimeoutStartSec5sec/ /lib/systemd/system/networking.service减少系统默认等待时间echo DefaultTimeoutStopSec2s /etc/systemd/system.conf3.5 第一次启动扩展分区创建首次启动扩展分区的服务cat /etc/init.d/firstboot.sh EOF #!/bin/bash -e if [ ! -e /usr/local/first_boot_flag ]; then echo Resizing /dev/mmcblk0p6... resize2fs /dev/mmcblk0p6 touch /usr/local/first_boot_flag fi EOF chmod x /etc/init.d/firstboot.sh cat /lib/systemd/system/firstboot.service EOF [Unit] DescriptionSetup rockchip platform environment Beforelightdm.service Afterresize-helper.service [Service] Typesimple ExecStart/etc/init.d/firstboot.sh [Install] WantedBymulti-user.target EOF systemctl enable firstboot.service4. 构建与部署根文件系统完成所有定制后我们需要将根文件系统打包成镜像以便烧录到开发板。4.1 创建根文件系统镜像创建一个脚本mkimage.sh来自动化这个过程#!/bin/bash ROOTFS_DIR$1 IMAGE_FILE$2 IMAGE_SIZE6144 # MB if [ -z $ROOTFS_DIR ] || [ -z $IMAGE_FILE ]; then echo Usage: $0 rootfs_dir image_file exit 1 fi echo [1/5] Creating empty image file... dd if/dev/zero of$IMAGE_FILE bs1M count$IMAGE_SIZE echo [2/5] Formatting as ext4... mkfs.ext4 -F -L linuxroot $IMAGE_FILE echo [3/5] Mounting and copying files... mkdir -p mnt mount $IMAGE_FILE mnt cp -rfp $ROOTFS_DIR/* mnt/ sync umount mnt rmdir mnt echo [4/5] Checking and resizing filesystem... e2fsck -p -f $IMAGE_FILE resize2fs -M $IMAGE_FILE echo [5/5] Done. Image created: $IMAGE_FILE使用脚本创建镜像chmod x mkimage.sh ./mkimage.sh ~/rk3588s/ubuntu_rootfs/ rootfs.img4.2 烧录到开发板使用RKDevTool将生成的rootfs.img烧录到开发板将开发板进入Loader模式通常需要按住某个按键同时上电连接开发板到主机打开RKDevTool选择生成的rootfs.img文件点击执行开始烧录烧录完成后开发板将启动你定制的Ubuntu系统。首次启动时会自动扩展根文件系统分区以充分利用存储空间。5. 高级定制技巧对于有特殊需求的开发者这里提供一些高级定制技巧让你的系统更加贴合项目需求。5.1 精简系统大小嵌入式系统往往对存储空间有严格要求可以通过以下方式进一步精简系统删除不必要的文档和语言包apt-get purge -y ^libreoffice.* ^thunderbird.* ^firefox.* \ ^evolution.* ^transmission.* ^rhythmbox.* \ ^shotwell.* ^cheese.* ^simple-scan.*清理缓存和下载的软件包apt-get autoremove -y --purge apt-get clean使用localepurge工具删除不需要的语言包apt install -y localepurge localepurge5.2 优化启动速度通过分析系统启动过程可以识别并优化耗时较长的服务安装分析工具apt install -y bootchart2生成启动分析报告后禁用不必要的服务systemctl disable unnecessary-service并行启动服务sed -i s/^#Parallelize.*/Parallelizeyes/ /etc/systemd/system.conf5.3 添加自定义内核模块如果需要特定的硬件支持可以添加自定义内核模块将编译好的内核模块(.ko文件)放入/lib/modules/$(uname -r)/kernel/相应目录更新模块依赖depmod -a配置模块自动加载echo module_name /etc/modules-load.d/custom.conf5.4 创建只读根文件系统对于工业级应用可能需要将根文件系统设为只读以提高可靠性修改fstab将根分区挂载为只读/dev/mmcblk0p6 / ext4 ro,noatime,errorsremount-ro 0 1创建tmpfs挂载点用于存储临时文件tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0 tmpfs /var/log tmpfs defaults,nosuid,nodev 0 0配置系统服务适应只读根文件系统systemctl enable overlayroot.service6. 常见问题解决在实际操作过程中可能会遇到各种问题。这里列出一些常见问题及其解决方法。6.1 软件包安装失败问题在chroot环境中安装软件包时出现GPG错误。解决方案chmod 1777 /tmp apt update6.2 网络连接问题问题系统启动后网络不可用NetworkManager报告unmanaged状态。解决方案编辑配置文件cat /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf EOF [keyfile] unmanaged-devices*,except:type:ethernet,except:type:wifi,except:type:gsm,except:type:cdma EOF6.3 串口控制台配置问题需要通过串口自动登录root账户。解决方案修改串口服务配置sed -i s/^ExecStart.*/ExecStart-\/sbin\/agetty --autologin root --noclear %I $TERM/ \ /lib/systemd/system/serial-getty.service6.4 图形界面配置问题需要启用root用户登录图形界面。解决方案编辑lightdm配置echo greeter-show-manual-logintrue /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf echo all-guestfalse /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf修改PAM配置sed -i s/^auth.*pam_succeed_if.so user ! root.*$/#\0/ /etc/pam.d/gdm-*6.5 镜像大小优化问题生成的根文件系统镜像过大。解决方案在制作镜像前清理系统apt clean rm -rf /var/lib/apt/lists/*使用更高效的文件系统压缩方法/sbin/e2fsck -p -f rootfs.img /sbin/resize2fs -M rootfs.img考虑使用squashfs等压缩文件系统格式。

更多文章