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の最後に書き加えます。
if [[ ! -v INSIDE_GENIE ]]; then
echo "Starting genie:"
exec /usr/bin/genie -s
fi
長い道のりでした。
これで、SLURMもDockerも動かせます。