M1 Mac + podmanで、podman machine startが失敗した場合の対処方法 (podman v5.0.0)


# 概要

今までpodman v4.xの時には自分のM1 Macではpodman machine startが失敗してほとんどpodmanが起動しませんでした。

周りにはそういう人はあまりいなかったので、おそらく自分のM1 Macの環境依存の問題の気もします。

(podmanを綺麗に入れ直したり、バージョンを変えたり、VMのCPU、メモリを変えたり、unset SSH_AUTO_SOCKをしてやり直したり、、、などネットにある色々なワークアラウンドを試しましたがなかなかうまくいきませんでした。。)

そんな中、少し前の2024年3月後半に、Podman v5.0.0が出ました。

- [Podman 5.0 has been released!](https://blog.podman.io/2024/03/podman-5-0-has-been-released/)
- [Podman / Releases](https://github.com/containers/podman/releases)


Podman v5.0.0からは、podman machineは、qemuではなく、Apple Hypervisor(applehv)がデフォルトになったり色々変わったようですので、気分新たに、再チャレンジしてみました。

結果としては、podman v5.0.0でも、今までと同じようにpodman machine startで失敗してしまいました。。

ですが、その後色々と試していたところ、ついにpodman machine startが成功するところまで持っていくことができたので、自分用のメモとして実施した手順を残しておきます。

(おそらく他の人には起こらないと思うのであまり参考にはならないと思います。)


# 環境

## 検証実施バージョン

2024/03/25時点の最新バージョンを使用しています。

- MacBook Air, M1 2020 (macOS Sonoma 14.4)
- podman v5.0.0

:::note info
(補足)検証時(2024/03/25)の最新バージョン
検証時のpodmanのlatestはv5.0.0でした。 
また、podman-desktopのlatestは1.8.0で、中に含まれているpodmanのバージョンは4.9.3でした。
今回はpodman v5.0.0を使ってみたかったので、単体のpodmanをインストーラで導入しました。
- [Podman / Releases](https://github.com/containers/podman/releases)
- [Podman Desktop 1.8 Release](https://podman-desktop.io/blog/podman-desktop-release-1.8)
:::

:::note info
(補足)2024/04/30の最新バージョン
2024/04/30現在は、podmanのlatestはv5.0.2です。
また、podman-desktopのlatestは1.9.1で、中に含まれているpodmanのバージョンはv5.0.1またはv4.9.4になった模様なのでpodman-desktopでもpodman v5.xが利用できると思います。
- [Podman / Releases](https://github.com/containers/podman/releases) 
- [Podman Desktop 1.9 Release](https://podman-desktop.io/blog/podman-desktop-release-1.9)
:::

# podmanの起動 (失敗)

## podmanのインストーラのダウンロード

まず、以下のサイトからpodmanのインストーラをダウンロードします。

- [podman](https://podman.io/)

画面の中央の「Download」から「Podman CLI for macOS」を選択すると、`podman-installer-macos-universal.pkg`がダウンロードされます。

![2024-03-26-20-58-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/8e284824-6e4a-7bdc-a726-3f6f34a5d1dc.png)


もしくは、以下のサイトからpodmanのインストーラをダウンロードすることもできます。
- [GitHub / conainer/podman](https://github.com/containers/podman/releases)

「v5.0.0」欄の下部にある「Assets」欄のところから、`podman-installer-macos-universal.pkg`をダウンロードします。

![2024-03-26-21-04-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/31106392-06aa-9512-1307-71f3f681bb26.png)


## podmanのインストール

ダウンロードした`podman-installer-macos-universal-v5.0.0.pkg`をダブルクリックします。

Podman 5.0.0のインストーラが起動します。「続ける」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/cf059474-65e4-7f89-b332-6e7b1978dcdb.png)


「使用許諾契約」画面で「続ける」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/37291411-a387-d188-4703-093c5e223870.png)


確認の画面が表示されるので、「同意する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/80807e24-d064-d339-4940-b7b00737a65a.png)


インストール先の選択画面でデフォルトのまま「次へ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/e5e8e2a5-8d3c-96ff-c6d1-566e121ec402.png)


確認画面が出るので、「インストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/4d854037-1dd8-3141-03a0-28353f159611.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/b668d9fc-b032-161d-462b-fc6bbdae545b.png)


インストールが完了するので「閉じる」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/650ffc67-a537-9392-0be1-46740f26048d.png)


インストーラをゴミ箱に入れるかを聞かれるので、「残す」か「ゴミ箱に入れる」のいずれかをクリックします。

(何回か入れ直したいので、「残す」を選択しました。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/1c0b74f0-e8e0-f938-d5c8-b1785fe31520.png)



podman v5.0.0が導入されていることを確認します。

```zsh
Mac: ~ % which podman
/opt/podman/bin/podman
Mac: ~ %
Mac: ~ % podman -v
podman version 5.0.0
Mac: ~ %
```

補足として以下のようなコマンドも導入されています。
```zsh
Mac: ~ % ls -l /opt/podman/bin
total 302288
-rwxr-xr-x  1 root  wheel  23179008  3 20 02:29 gvproxy
-rwxr-xr-x  1 root  wheel  87072688  3 20 02:29 podman
-rwxr-xr-x  1 root  wheel  10658976  3 20 02:29 podman-mac-helper
-rwxr-xr-x  1 root  wheel  33854288  3 20 02:29 vfkit
Mac: ~ %
```


## podman machineの初期化

`podman machine init`で初期設定を行います。

初回は仮想マシンのイメージのダウンロードが行われます。

```zsh
Mac: ~ % podman machine init
Looking up Podman Machine image at quay.io/podman/machine-os:5.0 to create VM
Getting image source signatures
Copying blob 0c74f573281e done   |
Copying config 44136fa355 done   |
Writing manifest to image destination
0c74f573281ebcefdded409a6384313afbbfd993bfc8e92d48b066b31ca941b0
Extracting compressed file: podman-machine-default-arm64.raw: done
Machine init complete
To start your machine run:

	podman machine start

Mac: ~ %
```

初期化が完了するとpodman machine listで仮想マシンがリストされます。

podman v5.0.0なので、デフォルトで`VM TYPE`が`applehv`になっています。

```zsh
Mac: ~ % podman machine list
NAME                     VM TYPE     CREATED         LAST UP     CPUS        MEMORY      DISK SIZE
podman-machine-default*  applehv     10 minutes ago  Never       4           2GiB        100GiB
Mac: ~ %
```

`podman system connection list`も確認しておきます。

デフォルトでは、VMにcoreユーザでSSH接続してpodman.sockに接続しているようです。
coreユーザなのでデフォルトではルートレスで動作しています。
SSH接続で使用するSSH秘密鍵は`$HOME/.local/share/containers/podman/machine`で、公開鍵は`machine.pub`ということがわかります。

```zsh
Mac: ~ % podman system connection list
Name                         URI                                                         Identity                                                   Default     ReadWrite
podman-machine-default       ssh://core@127.0.0.1:49354/run/user/501/podman/podman.sock  /Users/ayu/.local/share/containers/podman/machine/machine  true        true
podman-machine-default-root  ssh://root@127.0.0.1:49354/run/podman/podman.sock           /Users/ayu/.local/share/containers/podman/machine/machine  false       true
Mac: ~ %
```

(補足)podmanの仮想マシンの設定ファイルは`$HOME/.config/containers/podman/machine/applehv/podman-machine-default.json`にあり、中身を確認すると仮想マシンのイメージファイルは`$HOME/.local/share/containers/podman/machine/applehv/podman-machine-default-arm64.raw`にダウンロードされたことがわかります。)

```zsh
Mac: ~ % ls -l .local/share/containers/podman/machine/applehv/
total 7311008
drwxr-xr-x  3 ayu  staff            96  4 15 20:24 cache
-rw-------  1 ayu  staff        131072  4 15 21:02 efi-bl-podman-machine-default
-rw-r--r--  1 ayu  staff  107374182400  4 15 21:04 podman-machine-default-arm64.raw
srwxr-xr-x  1 ayu  staff             0  4 15 20:27 podman-machine-default-ignition.sock
Mac: ~ %
```


## podman machineの起動(失敗)

`podman machine start`で`podman machine`を起動します。

ここで、自分の環境ではSSH接続がtime outして`podman machine start`がSSHのエラーで終了します。

```zsh
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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

Error: machine did not transition into running state: ssh error: exit status 255
Mac: ~ %
```

# 問題判別(その1)

ここから問題判別をしていきます。

## 状態確認(仮想マシン)

VMの状態を確認します。

一応`Currently running`と表示されているのでVM自体は起動はしている模様です。

```zsh
Mac: ~ % podman machine list
NAME                     VM TYPE     CREATED         LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  applehv     22 minutes ago  Currently running  4           2GiB        100GiB
Mac: ~ %
```

`podman machine ssh`でVMにSSH接続してみます。
これを実行すると、SSH接続はできていない模様です。

```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
ssh: connect to host localhost port 49354: Connection refused
Mac: ~ %
```
```zsh
Mac: ~ % podman machine ssh --log-level debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Using Podman machine with `applehv` virtualization provider
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv is 52
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv is 57
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv/cache is 63
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman is 55
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json is 80
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
DEBU[0000] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= -t]
ssh: connect to host localhost port 49354: Connection refused
DEBU[0000] Called machine ssh.PersistentPostRunE(podman machine ssh --log-level debug)
DEBU[0000] Shutting down engines
Mac: ~ %
```

## podman machineの起動(--log-level debugオプション)

次にlog-levelをdebugにしてVMを起動したいので、一旦`podman machine stop`でVMを停止します。

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
```


今度は、log-levelをdebugにして`podman machine start`をしてみます。
`--log-level debug`オプションをつけると、vfkitで、VMのコンソールも表示されます。


podman machine startコマンドは前回と同様にSSH接続の失敗で終わりますが、VMのコンソールからはVM自体はちゃんと起動していることがわかります。

コマンド出力を見ていると、VMが起動してからも、何回かSSH接続を試みているもののfailedになっています。

(コマンド出力)
```zsh
Mac: ~ % podman machine start --log-level debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Using Podman machine with `applehv` virtualization provider
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv is 52
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv is 57
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv/cache is 63
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman is 55
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json is 80
Starting machine "podman-machine-default"
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv is 52
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv is 57
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv/cache is 63
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman is 55
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json is 80
DEBU[0000] connection refused: http://localhost:49521/vm/state
DEBU[0000] writing configuration file "/Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json"
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.pid is 67
DEBU[0000] socket length for /Users/ayu/.config/containers/podman/machine/applehv is 52
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv is 57
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/applehv/cache is 63
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman is 55
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock is 87
DEBU[0000] socket length for /Users/ayu/.local/share/containers/podman/machine/podman.sock is 61
DEBU[0000] {true 1500 map[forward-dest:[/run/user/501/podman/podman.sock] forward-identity:[/Users/ayu/.local/share/containers/podman/machine/machine] forward-sock:[/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock] forward-user:[core]] [] map[] /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.log /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.pid 49354}
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock is 91
DEBU[0000] gvproxy command-line: /opt/podman/bin/gvproxy -debug -mtu 1500 -ssh-port 49354 -listen-vfkit unixgram:///var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock -forward-sock /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock -forward-dest /run/user/501/podman/podman.sock -forward-user core -forward-identity /Users/ayu/.local/share/containers/podman/machine/machine -pid-file /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.pid -log-file /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.log
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock is 91
DEBU[0000] checking that "gvproxy" socket is ready
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.log is 82
DEBU[0000] socket length for /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.sock is 83
DEBU[0000] vfkit path is: /opt/podman/bin/vfkit
DEBU[0000] listening for ready on: /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.sock
DEBU[0000] waiting for ready notification
DEBU[0000] vfkit command-line: [/opt/podman/bin/vfkit --cpus 4 --memory 2048 --bootloader efi,variable-store=/Users/ayu/.local/share/containers/podman/machine/applehv/efi-bl-podman-machine-default,create --device virtio-blk,path=/Users/ayu/.local/share/containers/podman/machine/applehv/podman-machine-default-arm64.raw --device virtio-rng --device virtio-serial,logFilePath=/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.log --device virtio-vsock,port=1025,socketURL=/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.sock,listen --device virtio-net,unixSocketPath=/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock,mac=5a:94:ef:e4:0c:ee --device virtio-fs,sharedDir=/Users,mountTag=Users --device virtio-fs,sharedDir=/private,mountTag=private --device virtio-fs,sharedDir=/var/folders,mountTag=var-folders --restful-uri tcp://localhost:49521 --device virtio-gpu,width=800,height=600 --device virtio-input,pointing --device virtio-input,keyboard --gui]
DEBU[0007] ready ack received
DEBU[0007] ready notification received

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

DEBU[0007] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0009] SSH readiness check for machine failed: exit status 255
DEBU[0009] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0012] SSH readiness check for machine failed: exit status 255
DEBU[0013] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0016] SSH readiness check for machine failed: exit status 255
DEBU[0018] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0020] SSH readiness check for machine failed: exit status 255
DEBU[0024] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0027] SSH readiness check for machine failed: exit status 255
DEBU[0035] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0038] SSH readiness check for machine failed: exit status 255
DEBU[0038] writing configuration file "/Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json"
Error: machine did not transition into running state: ssh error: exit status 255
DEBU[0038] Shutting down engines
Mac: ~ %
```

(VMコンソール)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/3d9c61c5-b320-fdaf-ce91-ad20b04caaf5.png)



## ログの確認(podman machine startコマンドログ)

先ほどのコマンドログを見ると、最終的にはSSH鍵ペアを使って、coreユーザでSSH接続に失敗しています。

```log
DEBU[0035] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
DEBU[0038] SSH readiness check for machine failed: exit status 255
DEBU[0038] writing configuration file "/Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json"
Error: machine did not transition into running state: ssh error: exit status 255
DEBU[0038] Shutting down engines
```

## SSH鍵の設定の確認

SSH鍵は上述のコマンド出力や`podman system connection list`の出力から`$HOME/.local/share/containers/podman/machine/`以下にあります。

```zsh
Mac: ~ % ls -l /Users/ayu/.local/share/containers/podman/machine/
total 24
drwxr-xr-x  6 ayu  staff  192  5  1 13:33 applehv
-rw-------  1 ayu  staff  419  5  1 13:13 machine
-rw-r--r--  1 ayu  staff    0  5  1 13:33 machine-start.lock
-rw-r--r--  1 ayu  staff  110  5  1 13:13 machine.pub
lrwxr-xr-x  1 ayu  staff   87  5  1 13:33 podman.sock -> /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock
-rw-r--r--  1 ayu  staff    8  5  1 13:13 port-alloc.dat
-rw-r--r--  1 ayu  staff    0  5  1 13:13 port-alloc.lck
Mac: ~ %
```

SSH公開鍵の中身を見ておきます。

```zsh
Mac: ~ % cat /Users/ayu/.local/share/containers/podman/machine/machine.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPML1PKHOLF7y4wuCHOSFml3SM6X/YAsRt8c3QtjsNao ayu@Ayu-no-MacBook-Air.local
Mac: ~ %
```

こちらの公開鍵が、仮想マシンのcoreユーザとrootユーザのauthorized_keyファイルに登録されているかを確認します。

VMのコンソール上で確認すると、起動時の出力でもIgnitionに従って公開鍵が登録されていることが表示されています。

実際にSSH公開鍵の中身を見てみるとrootユーザ、coreユーザとも両方とも登録されています。

ですので、SSH公開鍵の登録自体は問題ないことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/1cf11431-e5aa-e8a4-e07a-8b701c970582.png)


## ログの確認(gvproxy.log)

次にネットワーク接続に関するログを見てみます。

先ほどの`podman machine start`のdebugログのSSH接続のログを見ると、localhostのポート番号49354に接続しようとしています。

```zsh
DEBU[0035] Executing: ssh [-i /Users/ayu/.local/share/containers/podman/machine/machine -p 49354 core@localhost -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o LogLevel=ERROR -o SetEnv=LC_ALL= true]
```

MACではMAC上ののpodman CLIから仮想マシンのpodman.sockに接続してコンテナの操作を行っているようです。
```zsh
Mac: ~ % podman system connection list
Name                         URI                                                         Identity                                                   Default     ReadWrite
podman-machine-default       ssh://core@127.0.0.1:49354/run/user/501/podman/podman.sock  /Users/ayu/.local/share/containers/podman/machine/machine  true        true
podman-machine-default-root  ssh://root@127.0.0.1:49354/run/podman/podman.sock           /Users/ayu/.local/share/containers/podman/machine/machine  false       true
Mac: ~ %
```

ちゃんと理解していないので正しいかはわかりませんが、コンテナでポート公開を行うとpodman machineが自動でポートフォワードを行いますが、それを`gvproxy`というモジュールが担っているようです。

直接関係あるかはわかりませんが、ネットワーク関連ということでこちらのログも見てみたいと思います。

gvproxyのログの場所は、先ほどの`podman machine start`のdebugの出力に書いていました。
```zsh
DEBU[0000] gvproxy command-line: /opt/podman/bin/gvproxy -debug -mtu 1500 -ssh-port 49354 -listen-vfkit unixgram:///var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock -forward-sock /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock -forward-dest /run/user/501/podman/podman.sock -forward-user core -forward-identity /Users/ayu/.local/share/containers/podman/machine/machine -pid-file /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.pid -log-file /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.log
```

gvproxyのログファイル`/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.log`を見てみます。

```zsh
Mac: ~ % cat /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/gvproxy.log
time="2024-05-01T13:45:21+09:00" level=info msg="gvproxy version v0.7.3"
(略)

