Armadilloフォーラム

コンテナが操作を受け付けない

toshiki814

2022年4月21日 16時45分

お世話になっております。金田です。

コンテナにファイルを転送していたところ、容量がMAXになってしまったのか、途中でエラーを吐きました。仕方なくコンテナを起動して中のファイルを消そうとしましたが、

podman start コンテナ名
Error: write /var/lib/containers/storage/overlay/metacopy-check373432141/l1/.tmp-f301455944: no space left on device

となってしまい、コンテナを開始できなくなってしまいました。コンテナ自体を消去生としても、

podman rm コンテナ名
Error: write /var/lib/containers/storage/overlay/metacopy-check373432141/l1/.tmp-f301455944: no space left on device

となってしまい、同様のエラーが発生してしまいます。

コンテナ内の./tmpフォルダにあるファイルを消去すれば解決しそうなのですが、方法が分かる方いましたら、助言いただけるとありがたいです。

以下参考

armadillo:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       281M  223M   39M  86% /
devtmpfs         10M     0   10M   0% /dev
tmpfs           333M  840K  332M   1% /run
shm             831M   56K  831M   1% /dev/shm
cgroup_root      10M     0   10M   0% /sys/fs/cgroup
none            831M   56K  831M   1% /etc
none            831M   56K  831M   1% /var
none            831M   56K  831M   1% /root
none            831M   56K  831M   1% /home
tmpfs           831M     0  831M   0% /tmp
/dev/mmcblk2p3   42M  412K   38M   2% /var/log
/dev/mmcblk2p5  6.5G  6.4G     0 100% /var/lib/containers/storage_readonly
/dev/mmcblk2p5  6.5G  6.4G     0 100% /var/app/rollback/volumes
/dev/mmcblk2p5  6.5G  6.4G     0 100% /var/app/volumes
/dev/mmcblk2p5  6.5G  6.4G     0 100% /var/tmp
/dev/mmcblk2p5  6.5G  6.4G     0 100% /var/lib/containers/storage
/dev/mmcblk2p4   24M   24M     0 100% /opt/firmware

何卒よろしくお願いいたします。

コメント

at_dominique.m…

2022年4月21日 17時32分

金田さん、
お世話になっています、アットマークテクノのマルティネです。

> podman rm コンテナ名
> Error: write /var/lib/containers/storage/overlay/metacopy-check373432141/l1/.tmp-f301455944: no space left on device

app のファイルシステムに btrfs を使っていて、特集な仕様でファイルを消すとしても削除の命令を書き込むスペースが必要です。

その仕様で電源落とす時に壊れにくくなりますが、100%になると厄介ですね。
本来であれば「GlobalReserve」の予約で何とかなるはずですが…

対応がいくつかあって、いずれマニュアルに載せないといけないと思いますが、とりあえず状況確認をお願いいただけますか?
以下のコマンドの出力をこちらに張っていただけると助かります。balanceのコマンドで失敗しても大丈夫です。

btrfs fi usage /var/tmp
btrfs balance start -dusage=0 -musage=0 /var/tmp
btrfs balance start -dusage=10 -musage=10 /var/tmp

この時点で、balanceが何か効果があった場合にファイルを削除できるようになったと思いますが、恐らく何もできない状態のままです。
10でエラーが出た場合に一つずつ下げて、10で何もしていない場合(「had to relocate 0 out of」メッセージ)に一つずつ上げることでいずれ削除できるようになるかエラーします。
その一番小さい数字でもエラーする場合に、一時的に容量を上げて、ファイルを削除してから綺麗に容量をまた外すことで解決できますが、説明がながくなりますのでとりあえずbalanceだけを試してみましょう。

よろしくお願いします。

マルティネ 様

