使用QEMU和binfmt_misc在aarch64文件系统中进行chroot操作(WSL2可用)

使用QEMU和binfmt_misc在aarch64文件系统中进行chroot操作

初始情况

这是我开始这次冒险时的处境:
我修改了dracut配置,手动重新生成了initramfs,重启后无法通过SSH连接到树莓派。我的结论是可能在手动创建initramfs时出错了。最简单的修复方法应该是重新安装linux-rpi包,这会自动生成更新的initramfs。于是我做了以下操作:

  1. 关闭树莓派,取出SD卡并通过USB适配器连接到PC
  2. 将数据分区挂载到/mnt,启动分区挂载到/mnt/boot
  3. 使用arch-chroot进入文件系统

在执行第三步时,遇到了这个错误:
chroot: failed to run command '/bin/bash': Exec format error

我意识到自己正尝试在x64机器上chroot进入aarch64架构的文件系统,无法直接执行为不同架构编译的二进制文件。

近似解决方案

网上搜索后找到了这个StackOverflow回答,步骤如下:

  1. 安装qemu-user-static包(名称可能因发行版而异)
  2. 将QEMU二进制文件复制到挂载的文件系统:
    sudo cp /usr/bin/qemu-aarch64-static /mnt/usr/bin
  3. 使用QEMU运行原生bash:
    sudo arch-chroot /mnt qemu-aarch64-static /bin/bash

QEMU是"通用开源机器模拟器和虚拟化工具",我们这里需要的是"用户模式模拟"(usermode emulation)。-static表示静态链接的二进制文件,可以直接复制到树莓派文件系统运行。

在Arch Linux上,虽然能获得工作shell,但执行任何命令都会再次出现"Exec format"错误。这是因为bash生成的新进程会脱离用户模式模拟环境。

最终解决方案

Linux内核的binfmt_misc功能可以无缝运行其他架构的二进制文件。配置步骤如下:

  1. 检查/proc/sys/fs/binfmt_misc目录是否存在,若不存在则启用:
    mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

  2. 使用以下脚本配置(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值解决了这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值