(略)
time="2024-05-01T13:49:14+09:00" level=info msg="PACKET: 42 bytes\n- Layer 1 (14 bytes) = Ethernet\t{Contents=[..14..] Payload=[..28..] SrcMAC=5a:94:ef:e4:0c:dd DstMAC=ff:ff:ff:ff:ff:ff EthernetType=ARP Length=0}\n- Layer 2 (28 bytes) = ARP\t{Contents=[..28..] Payload=[] AddrType=Ethernet Protocol=IPv4 HwAddressSize=6 ProtAddressSize=4 Operation=1 SourceHwAddress=[..6..] SourceProtAddress=[192, 168, 127, 1] DstHwAddress=[..6..] DstProtAddress=[192, 168, 127, 2]}\n"
time="2024-05-01T13:49:15+09:00" level=debug msg="Waiting for sshd (1s)"
time="2024-05-01T13:49:16+09:00" level=debug msg="597 kB sent to the VM, 11 kB received from the VM\n"
time="2024-05-01T13:49:16+09:00" level=error msg="cannot receive packets from /Users/ayu/Library/Application Support/vfkit/net-2737-875599647.sock, disconnecting: cannot read size from socket: read unixgram /var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock: use of closed network connection"
time="2024-05-01T13:49:16+09:00" level=error msg="gvproxy exiting: setupProxy failed: timeout: connect tcp 192.168.127.2:22: no route to host"
```

ログを見ると、gvproxyがProxyの設定をしている際に、`192.168.127.2`のポート`22`で接続しようとして失敗しています。

また、`SourcePortAddress`というところが`192.168.127.1`、`DstPortAddress`が`192.168.127.2`というようなログもありました。


`podman machine start`時に`--log-level debug`をつけて起動しているので、VMのコンソールが表示されているので、IPアドレスの設定を確認します。

IPアドレスを確認すると、IPアドレスが設定されていないようでした。

![2024-05-01-14-23-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/3be1dc91-f294-522d-fe87-f970117680d3.png)


またconnectionも有効になっていないようでした。

![2024-05-01-14-24-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/c3efaef1-6e69-b227-487b-143671b8fae0.png)


ですので、connectionを有効にし、手動でIP Addressを`192.168.127.2/24`、Gatewayを`192.168.127.1`にしてみることにします。


## 手動でIPアドレスの設定

nmcliで見ると`Wired connection 1`というconnectionがあるので、nmtuiで設定を見てみます。

(nmcliで設定を修正しても良かったのですがキーボードの設定が英語で大変だったのでnmtuiでやってしまいます。)

![2024-05-01-14-28-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/7bac7580-43a4-caed-4d6d-c82ca509e771.png)


connectionが有効化されているかを見ます。「Activate a connection」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a228aaef-4fab-e694-a7f4-fb07c485e3ff.png)


Activateされていないようだったので、一度IPアドレスの設定などをした後にActivateしようと思雨ので、ここでは何もせず、Backを選択して最初の画面に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a3c1b0d7-95ea-c875-54a0-d94b0811859d.png)


最初の画面で「Edit a connection」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/826d3893-eb64-48b2-0b75-993a978866c9.png)


「Edit」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/b09e7083-1ebf-776b-4708-fd51a64d7b1d.png)


DHCPの設定になっているので本来IPアドレスは設定されると思うのですが、IPアドレスが取れていなかったので手動でIPアドレスを設定してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/67e72677-2c40-e3c5-7650-ded0e761d5ab.png)


IPv4 CONFIGURATIONを`Manual`にし、Addressを、`192.168.127.2/24`、Gatewayを`192.168.127.1`にしてみました。

Require IPv4 addressing for this connectionにもチェックを入れてみました。

設定ができたら「OK」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/95931569-32e8-8a78-8c15-bbef3c64b2f9.png)


「Back」で最初の画面に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/1cec5db0-7a3a-34ef-cb30-30cee7f650e3.png)


「Activate a connection」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/e873d466-0ad0-06bd-ba9d-835b6aa2fce0.png)


connectionが有効化されていないので、「Activate」を選択してEnterをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/b6b120fc-10bc-bc82-9ddc-04a6825b012a.png)


表示がDeactivateになり、有効化されたので、「Back」を選択してEnterをクリックし、元の画面に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/69724ddc-d0dd-e44b-922d-f37600112c80.png)


設定が終わったので、「OK」を選択してnmtuiを終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/4e874813-8eaa-4492-6b3d-5a71a2d45ecb.png)


今度は、connectionが有効になり、IPv4アドレスが設定されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/9e1adb13-744a-4bda-758d-8aedf7343e12.png)



## podman machineの起動(成功)

仮想マシンを再起動して`podman machine start`がうまくいくかみてみます。

podman machineを停止します。

(CoreOSがシャットダウンしてVMのコンソールも閉じられます。)

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
```

