🍉

Ubuntu (on WSL2)でsnapを動かす

2022/11/03に公開

WSL2のUbuntuでsnapを使ってパッケージ(ここではmicrok8s)をインストールしようとしたところ

$ sudo snap install microk8s --classic
error: cannot communicate with server: Post http://localhost/v2/snaps/microk8s: dial unix /run/snapd.socket: connect: no such file or directory

というエラーに遭遇。

起きていることの背景

  • snap (Snappy)というパッケージマネージャーでmicrok8sをインストールしようとしているが、snapが動くためにはsnapdが動いている必要がある
  • snapdが動くためにはinitdではなくsystemdというデーモン経由でBashが立ち上がる必要があるが、WSL2ではinitdでBashが立ち上がっているためsystemdが存在しない

やること

  1. genieというパッケージを導入してWSL2でsystemdをpid=1の状態で起動する(つまり最初に起動するスーパーデーモンにする)
  2. apt-get install でsnapdをインストールする
  3. snapdを起動する

具体的な手順

genieに必要な.NET Coreランタイムをインストールする

sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y aspnetcore-runtime-3.1

最新版のgenieをgithubから取得する
Releases · arkane-systems/genie (github.com)
(debファイルをダウンロードする)
1.26の場合:

wget https://github.com/arkane-systems/genie/releases/download/1.26/systemd-genie.deb
  • debファイルからインストールを行う
$ sudo dpkg -i systemd-genie.deb
  • genieを起動する
    単純にはUbuntu内で
genie -s

でよい。

ps aux | less

などでsystemdがPID 1になっていることを確認できる。

毎回systemdをスーパーデーモンとして自動起動したい場合はスタートアップのタスクに登録する等の方法があるが、今回はsnapのインストールができればよいため省略。

  • snapdを起動する
sudo service snapd start
sudo service snapd status

で確認できる。

  • microk8sのインストール
sudo snap install microk8s --classic

毎回自動起動したい場合

以下を.bashrcや.zshrcに追記しておくのが良いらしい(genie公式のWikiより)
https://github.com/arkane-systems/genie/wiki/Automatically-start-genie-on-every-shell-session

# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
    echo "Starting genie:"
    exec /usr/bin/genie -s
fi

参考:
コラム - WSLで始めるUbuntu | 第22回 WSL2の新機能を試してみよう|CTC教育サービス 研修/トレーニング (ctc-g.co.jp)

Discussion