序論
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
- Guest OS:
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