下記の環境で試しています。
- centos-release-7-2.1511.el7.centos.2.10.x86_64
- kernel-3.10.0-327.10.1.el7.x86_64
- qemu-kvm-1.5.3-105.el7_2.3.x86_64
- libvirt-1.2.17-13.el7_2.3.x86_64
下記の記事などを参考にやってみました。
- http://blog.widodh.nl/2015/12/using-trimdiscard-with-ceph-rbd-and-libvirt/
- http://dustymabe.com/2013/06/11/recover-space-from-vm-disk-images-by-using-discardfstrim/
- http://seesaawiki.jp/w/kou1okada/d/libvirt
ゲストの設定の編集を開始します。
virsh edit GUEST
scsi controller を追加します(既にあるなら不要です)。
<controller type='scsi' model='virtio-scsi' index='0'/>
ディスクの設定を変更します。
<disk type='block' device='disk'>
<driver name='qemu' type='raw' discard='unmap'/>
<source dev='/dev/vg1/guest.img'/>
<target dev='sda' bus='scsi'/>
</disk>
-
<target/>
をdev='sda' bus='scsi'
に変更する -
<driver/>
にdiscard='unmap'
を追記する -
<address/>
は削除する
変更を保存して、ゲストを開始します。
virsh start GUEST
virsh console GUEST
fstrim してみます。
fstrim -a -v
TRIM されました。
/: 3.2 GiB (3422597120 bytes) trimmed
なお、元のゲストのディスクが virtio で接続されていた場合はディスクデバイスの名前が /dev/vda
から /dev/sda
に変わりますのでご注意ください。
ホストで SystemTap で TRIM を確認
下記の記事の通りの方法で、ホスト側で SystemTap を使って、ゲストで fstrim したときに実際に TRIM されていることを確認してみました。
ホスト側で次の通り準備します。
yum install systemtap \
kernel-devel-$(uname -r) \
kernel-headers-$(uname -r)
debuginfo-install kernel-$(uname -r)
cat <<'EOS'> /tmp/discard.stp
probe kernel.function("blkdev_issue_discard").return {
printf("%s, sector=%d, nr_sects=%d, return=%d (%d - %d KiB)\n",
execname(), $sector, $nr_sects, $return,
$sector / 2, ($sector + $nr_sects) / 2 - 1);
}
EOS
stap -v /tmp/discard.stp
上がゲストで下がホストです。