Ubuntu20.04＠wsl2でsystemd(systemctl)を自動起動する


## systemctlコマンドでエラーが出る
どうやらwslでUbuntuを使うとsystemdがそのままでは使えないみたい。
本来systemdのPIDは1でないといけないが、そうなっていないことが原因らしい。
これが解消しないとDockerもSLURMも、いろいろと使えなくて不便！

そこで、Ubuntu20.04＠wsl2で
Genie（ https://github.com/arkane-systems/genie ）
というソフトを入れてsystemdを使う方法を記載します。
[21/9/26追記]genie起動時のエラー対処、自動起動方法を追記しました。

お役に立てたら、LGTMよろしくお願いします。

なお、systemdを使うにはいろんな方法があるらしく、下記に詳しいです。
https://qiita.com/matarillo/items/f036a9561a4839275e5f

## 事前環境と準備
WSL2にUbuntu20.04はインストールして、作業用ユーザーを作って、作業用ユーザーがsudoできる状態にしたもの。
まずは、Ubuntu@wsl2を立ち上げて、リストを更新

```bash
$ sudo apt update
```

## Genieインストール準備
Genieインストールは、GenieのGitHubのマニュアル通りです。
https://github.com/arkane-systems/genie

まずはdotnet-runtime-5.0を入れる。
https://dotnet.microsoft.com/download/dotnet/current/runtime
を参照

```bash
#APIインストールのためのリポジトリ追加
$ wget https://packages.microsoft.com/config/ubuntu/20.10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
#SDKのインストール
$ sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0
#ランタイムをインストールする。
#最後の行はaspnetcore-runtime-5.0をdotnet-runtime-5.0に変更してある。
$ sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-runtime-5.0
```
SDKとランタイムは、ちょっと長めですがそれぞれ丸々コピーして実行してください。
連続実行されますが、たまにEnterキー押さないといけないので、よく見て完了させましょう。

次に、wsl-translinux レポジトリの追加

```bash
$ sudo -s
$ apt install apt-transport-https
wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main
EOF
apt update
$ exit #rootから作業ユーザーに戻る
```
最後にexitで作業ユーザーに戻るのをお忘れなく。

##Genieのインストールと起動
```
# Genieをインストール
$ sudo apt update
$ sudo apt install -y systemd-genie
```

これでインストール完了。
genieを立ち上げる。

```bash
$ genie -s
#　実行結果
Waiting for systemd....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
（辛抱強く我慢する……）

Failed units will now be displayed (systemctl list-units --failed):
  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
● ssh.service                loaded failed failed ・・・・
● systemd-remount-fs.service loaded failed failed ・・・・
● multipathd.socket          loaded failed failed ・・・・
```
エラーがでる。どうやらサービスの起動に失敗している。
まずは、genie の待機時間を短くする。これで待機時間を短くできる。

```bash
$ sudo vi /etc/genie.ini
# ファイルの中身の一部　240を10秒とかに変更
 [genie]
systemd-timeout=10
```

続いて起動に失敗したサービスの対処。使わないなら止めちゃう。
とりあえずsystemd-remount-fs.serviceとmultipathd.socketは止める。

```bash
$ sudo systemctl disable multipathd.socket
$ sudo systemctl mask systemd-remount-fs.service
```
下段は、disableでは止まらなかったのでmask(手動でも起動できなくする)を使用。
ssh.serviceは利用したい。インストールしてsshのkeygenをたたく。
(apt-get updateでエラーが出たら、wslを抜けてUbuntu を再起動)

```bash
$ sudo apt-get update
$ sudo apt-get install openssh-server
$ sudo ssh-keygen -A
```

ここまで済んだら一度wslから抜けてUbuntu を再起動。
いざ、genieを再度起動！

```bash
$ genie -s
#　実行結果  
  Waiting for systemd....!!
$ ps -ax
#　実行結果
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:00 systemd
```
無事に動いてますし、systemdのPIDも１になってますね。
自動起動するためにbashrcの最後に書き加えます。

```bash:.bashrc
if [[ ! -v INSIDE_GENIE ]]; then
  echo "Starting genie:"
  exec /usr/bin/genie -s
fi
```
長い道のりでした。
これで、SLURMもDockerも動かせます。