こんにちは.怠惰人間です.大学生院生はこの時期,学部生の卒研の補助とか,学会発表とかでいろいろと忙しい時期なので,あまり更新できないような環境でした.
さて,本題ですが,昨日自分の研究用のUbuntuマシンで,「apt update」をしようとしたところ,「ERROR couldn’t save system state: Minimum free space to take a snapshot and preserve ZFS performance is 20%.」という文章が出力されました.特に実害はなさそうなのですが,エラーが出てるのは非常に気になるので,今回はその修正方法を調べてみました.
エラーの直し方
忙しい人のために,直し方だけ簡潔に述べると,
- 「
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT
」を実行 - コマンド出力の内,日時が古いもののNAMEを確認する
- 2で確認したNAMEの末尾から6文字を記憶しておく(ここでは仮にABCDEFとする)
- 「
sudo zsysctl state remove ABCDEF --system
」を実行
です.上記の手法の内,2から4を数回繰り返すと自分の環境ではエラーはでなくなりました.
エラーの原因
そもそも,エラーの内容を日本語に翻訳してみると,以下のような文になります.
「エラー システムの状態を保存できません: スナップショットを保存してZFSのパフォーマンスを維持するための最小空き容量は20%必要です」
つまり,ZFS(?)のスナップショット(??)を取るための最小空き容量が足りないというエラーのようです.それぞれについて詳しく見てみましょう.
ZFS
ZFSは,所謂ファイルシステムと呼ばれるものであり,Unixの次世代ファイルのシステムの標準とされるであろうもので巣.このファイルシステムとは,WindowsのNTFSやAppleのAPFS,USBなどに使用される古典的かつ標準的なFATなど,様々な種類が存在するプログラムであり,主な機能としてはその名前の通りファイルを保存する機能を提供します.
今回のエラーは,この多々あるファイルシステムの内,ZFSで発生するエラーだということですね.
ファイルシステムのスナップショットとは
ZFSがなんだかわかったところで,スナップショットが何なのかの説明をしようと思います.スナップショットとは,ファイルシステムをはじめとした所詮データベース関連で使われる用語で,「あるデータベースの内容を全てコピーしたもの」になります.つまり,簡単に言えば全データのコピー,つまりバックアップのことですね.
詳しく説明すると,スナップショットといっても毎回全データをコピーするのは効率が悪いので,差分をコピーしたり,変更記録(メタデータ)のみをコピーしたりといろいろ方法があるのですが,今回はスナップショット=バックアップみたいなイメージで十分だと思います.
ZFSの空き容量について
では,最後にエラー文で示されている空き容量について説明します.一つ上の見出しで,スナップショットの意味を示しました.エラー文が示している空き容量とはつまり,このスナップショットを保存するための容量が無いといっているわけです.
けど,「私のマシンでは十分な空き容量が確保はず!」みたいな人がいるかもしれません.その場合は,話の主語にあたるパーティション(正確にはストレージプール)が異なることが考えられます.今回のエラーでは,空き容量の不足といっても特に「bpool」パーティションの空き容量が不足しているという話なのです.
実際に自分の記憶装置のパーティションを確認するといくつかのパーティションに分かれていることが分かります.例えば,私のマシンならば記憶装置の名前が「/dev/sda」なので「sudo fdisk -l /dev/sda
」を使用してみると

このような内容が出力されます.私のマシンの設定は初期設定から変更していないので,Ubuntu20.04でインストール時に設定を変更していないマシンの場合,似たような状況になっていると思います.
さて,先の画像を見てみると,4つのパーティションに分かれていることが分かります.このうち,上の2つはLinuxOSに関係するパーティションなので,ZFSには関係してきません.ZFSに関係するのはした2つのTypeがSolaris bootとなっているものです.今回空き容量が足らないといわれている「bpool」とは,3番目の「/dev/sda3」のことなのです.そして皆さんが普段使用しているホームディレクトリなどは4番目の「/dev/sda4」になります.容量がかなり違いますよね?これが原因で,ぱっと見容量が空いていてもエラーが出ることがあるわけですね.
ちなみに,実際に「bpool」がどれだけ容量を使用しているのかは「df | grep bpool
」コマンドを使用するとわかります.使ってみると

こんな感じになり,私の環境では,90%を使用していることが分かります.
詳細な修正手順
1. ZFSのスナップショットの確認
上記の1番から3番の手順に該当します.
「zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT
」
このコマンドは,zfsコマンドを使用して「bpool/BOOT」のスナップショット一覧を確認するコマンドです.ちなみに,bpoolにはBOOT以外のスナップショットはない(はず?)ので,
「zfs list -r -t snapshot -o name,used,referenced,creation bpool
」
でもよいです.
出てきたスナップショットのログを次のステップで削除するわけですね.
2. スナップショットの削除
上記の4番の手順に該当します.
これは単純に
「sudo zsysctl state remove ABCDEF --system
」
このコマンドでスナップショットを削除しているだけですね.
今日の内容は以上!