はじめに
先日、自宅PCの(おそらく)マザーボードが故障して起動できなくなってしまったので、以前使っていたノートPCをフォーマットして故障したPCの代わりにWindows11
をセットアップしました。
その際、WSL
のインストール・セットアップに色々あって手間取ったのと、そういえば最近のWSL
は、以前のように追加パッケージをインストールしなくてもネイティブにSystemd
を動かせるようになっていたなと思い、セットアップした結果を紹介します。
-
以前の記事
WSLの準備
WSL
を実行するために必要となる事前の準備を行います。
手順は公式ドキュメントにまとまっているので、基本的な手順は以下に沿って進めます。
以下目次
Windowsターミナルの設定
WSL
セットアップ時、何度かPowerShell
を管理者モードで起動する必要があるため、WindowsターミナルでPowerShell
の管理者モードを起動できるようにしておきます。
Windowsターミナルを起動し、メニューから「設定」を選択。
「新しいプロファイルを追加します」から、複製元のプロファイルで「Windows PowerShell」を選択して、「複製」を選択します。
「名前」を任意(今回は「Windows PowerShell (管理者)」)で入力して、「このプロファイルを管理者として実行する」のトグルスイッチをオンにして「保存」すれば、次からはPowerShell
を管理者モードで簡単に起動することができます。
サービスの有効化
WSL
を使えるようにするため、「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」の有効化を行います。
Windowsメニューより、「システム」→「システム」→「オプション機能」→「Windowsのその他の機能」からGUIでも設定できますが、今回は公式ドキュメント通りコマンドで実行します。
Windowsターミナルを起動して、「+」ボタンから先程設定した管理者モードで起動するPowerShell
を選択して以下コマンドを実行します。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
上記設定後、Windows
の再起動を行う必要があるので一度再起動しておきます。
再起動後、WSL
のコマンドを実行して、以下のように出力されることを確認して、もし失敗するようであれば「エラーが発生した場合の対処」を実行してみてください。
PS C:\Users\username> wsl
Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
Linuxカーネル更新プログラムパッケージのインストール
以下のページのリンクにある、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」から最新パッケージをダウンロードしてインストールします。
WSLのデフォルトバージョン変更
WSL
にはVersion1
とVersion2
がありますが、Version2
をデフォルトにするため、以下コマンドを実行します。
wsl --set-default-version 2
Ubuntuのインストール
「Microsoft Store」から「Ubuntu」を検索してインストールします。
インストール後、作成するユーザ名とパスワードを聞かれるため、それぞれ任意のユーザ名、パスワードを入力します。
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: [ユーザ名を入力]
New password: [パスワードを入力]
Retype new password: [パスワードを入力]
passwd: password updated successfully
Installation successful!
Systemdの有効化
以下よりSystemd
を有効化していきます。
Systemd
も以下公式ドキュメントに沿って進めていきますが、公式ドキュメントによると、すでにinit
システムの既定値がSystemd
に変更となっているとのことなので、私のように新たにWindows
をインストールした方は作業不要かもしれません。
今回私が実施した手順に沿って以下進めていきます。
WSLのアップデート
WSL
のコマンドはそのままではバージョンが古い場合があり、そのままではwsl --version
といったいくつかのコマンドが実行できないことがあるようです。
そのため、PowerShell
より、以下コマンドを実行してWSL
をアップデートします。
wsl --update
アップデート後、もしWSL
コマンドが実行できなくなったり、Ubuntu
にログインできなくなってしまった場合は「エラーが発生した場合の対処」を参考にしてみてください。
Systemdの確認・有効化
Systemd
の有効化は、今まで操作してきたPowerShell
からではなく、Linux
(今回の場合はUbuntu
)側のコマンドラインを操作して有効化する必要があります。
今回の手順通りに進めている場合、「Windowsターミナル」からUbuntu
を実行できるようになっているはずなので、Ubuntu
を起動し、wsl.conf
ファイルを確認します。
cat /etc/wsl.conf
ファイルを確認し、systemd
の設定がtrue
になっていればSystemd
が有効になっています。
[boot]
systemd=true
もし上記の設定になっていないようであれば、vi
等で編集した後、wsl --shutdown
コマンドで停止します。
wsl --shutdown Ubuntu
停止後、WindowsターミナルからUbuntu
のターミナルを起動すると停止したUbuntu
が起動してくるので、Ubuntu
のコマンドラインから、以下のようなSystemctl
コマンドを実行して結果が表示されれば問題ありません。
systemctl list-unit-files --type=service
エラーが発生した場合の対処
通常、Windowsサブシステムと仮想マシンプラットフォームを有効化すれば、WSL
のコマンドが実行できるようになるはずですが、私の環境では「クラスが登録されていません」と表示され、実行できませんでした。
PS C:\Users\username> wsl
クラスが登録されていません
Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG
wsl --update
でアップデート後にも上記のWSL
エラーが再度出力されるようになったり、またUbuntu
ログインしようとした際にも以下のようなエラーが出力されるようになりました。
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8007019e
Error: 0x8007019e Linux ? Windows ??????????????????
Press any key to continue...
その時の私の環境情報等も載せておきます。
項目 | パラメータ |
---|---|
エディション | Windows 11 Pro |
バージョン | 23H2 |
OS ビルド | 22631.3085 |
エクスペリエンス | Windows Feature Experience Pack 1000.22684.1000.0 |
プロセッサ | AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx 2.30 GHz |
実装RAM | 16.0 GB |
私の環境だけではなく、同じような事象が報告されているようで、以下参考にさせて頂いたページを見ると、バージョンによるバグのようです。
中々現状のWSL
のバージョンを確認する方法が見つかりませんでしたが、PowerShell
の管理者モードで以下ディレクトリ名を見ることでなんとか確認しました。
> ls 'C:\Program Files\WindowsApps\microsoftCorporationii*'
ディレクトリ: C:\Program Files\WindowsApps
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/01/28 13:20 microsoftcorporationii.windowssubsystemforlinux_2.0.14.0_x64__8wekyb3d8bbwe
私の場合、作業実施時の安定リリース版最新となる2.0.14.0
でしたが、サービスを入れ直したりしても変わらなかったため、以下Microsoft WSL
のGitHub
ページより、作業時のプレリリース版最新となる2.1.1
をインストールしたところ、問題が発生しなくなりました。
同じように失敗する方がいれば参考にしてもらえればと思います。
おわりに
今まではWSL
でSystemd
サービスを実行するためには、オープンソースのユーザパッケージをインストールしたりしないと使えなかったので、仮想Linux
として使用するにはちょっと難しい部分がありましたが、ネイティブでSystemd
が実行できるようになったことで、WSL
でもかなり使えるようになったと感じました。
ただ、Systemd
がネイティブで実行できるようになったからなのか、WSL
自体のインストール・セットアップは以前より不安定になっているなと個人的に感じました。