IBM のProject Bob(以降Bobと略します)、皆さんもう試しましたか?
Project Bobのウェイティングリスト
【参考】前回のファーストタッチ体験記
watsonx Code Assistantの基盤技術としても注目されているBobですが、今回は難しめのタスクに挑戦しようと思い、WSL(Ubuntu) 上からBobを起動しようとしたところ……(ちなみにBobの起動コマンドはbobideです)
$ bobide . /mnt/c/Users/xxxxx/AppData/Local/Programs/Bob-IDE/bin/bobide: 61: /mnt/c/Users/xxxxx/AppData/Local/Programs/Bob-IDE/Bob-IDE.exe: Exec format error

いきなりエラー。
エラーメッセージを見ると、bobide スクリプトの61行目で Bob-IDE.exe を実行しようとして失敗しているようです。
「インストール失敗した?パスがおかしい?」と思って、切り分けのために notepad.exe を叩いてみたんですが……
$ notepad.exe -bash: /mnt/c/WINDOWS/system32/notepad.exe: cannot execute binary file: Exec format error

これも似たようなエラー。つまり Bob-IDE の問題ではなく、WSL から Windows の exe が一切起動できない状態です。
原因を調べてみた
Exec format error はWSL内のLinux側のエラーで、
「このファイルは Linux 用の実行形式じゃないですよ」
という意味です。
本来、WSL では .exe ファイルを実行すると Windows 側で起動してくれる仕組み(interop)が働くんですが、これが無効だと Linux がそのまま exe を実行しようとして失敗します。
WSL の設定ファイル /etc/wsl.conf を確認してみると……
[boot] systemd=true [user] default=user2404 [network] hostname=ibm
[interop] セクションがない!これが原因か!
設定を追加して解決(したと思った)
というわけで、/etc/wsl.conf に以下を追記しました。
[interop] enabled=true appendWindowsPath=false
一旦、WSLのLinuxをexitで抜けて、PowerShellからWSLをシャットダウンします
PS> wsl --shutdown
WSLのUbuntuを起動して確認してみます。
$ notepad.exe
メモ帳が起動した!Bob-IDE も動いた!やったー!🎉
$ bobide .
……と、ここで終われば普通の技術記事なんですが。
実はオチがありまして
本当にこれが設定の問題か検証してみてました。(ブログを書くときには何度か試しています) 設定を戻してみたんです。すると……
設定なしでも再度テストすると
$ bobide .
普通に動いた。
えっ🙄🙄🙄
結論:まず再起動を試そう
元も子もない…🥲
どうやらWSLのinteropは、何らかのタイミングで一時的に動作しなくなることがあるようです。そのようなケースでは、設定ファイルをいじらなくても、wsl --shutdown でシャットダウンするだけで復旧することがあるようです。
WSLのinteropは明示的に設定しなくてもデフォルトで有効になっています。
というわけで、このエラーに遭遇したときの対処順序は
ステップ1:まず再起動(これだけで直ることが多い)
PS> wsl --shutdown
その後 Ubuntu を起動して notepad.exe で確認。起動すればOK。
ステップ2:それでもダメなら設定を確認
/etc/wsl.conf に以下を追記:
[interop] enabled=true appendWindowsPath=false
再度 wsl --shutdown して確認。
appendWindowsPath について補足
ついでなので、設定項目の意味も書いておきます。
[interop] enabled=true # Windows の exe を起動可能にする appendWindowsPath=true # Windows の PATH を WSL に混ぜる
appendWindowsPath=true にすると、Windows の PATH が WSL 側に追加されます。一見便利そうですが、python を実行する場合などWSL版なのかWindows版なのかわからなくなるので、開発環境では false にしておくのが安全かなと思います。
おわりに
今回の教訓
設定をいじる前に、まず再起動を試せ
エンジニアとしては基本中の基本なんですが、エラーメッセージを見ると「何か設定がおかしいのでは」と深読みしてしまうんですよね……🥲
# まずこれを試す PS> wsl --shutdown
Project Bobを WSL環境で試そうとしている方、同じエラーでハマったらまず wsl --shutdown を試してみてください。設定ファイルをいじる必要はないかもしれません。
私のように「原因を特定した!」と思って設定を追加したものの、実は再起動だけでよかった……というトホホな経験をしなくて済むように、この記事が参考になれば幸いです。