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がネームスペースで分離されていないからだそうです。複数のディストリビューションを共存させる使い方では必要なフォーマットは当面は他のディストリビューションも登録しておくことになりそうです。