VDOとは?

VDOはRHEL 7.5から導入されたcompressionとdeduplicationを提供するパッケージ。ブロックストレージとファイルシステムの間で動作するため、xfsやext4などのファイルシステムでもZFSのような一部機能が実現可能になる。

ドキュメント

Redhatのカスタマーポータルサイトに詳しい情報が記載されています。
今回はこちらを参考にします。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/vdo-quick-start external_link

VDOの導入

yum install vdo kmod-kvdo

これだけ。

VDOボリュームの作成

Redhatのガイド(上のURL)に従って、VDOボリュームを作成します。

vdo create --name=vol_vdotest --device=/dev/disk/by-path/pci-0000\:00\:10.0-scsi-0\:0\:1\:0 --vdoLogicalSize=50G Creating VDO vol_vdotest vdo: ERROR - Kernel module kvdo not installed vdo: ERROR - modprobe: FATAL: Module kvdo not found.

あれ?「Module kvdo not found.」ってことは…インストールしてからOSまだ再起動していませんでしたね…
再起動してもう一度トライ。

vdo create --name=vol_vdotest --device=/dev/disk/by-path/pci-0000\:00\:10.0-scsi-0\:0\:1\:0 --vdoLogicalSize=50G Creating VDO vol_vdotest Starting VDO vol_vdotest Starting compression on VDO vol_vdotest VDO instance 0 volume is ready at /dev/mapper/vol_vdotest

作成したVDOデバイスの状態を見てみます。vdostatsコマンドを使用します。

# vdostats Device 1K-blocks Used Available Use% Space saving% /dev/mapper/vdovolume 244197540 3187900 241009640 1% N/A

vdostatsコマンドに、--human-readable オプションをつけると、少し見やすくなります。

# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdovolume 232.9G 3.0G 229.8G 1% N/A

作成したVDOデバイスをxfsでフォーマットします。
パーティション分割してもよいですが、今回はテストなのと、将来的にこのデバイスをLVMのPVとして使用することを考え、単一のボリュームとして構築を進めます。

VDOボリュームをxfsでフォーマット

mkfs.xfs -K /dev/mapper/vol_vdotest

マウントポイント/vdoを作成して、/dev/mapper/vol_vdotest をマウントします。

mount -o "discard" /dev/mapper/vol_vdotest /vdo

マウントオプションの"discard"については、ブロックデバイスの破棄操作を有効にしています。
これは、「ファイルシステムの基礎となるブロックデバイスは、物理的な破棄操作に対応している必要があります。」というVDOの要件によるものです。
これをしないと、手動で使用されていないブロックの破棄を手動で行う必要が出てきます。

マウントオプションのdiscardが有効になっていることを確認します。

mount | grep "vol_vdotest" /dev/mapper/vol_vdotest on /vdo type xfs (rw,relatime,seclabel,attr2,discard,inode64,noquota)

マウントオプションのdiscardが有効になっていることを確認します。

/vdo直下に1GBのテストファイル(0埋め)を作成してみます。

dd if=/dev/zero of=/vdo/test_zero1g.dat bs=1M count=1024

/vdo直下に1GBのテストファイル(ランダムデータ)を作成してみます。

dd if=/dev/urandom of=/vdo/test_rand1g.dat bs=1M count=1024

ファイルが正しく作成されていることを確認します。

ls -l -rw-r--r--. 1 root root 1073741824 8月 4 16:26 test_rand1g.dat -rw-r--r--. 1 root root 1073741824 8月 4 16:25 test_zero1g.dat

書き込みには問題なさそうなので、重複排除の状態を確認します。

[root@host185 vdo]# vdostats Device 1K-blocks Used Available Use% Space saving% /dev/mapper/vol_vdotest 16777216 13101304 3675912 78% 12% [root@host185 vdo]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vol_vdotest 16.0G 12.5G 3.5G 78% 12%

データの12%が重複として除外されているようです。0埋めデータとランダムデータなのでこんなものでしょうか。

次は、読み書きのパフォーマンスを確認してみようと思います。