Podman 4.3 on Artix Linux: 初期設定で発生する問題を解決
Tags: podman, docker, kubernetes, virtualization
Published: 2023-01-29 02:38:07

## はじめに

[Podman](https://podman.io/) を [Artix Linux](https://artixlinux.org/) という [Arch Linux](https://archlinux.org/) ベースで [systemd](https://www.freedesktop.org/wiki/Software/systemd/) を使っていない OS にインストールすることは、それほど難しいことではありません。
[pacman](https://archlinux.org/pacman/) が主要なパッケージを管理してくれているからです: `podman` と [QEMU](https://www.qemu.org/) の `qemu-base` のことです。

それらをインストールしていくつかの設定を行うことで Podman の準備を行えます。[それらが完了すれば](https://scqr.net/ja/blog/2023/01/27/podman-43-on-artix-linux-install/index.html)、仮想マシンを動かしてコンテナ管理を始められます ... ある程度までは。

しかし問題がいくつかは残っています。しかもプロセス制御やネットワークで問題になり得るものです。
本記事でそれらを解消する方法を記述します。

### 環境

- OS: Artix Linux (Arch Linux ベース) - [init システム](https://ja.wikipedia.org/wiki/Init) は [OpenRC](https://wiki.gentoo.org/wiki/OpenRC) を選択
- 仮想化: Podman [4.3.1](https://github.com/containers/podman/releases/tag/v4.3.1)

## 問題ごとの解決方法

\* `doas` ([OpenDoas](https://wiki.archlinux.org/title/Doas)) のところは代わりに `sudo` も使えます。

### `system migrate` が buildah が無いために警告

#### 問題の内容

[buildah](https://buildah.io/) は [Containers](https://github.com/containers) が提供する "OCI イメージのビルドを容易にするためのツール" です。
インストールされていない場合、`podman system migrate` が以下のワーニングを出力するでしょう:

```console
WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers
```

さらに後続の `podman` 操作でも同様のワーニングが出力されることがあるかもしれません。

#### 解決方法

buildah をインストールしましょう。pacman のおかげで楽にできます:

```console
$ doas pacman -Sy buildah
```

出力とやり取りは以下の通りでした:

```console
:: Synchronizing package databases...
(...)
resolving dependencies...
looking for conflicting packages...

Packages (2) skopeo-1.11.0-1  buildah-1.28.2-1

Total Download Size:   15.06 MiB
Total Installed Size:  52.21 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...
(...)
:: Processing package changes...
(...)
```

`podman system migrate` をもう一度実行してみましょう。エラーもワーニングも出ないのでは無いでしょうか。

### `gvproxy` が見付からないためにネットワークが制限される

#### 問題の内容

仮想マシンを起動した時に `gvproxy` が見付からずそのために "ホスト・ネットワークを起動できなかった" 旨が出力されたケースです。

```console
$ podman machine start
```

出力は以下の通りでした:

```console
Starting machine "podman-machine-default"
Error: unable to start host networking: "could not find \"gvproxy\" in one of [/usr/local/libexec/podman /usr/local/lib/podman /usr/libexec/podman /usr/lib/podman].  To resolve this error, set the helper_binaries_dir key in the `[engine]` section of containers.conf to the directory containing your helper binaries."
```

#### 解決方法

`gvproxy` は [gvisor-tap-vsock](https://github.com/containers/gvisor-tap-vsock) として Containers から [Github](https://github.com/) で公開されています。
最新バージョン (私の場合 0.5.0 でした) を [releases](https://github.com/containers/gvisor-tap-vsock/releases) からダウンロードします。Linux 向けのものは `gvproxy-linux` という名前です。

ローカル環境で、`gvproxy` とリネームします。そして Podman が補助バイナリとして扱える場所に配置します。具体的にはどこでしょうか ? 上のエラーメッセージ中に候補が記されていました。なおパーミッション設定も必要です。

```console
$ doas mv gvproxy-linux /usr/lib/podman/gvproxy

$ doas chown root:root /usr/lib/podman/gvproxy
$ doas chmod a+x /usr/lib/podman/gvproxy
```

ちなみにもしかすると pacman リポジトリや AUR でパッケージを見付けることもできるかもしれません。

### `timedatectl` が見付からないために `.ign` という vm 起動用ファイルがつくられない

#### 問題の内容

Podman の [`ignition_linux.go`](https://github.com/containers/podman/blob/52d5f367b144f755dd20b18d88c5f79bc6b0c3fe/pkg/machine/ignition_linux.go) にある `getLocalTimeZone` は [`timedatectl`](https://www.freedesktop.org/software/systemd/man/timedatectl.html) を実行します。これは systemd の一部です。そのため `podman machine init` は次のエラーで失敗しました:

```console
Extracting compressed file
Image resized.
Error: exec: "timedatectl": executable file not found in $PATH
```

そのため `.ign` というデフォルトのマシン向け起動用設定が作成されませんでした。

結果として `podman machine start` が次のエラーで失敗しました:

```console
Starting machine "podman-machine-default"
Waiting for VM ...
Error: qemu exited unexpectedly with exit code 1, stderr: qemu-system-x86_64: -fw_cfg name=opt/com.coreos/config,file=/home/(...)/.config/containers/podman/machine/qemu/podman-machine-default.ign: can't load /home/(...)/.config/containers/podman/machine/qemu/podman-machine-default.ign: Failed to open file “/home/(...)/.config/containers/podman/machine/qemu/podman-machine-default.ign”: No such file or directory
```

#### 解決方法

4.4 のリリースで [解消する予定](https://github.com/containers/podman/pull/17264) です。

実行ファイル `timedatectl` を $PATH に配置しましょう... 今のうちは、なんとかして、強引にでも 😅

私が採った方法は以下の通りです:

1. Cargo プロジェクトを作成して "timedatectl" と命名します。
2. 私のタイムゾーンを出力するだけの Rust コードを書きます。(実行入力があっても無視します。)    
    ```rust
    fn main() {
        println!("Asia/Tokyo");
    }
    ```
3. ビルドして `$PATH` に配置します。実際は `/usr/local/bin` に配置しました。

## おわりに

`podman machine init` が以下のように成功するはずです !!!

```console
Extracting compressed file
Image resized.
Machine init complete
To start your machine run:

	podman machine start

```

次に `podman machine start` を実行してみましょう。rootless モードで見事に起動するはずです 😊

```console
Starting machine "podman-machine-default"
Waiting for VM ...
Mounting volume... /home/(...):/home/(...)

This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command: 

	podman machine set --rootful

API forwarding listening on: /home/(...)/.local/share/containers/podman/machine/podman-machine-default/podman.sock
You can connect Docker API clients by setting DOCKER_HOST using the
following command in your terminal session:

	export DOCKER_HOST='unix:///home/(...)/.local/share/containers/podman/machine/podman-machine-default/podman.sock'

Machine "podman-machine-default" started successfully
```

掲載した解決方法のどれかが、あなたが Podman コンテナとポッドを快適に操作する一助となれば、幸いです。