ConohaのVPSでサーバーを立ち上げて数年が過ぎました。
6年も前なのか・・・
毎回のバックアップごとに容量が増えていたのですが、まあユーザーが増えれば当然だと思っていたら、この前イメージのバックアップを試みるとイメージサイズが44GBにも達していて大慌て!
chatGPTさんに相談して肥大化したlogファイルなどを削除したりしました。
50GBまでは無償でイメージ保存できるんだけど、50GBを超える容量を保存する場合は上位の550GBプランに2000円弱で申し込まないといけません。1時間あたり2.6円でも利用可能なので、これまでは25GBを超えたあたりからバックアップ時だけ1時間以内で利用して無事にバックアップできたら古いイメージを消して50GBストレージに戻すという方法を取っていました。
そして今回、イメージ保存をするとついに52GBを超えていました!これはマズイ!!
どうやら実際の使用ディスク容量に関係なくイメージ容量が肥大化したままのようです。なんでっ!??
df -h
で使用容量を見ると、実際のディスクは12GB程度しか利用していません・・・

なのにバックアップしたイメージは52GB??

なんでじゃ???
とchatGPTさんに聞いてもストレージ容量の整理方法しか教えてくれません。(悲
少し整理したら10MB分ぐらいはイメージが減った?けど意味無し!
Google検索をすると、そのものズバリな回答を書いておられる方を発見!!やっぱりすごいぞGoogle検索!!何でもかんでもAIに頼っては駄目ってことですね。
解決:ConoHa VPSで「イメージ保存容量」がどんどん増えていってしまう | あっちこっちにーち
この方はConohaに直接電話で問い合わせされたようです。
要するに、「ディスクに一度でも0以外のデータが書き込まれたら、書き込まれたブロックごとディスクイメージとして保存しちゃうから、ディスクの空きに0で埋めたファイルを一時的に作ってそのファイルを消したら無かったことになるよ!」ということらしいです。なるほどな仕様。
少しわかりやすく図示します↓
VPSの100GB分のディスクスペースは予め「0」埋めで用意(フォーマット)されている状態です。
(※以下イメージはあくまで便宜上の表現です。)

データが書き込まれると、0以外のデータがディスクに入力されることになり、そのデータがどこにあるかが記録されることになります。
(Aというデータがディスクの先頭に書き込まれた)

(Aに続いてB、Cというデータが順番にディスクに書き込まれた)

この状態でイメージを保存すると、0以外が入力されたブロックだけがディスクイメージとして保存されることになります。
(イメージはABCのデータのみ抽出される)

保存されるデータは必ず順番通りになるとは限りません。このように飛ばされたブロックがあった場合は
(データを書き込む順が飛んでEというデータが書き込まれた)

0以外のデータがディスクイメージとして保存されることになります。
(イメージにはABCEのデータが抽出される)

ここで問題になるのが、一度書き込んだデータを削除した場合、ディスクからは保存先情報だけが削除され、ディスク内部のデータは0以外のままになっています。
(BCのデータを削除した)

この状態でディスクイメージを生成すると、0以外のデータがそのままイメージとして保存されてしまいます。
これがデータが無いのにディスクイメージだけが肥大化している状態です。
(AEだけでなく、消したBCのデータも書き込まれる)

なので、肥大化対策として、ここに全て「0」で埋めたデータを書き込みます。
このとき、”0でないブロックだけ”を狙い撃ちすることは出来ないので、できるだけ大きな0ファイルを書き込む必要があります。
(BCのあった領域を上書きで使うように、中身「0」の大きなファイルを作成)

そのうえで書き込んだデータを削除します。
(0というデータ情報が消えるが、中身はそのまま0が残る)

そうすると、0のデータはディスクイメージとして保存されないので、イメージ容量が減るということですね。
(イメージはAEのデータのみ抽出される)

さて、原因が判明したので実際に作業を行います。
コマンドはddを使い、
dd if=/dev/zero of=/tmp/tmpzero.tmp bs=G count=「空き容量をGB単位で入力」
で、0埋めファイルを生成するということです。
僕の場合は空き容量は83GBだけど、ddで全部埋めると怖いので試しに80GB分のファイルを生成しました。
dd if=/dev/zero of=/tmp/tmpzero.tmp bs=G count=80
完了までに30分ぐらいかかりました。
参考先の方は70GBぐらいが1分半ぐらいとのことでしたが、僕の環境の場合は1分で2GB分ぐらいしか書き込まれませんでした。
※別のターミナルから接続してdf -hコマンドで容量をちょくちょく確認しました。

これでディスクが98%使用されています。

そして、rmで作った80GBのファイルを消します。
rm /tmp/tmpzero.tmp
98%→13%へ!すごいダイエット。

イメージ保存をしましたら、52GBもあったイメージが16GBに戻りました。成功です!

これで無償イメージ容量のままで使えます。
