AWS等々でのスナップショットの使用容量を節約する方法

シェアする

Voiced by Amazon Polly

特にファイルを大量に削除した直後に有効な方法です。

広告



そのままスナップショットを取ってもいいけれども…

AWS EC2内のEBSをはじめとする多くのブロックストレージではいつでもスナップショットを取得できます。複数取得した場合は差分が取得されます。しかし、これらはブロックレベルで取得されます。
つまり、ファイルレベルでは取得されません。

多くのファイルシステムでは、ファイルを削除しても直ちにディスクからファイルの実体が削除されません。従って、ファイルシステムから見えない状態であっても、ファイルの痕跡が残っている場合はブロック上に残骸が残っていることになります。
この残骸もブロックレベルでは変更されているものとみなされるため、スナップショット作成時に余分な容量を消費することになります。また、スナップショットの圧縮効率も低下することになります。

残骸を埋め立てる

この操作はファイルシステムへの書き込みを行うため、重要なファイルに関しては事前にバックアップやスナップショットを取得してください。また、大量の書き込みを発生させるため、I/O単位で料金が課金されるマグネティックボリュームでの操作は避けてください。
なお、この操作でファイルが消失したりファイルシステムが破損したりしても、当方は一切責任を負いかねます。

スナップショットの作成前にファイルシステムの空き領域をゼロ埋めしておくことで、スナップショットの圧縮効率が上がり、使用量や料金を節約することができます。
Linuxでは、次のようなコマンドが例として挙げられます。
dd if=/dev/zero of=/tempfile bs=1M ; rm -f /tempfile

このコマンドは、/tempfileにゼロで埋め尽くされたファイルを作成し、/tempfileを削除するものです。この操作を行うことで、削除されたファイルの残骸をゼロで埋めることができます。
なお、of=の部分には存在しないファイルを指定し、間違ってもデバイスファイル名を指定しないようにしてください

誤ってデバイスファイル名(例:/dev/sda)を指定した場合、当該ファイルシステムやディスク上のデータが消失します。存在するファイルを指定した場合、当該ファイルが上書きされ消失します。

補足

オンプレミス環境において自動拡張型ファイルシステムの場合、この操作を行うと仮想ディスクのサイズが際限なく(指定した上限まで)拡張される点にご注意ください。
事前に、縮小が可能かどうかを確認しておく必要があります。