ご返信ありがとうございます。
状況確認として、コマンド出力を添付いたします。

 
btrfs fi usage /var/tmp                                            
Overall:                                                                        
    Device size:                   6.46GiB                                      
    Device allocated:              6.46GiB                                      
    Device unallocated:            1.04MiB                                      
    Device missing:                  0.00B                                      
    Used:                          6.32GiB                                      
    Free (estimated):                0.00B      (min: 0.00B)                    
    Free (statfs, df):               0.00B                                      
    Data ratio:                       1.00                                      
    Metadata ratio:                   2.00                                      
    Global reserve:               20.83MiB      (used: 0.00B)                   
    Multiple profiles:                  no                                      
 
Data,single: Size:5.93GiB, Used:5.93GiB (100.00%)                               
   /dev/mmcblk2p5          5.93GiB                                              
 
Metadata,DUP: Size:267.44MiB, Used:200.38MiB (74.92%)                           
   /dev/mmcblk2p5        534.88MiB                                              
 
System,DUP: Size:8.00MiB, Used:16.00KiB (0.20%)                                 
   /dev/mmcblk2p5         16.00MiB                                              
 
Unallocated:                                                                    
   /dev/mmcblk2p5          1.04MiB 
 
 
 
btrfs balance start -dusage=0 -musage=0 /var/tmp                   
[  208.449221] BTRFS info (device mmcblk2p5): balance: start -dusage=0 -musage=0
[  208.457297] BTRFS info (device mmcblk2p5): balance: ended with status: 0     
Done, had to relocate 0 out of 15 chunks  
 
 
 
btrfs balance start -dusage=10 -musage=10 /var/tmp                 
[  260.496556] BTRFS info (device mmcblk2p5): balance: start -dusage=10 -musage0
[  260.505110] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  260.528030] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  260.534847] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail         

また、値を9~1へ変更した際の出力も添付いたします。

armadillo:~# btrfs balance start -dusage=9 -musage=9 /var/tmp                   
[  547.506403] BTRFS info (device mmcblk2p5): balance: start -dusage=9 -musage=9
[  547.514645] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  547.542968] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  547.549778] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=8 -musage=8 /var/tmp                   
[  558.223337] BTRFS info (device mmcblk2p5): balance: start -dusage=8 -musage=8
[  558.231568] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  558.257886] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  558.264756] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=7 -musage=7 /var/tmp                   
[  566.356382] BTRFS info (device mmcblk2p5): balance: start -dusage=7 -musage=7
[  566.364602] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  566.396448] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  566.403312] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=6 -musage=6 /var/tmp                   
[  576.708956] BTRFS info (device mmcblk2p5): balance: start -dusage=6 -musage=6
[  576.717257] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  576.746776] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  576.753591] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=5 -musage=5 /var/tmp                   
[  588.224155] BTRFS info (device mmcblk2p5): balance: start -dusage=5 -musage=5
[  588.232434] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  588.268429] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  588.275299] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=4 -musage=4 /var/tmp                   
[  597.938506] BTRFS info (device mmcblk2p5): balance: start -dusage=4 -musage=4
[  597.946728] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  597.975755] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  597.982565] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=3 -musage=3 /var/tmp                   
[  605.535578] BTRFS info (device mmcblk2p5): balance: start -dusage=3 -musage=3
[  605.543867] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  605.568616] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  605.575485] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=2 -musage=2 /var/tmp                   
[  614.014281] BTRFS info (device mmcblk2p5): balance: start -dusage=2 -musage=2
[  614.022489] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  614.052519] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  614.059329] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail                             
armadillo:~# btrfs balance start -dusage=1 -musage=1 /var/tmp                   
[  623.509519] BTRFS info (device mmcblk2p5): balance: start -dusage=1 -musage=1
[  623.517725] BTRFS info (device mmcblk2p5): relocating block group 22020096 fp
[  623.549693] BTRFS info (device mmcblk2p5): 1 enospc errors during balance    
[  623.556506] BTRFS info (device mmcblk2p5): balance: ended with status: -28   
ERROR: error during balancing '/var/tmp': No space left on device               
There may be more info in syslog - try dmesg | tail  

