VMWare, Shrink and Trim

VMWareの仮想ストレージには、大きく分けて

  • 事前に必要な容量を全部確保する
  • 使用した分だけ容量を確保する

二つの方法があります。後者は初めは小さなファイルを仮想ストレージとして確保し、ストレージにゲストOSが書き込む度にファイルが大きくなっていくというほうしきです。この方法は限られた物理ディスクの上に複数の仮想マシンを作る場合に重宝します。
しかし、容量が自動的に増えていくのはいいのですが、自動的には減りません。VMWareにはshrinkという機能があり、定期的にこれを行わないと、使用済みのディスク領域も確保されたままになります。その結果、ゲストOSの正味ディスク容量が3GBであっても、仮想ストレージ用のファイルサイズは4GBなんてことが起きることになります。
結局、Shrinkとはガーベージコレクションです。ゲストOSから未使用のセクタに何らかの方法でマークを付け、ホストOS上のVMWareがそのマークの付いたセクタを仮想ストレージ用のファイルから追い出しているのでしょう。実際には未使用のセクタにはオール0が書き込まれているそうです。つまり、VMWareはオール0のセクタは未割り付けとし、未割り付けセクターの読み出し要求にはオール0を返していることになります。
だったら、VMWareATAのTrimコマンドを実装しておけば、対応OSの場合VMWareの仮想ストレージサイズを常に小さく保てることになりますね。