告别黑盒:手把手教你为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环境
- RKDevTool:Rockchip官方烧录工具
- 远程连接工具(如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 multiverse
2.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/TimeoutStartSec=5min/TimeoutStartSec=5sec/' /lib/systemd/system/networking.service减少系统默认等待时间:
echo "DefaultTimeoutStopSec=2s" >> /etc/systemd/system.conf
3.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] Description=Setup rockchip platform environment Before=lightdm.service After=resize-helper.service [Service] Type=simple ExecStart=/etc/init.d/firstboot.sh [Install] WantedBy=multi-user.target EOF systemctl enable firstboot.service4. 构建与部署根文件系统
完成所有定制后,我们需要将根文件系统打包成镜像,以便烧录到开发板。
4.1 创建根文件系统镜像
创建一个脚本mkimage.sh来自动化这个过程:
#!/bin/bash ROOTFS_DIR=$1 IMAGE_FILE=$2 IMAGE_SIZE=6144 # 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" bs=1M 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 localepurge
5.2 优化启动速度
通过分析系统启动过程,可以识别并优化耗时较长的服务:
安装分析工具:
apt install -y bootchart2生成启动分析报告后,禁用不必要的服务:
systemctl disable <unnecessary-service>并行启动服务:
sed -i 's/^#Parallelize.*/Parallelize=yes/' /etc/systemd/system.conf
5.3 添加自定义内核模块
如果需要特定的硬件支持,可以添加自定义内核模块:
将编译好的内核模块(.ko文件)放入
/lib/modules/$(uname -r)/kernel/相应目录更新模块依赖:
depmod -a配置模块自动加载:
echo "module_name" > /etc/modules-load.d/custom.conf
5.4 创建只读根文件系统
对于工业级应用,可能需要将根文件系统设为只读以提高可靠性:
修改fstab,将根分区挂载为只读:
/dev/mmcblk0p6 / ext4 ro,noatime,errors=remount-ro 0 1创建tmpfs挂载点用于存储临时文件:
tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0 tmpfs /var/log tmpfs defaults,nosuid,nodev 0 0配置系统服务适应只读根文件系统:
systemctl enable overlayroot.service
6. 常见问题解决
在实际操作过程中,可能会遇到各种问题。这里列出一些常见问题及其解决方法。
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-login=true" >> /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf echo "all-guest=false" >> /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等压缩文件系统格式。