状況がつかみ切れておらず、頼り切りになってしまいますが、
ご指導の程、何卒よろしくお願いいたします。

at_dominique.m…

2022年4月22日 9時31分

金田さん

 
> btrfs fi usage /var/tmp                                            
> Data,single: Size:5.93GiB, Used:5.93GiB (100.00%)                               
>    /dev/mmcblk2p5          5.93GiB                                              
>                                                                                 
> Metadata,DUP: Size:267.44MiB, Used:200.38MiB (74.92%)                           
>    /dev/mmcblk2p5        534.88MiB                                              

あれ?ファイルの削除できないと聞いた時にmetadataの方が100%だと思っていましたが、そうでもなかったんですね…
申し訳ございません、エラーを読み間違いました。btrfsの難しい「ファイルを削除できなくなる」問題ではなく、ただpodmanがファイルを削除するには一時的なファイルを書く必要があります。失礼しました。

ファイルの削除は podman を使わなければできると思いますので、削除できるファイルを探しましょう。
まず、/var/tmp/ に一時的なデータが残っていたらけしていいと思いますので、把握してから消してみましょう。

armadlilo# cd /var/tmp
armadillo# du -hs *
# ここでお客さんにとって重要なデータがないことを確認してください。podmanの一時的なデータは「podman<数字列>」と「storage<数字列>」であれば安全に消せます。
armadillo# rm -rf *

ここからは三つのパターンあるので、説明がややこしいですが。。。
* エラーあったら、ここで止めて、やはりbtrfsで削除できなくなった状態になったので、昨日考えた手順を説明しますのでまた聞いてください。
* ファイルがあって、削除できたらpodman rmを再び使えるようになったはずですので、そちらで消してください。
* ファイルがなかったら(かたりなかったら)、別のところで探す必要があるので、一般的な説明が難しくなります。 一番考えるのは、「podman ps -a」でコンテナが表示されて、そのなかにファイルがあったら、podman rmで削除されるはずのデータを手動で見つけて消すぐらいですが、ただいま試して再現できなかったのでどこまで使えるかは不明です…その場合に以下のコマンドの出力をお願いできますでしょうか?

armadillo# podman ps -a
armadillo:/var/tmp# podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED             STATUS                         PORTS       NAMES
5164786c3453  k8s.gcr.io/pause:3.5                                   15 minutes ago      Up 15 minutes ago                          cfb43e236bef-infra
1dd4a3296e2d  localhost/xwayland:latest        sh -c trap exit T...  15 minutes ago      Up 15 minutes ago                          xwayland
155bd60aefd8  docker.io/library/alpine:latest  ls                    2 minutes ago       Exited (0) 2 minutes ago                   youthful_swanson
cc9094f5cf99  docker.io/library/alpine:latest  touch /foo            About a minute ago  Exited (0) About a minute ago              test
# ここでどれでもいいので、NAMESのところの一つを使って<podman mount xxx>を実行してください
armadillo# podman mount test
/var/lib/containers/storage/overlay/4c52a43b2bed1ab428448469af5d92587de5b7c0d90166ff3dd5c9ac373152ce/merged
# これができたら、そのパスの ../diffにファイルがあればそちらを消すことはできるはずです。例えば、
armadillo# cd /var/lib/containers/storage/overlay/4c52a43b2bed1ab428448
469af5d92587de5b7c0d90166ff3dd5c9ac373152ce/merged/../diff
armadillo# ls
etc  foo  run
armadillo# rm -rf foo

お手数をかけしますが、よろしくお願いします。

マルティネ 様

素早いご対応ありがとうございます。

実行した順に記述していきます。

armadillo:/# cd /var/tmp                                                        
armadillo:/var/tmp# du -hs *                                                    
du: cannot access '*': No such file or directory                                
armadillo:/var/tmp# dir                                                         
armadillo:/var/tmp# 