podman machineを再度起動します。

今度は起動に成功しました！！

```zsh
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
Mac: ~ %
```


podman machineも`Currently running`になっています。

```zsh
Mac: ~ % podman machine list
NAME                     VM TYPE     CREATED      LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  applehv     2 hours ago  Currently running  4           2GiB        100GiB
Mac: ~ %
```

podman imagesコマンドなどが表示されているので、podmanコマンドは正常に動作できているようでした。

```zsh
Mac: ~ % podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
Mac: ~ %
```

podman infoも正常に表示されました。

```zsh
Mac: ~ % podman info
host:
  arch: arm64
  buildahVersion: 1.35.3
  cgroupControllers:
  - cpu
  - io
  - memory
  - pids
  cgroupManager: systemd
  cgroupVersion: v2
  conmon:
    package: conmon-2.1.10-1.fc39.aarch64
    path: /usr/bin/conmon
    version: 'conmon version 2.1.10, commit: '
  cpuUtilization:
    idlePercent: 99.29
    systemPercent: 0.38
    userPercent: 0.33
  cpus: 4
  databaseBackend: sqlite
  distribution:
    distribution: fedora
    variant: coreos
    version: "39"
  eventLogger: journald
  freeLocks: 2048
  hostname: localhost.localdomain
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 100000
      size: 1000000
    uidmap:
    - container_id: 0
      host_id: 501
      size: 1
    - container_id: 1
      host_id: 100000
      size: 1000000
  kernel: 6.8.4-200.fc39.aarch64
  linkmode: dynamic
  logDriver: journald
  memFree: 1661968384
  memTotal: 2047471616
  networkBackend: netavark
  networkBackendInfo:
    backend: netavark
    dns:
      package: aardvark-dns-1.10.0-1.fc39.aarch64
      path: /usr/libexec/podman/aardvark-dns
      version: aardvark-dns 1.10.0
    package: netavark-1.10.3-1.fc39.aarch64
    path: /usr/libexec/podman/netavark
    version: netavark 1.10.3
  ociRuntime:
    name: crun
    package: crun-1.14.4-1.fc39.aarch64
    path: /usr/bin/crun
    version: |-
      crun version 1.14.4
      commit: a220ca661ce078f2c37b38c92e66cf66c012d9c1
      rundir: /run/user/501/crun
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
  os: linux
  pasta:
    executable: /usr/bin/pasta
    package: passt-0^20240405.g954589b-1.fc39.aarch64
    version: |
      pasta 0^20240405.g954589b-1.fc39.aarch64-pasta
      Copyright Red Hat
      GNU General Public License, version 2 or later
        <https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.
  remoteSocket:
    exists: true
    path: /run/user/501/podman/podman.sock
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: true
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: true
  serviceIsRemote: true
  slirp4netns:
    executable: /usr/bin/slirp4netns
    package: slirp4netns-1.2.2-1.fc39.aarch64
    version: |-
      slirp4netns version 1.2.2
      commit: 0ee2d87523e906518d34a6b423271e4826f71faf
      libslirp: 4.7.0
      SLIRP_CONFIG_VERSION_MAX: 4
      libseccomp: 2.5.3
  swapFree: 0
  swapTotal: 0
  uptime: 0h 3m 39.00s
  variant: v8
plugins:
  authorization: null
  log:
  - k8s-file
  - none
  - passthrough
  - journald
  network:
  - bridge
  - macvlan
  - ipvlan
  volume:
  - local
registries:
  search:
  - docker.io
store:
  configFile: /var/home/core/.config/containers/storage.conf
  containerStore:
    number: 0
    paused: 0
    running: 0
    stopped: 0
  graphDriverName: overlay
  graphOptions: {}
  graphRoot: /var/home/core/.local/share/containers/storage
  graphRootAllocated: 106769133568
  graphRootUsed: 3488686080
  graphStatus:
    Backing Filesystem: xfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Supports shifting: "false"
    Supports volatile: "true"
    Using metacopy: "false"
  imageCopyTmpDir: /var/tmp
  imageStore:
    number: 0
  runRoot: /run/user/501/containers
  transientStore: false
  volumePath: /var/home/core/.local/share/containers/storage/volumes
version:
  APIVersion: 5.0.2
  Built: 1713312000
  BuiltTime: Wed Apr 17 09:00:00 2024
  GitCommit: ""
  GoVersion: go1.21.9
  Os: linux
  OsArch: linux/arm64
  Version: 5.0.2

Mac: ~ %
```

