12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-06

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を立ち上げて、リストを更新

$ 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
を参照

#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 レポジトリの追加

$ 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を立ち上げる。

$ 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 の待機時間を短くする。これで待機時間を短くできる。

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

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

$ sudo systemctl disable multipathd.socket
$ sudo systemctl mask systemd-remount-fs.service

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

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

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

$ genie -s
# 実行結果  
  Waiting for systemd....!!
$ ps -ax
# 実行結果
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:00 systemd

無事に動いてますし、systemdのPIDも1になってますね。
自動起動するためにbashrcの最後に書き加えます。

.bashrc
if [[ ! -v INSIDE_GENIE ]]; then
  echo "Starting genie:"
  exec /usr/bin/genie -s
fi

長い道のりでした。
これで、SLURMもDockerも動かせます。

12
5
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
12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?