WSL 上の VSCode で "Exec format error" が発生して起動しなくなったときの対処方法
こんにちは。最近、 ジーンズを新調した k-so16 です。ウエストと丈がちょうど合うサイズのものを買えて、とても満足しています (笑)
普段、 Laravel や Vue でアプリ開発を進める際に、 WSL 上から Visual Studio Code (以降 VSCode と表記) を利用しています。
ある日、いつも通り WSL から VSCode を起動しようとすると、 次のようなエラーが表示されて起動しませんでした。なお、 Windows 側からは問題なく VSCode は起動した ので、 VSCode の問題ではなさそうです。
/mnt/c/Users/k-so16/AppData/Local/Programs/Microsoft VS Code/bin/code: 61: /mnt/c/Users/k-so16/AppData/Local/Programs/Microsoft VS Code/Code.exe: Exec format error
前日までは問題なく起動していたのに、急にエラーが出て起動しなくなってしまいました。これでは開発が進められないので、解決方法を模索しました。
本記事では、 WSL から VSCode を起動しようとした際に Exec format error
が発生して起動しない場合の対処方法を紹介します。
本記事で想定する読者層は以下の通りです。
- WSL 上での VSCode の基本的な使い方を知っている
想定環境
今回のトラブルが発生した環境は以下の通りです。
- OS: Windows 11 Pro
- バージョン: 22H2
- WSL2
- カーネルバージョン: 5.15.90.1
- OS: Ubuntu 22.04.2 LTS
- VSCode: バージョン 1.80.2
発生した事象
冒頭にも記載したように、 VSCode を起動しようとすると Exec format error
というエラーが表示され、起動できませんでした。実は VSCode だけでなく、 Explorer など、ほかの Windows のプログラムも起動できなくなっていました。
bash: /mnt/c/Windows/explorer.exe: cannot execute binary file: Exec format error
どうやら、 Windows の実行ファイルが WSL から起動できなくなっている ようです。
解決方法
実際に解決できた方法
さっそくですが、解決方法を紹介します。 以下のコマンドを実行 することで、 VSCode が WSL 上からも起動するようになりました。
sudo sh -c 'echo :WSLInterop:M::MZ::/init:PF > /usr/lib/binfmt.d/WSLInterop.conf'
sudo systemctl unmask systemd-binfmt.service
sudo systemctl restart systemd-binfmt
sudo systemctl mask systemd-binfmt.service
上記の解決方法は、以下の GitHub の issue 内のコメントに記載されていました。それぞれのコマンドについて、簡単に解説します。
1 行目は WSLInterop.conf
という設定ファイルを作成しています。事前に /usr/lib/binfmt.d/WSLInterop.conf
が存在するか確認しましたが、筆者の環境では存在しませんでした。
2 ~ 4 行目は systemd-binfmt.service
のサービスの再起動をしています。 systemctl
でサービスの起動、停止や稼働状況の確認などができます。
2 行目の systemctl unmask
はサービスの mask
を取り消すコマンドです。 systemd-binfmt.service
を手動で再起動するために、このコマンドを実行しています。サービスの mask
については 4 行目のコマンドの説明で後述します。
3 行目の system restart
では、 systemd-binfmt.service
のサービスを再起動しています。
4 行目の systemctl mask
は サービスの起動を無効化 します。サービスを mask
すると、 サービスの自動起動だけでなく、手動での起動も無効化 されます。
他に試行錯誤した方法
解決方法が見つかるまでの間に、いくつか別の手段も試行錯誤したので、その内容も合わせて記載します。
- WSL の再起動
- systemd の有効化設定の取り消し
まずは、 とりあえず困ったときの再起動 、ということで WSL を再起動してみました。残念ながら、今回は再起動では解決しませんでした。
次に、同様のエラーが発生しているという GitHub の issue に記載されていた issue コメント の内容を試すことにしました。
コメントでは、 /etc/wsl.conf
に追記した systemd
のサポートの有効化を取り消す ことで解決したと記載されていました。コメント内の /etc/wsl.conf
を確認してみると、 systemd = true
の行をコメントアウトしていました。
[boot]
#systemd = true
しかし、筆者の環境では、そもそも systemd = true
を記載していなかったため、この方法は取れませんでした。
原因の調査
心当たり
「何もしていないのに壊れました。」と言いたい気持ちを抑えて、 本当に心当たりがないのか 考えてみました。よく考えると、 VSCode を起動する前に Ubuntu の apt のパッケージをアップデート したことを思い出しました。
何をアップデートしたか、ターミナルの表示からさかのぼろうとしましたが、 WSL を再起動する際にターミナルを閉じてしまった ため、この方法では調べられません。アップデートしたパッケージの履歴が見られないか調べてみると、 /var/log/apt/history.log
に載っていることがわかりました。
アップデートしたパッケージ
アップデートしたパッケージを /var/log/apt/history.log
から確認してみます。
Start-Date: 2023-08-02 09:08:04
Commandline: apt upgrade
Requested-By: k-so16 (1000)
Upgrade: librsvg2-common:amd64 (2.52.5+dfsg-3, 2.52.5+dfsg-3ubuntu0.2), librsvg2-2:amd64 (2.52.5+dfsg-3, 2.52.5+dfsg-3ubuntu0.2)
End-Date: 2023-08-02 09:08:04
librsvg2-common:amd64
と librsvg2-2:amd64
の 2 つがアップデートされていました。どうやら SVG ファイルの描画ライブラリーのようです。正直、このアップデートが原因とは思いづらいですね。
おそらく、 apt のアップデートなど、何かの拍子に /usr/lib/binfmt.d/WSLInterop.conf
が消えてしまって、起動できなくなったのかなと推測します。
まとめ
本記事のまとめは以下の通りです。
- VSCode で
Exec format error
が表示されて起動しない場合の解決方法を紹介- 実行しているコマンドの内容を解説
- エラーの発生となった原因の調査
- 直前でアップデートしたパッケージを調査
- 直接の原因は不明
以上、 k-so16 でした。本記事が同じエラーに悩まされている方々の助けになれば幸いです。