在 x64 Linux 6.6 上结合 binfmt_misc、chroot 和 overlayfs 运行 AArch64 环境,核心是通过 overlay 挂载 保护原始 AArch64 根文件系统(rootfs)的只读性,所有修改(如安装软件、创建文件)都写入独立分区(上分层),实现「原始环境不变、修改可持久化 / 可重置」的效果。

一、核心原理

  1. overlayfs 三层结构:
  • lowerdir:底层目录(原始 AArch64 rootfs,设为只读,避免被修改)。
  • upperdir:上分层目录(存储所有修改,位于你指定的独立分区)。
  • workdir:临时工作目录(overlayfs 内部使用,需与 upperdir 在同一分区)。
  • merged:合并目录(最终呈现给 chroot 的根目录,叠加 lowerdir 和 upperdir 的内容)。
  1. 流程:chroot 进入 merged 目录后,所有读操作优先取 upperdir(若有),否则取 lowerdir;所有写操作仅写入 upperdir,原始 rootfs 始终不变。

二、前置条件

  1. 已完成基础配置:binfmt_misc 启用、qemu-aarch64-static 安装、AArch64 binfmt 规则注册(参考前两轮回复)。
  2. 存在独立分区(如 /dev/sdb1、/dev/nvme0n1p5):用于存储 upperdir 和 workdir(建议容量 ≥ 1GB,格式为 ext4/xfs 等 Linux 兼容格式)。
  3. 已准备 AArch64 rootfs(如 /opt/aarch64-rootfs,Debian/Ubuntu 完整根文件系统)。
  4. root 权限(所有挂载、chroot 操作需最高权限)。

三、详细步骤

1. 确认基础配置生效(必做)

先验证前期配置,避免后续踩坑:

1
2
3
4
5
6
7
8
# 1. 检查 AArch64 binfmt 规则已启用
update-binfmts --display aarch64 | grep "enabled"

# 2. 检查 qemu-aarch64-static 存在
ls /usr/bin/qemu-aarch64-static

# 3. 确认原始 AArch64 rootfs 存在(示例路径 /opt/aarch64-rootfs)
ls /opt/aarch64-rootfs/bin/bash # 需存在 bash/sh 可执行文件

2. 处理 overlay 分区(独立分区准备)

假设你要用作 overlay 上分层的分区为 /dev/sdb1(需替换为你的实际分区路径,可通过 lsblk 或 fdisk -l 查看)。

(1)格式化分区(若分区未格式化,首次需执行)

推荐格式化为 ext4(兼容性最好):

1
2
# 备份分区数据(若有),格式化会清空数据!
sudo mkfs.ext4 /dev/sdb1

(2)挂载分区到宿主目录

创建分区挂载点,将 overlay 分区挂载到宿主的固定目录(如 /opt/overlay-partition):

1
2
3
4
5
6
7
8
9
# 创建挂载点
sudo mkdir -p /opt/overlay-partition

# 挂载分区(临时挂载,重启失效;需持久化则添加到 /etc/fstab)
sudo mount /dev/sdb1 /opt/overlay-partition

# (可选)持久化挂载(重启自动挂载)
echo '/dev/sdb1 /opt/overlay-partition ext4 defaults 0 2' | sudo tee -a /etc/fstab
sudo mount -a # 验证 fstab 配置,无需重启

(3)在分区内创建 overlay 必需目录

在挂载的分区内创建 upperdir(存储修改)和 workdir(overlay 临时工作目录):

1
sudo mkdir -p /opt/overlay-partition/{upper,work}

3. 挂载 overlayfs(合并原始 rootfs 与分区)

创建 merged 目录(最终 chroot 的目标目录,叠加后的 AArch64 根目录),并通过 overlayfs 挂载:

1
2
3
4
5
6
7
8
9
# 1. 创建 merged 目录(叠加后的根目录挂载点)
sudo mkdir -p /opt/aarch64-merged

# 2. 挂载 overlayfs(关键命令)
sudo mount -t overlay overlay -o \
lowerdir=/opt/aarch64-rootfs, \
upperdir=/opt/overlay-partition/upper, \
workdir=/opt/overlay-partition/work \
/opt/aarch64-merged

