FreeBSDがdisk fullで大変だった話

2024/07/03に公開

FreeBSD 13.2-RELEASEを使っていたのですが、何かの拍子に「もうEOLだからバージョンアップしなさい」的なメッセージが出るようになったので、freebsd-updateを使って13.3に上げ、さらに14.1まで上げました。

余談

公式のアップグレード手順はこちら
下準備的な部分を省くと、以下のようになります。

  1. fetchとカーネルのインストール
freebsd-update upgrade -r 14.1-RELEASE
freebsd-update install
  1. リブート
shutdown -r now
  1. ユーザーランドのインストール
freebsd-update install
  1. 3rd partyのアプリの更新
  2. 古い共有ライブラリの削除
freebsd-update install
  1. リブート
shutdown -r now

この手順の中で、4番目だけ具体的な手順が書いていないのです。これは、ユーザーによってportsを使っていたり、pkgを使っていたり、手動でインストールしたアプリがあったりするためだと思われます。
ここで手抜きをして、以下のようにしました。

pkg upgrade

何が起きたか?上記コマンドで、古くなっていたパッケージは更新されますが、最新が入っていたものは更新されません。
結果、リブートしたらいろいろなコマンドが使えなくなりました。一番困ったのが、sudoコマンドが使えなくなってしまったこと。

このミス、以前もやった記憶があって、そのときはsudoではなくzshが起動しなくなり、sshでログインできない状態になりました。今回はログインできるだけだいぶまし。
su でrootになれたので、以下のコマンドで全てのpkgを再インストールしました。

pkg upgrade -f

以前のときは、リモートコンソールでrootログインしたんだっけな。
教訓としては、以下になります。

  • su でrootになれるようにrootに堅牢なパスワードをつけておく
  • コンソールでrootログインできるようにしておく(sshログインは禁止)
  • zshのような3rd partyのシェルではなく、システム標準のシェルを使うユーザを残して置く
    • これ、ユーザはいたけど今回はsshログインできるようになってなかった
  • アップグレードは手順通りにやる

前者二つは、セキュリティとのトレードオフになるので、ご利用は計画的に。

本論

上記をやったのが珍しく出社する日の早朝だったので、復旧できないかと思って焦りました。
アップグレードは時間の余裕のあるときに。
で、なんとか14.1で動くようになって、各種サービスも動作しているようだったので安心していたのですが、その日の夜中にPostgreSQLのデータベースに接続できないと言うアラートが飛んで来ました。
(10秒毎にLINEで通知が来る。これも見直さないといけない)

ログインしてみると、disk fullになっているようです。

# df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default     25G     25G      0B   100%    /
devfs                 1.0K      0B    1.0K     0%    /dev
zroot/tmp              48M     48M      0B   100%    /tmp
zroot/usr/home        7.8G    7.8G      0B   100%    /usr/home
zroot                  88K     88K      0B   100%    /zroot
zroot/usr/ports       2.1G    2.1G      0B   100%    /usr/ports
zroot/usr/src          88K     88K      0B   100%    /usr/src
zroot/var/log         103M    103M      0B   100%    /var/log
zroot/var/audit        88K     88K      0B   100%    /var/audit
zroot/var/crash       409M    409M      0B   100%    /var/crash
zroot/var/mail        120K    120K      0B   100%    /var/mail
zroot/var/tmp         100K    100K      0B   100%    /var/tmp

動いているのはsakuraのVPSの100G SSDのプランなので、冷静に考えれば zroot/ROOT/default の Size が25Gしかないのがおかしいことに気づいたはずなのですが、このときは焦っていたのでわかりません。

# zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zroot  97.5G  97.5G   0.0G        -         -    40%    54%  1.00x    ONLINE  -
# zfs list
NAME                                            USED  AVAIL  REFER  MOUNTPOINT
zroot                                          94.5G     0B    88K  /zroot
zroot/ROOT                                     83.5G     0B    88K  none
zroot/ROOT/12.3-RELEASE-p5_2022-07-27_130629      8K     0B  16.5G  /
zroot/ROOT/13.1-RELEASE-p1_2022-09-05_085036      8K     0B  18.0G  /
zroot/ROOT/13.1-RELEASE-p2_2023-04-18_174750      8K     0B  19.8G  /
zroot/ROOT/13.1-RELEASE-p7_2023-07-22_230323      8K     0B  19.7G  /
zroot/ROOT/13.1-RELEASE-p8_2023-08-12_095436      8K     0B  20.3G  /
zroot/ROOT/13.1-RELEASE-p9_2023-08-29_084227      8K     0B  20.5G  /
zroot/ROOT/13.1-RELEASE_2022-07-27_130836         8K     0B  16.6G  /
zroot/ROOT/13.1-RELEASE_2022-07-27_131940         8K     0B  17.6G  /
zroot/ROOT/13.1-RELEASE_2022-08-14_113545         8K     0B  18.3G  /
zroot/ROOT/13.2-RELEASE-p10_2024-04-28_223155     8K     0B  22.5G  /
zroot/ROOT/13.2-RELEASE-p11_2024-07-02_055635     8K     0B  22.8G  /
zroot/ROOT/13.2-RELEASE-p12_2024-07-02_061125     8K     0B  23.5G  /
zroot/ROOT/13.2-RELEASE-p2_2023-08-29_084357      8K     0B  20.6G  /
zroot/ROOT/13.2-RELEASE-p2_2023-09-22_081105      8K     0B  20.8G  /
zroot/ROOT/13.2-RELEASE-p3_2023-10-11_102918      8K     0B  20.5G  /
zroot/ROOT/13.2-RELEASE-p4_2023-11-29_082003      8K     0B  20.6G  /
zroot/ROOT/13.2-RELEASE-p5_2024-01-07_075600      8K     0B  20.7G  /
zroot/ROOT/13.2-RELEASE-p9_2024-03-09_183450      8K     0B  21.3G  /
zroot/ROOT/13.3-RELEASE-p3_2024-07-02_061318      8K     0B  23.6G  /
zroot/ROOT/13.3-RELEASE-p4_2024-07-02_062657      8K     0B  24.2G  /
zroot/ROOT/14.1-RELEASE-p2_2024-07-02_070203      8K     0B  25.0G  /
zroot/ROOT/14.1-RELEASE_2024-07-02_062824         8K     0B  24.2G  /
zroot/ROOT/default                             83.5G     0B  25.3G  /
zroot/encvol                                    530M   526M  3.73M  -
zroot/tmp                                      47.9M     0B  47.9M  /tmp
zroot/usr                                      9.85G     0B    88K  /usr
zroot/usr/home                                 7.78G     0B  7.78G  /usr/home
zroot/usr/ports                                2.08G     0B  2.08G  /usr/ports
zroot/usr/src                                    88K     0B    88K  /usr/src
zroot/var                                       513M     0B    88K  /var
zroot/var/audit                                  88K     0B    88K  /var/audit
zroot/var/crash                                 409M     0B   409M  /var/crash
zroot/var/log                                   103M     0B   103M  /var/log
zroot/var/mail                                  120K     0B   120K  /var/mail
zroot/var/tmp                                   100K     0B   100K  /var/tmp

zpool listはログを残していなかったので、上の結果は想像で書いたものです。

