このページの本文へ

Windows Info 第373回

Windows Subsystem for Linuxでsystemdが動くようになったので試した

2023年04月02日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

WSLでのsystemdのサポートが開始 早速使ってみる

 Unixを祖先に持つLinuxには、起動時にデーモン(Windowsでいうところのサービス)を起動したり、初期化などをするプログラムを実行するinitシステムがある。ただ、WSL(Windows Subsystem for Linux)では特殊な起動をすることから、従来initシステムは動作できなかった。そもそもWSLは当初のコンセプトからして、Linuxコマンドラインを使うための環境であり、たとえばHTTPサーバーなどを動作させることは想定外とされていたのだ。

 一方でLinuxには、さまざまなプログラムがあり、その中にはinitシステムで起動されるプログラムが必要なものがある。こうしたプログラムを動作させるためには、どうしてもinitシステムを組み込む必要があった。

 Linuxのinitシステムには、Unix System V互換のSysVinitやBSD系Unix由来のBSDinit、Linux用に作られたupstartなどいくつかあるが、現在ではsystemdと呼ばれるinitシステムが普及している。

 WSL Ver.0.67.6からWSLでのsystemdのサポートが開始された。本稿執筆時点では、Microsoftストア版WSLがインストールしてあれば、systemdは利用可能だ。ここでは、Ubuntu-22.04 LTSを使い、systemdを使ってみることにする。なお、systemdは必ずしも使うべきものではなく、使い方によっては無効のままでも問題ない。WSLの標準では無効にされている。

そもそもsystemdとは?

 systemdとは、UNITと呼ばれるサービス、デーモンの起動処理を行ない、システムの初期化をするものだ。Linuxでは、バックグラウンドで動作しさまざまな処理をする、デーモンと呼ばれるプログラムを利用するが、アプリケーションでもデーモンを必要とするものは、systemdに対して、UNITを組み込み起動をさせるようになっている。

 UNITは、設定(プロパティという)を記述したテキストファイルで記述されている。ただし、UNITファイルから実行時に生成されるファイルではないUNITもある。UNITファイルの中で起動するプログラムやスクリプトが定義されており、UNITファイルは、実行の前後関係や依存関係を記述する。

 なお、systemdは大規模で複雑なプログラムであるため、ここで全体を解説することは難しい。とりあえず「さわり」だけとさせていただきたい。

 systemdのUNITファイルは「/usr/lib/systemd/system」にある。ここには、末尾が「.service」「.target」やその他の単語を持つファイルやディレクトリがある。ここにあるのは、システム全体のUNITの雛形であり、これらを編集してはならない。

 設定を変更するにはいくつかの正しいやりかたがある。単に有効・無効を切り替えるなら、systemctlコマンドを使う。設定を変更したい場合、ドロップインディレクトリを作り、「~.conf」ファイルで差分を記述する。あるいは「/etc/systemd/system」にUNITファイルをコピーして編集する必要がある。なお、systemdでは同名のUNITファイルがあった場合、「/etc/systemd/system」のものが優先される。

UNITを調べる

 まずは、どのようなUNITがあるのかを調べる方法だが、上記のディレクトリを調べてもいいが、専用のコマンドとして「systemctl」がある。UNITのファイルを表示させるには、「systemctl list-unit-files」を使う。serviceのUNITファイルだけを表示させたければ「systemctl list-unit-files --type=service」とする。メモリに読み込まれているUNITを表示するには、「systemctl list-units」だ。

 前述のようにメモリに読み込まれているUNITには、直接対応するUNITファイルを持たないものもある。そのほか詳細は、systemctlのmanページを参照してほしい。

 これらのlistサブコマンドでは、lessがページャー(ページ単位で表示を一時停止するプログラム)が使われており、右側に反転表示の「>」がある場合、行にはみ出した部分があることを示す。このとき、左右カーソルキーで横スクロールさせることが可能だ。

 UNITで定義されたサービスなどを起動させたい場合には、

systemctl␣start/stop/reload/restart␣<UNIT名>...

などとする。UNITの状態を調べるには、

systemctl␣status␣<UNIT名>

とする。

 UNITを含むアプリケーションをインストールしてsytemdを使ってみることにしよう。テストに使うのは、HTTPサーバーの「nginx」である。以下のコマンドでnginxの基本版をインストールする。

sudo apt update
sudo apt install nginx-light

 これで、HTTPサーバーnginxが導入され起動したはずである。systemdでnginx.serviceの状態を調べるには、

systemctl status nginx.service

とする。curlコマンドでnginxが動いているかをテストする。Win32側でWebブラウザから「http://localhost」を開いてもnginxのページが表示できる。

HTTPサーバーnginxをインストールして、Win32側で「http://localhost」を開けば、nginxのページが表示される

 Win32側で開けない場合、ユーザーフォルダにある「.wslconfig」のlocalhostForwardingを確認する。trueでないと開けない。

 WSL側でテストするには、

curl http://localhost

とすると、出力の最後のほうに「Thank you for using nginx.」と表示されているはずだ。

systemctlコマンドを使うことで、UNITの状態を調べたり、起動や停止が可能になる。また、curlコマンドでnginxが動作しているかも調べられる

 nginxサービスを「sudo systemctl stop nginx.service」で停止させ、再度curlコマンドを実行するとコマンドは失敗する。再開するには、「sudo systemctl start nginx.service」とする。

 systemd関連のログを表示させるには、journalctlコマンドを使う。UNITを編集した場合など、エラーで起動しないといった問題が発生したとき、ログを調べる必要がある。たとえば、前回のブート以降の“nginx.service”のログを表示させるには、

journalctl --boot -u nginx.service

とする。systemdが動作すると基本的なログは、journaldと呼ばれるサービスが管理するようになる。journalctlは、その表示・管理用のコマンドである。標準では、ログはファイルとして記録される。「--boot」は、前回の再起動以降のログを表示するもの(後ろに数字を置くことで、前回、前々回の再起動以降のログを表示できる)。「-u」は、ログを表示させるUNITを指定するものだ。そのほか、journalctlには多数のコマンドがある。詳細はmanページなどで調べてほしい。

WSLの起動と継続

 systemdを有効にすることで、たとえばHTTPサーバーなどを、WSLと同時に起動することが可能になる。ただし、WSL自体は自動起動されないので、Win32側のスタートアップフォルダーなどで該当のディストリビューションを起動させる必要がある。たとえば、Windows Terminalなどで、「wt.exe -p <WSLプロファイル名/GUID>」などとする。

 また、WSLは、コンソールからセッションを開いていないと、一定時間で自動的にシャットダウンされる。その時間は、Win32側のユーザーフォルダにある「.wslconfig」ファイルの「vmIdleTimeout」で指定する。これで最後のコンソールが閉じてから自動シャットダウンされるまでの時間が長くできる。

 コンソールが開いていないと、HTTPサーバーが起動して、外部からアクセスされていても、シャットダウンがされてしまう。vmIdleTimeoutにゼロを入れても無効にはならないので、かなり大きな値を入れておくか、常にWSLのコンソールを開いておく必要がある。ただし、WSLを起動し続けると、メモリなどリソースが専有されたままになる点には注意が必要だ。

 systemdを有効にすると、WSLの起動時間が長くなってしまう。コマンドラインを使う用途が中心の場合、必ずしも有効にする必要はない。こうしたデメリットもあるので、利用するアプリケーションや使い方、ハードウェアスペックを考えて、利用の可否を考える必要がある。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン