LoginSignup
75
68

More than 3 years have passed since last update.

WSL2でスタートアップスクリプトを実行するHack

Posted at

序論

WSL2 では起動時に systemd を自動スタートさせたり、/etc/rc.local によるスタートアップスクリプトの実行ができません。

Windowsスケジューラにスクリプトを登録するなど、回避策はありますが、筆者はなるべく Linux 環境内で設定を完結させたいと考えていました。

そのような訳で、WSL2 で Docker を使いたい場合、起動時にいちいち以下のようなコマンドを打っていました。

# dockerデーモン起動
$ sudo service docker start

# WSL2 には cgroup 用ディレクトリがデフォルトで作られていないため作成しておく
## これをしておかないと Docker でプロセスのグループ化が必要になったときにエラーが起きる
$ sudo mkdir -p /sys/fs/cgroup/systemd
$ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

・・・面倒くさい。

ああ、面倒くさい。

そんな事を考えながらネットを彷徨っていると、WSL2 が起動時に /sbin/mount -a を呼び出すことを利用した Hack を発見し、感動したので共有します。

Environment

  • WSL2:
    • Guest OS: Ubuntu 20.04 LTS
    • Linuxカーネルバージョン: 4.19.121-microsoft-standard

WSL2用スタートアップスクリプト作成

仕組みとしては、WSL2 では起動時に /sbin/mount -a コマンドが呼び出されるため、これをフックすることで /sbin/mount.rc をスタートアップスクリプトとして使うことができる、ということのようです

WSL2内のLinuxターミナルで以下のように設定します

# /sbin/mount -a 実行時に rc ファイルシステムをマウントするように設定
$ echo 'none none rc defaults 0 0' | sudo tee -a /etc/fstab

# => これにより起動時に /sbin/mount.rc ファイルが呼び出されるようになる

# /sbin/mount.rc ファイルを実行可能スクリプトとして作成
$ echo '#!/bin/bash' | sudo tee /sbin/mount.rc
$ sudo chmod +x /sbin/mount.rc

# /sbin/mount.rc に実行権限が付与されているか確認
$ ll /sbin/mount.rc
-rwxr-xr-x 1 root root 12 11月  7 18:27 /sbin/mount.rc*

起動時に Docker サービスを開始するように設定

# service docker start を /sbin/mount.rc に追記
$ echo 'service docker start' | sudo tee -a /sbin/mount.rc

# WSL2 には cgroup 用ディレクトリがデフォルトで作られていないため、以下もスタートアップスクリプトに登録しておく
## これをしておかないと Docker でプロセスのグループ化が必要になったときにエラーが起きる
$ echo 'mkdir -p /sys/fs/cgroup/systemd && mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd' | sudo tee -a /sbin/mount.rc

# スタートアップスクリプト確認
$ sudo cat /sbin/mount.rc
#!/bin/bash
service docker start
mkdir -p /sys/fs/cgroup/systemd && mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

WSL2 を再起動して動作確認

WSL2 を再起動して動作確認してみます。

Win + X |> A キーで管理者権限 PowerShell を起動し、以下のようにコマンドを実行します。

# WSL2 シャットダウン
> wsl --shutdown

# WSL2 起動
> wsl
# -- user@wsl2

# Docker サービスが起動しているか確認
$ sudo service docker start
 * Starting Docker: docker

# /sys/fs/cgroup/systemd に cgroup がマウントされているか確認
$ ll /sys/fs/cgroup/systemd
合計 0
dr-xr-xr-x  3 root root   0 11月  7 17:54 ./
drwxr-xr-x 17 root root 340 11月  7 17:54 ../
-rw-r--r--  1 root root   0 11月  7 17:54 cgroup.clone_children
-rw-r--r--  1 root root   0 11月  7 17:54 cgroup.procs
-r--r--r--  1 root root   0 11月  7 17:54 cgroup.sane_behavior
drwxr-xr-x  4 root root   0 11月  7 17:54 docker/
-rw-r--r--  1 root root   0 11月  7 17:54 notify_on_release
-rw-r--r--  1 root root   0 11月  7 17:54 release_agent
-rw-r--r--  1 root root   0 11月  7 17:54 tasks
75
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
75
68