【WSL環境構築】wslコマンドが使えずインストール、バージョン変更できない問題を解決

アイキャッチ画像 環境構築
スポンサーリンク

はじめに

本記事では,私がWindowsPCでC++言語による開発環境構築を行うべく,WSL2,Ubuntsをインストールした際に発生した問題と,その解決方法を紹介しています(2023.5.28執筆).

WSL環境開発の基本的な手順について
WSL 開発環境を設定する | Microsoft Learn

追記:
最終的な目的は,Ubunts側でVSCodeを使うことだったのですが,WSLのインストールおよびアップデートに手間取ったので,VSCodeの利用については,参考になった記事の紹介にとどめておきます.

WSLでVSCodeを使用する方法について
WSL で VS Code の使用を開始する | Microsoft Learn
WSL2とVS CodeでC++を利用してみる | メモ置場のブログ (scratchpad.jp)

スポンサーリンク

実行環境

  • Windowsの仕様(設定 -> 詳細情報)
    ・エディション Windows 10 Home
    ・バージョン 22H2
    ・19045.2965
  • Ubuntu22.04.2LTS(インストール済み)

環境構築系で問題が生じたときは,OSのバージョンも要チェックです.

スポンサーリンク

前提確認

コントロールパネル > プログラム > プログラムと機能 > Windowsの機能の有効化または無効化

に移動し,次の項目にチェックをします.チェック後にOKを押すと,再起動されて設定が反映されます.

  • Linux 用 Windows サブシステム
  • 仮想マシンプラットフォーム
スポンサーリンク

PowerShellでwslコマンドが使えない問題を解決

管理者権限でPowerShellを起動し,WSLのインストールをすべく,次のコマンドを実行しました.

PS C:\Users\username> wsl --install

すると,次のようなエラーが返ってきました.

wsl : 用語 'wsl' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください
。
発生場所 行:1 文字:1
+ wsl
+ ~~~
    + CategoryInfo          : ObjectNotFound: (wsl:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Suggestion [3,General]: コマンド wsl は見つかりませんでしたが、現在の場所に存在します。
Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。
このコマンドを信頼する場合は、".\wsl" と入力してください。
詳細については、"get-help about_Command_Precedence" と入力してヘルプを参照してください。

「現在の場所に存在する」ということは,wslコマンドを実行するのに必要なファイル自体は既に存在しているようです.色々とエラー原因を調べていると,「wsl.exe」という実行ファイルがwslコマンドの正体だということが分かりました.この実行ファイルは,以下のパスに存在します.

\C:\Windows\System32\wsl.exe

ということで,wslコマンドが使えなかったのは,この実行ファイルにパスが通っていなかったことが原因だと考えられます.そこで,wlsコマンドを,実行ファイルのフルパスに置き換えたところ,無事にwslのバージョン確認に成功しました!

wsl -> \C:\Windows\System32\wsl.exe

PS C:\WINDOWS\system32> \C:\Windows\System32\wsl.exe -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         1

ちなみに,wslコマンドにパスを通すためには,管理者権限でPowerShellを起動し,次のコマンドを実行すればよいです.

このコマンドを信頼する場合は、”.\wsl” と入力してください。

と言われたので,wslの前に「.\」を付ける必要があったのですが,この原因は未だ分かっていません.

PS C:\WINDOWS\system32> $env:Path += ";C:\Windows\System32\wsl.exe"
PS C:\WINDOWS\system32> .\wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         1

WSL1をWSL2にアップデートしたい

WSLのバージョン確認は無事にできました.しかし,WSL1をWSL2にアップデートする際のコマンドライン引数の設定方法を書いている記事では,実行してもエラーが返ってくるものばかりでした.

エラーとなったコマンド例

PS C:\WINDOWS\system32> .\wsl --set version 2
指定された名前のディストリビューションはありません。
Error code: Wsl/Service/WSL_E_DISTRO_NOTFOUND

PS C:\WINDOWS\system32> .\wsl --set version Ubuntu 2
指定された名前のディストリビューションはありません。
Error code: Wsl/Service/WSL_E_DISTRO_NOTFOUND

正しいコマンド例(Ubunts 22.04.2の場合)

PS C:\WINDOWS\system32> .\wsl --set version Ubuntu-22.04 2
PS C:\WINDOWS\system32> .\wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

WSL2への切り替えに成功しました!

下の記事では,正しくWSLのバージョン切り替えを行う方法を紹介してくださっていたので,非常に助かりました.WSLの方が,WSL2よりも動作が速いという情報もちらっと見かけたので,デフォルトのバージョンを無印WSLに切り替えたいとき等にも,お世話になりそうです.
Windowsユーザーに贈るLinux超入門(55) インストール済みのLinuxをWSL 1からWSL 2へ変える方法 | TECH+(テックプラス) (mynavi.jp)

まとめ

自力でWSL環境構築を行ってみましたが,この辺の知識が乏しい身としては,やはり難しいなと思いました.しかし,今回の注意すべきだった

  • WindowsPowerShellは管理者権限で実行する.
  • wslコマンドにパスが通っているか確認する.
  • パスは通っていなくても,実行ファイルの存在場所さえ分かれば,実行ファイルのフルパスをコマンド同様に使える.
  • コマンドライン引数は正しく指定する.

といったことは,今後他の開発環境を構築する際にも役立つと思われます.

コメント