FreeBSDがdisk fullで大変だった話
FreeBSD 13.2-RELEASEを使っていたのですが、何かの拍子に「もうEOLだからバージョンアップしなさい」的なメッセージが出るようになったので、freebsd-updateを使って13.3に上げ、さらに14.1まで上げました。
余談
公式のアップグレード手順はこちら。
下準備的な部分を省くと、以下のようになります。
- fetchとカーネルのインストール
freebsd-update upgrade -r 14.1-RELEASE
freebsd-update install
- リブート
shutdown -r now
- ユーザーランドのインストール
freebsd-update install
- 3rd partyのアプリの更新
- 古い共有ライブラリの削除
freebsd-update install
- リブート
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