## コンテナ起動確認(Hello World)(失敗)

実際にコンテナが起動できるかを確認します。

試しにHello Worldのコンテナを起動してみます。

[GitHub / containers/podman / Podman Hello](https://github.com/containers/podman?tab=readme-ov-file#podman-hello)


残念ながらまたエラーで失敗しました。。

```zsh
Mac: ~ % podman run --rm quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Error: initializing source docker://quay.io/podman/hello:latest: pinging container registry quay.io: Get "https://quay.io/v2/": dial tcp: lookup quay.io: Temporary failure in name resolution
Mac: ~ %
```


# 問題判別(その2)

## ログの確認(コンテナ起動)

先ほどの`podman run`のメッセージから、単純に`quay.io`の名前解決ができていない模様です。

VM内から名前解決ができているか確認します。


podmanを再起動して`--log-level debug`オプションでVMのコンソールから確認でも良いのですが、今は、SSH接続ができるようになったので、`podman machine ssh`でSSH接続して確認します。

![2024-05-01-15-35-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/63c8803f-c18a-d472-02bf-f0682ff06cc7.png)


```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Wed May  1 06:34:31 2024 from 192.168.127.1
core@localhost:~$
```


VMにcoreユーザでログインできたので、`quay.io`が名前解決されるかを確認すると、名前解決ができないことがわかります。

```zsh
core@localhost:~$ nslookup quay.io
Server:		127.0.0.53
Address:	127.0.0.53#53

** server can't find quay.io: SERVFAIL

core@localhost:~$
```


## 手動でDNS設定(8.8.8.8)

DNSサーバとして`8.8.8.8`を設定してみます。

nmtuiで、先ほどのIPアドレスの設定に加えて「DNS Servers」に`8.8.8.8`を加えます。

`podman machine ssh`だとcoreユーザでSSHログインしているので、設定を変更しようとすると権限が足りなくて設定できません。

(VMのコンソールでは、デフォルトではrootユーザでログインしているので気にする必要はありませんでしたが、今回はsudoが必要です。)

![2024-05-01-15-41-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/88d172a7-a604-8103-f075-86cc4ffd2a54.png)


ですので、podman machine sshで接続後のnmtuiはsudoをつけるか、rootユーザに切り替えて実行します。

![2024-05-01-15-45-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a9e22f6c-024e-a391-ce15-db18e5b36a88.png)


nmtuiで、先ほどのIPアドレスの設定に加えて「DNS Servers」に`8.8.8.8`を加えます。

![2024-05-01-15-47-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/4faa0a99-1cfe-7ed4-4ae6-453cab8b5e99.png)


設定が完了したら、再度podman machineを再起動します。

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
Mac: ~ %
```

名前解決ができているか確認すると、出来ていることがわかります。

```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Wed May  1 06:49:59 2024 from 192.168.127.1
core@localhost:~$
core@localhost:~$ nslookup quay.io
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	quay.io
Address: 54.144.224.137
Name:	quay.io
Address: 3.225.247.3
Name:	quay.io
Address: 44.212.212.54
Name:	quay.io
Address: 54.236.73.49
Name:	quay.io
Address: 34.206.210.7
Name:	quay.io
Address: 3.228.243.121
Name:	quay.io
Address: 2600:1f18:483:cf00:2de7:dc8f:3e59:2cac
Name:	quay.io
Address: 2600:1f18:483:cf02:101c:ba62:1cd3:96f4
Name:	quay.io
Address: 2600:1f18:483:cf02:101e:d938:90b4:8f32
Name:	quay.io
Address: 2600:1f18:483:cf01:f5a7:c7a4:6620:dbc
Name:	quay.io
Address: 2600:1f18:483:cf00:e91a:d8cb:1b23:812b
Name:	quay.io
Address: 2600:1f18:483:cf01:fccc:f69:54b:1247

core@localhost:~$
core@localhost:~$ exit
logout
Mac: ~ %
```

## コンテナ起動確認(Hello World)(成功)

再度Hello Worldを起動してみます。

今度は正常にquay.ioからコンテナイメージをpullして、コンテナを起動することができました！

```zsh
Mac: ~ % podman run --rm quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:5ea7ca68e6b64f513a82e9c9d619bd1a298cafb0ad21e07e5e776c826d112db5
Copying config sha256:78f4bb63a934181a0c721ba760726cf7c8b1c581cc62b1786043064e1f47f7df
Writing manifest to image destination
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org
Mac: ~ %
```

コンテナイメージもpull出来ていました。

```zsh
Mac: ~ % podman images
REPOSITORY            TAG         IMAGE ID      CREATED     SIZE
quay.io/podman/hello  latest      78f4bb63a934  3 days ago  550 kB
Mac: ~ %
```


## コンテナ起動確認(httpd)(失敗)

次に外部から接続するコンテナも起動してみます。

以下を参考にhttpdのコンテナを起動して、localhostの8080で接続できるかを確認します。

- [Podman / Getting Started](https://podman.io/get-started)
- [Podman / Documentation / Getting Started / Running a container](https://podman.io/docs#running-a-container)


これがまたErrorで失敗します。。。

メッセージを見ると`gateway.containers.internal`の名前解決がされていないというメッセージのようでした。

```zsh
Mac: ~ % podman run -dt -p 8080:80/tcp docker.io/library/httpd
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob sha256:bae159c85a0b3662b8e9d58344f7da1b84836a7338c8ddf6b88360cea400929f
Copying blob sha256:22d97f6a5d13532e867231d23d92620a81874d51a456196be50154eeb32edc08
Copying blob sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
Copying blob sha256:855b568ab02c3fee1362d51176f966517b1e03ca0c8efde55eddace90835f300
Copying blob sha256:c521cc2c4e8a439951003122cdab841fe1b1350db864e2cf9dea69298513f711
Copying blob sha256:98c8bced82bd1d3557a49d39ea03bb8090bf3abc8154ab65388d9f9728f3ce02
Copying config sha256:73acb239a8eb7a9ef5b6848a5b01bb26cc03d2262056705876bf7ac6ad781f02
Writing manifest to image destination
Error: Post "http://gateway.containers.internal/services/forwarder/expose": dial tcp: lookup gateway.containers.internal: no such host
Mac: ~ %
```

イメージ自体はpullできていますが、コンテナが起動していませんでした。

```zsh
Mac: ~ % podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
quay.io/podman/hello     latest      78f4bb63a934  3 days ago   550 kB
docker.io/library/httpd  latest      73acb239a8eb  3 weeks ago  181 MB
Mac: ~ %
Mac: ~ % podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
Mac: ~ %
Mac: ~ % podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS      PORTS                 NAMES
0c505c8d953d  docker.io/library/httpd:latest  httpd-foreground  3 minutes ago  Created     0.0.0.0:8080->80/tcp  epic_lumiere
Mac: ~ %
```

# 問題判別(その3)

## gvproxyの設定確認


先ほども出てきたようにちゃんと理解していないので正しいかはわかりませんが、コンテナでポート公開を行うとpodman machineが自動でポートフォワードを行いますが、それを`gvproxy`というモジュールが担っているようです。

:::note info
(参考)gvproxy
- [赤帽ブログ / 【podman machine】macOS上でPodmanを実行する新コマンドの紹介 / 自動ポートフォワード](https://rheb.hatenablog.com/entry/podman-machine#%E8%87%AA%E5%8B%95%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89)
- [Podman,CRI-O最新情報(2024年春)](https://speakerdeck.com/orimanabu/podman-cri-o-update-2024-02) p24
:::

以下がそのソースのようでした。

- [https://github.com/containers/gvisor-tap-vsock](https://github.com/containers/gvisor-tap-vsock)
- [https://github.com/containers/gvisor-tap-vsock / cmd/gvproxy/main.go](https://github.com/containers/gvisor-tap-vsock/blob/main/cmd/gvproxy/main.go)



まず、[https://github.com/containers/gvisor-tap-vsock](https://github.com/containers/gvisor-tap-vsock)の[DNS](https://github.com/containers/gvisor-tap-vsock?tab=readme-ov-file#dns)欄を見てみると、GatewayのアドレスでDNSの設定がされているようです。

それだけだとよくわからず、[https://github.com/containers/gvisor-tap-vsock / cmd/gvproxy/main.go](https://github.com/containers/gvisor-tap-vsock/blob/main/cmd/gvproxy/main.go)も見てみました。

以下が関連していそうな設定内容です。

main.go抜粋
```go
const (
	gatewayIP   = "192.168.127.1"
	sshHostPort = "192.168.127.2:22"
	hostIP      = "192.168.127.254"
	host        = "host"
	gateway     = "gateway"
)
```
```go
	config := types.Configuration{
		Debug:             debug,
		CaptureFile:       captureFile(),
		MTU:               mtu,
		Subnet:            "192.168.127.0/24",
		GatewayIP:         gatewayIP,
		GatewayMacAddress: "5a:94:ef:e4:0c:dd",
		DHCPStaticLeases: map[string]string{
			"192.168.127.2": "5a:94:ef:e4:0c:ee",
		},
		DNS: []types.Zone{
			{
				Name: "containers.internal.",
				Records: []types.Record{
					{
						Name: gateway,
						IP:   net.ParseIP(gatewayIP),
					},
					{
						Name: host,
						IP:   net.ParseIP(hostIP),
					},
				},
			},
			{
				Name: "docker.internal.",
				Records: []types.Record{
					{
						Name: gateway,
						IP:   net.ParseIP(gatewayIP),
					},
					{
						Name: host,
						IP:   net.ParseIP(hostIP),
					},
				},
			},
		},
		DNSSearchDomains: searchDomains(),
		Forwards: map[string]string{
			fmt.Sprintf("127.0.0.1:%d", sshPort): sshHostPort,
		},
		NAT: map[string]string{
			hostIP: "127.0.0.1",
		},
		GatewayVirtualIPs: []string{hostIP},
		VpnKitUUIDMacAddresses: map[string]string{
			"c3d68012-0208-11ea-9fd7-f2189899ab08": "5a:94:ef:e4:0c:ee",
		},
		Protocol: protocol,
	}
```



上述を見ると、まず、DHCPでMACアドレスに紐付けて`192.168.127.2`のIPアドレスがアサインされるようです。

ですので、先ほどのIPアドレスの設定は間違っていなさそうでした。
サブネットも`24`なのでこちらも間違っていないようでした。


また、DNSの設定では、二つのzoneが設定されており、以下の名前解決ができる必要があるようです。

これが先ほどの`podman run`をした際のエラーメッセージで出ていた`gateway.containers.internal`のエントリも含まれています。

| hostname                    | IP Address      |
|:----------------------------|:----------------|
| gateway.containers.internal | 192.168.127.1   |
| host.containers.internal    | 192.168.127.254 |
| gateway.docker.internal     | 192.168.127.1   |
| host.docker.internal        | 192.168.127.254 |



実際はdnsmasq？が起動して/etc/resolv.confで参照して名前解決されるようですが、ここがうまくいっていなかったようですので、手動で/etc/hostsにこのエントリーを設定してみました。


(補足)dnsmasqを手動で起動してみたけどうまくいきませんでした。(systemctl unmaskとかしたらもしかしたら起動したかもしれませんが...。)
```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Wed May  1 06:50:45 2024 from 192.168.127.1
core@localhost:~$
core@localhost:~$ sudo su -
root@localhost:~#
root@localhost:~# cat /etc/resolv.conf
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0 trust-ad
search .
root@localhost:~#
root@localhost:~# systemctl status dnsmasq.service
Warning: The unit file, source configuration file or drop-ins of dnsmasq.service changed on disk. Ru>
○ dnsmasq.service
     Loaded: masked (Reason: Unit dnsmasq.service is masked.)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
root@localhost:~#
root@localhost:~# systemctl start dnsmasq.service
Failed to start dnsmasq.service: Unit dnsmasq.service is masked.
root@localhost:~#
root@localhost:~# exit
logout
core@localhost:~$ exit
logout
Mac: ~ %
```

## 手動でhosts設定

本来はちゃんと設定されると思うので、普通はやる必要がない & やっちゃいけないと思いますが、上述の4つのエントリを手動でhostsに登録してみました。

(`/etc/hosts`に以下を追記)
```ini
192.168.127.1     gateway.containers.internal gateway.docker.internal
192.168.127.254   host.containers.internal host.docker.internal
```

```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Wed May  1 07:31:13 2024 from 192.168.127.1
core@localhost:~$
core@localhost:~$ cat /etc/hosts
# Loopback entries; do not change.
# For historical reasons, localhost precedes localhost.localdomain:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# See hosts(5) for proper format and other examples:
# 192.168.1.10 foo.mydomain.org foo
# 192.168.1.13 bar.mydomain.org bar
core@localhost:~$
core@localhost:~$ sudo vi /etc/hosts
core@localhost:~$
core@localhost:~$ cat /etc/hosts
# Loopback entries; do not change.
# For historical reasons, localhost precedes localhost.localdomain:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# See hosts(5) for proper format and other examples:
# 192.168.1.10 foo.mydomain.org foo
# 192.168.1.13 bar.mydomain.org bar

192.168.127.1     gateway.containers.internal gateway.docker.internal
192.168.127.254   host.containers.internal host.docker.internal
core@localhost:~$
core@localhost:~$ exit
logout
Mac: ~ %
```

設定が完了したら、再度podman machineを再起動します。

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
Mac: ~ %
```

名前解決ができていることを確認します。

```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Wed May  1 07:35:41 2024 from 192.168.127.1
core@localhost:~$
core@localhost:~$ nslookup gateway.containers.internal
Server:		127.0.0.53
Address:	127.0.0.53#53

Name:	gateway.containers.internal
Address: 192.168.127.1

core@localhost:~$
(以下同様)
```


## コンテナ起動確認(httpd)(成功)


再度httpdのコンテナを起動してみます。

今度は正常に起動することができました！

```zsh
Mac: ~ % podman run -dt -p 8080:80/tcp docker.io/library/httpd
e6babd61d12cb451526a97536495df4e844b8a95bcceef0b6e8ddd91fb6e5201
Mac: ~ %
Mac: ~ % podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS        PORTS                 NAMES
e6babd61d12c  docker.io/library/httpd:latest  httpd-foreground  5 seconds ago  Up 5 seconds  0.0.0.0:8080->80/tcp  nifty_swanson
Mac: ~ %
```

ブラウザから`http://localhost:8080`のURLで画面がちゃんと表示されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/58c3a014-162c-0a6a-5668-2c4f49cf4e4e.png)



