Armadilloフォーラム

コンテナが起動できない

m.yoshida

2024年4月8日 15時28分

お世話になります。
起動していたコンテナを停止し再度起動させようとしましたが、下記エラーで起動しません。

# podman start my_contna_pv
[conmon:e]: Failed to write conmon pidfile: Failed to write file “/run/containers/storage/overlay-containers/274678c10d63cf4de4cd4bc735a8b3851220f397d1283467537935260b6ee42a/userdata/conmon.pid.VLH6L2”: write() failed: No space left on device No space left on device
Error: unable to start container "274678c10d63cf4de4cd4bc735a8b3851220f397d1283467537935260b6ee42a": exit status 1

デバイスの容量かとおもいますが、原因と対策などありましたら、ご教示願います。
現在の容量は下記になります

~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               271.1M    132.6M    119.5M  53% /live/rootfs
devtmpfs                 10.0M         0     10.0M   0% /dev
tmpfs                    99.2M     99.2M     12.0K 100% /run
shm                     248.0M     52.0K    247.9M   0% /dev/shm
/dev/mmcblk0gp1           7.9M      1.0K      7.9M   0% /var/at-log
/dev/mmcblk0p3           41.8M    432.0K     37.9M   1% /var/log
tmpfs                   248.0M         0    248.0M   0% /tmp
/dev/mmcblk0p5            2.5G    375.7M      1.7G  18% /var/lib/containers/storage_readonly
/dev/mmcblk0p5            2.5G    375.7M      1.7G  18% /var/app/rollback/volumes
/dev/mmcblk0p5            2.5G    375.7M      1.7G  18% /var/app/volumes
/dev/mmcblk0p5            2.5G    375.7M      1.7G  18% /var/tmp
none                    248.0M     44.0K    247.9M   0% /live
none                    248.0M     44.0K    247.9M   0% /
tmpfs                    99.2M     99.2M     12.0K 100% /run/netns
コメント

at_dominique.m…

2024年4月8日 15時55分

m.yoshidaさん

お世話になっています、
マルティネです。

> 起動していたコンテナを停止し再度起動させようとしましたが、下記エラーで起動しません。
> デバイスの容量かとおもいますが、原因と対策などありましたら、ご教示願います。

デフォルトではコンテナを起動する際にコンテナの書込みしているデーターを含めて podman の一時的なデーターが全て /run の(狭い)tmpfs に書き込まれますので、/run が full な状態だとこういうエラーになります。

podman stop」と「podman start」コマンドでもコンテナの一時的なデーターが削除されないので、とても紛らわしいですが綺麗な状態でコンテナを再起動したい場合は「podman_start my_contna_pv」で再起動させてください(/etc/atmark/containers/my_contna_pv.conf が存在する想定です、ない場合は podman rm して作り直すしかないです)。

podman ps -a」で他のコンテナがまだ存在している場合に削除するとその分の容量が戻りますので、不要なコンテナも削除してください。

コンテナでデーターを保存する必要がある場合にボリューム(/var/app/volumes か /var/app/rollback/volumes) をコンテナにマウントしてそこで書込みするとその制限の問題が解決できます。
/run の 100MB がどうしても足りない場合(テストのためにパッケージを一時的にインストールする場合など)に一旦コンテナを全て停止してから「abos-ctrl podman-storage --disk」で eMMC で保存されるように設定できますが、その設定は運用で使うと不具合が発生するがありますのでデフォルトの tmpfs モードで開発できる場合はそのまま開発することを推奨しています。

よろしくお願いします。

m.yoshida

2024年4月8日 16時10分

マルティネさん

> デフォルトではコンテナを起動する際にコンテナの書込みしているデーターを含めて podman の一時的なデーターが全て /run の(狭い)tmpfs に書き込まれますので、/run が full な状態だとこういうエラーになります。
>
> 「podman stop」と「podman start」コマンドでもコンテナの一時的なデーターが削除されないので、とても紛らわしいですが綺麗な状態でコンテナを再起動したい場合は「podman_start my_contna_pv」で再起動させてください(/etc/atmark/containers/my_contna_pv.conf が存在する想定です、ない場合は podman rm して作り直すしかないです)。
>
> 「podman ps -a」で他のコンテナがまだ存在している場合に削除するとその分の容量が戻りますので、不要なコンテナも削除してください。
>
> コンテナでデーターを保存する必要がある場合にボリューム(/var/app/volumes か /var/app/rollback/volumes) をコンテナにマウントしてそこで書込みするとその制限の問題が解決できます。
> /run の 100MB がどうしても足りない場合(テストのためにパッケージを一時的にインストールする場合など)に一旦コンテナを全て停止してから「abos-ctrl podman-storage --disk」で eMMC で保存されるように設定できますが、その設定は運用で使うと不具合が発生するがありますのでデフォルトの tmpfs モードで開発できる場合はそのまま開発することを推奨しています。
>

早速のご回答ありございます。
上記の対応起動すること確認しました。
またこのような状態にならないために もう少し教えてください。
>podman の一時的なデーターが全て
これはどんなものが該当されますか?(sysログとうも?)
記載している場所ありましたら、お願いします。

運用する上では、tmpfs モードで開発など行っていきたいと思ってます。
そこでなのですが、一時的に/run の 100MB 以上にならない対策する方法ありますでしょうか?
参考で構いません。紹介お願いします。

at_dominique.m…

2024年4月8日 17時54分

マルティネです。

> これはどんなものが該当されますか?(sysログとうも?)
> 記載している場所ありましたら、お願いします。

