はじめに
筆者は 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'