以上


# 全部を反映した手順

ここまで色々と試行錯誤しながらやってしまったので、結局何が必要だったのかが、わかりづらくなったので、必要な手順を整理してもう一度やってみました。


## (補足)(一からやり直す前に一旦綺麗にアンインストール)

綺麗にアンインストールした状態から、再度やってみたかったので、一旦全部アンインストールしました。

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
Mac: ~ % podman machine rm
The following files will be deleted:


/Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json
/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.sock
/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-gvproxy.sock
/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default-api.sock
/var/folders/z3/ggmm70591934m0b07r4rspkw0000gn/T/podman/podman-machine-default.log
Are you sure you want to continue? [y/N] y
Mac: ~ %
Mac: ~ % ls -l .config/containers
total 8
drwxr-xr-x  3 ayu  staff  96  5  1 13:13 podman
-rw-r--r--  1 ayu  staff  28  5  1 16:45 podman-connections.json
-rw-r--r--  1 ayu  staff   0  5  1 13:17 podman-connections.json.lock
Mac: ~ %
Mac: ~ % rm -rf .config/containers
Mac: ~ %
Mac: ~ % ls -l .local/share/containers
total 0
drwx------  2 ayu  staff  64  5  1 13:13 cache
drwxr-xr-x  3 ayu  staff  96  5  1 13:13 podman
Mac: ~ %
Mac: ~ % rm -rf .local/share/containers
Mac: ~ %
Mac: ~ % which podman
/opt/podman/bin/podman
Mac: ~ %
Mac: ~ % ls -l /opt/podman/
total 0
drwxr-xr-x  6 root  wheel  192  3 20 02:29 bin
Mac: ~ %
Mac: ~ % ls -l /opt/podman/bin
total 302288
-rwxr-xr-x  1 root  wheel  23179008  3 20 02:29 gvproxy
-rwxr-xr-x  1 root  wheel  87072688  3 20 02:29 podman
-rwxr-xr-x  1 root  wheel  10658976  3 20 02:29 podman-mac-helper
-rwxr-xr-x  1 root  wheel  33854288  3 20 02:29 vfkit
Mac: ~ %
Mac: ~ % sudo rm -rf /opt/podman/
Password:
Mac: ~ %
```



## podmanのインストール

インストールは最初の[podmanのインストール](#podmanのインストール)でやった手順と同じです。

## podman machineの初期化

podman machineの初期化も[podman-machineの初期化](#podman-machineの初期化)でやった手順と同じです。

```zsh
Mac: ~ % podman machine init
Looking up Podman Machine image at quay.io/podman/machine-os:5.0 to create VM
Getting image source signatures
Copying blob 0c74f573281e done   |
Copying config 44136fa355 done   |
Writing manifest to image destination
0c74f573281ebcefdded409a6384313afbbfd993bfc8e92d48b066b31ca941b0
Extracting compressed file: podman-machine-default-arm64.raw: done
Machine init complete
To start your machine run:

	podman machine start