恐らくファイルが無い状態であると思いますので、次に移ります。

armadillo:/var/tmp# podman ps -a                                                
Error: write /var/lib/containers/storage/overlay/metacopy-check453525954/l1/.tme
armadillo:/var/tmp# podman mount コンテナ名                                        
Error: write /var/lib/containers/storage/overlay/metacopy-check238269200/l1/.tme

podmanのコマンドは全てエラーが出てしまい、コンテナ一覧を表示したり、マウントすることができず、podman rm で消去されるファイルを消すことができませんでした。

申し訳ありませんが、何卒よろしくお願いします。

at_dominique.m…

2022年4月22日 12時08分

金田さん

> 恐らくファイルが無い状態であると思いますので、次に移ります。

そうですね、あったら便利でしたが…

podman_switch_storage --disk を行ったので、ボリューム(/var/app/volumesか/var/app/rollback/volumes) も使ってませんですね?

> armadillo:/var/tmp# podman ps -a                                                
> Error: write /var/lib/containers/storage/overlay/metacopy-check453525954/l1/.tme
> armadillo:/var/tmp# podman mount コンテナ名                                        
> Error: write /var/lib/containers/storage/overlay/metacopy-check238269200/l1/.tme

> podmanのコマンドは全てエラーが出てしまい、コンテナ一覧を表示したり、マウントすることができず、podman rm で消去されるファイルを消すことができませんでした。

マウントができないじゃないかと思っていましたが、やはりそうなりますね。
(想定の運用をswupdateでコンテナをreadonlyな場所でインストールや更新しますので、その場合に対応が簡単になりますが、podmanがぞこまで使い辛くなると思ってませんでした…)

どうしましょうか…
/var/lib/containers/storage/overlay/ を手探りでさがしたらどうにかなるかもしれませんが、一時的なデータだけではなくコンテナのイメージも含まれてますので、間違ったらコンテナを起動できなくなる可能性もあります。
それは避けたいですね。
やはり、「一時的にappfsを大きくする」方向で直しましょうか。

Armadillo Base OSでは、A/Bインストールで常に眠ってる小さなパティションがありますので、それを使います。
まず、自動アップデートが有効の場合に無効にします。アップデートが起きたら、せっかく直しているコンテナのファイルシステムが壊れますので:

armadillo:~# rc-service swupdate-url stop
swupdate-url      | * Stopping swupdate-url ...                                                  [ ok ]
armadillo:~# rc-service swupdate-hawkbit stop
swupdate-hawkbit  | * WARNING: swupdate-hawkbit is already stopped

現在起動しているパティションを確認します。最新のバージョンを使っていたら 「abos-ctrl status」で、古いバージョンの場合に「swupdate -g」で確認してください。 mmcblk2p1 か mmcblk2p2 なはずです。

armadillo:~# abos-ctrl status
Currently booted on /dev/mmcblk2p1
rollback-status: optimal
armadillo:~# swupdate -g
/dev/mmcblk2p1

このパティションを覚えて、もう一つのパティションをbtrfsに足します。今の例では、statusではmmcblk2p1でしたので、mmcblk2p2を使います。逆の場合にmmcblk2p1を使ってください。間違ってもエラーしますので、安心して実行してください。

armadillo:~# btrfs dev add -f /dev/mmcblk2p2 /var/tmp
Performing full device TRIM /dev/mmcblk2p2 (300.00MiB) ...
armadillo:~# df -h /var/tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk2p5  6.8G  6.4G  300M  96% /var/tmp

そうしたら、少し余裕ができたので、podman rmのコマンドが再びできると思いますが、どうでしょうか?
今の段階でpodman rmやpodman rmi (image rm) でファイルを削除してください。

削除し終わったら、そのパティションをまた Armadillo Base OS に返します。

