ARTICLE

64位主机进入ARM/32位rootfs的chroot配置指南

在 64 位主机上进入 ARM 或 32 位 rootfs 的 chroot 实践,包含必要挂载、QEMU 配置与常见问题处理。

Article

64位主机进入ARM/32位rootfs的chroot配置指南

在 64 位主机上进入 ARM 或 32 位 rootfs 的 chroot 实践,包含必要挂载、QEMU 配置与常见问题处理。

64位主机进入ARM/32位rootfs的chroot配置指南

在 64 位主机上使用 chroot 进入一个为不同架构(如 ARM 或 32 位 i386)准备的根文件系统(rootfs)时,为了确保环境能正常工作,必须正确挂载一系列虚拟文件系统。

1. 挂载核心虚拟文件系统

在 chroot 之前,必须将宿主机的几个关键虚拟文件系统绑定挂载到目标 rootfs 的对应目录下。这是为了让 chroot 环境内的进程能够访问设备、进程信息和系统信息等核心资源。

/proc - 进程信息文件系统

sudo mount -t proc /proc /path/to/rootfs/proc
# 或使用 --bind 选项
sudo mount --bind /proc /path/to/rootfs/proc

/sys - 系统内核信息

sudo mount -t sysfs /sys /path/to/rootfs/sys
# 或
sudo mount --bind /sys /path/to/rootfs/sys

/dev - 设备文件系统

sudo mount --bind /dev /path/to/rootfs/dev

/dev/pts - 伪终端支持

这是 /dev 下的一个特殊目录,用于伪终端支持,对于运行 bash 等 Shell 是必要的:

sudo mount --bind /dev/pts /path/to/rootfs/dev/pts

2. 其他可能需要挂载的目录

根据具体使用场景,可能还需要挂载以下目录:

/tmp - 临时文件系统

sudo mount --bind /tmp /path/to/rootfs/tmp

/run - 运行时目录

某些服务(如 Docker 守护进程)会用到:

sudo mount --bind /run /path/to/rootfs/run

3. 跨架构 chroot 的特殊准备

如果你的 rootfs 是为 ARM 或 i386 等与宿主机不同的 CPU 架构准备的,仅挂载文件系统是不够的。你还需要配置跨架构二进制执行支持,否则 chroot 后无法运行目标架构的程序。

安装必要工具

sudo apt update
sudo apt install qemu-user-static binfmt-support

复制 QEMU 静态二进制文件

将对应的 QEMU 静态二进制文件复制到 rootfs 的 /usr/bin 目录下:

# 对于 ARM (armhf/armel)
sudo cp /usr/bin/qemu-arm-static /path/to/rootfs/usr/bin/

# 对于 32位 x86 (i386)
sudo cp /usr/bin/qemu-i386-static /path/to/rootfs/usr/bin/

这个步骤使得宿主机内核能够识别并调用 QEMU 来执行目标架构的二进制文件。

4. 进入 chroot 环境

完成上述挂载和准备后,即可使用 chroot 命令进入目标根文件系统:

sudo chroot /path/to/rootfs /bin/bash

5. 退出与卸载

完成在 chroot 环境中的操作后,需要退出并按顺序卸载之前挂载的文件系统,以避免出现"设备忙"的错误。

退出 chroot

exit

卸载挂载点

sudo umount /path/to/rootfs/dev/pts
sudo umount /path/to/rootfs/dev
sudo umount /path/to/rootfs/proc
sudo umount /path/to/rootfs/sys
sudo umount /path/to/rootfs/tmp  # 如果挂载了
sudo umount /path/to/rootfs/run  # 如果挂载了

⚠️ 卸载顺序通常与挂载时相反

6. 自动化脚本

为了方便,可以将挂载和卸载步骤写成脚本:

#!/bin/bash
# ch-mount.sh

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" ]; then
    mnt $1 $2
elif [ "$1" == "-u" ]; then
    umnt $1 $2
fi

使用方法

# 挂载并进入 chroot
sudo bash ch-mount.sh -m /path/to/rootfs/

# 卸载
sudo bash ch-mount.sh -u /path/to/rootfs/

总结

步骤命令
挂载文件系统mount –bind /proc, /sys, /dev, /dev/pts
配置 QEMUqemu-user-static
进入 chrootchroot /path/to/rootfs /bin/bash
退出exit
卸载umount (顺序与挂载相反)

通过正确配置这些虚拟文件系统和 QEMU 模拟器,就可以在 64 位 x86 主机上无缝运行 ARM 或 32 位 rootfs 中的程序了。