从Ubuntu Base到可启动镜像:ARM设备rootfs定制与烧录实战

张开发
2026/4/21 4:32:01 15 分钟阅读

分享文章

从Ubuntu Base到可启动镜像:ARM设备rootfs定制与烧录实战
1. ARM设备定制化系统镜像制作入门当你拿到一块BananaPi这样的ARM开发板时官方提供的系统镜像往往功能臃肿或者缺少你需要的组件。这时候从零开始构建一个精简、高效的Ubuntu系统就变得很有必要。我最近为BananaPi R64开发板定制了一个基于Ubuntu Base的rootfs整个过程踩了不少坑也积累了一些实用经验。Ubuntu Base是Canonical官方提供的最小化根文件系统它只包含最基本的命令行工具和系统组件非常适合作为定制系统的起点。相比直接使用现成的Ubuntu Server镜像从Ubuntu Base开始构建有三大优势首先是体积小基础镜像只有几十MB其次是干净没有预装任何多余软件最重要的是灵活你可以完全掌控系统中安装的每一个软件包。制作过程主要分为四个关键步骤获取基础镜像、搭建chroot环境、系统定制、制作可启动镜像。其中最关键也最容易出错的就是chroot环境的搭建特别是当宿主机和目标设备架构不同时比如在x86电脑上为ARM板制作系统需要用到qemu-user-static进行架构模拟。我第一次尝试时就因为漏掉了这个步骤导致chroot后所有命令都无法执行。2. 准备工作与环境搭建2.1 获取Ubuntu Base镜像首先从Ubuntu官网下载对应版本的Base镜像。以BananaPi R64为例这是块ARM64架构的开发板所以我们要选择arm64版本的镜像。建议使用LTS版本以获得长期支持我这次用的是ubuntu-base-22.04-base-arm64.tar.gz。wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz下载完成后创建一个工作目录解压镜像文件mkdir custom-rootfs sudo tar -xpf ubuntu-base-22.04-base-arm64.tar.gz -C custom-rootfs/2.2 配置chroot环境由于我的开发机是x86架构而目标系统是ARM64需要安装qemu-user-static来实现跨架构执行ARM指令sudo apt install qemu-user-static sudo cp /usr/bin/qemu-aarch64-static custom-rootfs/usr/bin/接下来复制宿主机的DNS配置保证chroot环境能正常解析域名sudo cp /etc/resolv.conf custom-rootfs/etc/2.3 准备挂载脚本为了方便操作我写了个mount.sh脚本来自动处理chroot所需的挂载点#!/bin/bash mnt() { echo 挂载虚拟文件系统 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} } umnt() { echo 卸载虚拟文件系统 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 用法: $0 -m/-u 路径 echo 示例: $0 -m custom-rootfs/ fi给脚本执行权限后就可以用它来进入chroot环境了chmod x mount.sh ./mount.sh -m custom-rootfs/3. 系统定制与配置3.1 基础软件安装进入chroot环境后首先修改apt源为国内镜像加速下载。编辑/etc/apt/sources.listdeb http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ jammy universe deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates universe deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-security universe更新软件包列表并安装基础工具apt update apt install sudo vim net-tools ssh ifupdown3.2 用户与权限配置创建普通用户并设置密码useradd -s /bin/bash -m -G adm,sudo devuser passwd devuser passwd root # 设置root密码配置sudo权限chmod w /etc/sudoers vim /etc/sudoers在文件中添加devuser ALL(ALL:ALL) ALL3.3 网络与SSH配置配置静态IP可选vim /etc/network/interfaces添加以下内容auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1启用SSH开机启动systemctl enable ssh4. 制作可启动镜像4.1 创建磁盘镜像文件退出chroot环境后开始制作镜像文件。首先创建一个1GB大小的空文件dd if/dev/zero ofubuntu-arm64.img bs1M count1024格式化为ext4文件系统mkfs.ext4 ubuntu-arm64.img4.2 复制根文件系统挂载镜像文件并复制定制好的rootfsmkdir mnt-point sudo mount ubuntu-arm64.img mnt-point/ sudo cp -rfp custom-rootfs/* mnt-point/ sudo umount mnt-point优化镜像大小e2fsck -p -f ubuntu-arm64.img resize2fs -M ubuntu-arm64.img4.3 烧录到SD卡使用dd命令将镜像烧录到SD卡假设SD卡设备为/dev/sdbsudo dd ifubuntu-arm64.img of/dev/sdb bs4M statusprogress烧录完成后还需要设置启动分区。通常ARM开发板的启动流程是第一分区(FAT32)存放u-boot和内核第二分区(ext4)存放根文件系统使用fdisk调整分区表确保根文件系统分区足够大sudo fdisk /dev/sdb5. 常见问题排查5.1 启动失败排查如果系统无法启动首先检查串口输出信息。常见问题包括内核panic通常是内核与硬件不匹配根文件系统挂载失败检查uEnv.txt中的root参数权限问题确保/etc/shadow权限为6005.2 文件系统扩展首次启动后建议扩展文件系统以使用全部SD卡空间resize2fs /dev/mmcblk0p25.3 性能优化技巧关闭不必要的服务使用systemctl disable关闭不需要的守护进程使用ramdisk将/tmp挂载为tmpfs减少SD卡写入启用zram压缩内存数据特别适合内存有限的设备整个定制过程虽然步骤不少但每一步都有明确的目的。我建议第一次操作时可以在虚拟机中练习熟悉了再在实体开发板上实践。记得做好每一步的备份这样遇到问题时可以快速回退到上一个可用状态。

更多文章