armadillo:~# btrfs device usage /var/tmp
/dev/mmcblk2p5, ID: 1
   Device size:             6.46GiB
   Device slack:            3.50KiB
   Data,single:             5.89GiB
   Metadata,DUP:          524.00MiB
   System,DUP:             64.00MiB
   Unallocated:             1.04MiB
 
/dev/mmcblk2p2, ID: 2
   Device size:           300.00MiB
   Device slack:              0.00B
   Data,single:           299.00MiB
   Unallocated:             1.00MiB
 
armadillo:~# btrfs device remove /dev/mmcblk2p2 /var/tmp
armadillo:~# btrfs device usage /var/tmp
/dev/mmcblk2p5, ID: 1
   Device size:             6.46GiB
   Device slack:            3.50KiB
   Data,single:             5.89GiB
   Metadata,DUP:          524.00MiB
   System,DUP:             64.00MiB
   Unallocated:             1.04MiB

これで手順が終わります(自動アップデートがあった場合は、再起動したらまた実行されます)。
何か問題あったら、何もせずにまた聞いてください。

よろしくお願いします。

マルティネ 様

> podman_switch_storage --disk を行ったので、ボリューム(/var/app/volumesか/var/app/rollback/volumes) も使ってませんですね?
はい。ファイルが無い状態で、恐らく使っていないと思います。

以下、実行していった順に記述します。

armadillo:/# rc-service swupdate-url stop                                       
swupdate-url     | * WARNING: swupdate-url is already stopped                   
armadillo:/# rc-service swupdate-hawkbit stop                                   
swupdate-hawkbit | * WARNING: swupdate-hawkbit is already stopped               
armadillo:/# abos-ctrl status                                                   
-ash: abos-ctrl: not found                                                      
armadillo:/# swupdate -g                                                        
mmcblk2p1      
armadillo:/# btrfs dev add -f /dev/mmcblk2p2 /var/tmp                           
[13710.578025] BTRFS info (device mmcblk2p5): disk added /dev/mmcblk2p2   
armadillo:/# podman rm コンテナ名                                                 
dbc2ab6377875645e8a938bb13771a448d88bde988950338d2de15f605915dc0                
armadillo:/# btrfs device usage /var/tmp                                        
/dev/mmcblk2p5, ID: 1                                                           
   Device size:             6.46GiB                                             
   Device slack:            3.50KiB                                             
   Data,single:             5.93GiB                                             
   Metadata,DUP:          534.88MiB                                             
   System,DUP:             16.00MiB                                             
   Unallocated:             1.04MiB                                             
 
/dev/mmcblk2p2, ID: 2                                                           
   Device size:           300.00MiB                                             
   Device slack:              0.00B                                             
   Data,single:           299.00MiB                                             
   Unallocated:             1.00MiB      
 
armadillo:/# btrfs device remove /dev/mmcblk2p2 /var/tmp                        
[13860.111749] BTRFS info (device mmcblk2p5): relocating block group 8074559488a
[13860.193018] BTRFS info (device mmcblk2p5): found 20 extents, stage: move dats
[13860.860139] BTRFS info (device mmcblk2p5): found 20 extents, stage: update ds
[13861.028334] BTRFS info (device mmcblk2p5): device deleted: /dev/mmcblk2p2    
armadillo:/# btrfs device usage /var/tmp                                        
/dev/mmcblk2p5, ID: 1                                                           
   Device size:             6.46GiB                                             
   Device slack:            3.50KiB                                             
   Data,single:             5.93GiB                                             
   Metadata,DUP:          534.88MiB                                             
   System,DUP:             16.00MiB                                             
   Unallocated:             1.04MiB    

結果として、podman rm コンテナ名 のコマンドが実行でき、無事解決することができました。

素早いご返信と対応、素晴らしかったです。
本当にありがとうございました。

at_dominique.m…

2022年4月22日 13時42分

金田さん

解決できてなによりです!

今後こうならないように、podman が full な状態でもコマンドを実行できるように調べておきます。

よろしくお願いします。