Mac: ~ %
```

## podman machineの起動(失敗)

`podman machine start`で`podman machine`を起動します。

ここで何もエラーが出なければ、あとは特に何もする必要がありません。

もし以下のようなSSH接続のエラーが出たら次のステップのようなことをやってみます。

```zsh
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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

Error: machine did not transition into running state: ssh error: exit status 255
Mac: ~ %
```

## podman machineの起動(--log-level debugオプション)

`--log-level debug`オプションをつけてpodman machineを起動します。
SSHのエラーで失敗します。

```zsh
Mac: ~ % podman machine start --log-level debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Using Podman machine with `applehv` virtualization provider

(略)

DEBU[0038] SSH readiness check for machine failed: exit status 255
DEBU[0038] writing configuration file "/Users/ayu/.config/containers/podman/machine/applehv/podman-machine-default.json"
Error: machine did not transition into running state: ssh error: exit status 255
DEBU[0038] Shutting down engines
Mac: ~ %
```

## IPアドレス、DNSサーバ、hostsの手動設定

表示されたvfkitのVMのコンソールでnmtuiでIPアドレスとDNSサーバの設定をします。

![2024-05-01-17-14-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/e0cf5e24-7226-5ae3-5d60-cbf114cb1bce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/d8180ca8-3657-baab-5f6b-fd9e62c2b461.png)


Activate a connectionのメニューで該当のconnectionをActivateします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/2d357bee-a946-3dcb-f9df-83dfd9d6f676.png)


/etc/hostsはこのままVMのコンソールで設定しても良いのですが、podman machine sshできるようになってから修正したほうがコピペできるので簡単と思います。

そのため、一旦podman machineを再起動します。

```zsh
Mac: ~ % podman stop
Error: you must provide at least one name or id
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
Mac: ~ %
```

正常に起動したのでpodman machine ssh接続をして/etc/hostsを修正します。

```zsh
Mac: ~ % podman machine ssh
Connecting to vm podman-machine-default. To close connection, use `~.` or `exit`
Fedora CoreOS 39.20240407.2.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

