通常、Ubuntuの停止や再起動はshutdownコマンドやrebootコマンドを使って行うが、WSLで動作するUbuntuではこの方法が使用できない。WSL(正確にはWSL 2)は仮想マシンで動作するLinuxという位置づけだが、そのあたりはちょっとばかり仕組みが異なっている。今回は、WSLで、Ubuntuの起動やシャットダウンを行う方法を紹介しよう。→連載「WindowsでUbuntuをはじめる」のこれまでの回はこちらを参照。
WSLではshutdownコマンドやrebootコマンドが動かない(少なくとも本稿執筆時点では)
第12回で、スーパーユーザーの権限が必要なコマンドはsudoコマンドによって実行できることを取り上げた。Ubuntuの終了や再起動の処理はスーパーユーザーの権限が必要だ。そして、そのコマンドはshutdownコマンドやrebootコマンドなので、sudoと組み合わせて実行することで、Ubuntuを停止したり再起動させることができる。
しかし、WSLで動作するUbuntuではこのコマンドが使用できない。試しに、次のようにshutdownコマンドやrebootコマンドを実行すると、エラーとなってコマンドが正常に実行されない。
shutdownコマンドの実行サンプル
daichi@VAIO-SX14:~$ sudo shutdown -h now
[sudo] password for daichi:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
daichi@VAIO-SX14:~$
rebootコマンドの実行サンプル
daichi@VAIO-SX14:~$ sudo reboot
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
daichi@VAIO-SX14:~$
Hyper-VやVMware、VirtualBoxといった仮想化アプリケーションでUbuntuを実行していたり、そのほかのハイパーバイザ、またはベアメタルでUbuntuを実行していたりするなら、shutdownコマンドやrebootコマンドでUbuntuの終了・再起動が可能だ。
WSL(正確にはWSL 2)は、仕組みとしてはHyper-Vで動作する仮想環境でLinuxを実行する技術なので、shutdownやrebootコマンドが機能してもよさそうなものだが、現時点ではこの機能は動作しないようになっている。
もしかすると、将来的にはshutdownコマンドやrebootコマンドが利用できるようになる可能性もある。仕組みとしてはそれほど難しくないと思われるので、ユーザーからの要望があれば実装されるかもしれないが、今のところはその機能は動作しない。
Ubuntuの起動 wsl.exe
では、WSLで動作するUbuntuはどうやって起動と停止を行っているのかだが、この処理はwsl.exeというWindowsのコマンドから行うようになっている。まず、wsl.exeコマンドを引数もなにも指定しないで実行すると、WSLでデフォルト実行する設定になっているLinuxディストリビューションが起動してくる。通常、この処理でUbuntuが起動してくる設定になっている環境が多いだろう。
次のスクリーンショットは、Windows 11のWindows Terminalでwsl.exeコマンドを実行したところだ。
ユーザーからは、Windows TerminalのPowerShellがUbuntuのbashに置き換わったように見える。しかし背後では、仮想マシンが起動してそこでUbuntuがブートし、そこでシェルを起動してWindows Terminalからアクセスしている、といった処理が走っている。Ubuntuの起動処理が行われているのだ。