システムがsystemdをinitシステムとして起動していない
「System has not been booted with systemd as init system (PID 1)」というエラーが表示されたと訴える人は多いです。ほとんどの場合、このエラーはLinuxシステムでsystemdコマンドを実行したときに発生します。
このエラーの原因は、Linuxシステムがinitシステムとしてsystemdを使用していないことにあります。ご存じの通り、Linuxシステムは以下のプロセスで起動します。
- PCを起動すると、BIOSがアクティブになります。
- BIOSはMBRを読み込んで、ブートローダーを見つけます。
- ブートローダーはシステムカーネルをロードし、コンピューターのハードウェアリソースを管理し、ソフトウェアとハードウェアの間のインターフェースとして機能します。
- カーネルはその後、システムの最初のプロセスであるinitプロセス(プロセスIDが1)をアクティブにします。これは、他のすべてのユーザープロセスの生成を担うものです。initは他のプロセスができないタスクを完了する、独特のプロセスです。
さて、initシステムとは何でしょうか?initシステムは、initプロセスの動作を定義・管理・制御します。コンピューターシステムが、ユーザーによって設定された動作モードにスムーズに入ることができるように、多数の独立した、あるいは関連する初期化タスクを整理し、実行する役割を担っています。
LinuxシステムにはSystem III、System V、Upstartなど、多くの初期化システムがありますが、2015年以降はほとんどのLinuxディストリビューションが従来の初期化システムに代わり、systemdを採用しています。systemdは、System Vとの下位互換性を持っています。
ただし、次の2つのケースでは、systemdはデフォルトで有効になりません。
- WSL(Windows Subsystem for Linux)でLinuxシステムを使用している
- initプロセス (/sbin/init) がスキップされている
解決策
「System has not been booted with systemd as init system」エラーを解決する方法を3つまとめました。同じ問題にお悩みの方は、これらを1つずつ試してみて下さい。
方法1: 同等のSysvinitコマンドを使用する
LinuxシステムをWSL経由で実行する場合、Linuxシステムはsystemdの代わりにSystem V initシステムを使用します。systemdコマンドを実行することはできませんが、同等のSysvinitコマンドを実行できます。
この表が参考になるでしょう。
Systemdコマンド | Sysvinitコマンド |
systemctl start service_name | service service_name start |
systemctl stop service_name | service service_name stop |
systemctl restart service_name | service service_name restart |
systemctl status service_name | service service_name status |
systemctl enable service_name | chkconfig service_name on |
systemctl disable service_name | chkconfig service_name off |
方法2: コマンドに/sbin/initを追加する
最近のLinuxシステムでは、ユーザーはinitプロセスをスキップすることができます。例えば、ブートローダー環境でコマンド init=/bin/bash を実行すると、システムはシングルユーザーのルートシェル環境を起動します。ユーザーパスワードは必要ありません。
この環境では、すべてのコマンドがデフォルトのパス「 /bin/bash 」で実行されます。この場合は、 /bin/bash の代わりに /sbin/init を使用して下さい。
方法3: スクリプトでSystemDを有効にする
WSL2でsystemdを常に有効にするには、diddledaniのスクリプトを適用します。こちらのリンクから、その作業の手順をご覧いただけます。一部のユーザーは、この方法でうまくいったと報告しています。