LoginSignup
6
2

More than 3 years have passed since last update.

WSL+qemu-arm で chroot に失敗するときの対処方法

Posted at

はじめに

筆者は FPGA-SoC-Linux で ZYNQ および CycloneV SoC に対応した Debian9 rootfs を提供しています。今までは VMware に Ubuntu を載せて Debian9 rootfs をビルドしていましたが、今回 WSL(Ubunts) でビルドを試してみました。ホストマシンが x86_64 の場合、arm アーキテクチャの Debian9 rootfs をビルドするためには qemu-arm を使って chroot する必要があります。この記事では、その際でくわしたトラブルとその対処方法を説明します。

注) ただし、現時点では WSL による Debian9 rootfs のビルドは成功していません。

failed to run command ‘/bin/bash’: Exec format error

症状

まず最初にでくわしたトラブル。

user@host:work$ sudo chroot debian9-rootfs
chroot: failed to run command ‘/bin/bash’: Exec format error

原因

update-binfmts コマンドで qemu-arm の状態をみてみると、disable になっていました。WSL(Ubuntu) に binfmt-support をインストールした直後は disable になっているようです。

user@host:work$ sudo update-binfmts --display qemu-arm
qemu-arm (disabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/bin/qemu-arm-static
    detector =

対処方法

update-binfmts コマンドで qemu-arm を enable にします。

user@host:work$ sudo update-binfmts --enable qemu-arm
user@host:work$ sudo update-binfmts --display qemu-arm
qemu-arm (enabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/bin/qemu-arm-static
    detector =

prepare_binprm: Bad file descriptor

症状

qemu-arm を enable にして再度 chroot を試みたら、次のようなエラーにでくわしました。

user@host:work$ sudo chroot debian9-rootfs
prepare_binprm: Bad file descriptor

原因

Google で検索してみると、次のようなページがみつかりました。

この対処方法をやってみました。

対処方法

まずは qemu-user-static パッケージに登録されている interpreter を取り除きます。

user@host:work$ sudo update-binfmts --package qemu-user-static --remove qemu-arm /usr/bin/qemu-arm-static

次に特別なオプション無しに元に戻します。

user@host:work$ sudo update-binfmts --install qemu-arm /usr/bin/qemu-arm-static \
  --magic '\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00' \
  --mask  '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'

すると次のようになります。

user@host:work$ sudo update-binfmts --display qemu-arm
qemu-arm (enabled):
     package = <local>
        type = magic
      offset = 0
       magic = \x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/bin/qemu-arm-static
    detector = 
user@host:work$ sudo chroot debian9-rootfs
root@host:/#

成功しました。

注意

この方法で update-binfmts の設定を変更したままだと、update-binfmts のアンインストールや再インストールに失敗します。使用後は元に戻しておいた方が良いでしょう。

user@host:work$ sudo update-binfmts --remove qemu-arm /usr/bin/qemu-arm-static
user@host:work$ sudo update-binfmts --package qemu-user-static \
  --install qemu-arm /usr/bin/qemu-arm-static \
  --magic '\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00' \
  --mask  '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2