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
コメント
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 モードで開発できる場合はそのまま開発することを推奨しています。
>
早速のご回答ありございます。
上記の対応起動すること確認しました。
またこのような状態にならないために もう少し教えてください。
>podman の一時的なデーターが全て
これはどんなものが該当されますか?(sysログとうも?)
記載している場所ありましたら、お願いします。
運用する上では、tmpfs モードで開発など行っていきたいと思ってます。
そこでなのですが、一時的に/run の 100MB 以上にならない対策する方法ありますでしょうか?
参考で構いません。紹介お願いします。
at_dominique.m…
マルティネです。
> これはどんなものが該当されますか?(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
マルティネさん
ご丁寧な回答ありがとうございます。
一旦容量圧迫してそうな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 >
>
> よろしくお願いします。
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 モードで開発できる場合はそのまま開発することを推奨しています。
よろしくお願いします。