podman のコンテナ管理に必要な情報 (~100KB + 100KB/コンテナ) 以外は以下のデータが /run に保存されています:
- コンテナの標準出力の最後の 1MB (コンフィグの set_log_max_size で変更できます)。古いログが削除されますので一つのコンテナは 1MB 以上を消費しません。
- コンテナの「/」パーティションの書込みデータ。
コンテナの / ディレクトリは overlayfs なので、読むだけのであれば直接に eMMC からデータを読めますが、ログも含めて書いているデータは /run に保存するしかないです。

> 運用する上では、tmpfs モードで開発など行っていきたいと思ってます。
> そこでなのですが、一時的に/run の 100MB 以上にならない対策する方法ありますでしょうか?

m.yoshidaさんは systemd を起動していた記憶がありますので、ログは journald で保存されていると思いますが、その場合はデフォルトで全ての容量を消費しないと設定されているはずです(/etc/systemd/journald.conf で変更できます)。
syslog も使用している場合は別で設定が必要です

ログについてはいくつかの考えがあります:
* (systemd 等を使わない場合はログを全て標準出力にするだけで、podman のサイズ制限に任せて、必要な場合に最新のログを「podman logs」で表示します。systemd の場合は journald の無効化は難しいので参考だけに残します。)
* (同じく、systemd がない場合に syslog を使う場合は Armadillo側の /dev/log をコンテナにマウントすることで、ログを armadillo の /var/log に保存できます。armadillo の syslog は 2*4MB までディスクに保存します。)
* ログを journald だけで管理して、journald のストレージの容量処理に任します。必要な場合に SystemMaxUse= などで制限を調整できます。
* /var/log を「add_volumes /var/app/volumes/log:/var/log」で eMMC からマウントしてログをディスクに保存します。その場合も、logrotate や最大サイズの設定が必要です。

ログ以外の書込みもある可能性がある場合(や安全のために禁じたい場合)はコンテナのコンフィグファイルに「set_readonly true」で tmpfs の領域を使用不可能に設定できます。
その場合はログなどを必ずボリュームに保存する必要もありますし、アプリケーションの /tmp もなくなりますのでおそらくいくつかの調整が必要です(例えば postgres の場合に複雑な処理が必要な場合に /tmp に一時的なデータを保存しますので、そういう書込みもできなくなります)

そこは対応しにくい場合もありますので、コンテナを起動してしばらく経ってから書き込まれたデータを確認すればいいと考えています。
例えば、以下の my_container で 10MB のログを書いていて、それ以外はほぼ何も残していませんので正常な例です:

armadillo:~# podman mount my_container
/run/containers/storage_root/overlay/4064baa2f484cf9983a32a2d94a6dfac2398739e34a5c280848029d5308f12ad/merged
armadillo:~# cd $(podman mount my_container)/../diff
armadillo:/.../diff# du -hs *
0	etc
4.0K	root
0	run
0	tmp
9.7M	var

よろしくお願いします。

m.yoshida

2024年4月9日 11時09分

マルティネさん

ご丁寧な回答ありがとうございます。
一旦容量圧迫してそうなsyslogをとめてみて、検証してみます。
syslogが原因であれば、
以下まずは、2点試してみます
journald のストレージの容量処理の SystemMaxUse=設定
add_volumes /var/app/volumes/log:/var/log設定

> m.yoshidaさんは systemd を起動していた記憶がありますので、ログは journald で保存されていると思いますが、その場合はデフォルトで全ての容量を消費しないと設定されているはずです(/etc/systemd/journald.conf で変更できます)。
> syslog も使用している場合は別で設定が必要です
>
> ログについてはいくつかの考えがあります:
> * (systemd 等を使わない場合はログを全て標準出力にするだけで、podman のサイズ制限に任せて、必要な場合に最新のログを「podman logs」で表示します。systemd の場合は journald の無効化は難しいので参考だけに残します。)
> * (同じく、systemd がない場合に syslog を使う場合は Armadillo側の /dev/log をコンテナにマウントすることで、ログを armadillo の /var/log に保存できます。armadillo の syslog は 2*4MB までディスクに保存します。)
> * ログを journald だけで管理して、journald のストレージの容量処理に任します。必要な場合に SystemMaxUse= などで制限を調整できます。
> * /var/log を「add_volumes /var/app/volumes/log:/var/log」で eMMC からマウントしてログをディスクに保存します。その場合も、logrotate や最大サイズの設定が必要です。
>
>
> ログ以外の書込みもある可能性がある場合(や安全のために禁じたい場合)はコンテナのコンフィグファイルに「set_readonly true」で tmpfs の領域を使用不可能に設定できます。
> その場合はログなどを必ずボリュームに保存する必要もありますし、アプリケーションの /tmp もなくなりますのでおそらくいくつかの調整が必要です(例えば postgres の場合に複雑な処理が必要な場合に /tmp に一時的なデータを保存しますので、そういう書込みもできなくなります)
>
> そこは対応しにくい場合もありますので、コンテナを起動してしばらく経ってから書き込まれたデータを確認すればいいと考えています。
> 例えば、以下の my_container で 10MB のログを書いていて、それ以外はほぼ何も残していませんので正常な例です:
>

> armadillo:~# podman mount my_container
> /run/containers/storage_root/overlay/4064baa2f484cf9983a32a2d94a6dfac2398739e34a5c280848029d5308f12ad/merged
> armadillo:~# cd $(podman mount my_container)/../diff
> armadillo:/.../diff# du -hs *
> 0	etc
> 4.0K	root
> 0	run
> 0	tmp
> 9.7M	var
> 

>
> よろしくお願いします。