core@localhost:~$
core@localhost:~$ cat /etc/hosts
# Loopback entries; do not change.
# For historical reasons, localhost precedes localhost.localdomain:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# See hosts(5) for proper format and other examples:
# 192.168.1.10 foo.mydomain.org foo
# 192.168.1.13 bar.mydomain.org bar
core@localhost:~$
core@localhost:~$ sudo vi /etc/hosts
core@localhost:~$ cat /etc/hosts
# Loopback entries; do not change.
# For historical reasons, localhost precedes localhost.localdomain:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# See hosts(5) for proper format and other examples:
# 192.168.1.10 foo.mydomain.org foo
# 192.168.1.13 bar.mydomain.org bar

192.168.127.1     gateway.containers.internal gateway.docker.internal
192.168.127.254   host.containers.internal host.docker.internal
core@localhost:~$
core@localhost:~$ exit
logout
Mac: ~ %
```

podman machineを再起動します。

```zsh
Mac: ~ % podman machine stop
Machine "podman-machine-default" stopped successfully
Mac: ~ %
Mac: ~ % podman machine start
Starting machine "podman-machine-default"

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: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
Mac: ~ %
```

## コンテナ起動確認(Hello World)

Hello Worldのコンテナが正常に起動しました。

```zsh
Mac: ~ % podman run --rm quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:5ea7ca68e6b64f513a82e9c9d619bd1a298cafb0ad21e07e5e776c826d112db5
Copying config sha256:78f4bb63a934181a0c721ba760726cf7c8b1c581cc62b1786043064e1f47f7df
Writing manifest to image destination
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org
Mac: ~ %
```

## コンテナ起動確認(httpd)

httpdのコンテナも正常に起動しました。

```zsh
Mac: ~ % podman run -dt -p 8080:80/tcp docker.io/library/httpd
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob sha256:bae159c85a0b3662b8e9d58344f7da1b84836a7338c8ddf6b88360cea400929f
Copying blob sha256:855b568ab02c3fee1362d51176f966517b1e03ca0c8efde55eddace90835f300
Copying blob sha256:22d97f6a5d13532e867231d23d92620a81874d51a456196be50154eeb32edc08
Copying blob sha256:c521cc2c4e8a439951003122cdab841fe1b1350db864e2cf9dea69298513f711
Copying blob sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
Copying blob sha256:98c8bced82bd1d3557a49d39ea03bb8090bf3abc8154ab65388d9f9728f3ce02
Copying config sha256:73acb239a8eb7a9ef5b6848a5b01bb26cc03d2262056705876bf7ac6ad781f02
Writing manifest to image destination
8c2159ec2a7402203c811cfc5f1fa33f8497d7a387cc1b08f1596cbfb0f4ab7f
Mac: ~ %
Mac: ~ % podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS         PORTS                 NAMES
8c2159ec2a74  docker.io/library/httpd:latest  httpd-foreground  42 seconds ago  Up 43 seconds  0.0.0.0:8080->80/tcp  elated_shannon
Mac: ~ %
```

ブラウザから8080のポートでアクセスもできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/5649fc46-1011-17d9-b969-6f91495b10d2.png)



# まとめ

M1 MacBookで、podman v5.0.0が起動しなかったので、とりあえず自分の環境で起動させるまでの手順をメモで残してみました。

今回の環境は以下です。
- MacBook Air, M1 2020 (macOS Sonoma 14.4)
- podman v5.0.0

そもそも他のM1 Macの人は普通にpodmanは何もしなくても使えてると思いますし、自分の環境のせいかなとと思います。

また、今後新しいバージョンにアップデートして試すと、きっと直ってたりするのではと思います。

(2024/05/01の最新: podman v5.0.2、macOS 14.1.1)


とりあえず、今回の手順は絶対正しくないと思いますが、なんとなくMacでのpodman v5.0.0の仕組みが少しわかったような気がしたので、自分用のメモとして手順を残しておきました。

以上