(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2018年3月6日火曜日

【Linux CentOS 7】 (ゲストOSがWindowsの場合で)そのqcow2ディスクイメージにおいて仮想容量の空き容量分だけを物理ディスク上で短縮して実際の物理ディスクの使用容量を減らす(シュリンクする)手順

qcow2ディスクイメージにおいて、仮想容量の内で空き容量分だけを、
物理ディスク上で短縮して実際の物理ディスクの使用容量を減らす。(シュリンクと呼ぶ)
シュリンクは、仮想ディスクの圧縮オプションとは異なるので、混同しないこと。


以下は、Windows10をゲストOSとして動作させている仮想マシンを対象に処理手順である。

特に、手順の1、2、は、ゲストOS内で行う準備作業なので、Windows以外のOSの場合は、
一番下に挙げた「参考の(1)」を参照する。

それ以外の手順は、Linuxホストで行うためゲストOSを問わない。
使用した環境は、CentOS 7 である。




1、(準備作業 1)仮想マシンで動作しているWindowsでディスクのデフラグを行った。

仮想マシン上のゲストWindowsを起動した上で、
ゲストWindowsに組み込まれているデフラグツールで、ディスクのデフラグを行った。

デフラグツールは対象のハードディスクアイコンの右クリックメニューから開く。
右クリックメニューでプロパティーを選択、開いたウインドウからツールタブを開いて、
ドライブの最適化とデフラグを選択する。

でフラグによって、ディスクに保存されているデータがディスク上に再配置される。
状態によって処理にとても時間がかかる。



2、(準備作業 2)仮想マシン上Windowsで、ディスクの空きスペースをゼロで上書きした。

準備作業1が完了した後に、仮想マシン上のWindowsにおいて、次のように作業を行った。


○ゼロ書き込みツールをダウンロードした。

下記リンクより、sdeleteツールをダウンロードし、
解凍して、sdeleteコマンドファイルを、c\windows\system32\ 内にコピーした。

(ツールダウンロードサイト)
https://docs.microsoft.com/ja-jp/sysinternals/downloads/sdelete


○ゼロ書き込みツールを実行した。

DOSプロンプトから、sdeleteコマンドで次のように、C:ドライブの空領域のゼロ上書きを行った。
C:> sdelete -z c:
このとき、ディスクの空き容量が減少していく様子が確認できた。
空き容量にゼロのファイルを書き込んでいるためではないかと思う。
書き込み終わればファイルが削除されて、ゼロ上書きが完了するという仕組みだろう。
SDelete v2.01 - Secure file delete
Copyright (C) 1999-2018 Mark Russinovich
Sysinternals - www.sysinternals.com
SDelete is set for 1 pass.
Cleaning free space on C:\: 23%
99%の段階で、空容量が57.4MBとなった。
Windowsから空き容量不足の警告がでたが無視した。

なぜか、ここからなかなか進まなくなった。
とりあえず一度エンターを押してみると、100%になり、
しばらくして、また一度エンターを押すと、下記のように表示されて完了した。
Free space cleaned on C:\
1 drive cleaned.
C:/>

ディスクの空き容量も正常になった。
使用領域 16.7GB空き領域 62.2GB
容量 79.0GB

実際に使用されている容量は、16.7GB程度である。



3、仮想マシンをシャットダウンした。

 今回の処理に関係の無い仮想マシンは動作させたままにした。



4、仮想マシンディスクの物理ディスク占有サイズを小さく(シュリンク)する。
(仮想マシン上でのディスクサイズには変化はない。)


○上記の仮想マシンがシャットダウンしていることを確認した。


○シュリンク処理前の仮想マシンディスクの情報を表示させた。

# qemu-img info windows10.qcow2
image: windows10.qcow2
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 78G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
処理前の物理占有サイズは、78GBである。


○仮想マシンディスクのファイル名に_backupを付えて変更しておく。

# mv windows10.qcow2 windows10.qcow2_backup


○シュリンク処理を行った。(圧縮オプションは付けずに行った。)

# qemu-img convert -p -O qcow2 windows10.qcow2_backup windows10.qcow2
 (100.00/100%)

-p 進捗状況の表示
-O 出力形式の指定

この処理は少々時間を要する。

windows10.qcow2_backup がシュリンク処理されて、
windows10.qcow2 というファイルが生成された。
(windows10.qcow2_backup はオリジナルとして変更されない。)


○シュリンク処理後の仮想マシンディスクの情報を表示させた。

# qemu-img info windows10.qcow2
image: windows10.qcow2
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 16G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
処理後の物理占有サイズは、16GBである。


(注意)
この後、この仮想マシンのWindowsを起動して、すぐにシャットダウンした。
そして、再度、上記のようにqcow2ディスクイメージの情報を表示させると、
24GBに膨れてしまった。

仮想マシン起動前のファイルサイズの小さいうちに、バックアップをとっておきましょう。
また、別にある仮想マシン設定ファイルもバックアップをとることも忘れずに。




<参考>
(1) Shrink Qcow2 Disk Files
< https://pve.proxmox.com/wiki/Shrink_Qcow2_Disk_Files > 2018年3月6日

(2) How to shrink OpenStack qcow2 image using qemu-img
< http://www.tuxfixer.com/how-to-shrink-openstack-qcow2-image-with-qemu-img/ > 2018年3月6日

(2) SDelete v2.01
< https://docs.microsoft.com/ja-jp/sysinternals/downloads/sdelete > 2018年3月6日