LoginSignup
7
2

WSL2+systemd バイナリファイルを実行できません: 実行形式エラー

Last updated at Posted at 2023-05-06

WSL2にてsystemdを有効にした状態でWindowsコマンドを実行すると「バイナリファイルを実行できません: 実行形式エラー」あるいは「cannot execute binary file: Exec format error」というエラーで失敗することがあります。
これは systemd-binfmt によってバイナリーフォーマットのリストが初期化されてしまうからです。

2023/9/19追記:
この問題は WSL 2.0.0 にて解決されました。今後は以下の対応を行わなくても問題は発生しないでしょう。

解決編

WSL2 が初期化時に用意する /proc/sys/fs/binfmt_misc/WSLInterop を復元すれば解決します。

具体的には以下の一文を実行します。

sudo sh -c 'echo :WSLInterop:M::MZ::/init:PF > /etc/binfmt.d/WSLInterop.conf'

この後 wsl --shutdown でWSLを終了させてから再度起動すれば解決します。

解説編

Windowsコマンドを実行できるディストリビューションでは以下のようになっています。

$ ls /proc/sys/fs/binfmt_misc
WSLInterop  register  status

Windowsコマンドが実行できない環境では WSLInterop がありません。この違いは systemd-binfmt が実行されたかどうかです。systemd-binfmtは設定すべきものが何もなければ実行されません。この場合、/init がしれっと追加したWSLInteropが有効になっています。

Ubuntu 23.04 では /usr/lib/binfmt.d/python3.11.conf が用意されているのでsystemdから /lib/systemd/systemd-binfmt 実行され初期状態(=WSLInteropは無い)にpython3.11が追加されます。

このため、Windowsコマンドは実行不能になるようです。

更に、起動中のすべてのディストリビューションが実行された systemd-binfmt の影響を受けてしまいます。これはbinfmt_miscがネームスペースで分離されていないからだそうです。複数のディストリビューションを共存させる使い方では必要なフォーマットは当面は他のディストリビューションも登録しておくことになりそうです。

7
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
7
2