建設予定地

当面はやったことの備忘録

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いわく、deamonizedotnet-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

snowsystem.net

qiita.com

github.com