zroot/ROOT/12.3-RELEASE-p5_2022-07-27_130629 みたいなものがたくさんあるので、過去のスナップショットのようなものがたくさんあってdiskを圧迫しているのだと考えました。
ここも、冷静に見れば USED が 8K とかなので効かないことがわかりますが、このときは(略
zfs destroyで片っ端から消してみました。

# zfs list
NAME                                           USED  AVAIL  REFER  MOUNTPOINT
zroot                                         94.5G     0B    88K  /zroot
zroot/ROOT                                    83.5G     0B    88K  none
zroot/ROOT/13.3-RELEASE-p4_2024-07-02_062657     8K     0B  24.2G  /
zroot/ROOT/14.1-RELEASE-p2_2024-07-02_070203     8K     0B  25.0G  /
zroot/ROOT/14.1-RELEASE_2024-07-02_062824        8K     0B  24.2G  /
zroot/ROOT/default                            83.5G     0B  25.3G  /
zroot/encvol                                   530M   526M  3.73M  -
zroot/tmp                                     47.9M     0B  47.9M  /tmp
zroot/usr                                     9.85G     0B    88K  /usr
zroot/usr/home                                7.78G     0B  7.78G  /usr/home
zroot/usr/ports                               2.08G     0B  2.08G  /usr/ports
zroot/usr/src                                   88K     0B    88K  /usr/src
zroot/var                                      513M     0B    88K  /var
zroot/var/audit                                 88K     0B    88K  /var/audit
zroot/var/crash                                409M     0B   409M  /var/crash
zroot/var/log                                  103M     0B   103M  /var/log
zroot/var/mail                                 120K     0B   120K  /var/mail
zroot/var/tmp                                  100K     0B   100K  /var/tmp

しかし、ちっとも空き容量は増えません。
落ち着いてマニュアルを眺めると、snapshotを見るには zfs list -t snapshot を使う必要があることがわかりました。

# zfs list -t snapshot
NAME                                       USED  AVAIL  REFER  MOUNTPOINT
zroot/ROOT/default@2022-04-15-13:18:39-0  3.96G      -  14.7G  -
zroot/ROOT/default@2022-07-27-13:06:29-0  33.5M      -  16.5G  -
zroot/ROOT/default@2022-07-27-13:08:36-0  4.33M      -  16.6G  -
zroot/ROOT/default@2022-07-27-13:19:40-0   394M      -  17.6G  -
zroot/ROOT/default@2022-08-14-11:35:45-0  3.09G      -  18.3G  -
zroot/ROOT/default@2022-09-05-08:50:36-0  2.96G      -  18.0G  -
zroot/ROOT/default@2023-04-18-17:47:50-0  3.84G      -  19.8G  -
zroot/ROOT/default@2023-07-22-23:03:23-0  3.13G      -  19.7G  -
zroot/ROOT/default@2023-08-12-09:54:36-0  3.54G      -  20.3G  -
zroot/ROOT/default@2023-08-29-08:42:27-0  5.97M      -  20.5G  -
zroot/ROOT/default@2023-08-29-08:43:57-0  4.77M      -  20.6G  -
zroot/ROOT/default@2023-09-22-08:11:05-0  3.05G      -  20.8G  -
zroot/ROOT/default@2023-10-11-10:29:18-0  2.77G      -  20.5G  -
zroot/ROOT/default@2023-11-29-08:20:03-0  2.76G      -  20.6G  -
zroot/ROOT/default@2024-01-07-07:56:00-0  2.82G      -  20.7G  -
zroot/ROOT/default@2024-03-09-18:34:50-0  3.40G      -  21.3G  -
zroot/ROOT/default@2024-04-28-22:31:55-0  3.65G      -  22.5G  -
zroot/ROOT/default@2024-07-02-05:56:35-0  11.3M      -  22.8G  -
zroot/ROOT/default@2024-07-02-06:11:25-0  4.76M      -  23.5G  -
zroot/ROOT/default@2024-07-02-06:13:18-0  5.16M      -  23.6G  -
zroot/ROOT/default@2024-07-02-06:26:57-0  5.52M      -  24.2G  -
zroot/ROOT/default@2024-07-02-06:28:24-0  9.60M      -  24.2G  -
zroot/ROOT/default@2024-07-02-07:02:03-0   653M      -  25.0G  -

こちらは、USEDにG単位の数字が並んでいます。
同じように古いものを消していったら空き領域が増えました。

# zfs list -t snapshot
NAME                                       USED  AVAIL  REFER  MOUNTPOINT
zroot/ROOT/default@2024-01-07-07:56:00-0  3.12G      -  20.7G  -
zroot/ROOT/default@2024-03-09-18:34:50-0  3.40G      -  21.3G  -
zroot/ROOT/default@2024-04-28-22:31:55-0  3.65G      -  22.5G  -
zroot/ROOT/default@2024-07-02-05:56:35-0  11.3M      -  22.8G  -
zroot/ROOT/default@2024-07-02-06:11:25-0  4.76M      -  23.5G  -
zroot/ROOT/default@2024-07-02-06:13:18-0  5.16M      -  23.6G  -
zroot/ROOT/default@2024-07-02-06:26:57-0  5.52M      -  24.2G  -
zroot/ROOT/default@2024-07-02-06:28:24-0  9.60M      -  24.2G  -
zroot/ROOT/default@2024-07-02-07:02:03-0   653M      -  25.0G  -

dfで見ても空きが増えています。

# df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default     66G     25G     41G    37%    /
devfs                 1.0K      0B    1.0K     0%    /dev
zroot/tmp              41G     48M     41G     0%    /tmp
zroot/usr/home         49G    7.8G     41G    16%    /usr/home
zroot                  41G     88K     41G     0%    /zroot
zroot/usr/ports        43G    2.1G     41G     5%    /usr/ports
zroot/usr/src          41G     88K     41G     0%    /usr/src
zroot/var/log          41G    104M     41G     0%    /var/log
zroot/var/audit        41G     88K     41G     0%    /var/audit
zroot/var/crash        42G    409M     41G     1%    /var/crash
zroot/var/mail         41G    120K     41G     0%    /var/mail
zroot/var/tmp          41G    100K     41G     0%    /var/tmp

zfs-listのマニュアルを見たら、-t allで全ての種類のリストが見られることがわかりました。これが一番見やすいかも。

# zfs list -t all
NAME                                           USED  AVAIL  REFER  MOUNTPOINT
zroot                                         53.4G  41.1G    88K  /zroot
zroot/ROOT                                    42.4G  41.1G    88K  none
zroot/ROOT/13.3-RELEASE-p4_2024-07-02_062657     8K  41.1G  24.2G  /
zroot/ROOT/14.1-RELEASE-p2_2024-07-02_070203     8K  41.1G  25.0G  /
zroot/ROOT/14.1-RELEASE_2024-07-02_062824        8K  41.1G  24.2G  /
zroot/ROOT/default                            42.4G  41.1G  24.5G  /
zroot/ROOT/default@2024-01-07-07:56:00-0      3.12G      -  20.7G  -
zroot/ROOT/default@2024-03-09-18:34:50-0      3.40G      -  21.3G  -
zroot/ROOT/default@2024-04-28-22:31:55-0      3.65G      -  22.5G  -
zroot/ROOT/default@2024-07-02-05:56:35-0      11.3M      -  22.8G  -
zroot/ROOT/default@2024-07-02-06:11:25-0      4.76M      -  23.5G  -
zroot/ROOT/default@2024-07-02-06:13:18-0      5.16M      -  23.6G  -
zroot/ROOT/default@2024-07-02-06:26:57-0      5.52M      -  24.2G  -
zroot/ROOT/default@2024-07-02-06:28:24-0      9.60M      -  24.2G  -
zroot/ROOT/default@2024-07-02-07:02:03-0       653M      -  25.0G  -
zroot/encvol                                   530M  41.6G  3.73M  -
zroot/tmp                                     47.9M  41.1G  47.9M  /tmp
zroot/usr                                     9.85G  41.1G    88K  /usr
zroot/usr/home                                7.78G  41.1G  7.78G  /usr/home
zroot/usr/ports                               2.08G  41.1G  2.08G  /usr/ports
zroot/usr/src                                   88K  41.1G    88K  /usr/src
zroot/var                                      513M  41.1G    88K  /var
zroot/var/audit                                 88K  41.1G    88K  /var/audit
zroot/var/crash                                409M  41.1G   409M  /var/crash
zroot/var/log                                  104M  41.1G   104M  /var/log
zroot/var/mail                                 120K  41.1G   120K  /var/mail
zroot/var/tmp                                  100K  41.1G   100K  /var/tmp

とりあえず、diskが足りなくなったら不要なsnapshotを消せば良いことはわかりました。

まだわからないこと

  • zroot/ROOT/13.3-RELEASE-p4_2024-07-02_062657 みたいなものは何?
  • snapshotを誰が作っているのか(freebsd-update upgrade -rのタイミングっぽい?)
  • snapshotの保存量とか世代を設定で自動管理できないのか

Discussion