WSL2でsystemctlを使えるようにする
環境
WSL2 ubuntu 18.04LTS
経緯
flutterをgit cloneして動かすとなぜか構文エラーで怒られるので(ホストのWindows/WSL2いずれの場合でも)、snapでインストールすることにした。
以下に従って
$ sudo apt update sudo apt install snapd
$ sudo snap install flutter --classic
をする。
snapcraft.io
が、
$ sudo snap install flutter --classic error: cannot communicate with server: Post http://localhost/v2/snaps/flutter: dial unix /run/snapd.socket: connect: no such dile or directory
sanpコマンドが動かない。
$ snap --version snap 2.49.2+18.04 snapd unavailable series -
systemctlでsnapの動作確認をしてみたいところですが、WSLではsystemctlが標準で無効化されており、PID1で動作しない(PID1はinitに付与されている)という問題が。
$ systemctl status snapd.service System has not been booted with systemd as init system (PID 1). Can't operate.
initプロセスについて
Linuxシステムでは通常、カーネルによりinitプロセスが起動され、その後initが各Daemonの起動を担い、Linuxシステム上の全てのプロセスはプロセスID = 1 のinitプロセスを親として起動されます。 roy-n-roy.github.io
対処法
genieを利用することでsystemdをPID1で稼働させることができるようになるとのこと。
genieの公式READMEいわく、deamonize
とdotnet-runtime-3.1
のインストールが必要ということなので、まずはこれを導入する必要がありそう。
github.com
$ sudo apt install daemonize
dotnet-runtime-3.1についてはUbuntu に .NET をインストールする - .NET | Microsoft Docsを参考に、 以下のコマンドで.NETパッケージのインスト―ルを行います。
$ sudo apt-get install -y gpg wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/ wget https://packages.microsoft.com/config/ubuntu/{os-version}/prod.list sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y {dotnet-package} /* dotnet-sdk-3.1 */
genieをインストールします。
sudo apt update sudo apt install -y systemd-genie
以下を実行し、systemdをPID1にする
genie -s
vim .bashrc
で以下を追記
if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then genie -s fi
こうすることで、実行時にsystemdがPID1でないgenie-sが実行されるようです。
かくして、無事PID1で稼働していることが確認できました。
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.6 0.1 77736 8808 ? Ss 11:03 0:01 systemd
$ sudo snap install flutter --classic [sudo] password for denham: 2021-06-12T11:06:54+09:00 INFO Waiting for automatic snapd restart... flutter 0+git.e75662a from Flutter Team✓ installed