参数说明:

  • lowerdir=/opt/aarch64-rootfs:原始 AArch64 rootfs(只读,自动生效,无需额外设置 ro)。
  • upperdir=/opt/overlay-partition/upper:上分层(分区内目录,所有修改写入这里)。
  • workdir=/opt/overlay-partition/work:临时工作目录(必须与 upperdir 在同一分区,不可删除)。
  • /opt/aarch64-merged:合并后的目录(chroot 目标)。

4. 准备 chroot 环境(基于 merged 目录)

merged 目录是叠加后的根目录,需补充 QEMU 模拟器、虚拟文件系统等,才能正常 chroot:

(1)复制 QEMU 静态文件到 merged 目录

chroot 后无法访问宿主 /usr/bin,需将 qemu-aarch64-static 复制到 merged 的对应目录:

1
sudo cp /usr/bin/qemu-aarch64-static /opt/aarch64-merged/usr/bin/

(2)挂载必要的虚拟文件系统(到 merged 目录)

虚拟文件系统需挂载到 merged 下,chroot 后才能访问 proc/sys/dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 挂载 proc(进程文件系统)
sudo mount -t proc /proc /opt/aarch64-merged/proc

# 挂载 sysfs(系统设备文件系统)
sudo mount -t sysfs /sys /opt/aarch64-merged/sys

# 挂载 devtmpfs(设备节点,绑定宿主 /dev)
sudo mount -o bind /dev /opt/aarch64-merged/dev

# 挂载 devpts(终端设备,支持命令行交互)
sudo mount -o bind /dev/pts /opt/aarch64-merged/dev/pts

# 挂载tmpfs
sudo mount -t tmpfs tmpfs -o size=2G /opt/aarch64-merged/tmp

(3)配置 DNS(可选,需 chroot 内联网)

复制宿主 DNS 配置到 merged 目录,确保 chroot 内可访问网络:

1
sudo cp /etc/resolv.conf /opt/aarch64-merged/etc/resolv.conf

5. chroot 进入 AArch64 + overlay 环境

1
2
# 切换到 merged 目录(叠加后的 AArch64 根目录)
sudo chroot /opt/aarch64-merged /bin/bash

验证效果:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 确认架构为 AArch64(输出 aarch64)
uname -m

# 2. 验证 overlay 生效(创建文件,测试修改是否写入 upperdir)
touch /test-overlay-file # 在 merged 目录(chroot 内根目录)创建文件
exit # 退出 chroot

# 3. 检查原始 rootfs 无变化(lowerdir 只读)
ls /opt/aarch64-rootfs/test-overlay-file # 输出:ls: 无法访问...: 没有那个文件或目录

# 4. 检查 upperdir 已存储修改(文件实际写入分区)
ls /opt/overlay-partition/upper/test-overlay-file # 输出:test-overlay-file(存在)

6. 退出与清理(关键:按顺序卸载)

必须按「虚拟文件系统 → overlay → 分区」的顺序卸载,避免数据损坏:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 确保已退出 chroot(若未退出,先执行 exit)

# 2. 卸载虚拟文件系统
sudo umount /opt/aarch64-merged/proc
sudo umount /opt/aarch64-merged/sys
sudo umount /opt/aarch64-merged/dev/pts
sudo umount /opt/aarch64-merged/dev
sudo umount /opt/aarch64-merged/tmp

# 3. 卸载 overlayfs
sudo umount /opt/aarch64-merged

# 4. (可选)卸载 overlay 分区(若无需持久化挂载)
sudo umount /opt/overlay-partition

四、关键注意事项

  1. lowerdir 只读保护:overlayfs 默认会将 lowerdir 视为只读(即使未显式设置 ro),但建议通过 chmod -R 555 $ORIG_ROOTFS 进一步锁定,避免误操作修改原始 rootfs。
  2. 分区兼容性:overlay 分区需为 Linux 支持的文件系统(ext4、xfs、btrfs 等),不支持 NTFS、FAT32(可能导致权限错误)。
  3. 目录权限upperdirworkdirmerged 目录的所有者必须为 root:rootsudo chown -R root:root /opt/overlay-partition),否则 chroot 会报权限错误。
  4. 修改重置:若需清空所有修改(恢复原始环境),直接删除 upperdir 内的文件即可(sudo rm -rf /opt/overlay-partition/upper/*),无需重新构建 rootfs。
  5. 虚拟文件系统挂载顺序:必须先挂载 overlayfs,再挂载 proc/sys/dev(挂载到 merged 目录下),否则 chroot 内无法访问这些系统资源。