1. 项目概述
构建自定义的Ubuntu rootfs(根文件系统)是嵌入式开发和系统定制中的常见需求。与传统的BusyBox、Yocto或Buildroot方案相比,基于ubuntu-base的方案具有以下优势:
- 完整的APT包管理体系
- 丰富的软件源支持
- 成熟的社区生态
- 跨架构兼容性
本文将详细演示如何在x86_64和ARM架构上,从最基础的ubuntu-base镜像开始,构建完整的可运行系统。整个过程涉及:
- 基础环境准备
- 文件系统解压与配置
- chroot环境搭建
- 软件包安装
- 系统定制化
2. 环境准备
2.1 宿主系统要求
推荐使用Ubuntu作为宿主系统,版本最好与目标系统一致。关键要求:
- 至少5GB可用空间
- 网络连接正常
- 基础工具链(gcc, make等)
- 对于ARM架构构建需要qemu支持
# 基础工具安装 sudo apt update sudo apt install -y qemu qemu-user-static binfmt-support2.2 获取ubuntu-base
从Ubuntu官方仓库下载对应架构的base镜像:
# x86_64架构 wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-amd64.tar.gz # ARM架构(以armhf为例) wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-armhf.tar.gz不同架构镜像说明:
- amd64:标准x86_64架构
- arm64:64位ARM架构(Cortex-A53/A72等)
- armhf:带硬浮点的32位ARM(Cortex-A7/A9等)
3. 基础系统构建
3.1 创建文件系统
建议使用独立分区或loop设备:
# 创建10GB镜像文件 dd if=/dev/zero of=ubuntu-rootfs.img bs=1G count=10 mkfs.ext4 ubuntu-rootfs.img # 挂载镜像 mkdir -p /mnt/ubuntu-rootfs mount -o loop ubuntu-rootfs.img /mnt/ubuntu-rootfs3.2 解压base系统
tar -xpf ubuntu-base-22.04-base-amd64.tar.gz -C /mnt/ubuntu-rootfs关键参数说明:
-p:保留文件权限-C:指定解压目录
3.3 配置基础环境
- 拷贝DNS配置:
cp /etc/resolv.conf /mnt/ubuntu-rootfs/etc/- 配置APT源(以清华源为例):
cat > /mnt/ubuntu-rootfs/etc/apt/sources.list <<EOF deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse EOF- 拷贝用户配置文件:
cp -r /etc/skel /mnt/ubuntu-rootfs/etc/4. chroot环境配置
4.1 挂载虚拟文件系统
mount -t proc /proc /mnt/ubuntu-rootfs/proc mount -t sysfs /sys /mnt/ubuntu-rootfs/sys mount -o bind /dev /mnt/ubuntu-rootfs/dev mount -t devpts /dev/pts /mnt/ubuntu-rootfs/dev/pts4.2 进入chroot环境
使用qemu进行跨架构chroot(ARM架构必需):
# 拷贝qemu静态程序 cp /usr/bin/qemu-arm-static /mnt/ubuntu-rootfs/usr/bin/ # 进入chroot chroot /mnt/ubuntu-rootfs /bin/bash5. 系统定制与软件安装
5.1 基础配置
# 设置时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置主机名 echo "my-ubuntu" > /etc/hostname # 更新软件包 apt update apt upgrade -y5.2 安装核心组件
# 基础工具 apt install -y sudo net-tools iputils-ping vim bash-completion # 系统服务 apt install -y systemd-sysv dbus # 网络管理 apt install -y network-manager5.3 安装桌面环境(可选)
以安装LXQt轻量桌面为例:
apt install -y --no-install-recommends lxqt-core sddm systemctl enable sddm6. ARM架构特殊处理
6.1 交叉构建注意事项
- 必须使用qemu进行模拟:
apt install -y qemu-user-static- ARM源配置不同:
cat > /etc/apt/sources.list <<EOF deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse EOF6.2 内核与引导加载
ARM设备通常需要单独处理:
- 将编译好的内核镜像(zImage)和设备树(.dtb)放入/boot目录
- 配置u-boot环境变量
- 确保启动分区为FAT32格式
7. 系统优化与问题排查
7.1 常见问题解决
网络不通:
- 检查/etc/resolv.conf是否配置正确
- 确认网络服务已启动:
systemctl start systemd-networkd
locale警告:
apt install -y locales dpkg-reconfigure locales服务启动失败:
journalctl -xe # 查看详细日志 systemctl status <service> # 检查服务状态
7.2 系统瘦身技巧
- 清理APT缓存:
apt clean- 删除不需要的文档:
find /usr/share/doc -depth -type f ! -name copyright | xargs rm || true- 压缩未使用的库:
find /usr/lib -type f -name "*.so*" -exec strip --strip-unneeded {} \;8. 最终系统打包
退出chroot环境后:
# 卸载虚拟文件系统 umount /mnt/ubuntu-rootfs/{proc,sys,dev/pts,dev} # 打包文件系统 cd /mnt tar -cpzf ubuntu-custom-rootfs.tar.gz -C ubuntu-rootfs .提示:对于生产环境,建议使用文件系统检查工具fsck确保完整性后再打包。
9. 实际应用建议
嵌入式设备:
- 将生成的rootfs直接写入设备存储
- 配合定制内核使用
- 考虑只读文件系统增强稳定性
容器镜像:
docker import ubuntu-custom-rootfs.tar.gz my-ubuntu:22.04开发测试:
- 使用qemu启动测试
- 通过NFS挂载进行快速迭代
构建自定义rootfs的过程虽然涉及多个步骤,但ubuntu-base提供的良好基础使得这一过程相对标准化。根据实际需求,可以进一步:
- 添加预装服务
- 配置自动更新
- 集成硬件特定驱动
- 优化启动速度
通过这种方法构建的系统既保持了Ubuntu的兼容性,又能满足特定场景的定制需求。