使用QEMU和binfmt_misc在aarch64文件系统中进行chroot操作
初始情况
这是我开始这次冒险时的处境:
我修改了dracut配置,手动重新生成了initramfs,重启后无法通过SSH连接到树莓派。我的结论是可能在手动创建initramfs时出错了。最简单的修复方法应该是重新安装linux-rpi包,这会自动生成更新的initramfs。于是我做了以下操作:
- 关闭树莓派,取出SD卡并通过USB适配器连接到PC
- 将数据分区挂载到
/mnt,启动分区挂载到/mnt/boot - 使用
arch-chroot进入文件系统
在执行第三步时,遇到了这个错误:
chroot: failed to run command '/bin/bash': Exec format error
我意识到自己正尝试在x64机器上chroot进入aarch64架构的文件系统,无法直接执行为不同架构编译的二进制文件。
近似解决方案
网上搜索后找到了这个StackOverflow回答,步骤如下:
- 安装
qemu-user-static包(名称可能因发行版而异) - 将QEMU二进制文件复制到挂载的文件系统:
sudo cp /usr/bin/qemu-aarch64-static /mnt/usr/bin - 使用QEMU运行原生bash:
sudo arch-chroot /mnt qemu-aarch64-static /bin/bash
QEMU是"通用开源机器模拟器和虚拟化工具",我们这里需要的是"用户模式模拟"(usermode emulation)。-static表示静态链接的二进制文件,可以直接复制到树莓派文件系统运行。
在Arch Linux上,虽然能获得工作shell,但执行任何命令都会再次出现"Exec format"错误。这是因为bash生成的新进程会脱离用户模式模拟环境。
最终解决方案
Linux内核的binfmt_misc功能可以无缝运行其他架构的二进制文件。配置步骤如下:
-
检查
/proc/sys/fs/binfmt_misc目录是否存在,若不存在则启用:
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc -
使用以下脚本配置(magic和mask值来自QEMU脚本):
magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00'
mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
arch='aarch64'
interpreter="/usr/bin/qemu-$arch-static"
echo ":qemu-$arch:M::$magic::$mask::$interpreter:" | sudo tee /proc/sys/fs/binfmt_misc/register
配置成功后,/proc/sys/fs/binfmt_misc/qemu-aarch64文件会显示类似内容:
enabled
interpreter /usr/bin/qemu-aarch64-static
flags:
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
现在可以直接运行sudo arch-chroot /mnt,一切都会正常工作!
后续发现
后来在Arch Wiki中发现,安装qemu-user-binfmt包后运行sudo systemctl restart systemd-binfmt也能自动完成配置。某些发行版可能在安装qemu-user-static时就自动配置了binfmt_misc。
手动配置的版本没有设置P标志,而Arch的包配置使用了该标志,这可能导致arch-chroot报错:
chroot: failed to run command '/bin/bash': No such file or directory
不过目前手动配置的方案已经能满足需求。
转载者注
在WSL2中,借助qemu和binfmt,chroot到aarch64架构的文件系统中时,经常会出现
chroot: failed to run command '/bin/bash': Exec format error
博主的WLS2中,qemu和binfmt都正确安装了,还是会有问题。
最后使用这篇文章中的magic和mask值解决了这个问题
2168

被折叠的 条评论
为什么被折叠?



