Red Hat Enterprise Linux 7.5 から Virtual Data Optimizer (VDO) が実装されている。
これは重複排除、圧縮、およびシンプロビジョニングの形で、Linux でインラインのデータ削減を行える機能である。
もともとは Permabit 社の Albireo VDO であったが、2017年7月31日に Red Hat が買収したことで取り込まれた。
なお、取り込まれた VDO は、オープンソースになっているようだ。
今回はこの VDO を有効にした EL8 なマシンを作ってみる。
参考にしたドキュメントは、Red Hat Enterprise Linux 8 のドキュメント「ストレージの重複排除および圧縮」。
■マシン構成
- OS: CentOS 8.2
- Memory: 2GB
- Disk: SSD 上に作られた 500GB の VMDK
■パーティション
- 1GiB /boot/efi
- 2GiB /boot
- 50GiB /
- 4GiB swap
- 443GiB [UNASSIGNED]
本来は LVM 上に作るのが良いが、ボリュームが大きくなればなるほど色々負荷が増えそうだったので、今後の拡張は「VDO ボリュームそのものの数を増やす」形で対応することとし、Standard パーティションを採用した。
■CentOS 8.2 のインストール
自分の信じるポリシーに則ってインストールする。
■VDO 関係パッケージのインストール
# yum install vdo kmod-kvdo
■VDO 用パーティションの切り出し
OS インストール時に空き容量を残しているので、そこにパーティションを作ってしまう。
# fdisk -lu /dev/sda Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: D7E8F1B7-40F3-4759-9FEF-1F22C6CF7E50 Device Start End Sectors Size Type /dev/sda1 2048 2099199 2097152 1G EFI System /dev/sda2 2099200 6293503 4194304 2G Linux filesystem /dev/sda3 6293504 111151103 104857600 50G Linux filesystem /dev/sda4 111151104 119539711 8388608 4G Linux swap
Disklabel が GPT なので、5つ以上パーティション作れるし、
500GiB のディスクに対して 57GiB しか使っていないので、400GiB くらいは作れる。
# fdisk /dev/sda Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition number (5-128, default 5): First sector (119539712-1048575966, default 119539712): Last sector, +sectors or +size{K,M,G,T,P} (119539712-1048575966, default 1048575966): Created a new partition 5 of type 'Linux filesystem' and of size 443 GiB. Command (m for help): p Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: D7E8F1B7-40F3-4759-9FEF-1F22C6CF7E50 Device Start End Sectors Size Type /dev/sda1 2048 2099199 2097152 1G EFI System /dev/sda2 2099200 6293503 4194304 2G Linux filesystem /dev/sda3 6293504 111151103 104857600 50G Linux filesystem /dev/sda4 111151104 119539711 8388608 4G Linux swap /dev/sda5 119539712 1048575966 929036255 443G Linux filesystem Command (m for help): w The partition table has been altered. Syncing disks.
sda5 が生まれた。
■永続的な命名属性を探す
とりあえず探す先は /dev/disk/ の中。
# ls -la /dev/disk/*/ /dev/disk/by-id/: total 0 drwxr-xr-x. 2 root root 60 Sep 21 20:52 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 9 Sep 21 20:52 ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001 -> ../../sr0 /dev/disk/by-label/: total 0 drwxr-xr-x. 2 root root 140 Sep 21 20:52 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 10 Sep 22 03:17 boot -> ../../sda2 lrwxrwxrwx. 1 root root 9 Sep 21 20:52 CentOS-8-2-2004-x86_64-dvd -> ../../sr0 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 efi -> ../../sda1 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 root -> ../../sda3 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 swap -> ../../sda4 /dev/disk/by-partlabel/: total 0 drwxr-xr-x. 2 root root 60 Sep 21 20:52 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 10 Sep 22 03:17 'EFI\x20System\x20Partition' -> ../../sda1 /dev/disk/by-partuuid/: total 0 drwxr-xr-x. 2 root root 140 Sep 22 03:17 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 10 Sep 22 03:17 111851b5-2c7c-0340-b9a1-cbfabceecc2d -> ../../sda5 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 7c8cd481-0e2b-4e97-b66f-e3d24af628f9 -> ../../sda4 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 b513a476-829e-42d8-9525-6bcdf4d683ae -> ../../sda3 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 c226f20f-3769-40a7-b063-dda76d91af58 -> ../../sda2 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 ea98214e-2e10-4ad7-9a81-a1c6f8dd2293 -> ../../sda1 /dev/disk/by-path/: total 0 drwxr-xr-x. 2 root root 180 Sep 22 03:17 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 9 Sep 21 20:52 pci-0000:02:03.0-ata-1 -> ../../sr0 lrwxrwxrwx. 1 root root 9 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0 -> ../../sda lrwxrwxrwx. 1 root root 10 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0-part1 -> ../../sda1 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0-part2 -> ../../sda2 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0-part3 -> ../../sda3 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0-part4 -> ../../sda4 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 pci-0000:03:00.0-scsi-0:0:0:0-part5 -> ../../sda5 /dev/disk/by-uuid/: total 0 drwxr-xr-x. 2 root root 140 Sep 21 20:52 . drwxr-xr-x. 8 root root 160 Sep 21 20:52 .. lrwxrwxrwx. 1 root root 10 Sep 22 03:17 08C0-9A79 -> ../../sda1 lrwxrwxrwx. 1 root root 9 Sep 21 20:52 2020-06-08-21-26-15-00 -> ../../sr0 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 293a9f4b-b149-4dd1-9a82-dfc003e231ad -> ../../sda2 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 e02d21ab-dfb3-4aac-8491-eda6a408831d -> ../../sda3 lrwxrwxrwx. 1 root root 10 Sep 22 03:17 f6f6d59e-feb2-4608-89bf-5911a2e3968c -> ../../sda4
sda5 を向いている UUID としては、by-partuuid しかないようだ。
その為今回は、/dev/disk/by-partuuid/111851b5-2c7c-0340-b9a1-cbfabceecc2d を使うこととする。
■VDO ボリュームの作成
# vdo create \ --name=VDO-vol01 \ --device=/dev/disk/by-partuuid/111851b5-2c7c-0340-b9a1-cbfabceecc2d \ --sparseIndex=enabled --indexMem=0.25 \ --vdoLogicalSize=400G Creating VDO VDO-vol01 vdo: ERROR - Kernel module kvdo not installed vdo: ERROR - modprobe: ERROR: could not insert 'kvdo': Required key not available
おや?Red Hat のドキュメント通りに実施しているがエラーになった。
なお、–sparseIndex=enabled –indexMem=0.25 がついているのは、Red Hat の推奨なのでつけている。
物理ボリュームサイズによる VDO 要件の例
推奨される UDS インデックス設定
2TB 以上の VDO ボリュームを作る場合は、UDS インデックスはデフォルトの「Dense」よりも「Sparse」のほうが良いらしい。
また、一般的には、Red Hat は、すべての実稼働環境に sparse の UDS インデックスを使用することを推奨します。ともあった。
■エラーの特定
とりあえずまずは /var/log/messages の確認。
Sep 22 03:28:37 storageserver kernel: device-mapper: uevent: version 1.0.3
Sep 22 03:28:37 storageserver kernel: device-mapper: ioctl: 4.39.0-ioctl (2018-04-03) initialised: dm-devel@redhat.com
Sep 22 03:28:37 storageserver kernel: Lockdown: modprobe: Loading of untrusted modules is restricted; see man kernel_lockdown.7
Sep 22 03:28:37 storageserver vdo[5876]: ERROR - Kernel module kvdo not installed
Sep 22 03:28:37 storageserver vdo[5876]: ERROR - modprobe: ERROR: could not insert 'kvdo': Required key not available
Lockdown という文字が見える。
ログにあるように man kernel_lockdown.7 を見てみたところ、どうやら Secure Boot が有効だと、Kernel Module がロードされないようだ。
KERNEL LOCKDOWN(7) Linux Programmer's Manual KERNEL LOCKDOWN(7) NAME Kernel Lockdown - Kernel image access prevention feature DESCRIPTION The Kernel Lockdown feature is designed to prevent both direct and indirect access to a running kernel image, attempting to protect against unauthorised modification of the kernel image and to prevent access to security and cryptographic data located in kernel memory, whilst still permitting driver modules to be loaded. Lockdown is typically enabled during boot and may be terminated, if configured, by typing a special key combination on a directly attached physical keyboard. If a prohibited or restricted feature is accessed or used, the kernel will emit a message that looks like: Lockdown: X: Y is restricted, see man kernel_lockdown.7 where X indicates the process name and Y indicates what is restricted. On an EFI-enabled x86 or arm64 machine, lockdown will be automatically enabled if the system boots in EFI Secure Boot mode. COVERAGE When lockdown is in effect, a number of features are disabled or have their use restricted. This includes special device files and kernel services that allow direct access of the kernel image: /dev/mem /dev/kmem /dev/kcore /dev/ioports BPF kprobes and the ability to directly configure and control devices, so as to prevent the use of a device to access or modify a kernel image: The use of module parameters that directly specify hardware parameters to drivers through the kernel command line or when loading a module. The use of direct PCI BAR access. The use of the ioperm and iopl instructions on x86. The use of the KD*IO console ioctls. The use of the TIOCSSERIAL serial ioctl. The alteration of MSR registers on x86. The replacement of the PCMCIA CIS. The overriding of ACPI tables. The use of ACPI error injection. The specification of the ACPI RDSP address. The use of ACPI custom methods. Certain facilities are restricted: Only validly signed modules may be loaded (waived if the module file being loaded is vouched for by IMA appraisal). Only validly signed binaries may be kexec'd (waived if the binary image file to be executed is vouched for by IMA appraisal). Unencrypted hibernation/suspend to swap are disallowed as the kernel image is saved to a medium that can then be accessed. Use of debugfs is not permitted as this allows a whole range of actions including direct configuration of, access to and driving of hardware. IMA requires the addition of the "secure_boot" rules to the policy, whether or not they are specified on the command line, for both the builtin and custom policies in secure boot lockdown mode. Linux 2017-10-05 KERNEL LOCKDOWN(7)
CentOS 固有の問題かどうかは後日調べるとして、一旦 VMware ESXi の仮想マシン設定から、Secure Boot を Disable にしてくる。
設定の編集 → 仮想マシンオプション → 起動オプション
UEFI セキュア ブートの有効化:OFF
■VDO ボリューム作成の再実行
# vdo create \ --name=VDO-vol01 \ --device=/dev/disk/by-partuuid/111851b5-2c7c-0340-b9a1-cbfabceecc2d \ --sparseIndex=enabled --indexMem=0.25 \ --vdoLogicalSize=400G Creating VDO VDO-vol01 The VDO volume can address 420 GB in 210 data slabs, each 2 GB. It can grow to address at most 16 TB of physical storage in 8192 slabs. If a larger maximum size might be needed, use bigger slabs. Starting VDO VDO-vol01 Starting compression on VDO VDO-vol01 VDO instance 0 volume is ready at /dev/mapper/VDO-vol01
無事に作成された・w・
■VDO ボリュームのステータス確認
# vdostats Device 1K-blocks Used Available Use% Space saving% /dev/mapper/VDO-vol01 464518124 24413564 440104560 5% N/A # vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/VDO-vol01 443.0G 23.3G 419.7G 5% N/A # fdisk -l Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: D7E8F1B7-40F3-4759-9FEF-1F22C6CF7E50 Device Start End Sectors Size Type /dev/sda1 2048 2099199 2097152 1G EFI System /dev/sda2 2099200 6293503 4194304 2G Linux filesystem /dev/sda3 6293504 111151103 104857600 50G Linux filesystem /dev/sda4 111151104 119539711 8388608 4G Linux swap /dev/sda5 119539712 1048575966 929036255 443G Linux filesystem Disk /dev/mapper/VDO-vol01: 400 GiB, 429496729600 bytes, 104857600 sectors Units: sectors of 1 * 4096 = 4096 bytes Sector size (logical/physical): 4096 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes
vdostats は、VDO が有効になっているパーティションの情報を出すものかな?
ということで、ディスク使用量を監視する際は、VDO ボリュームと VDO が有効になっているパーティションの二つを監視しておく必要があるね・x・。
この辺は、Microsoft Windows Server の重複排除のほうが素直でわかりやすいなーと思う。
NetApp ONTAP の Aggregate と Volume の概念に似てる。
■VDO ボリュームにファイルシステムを作成する
# mkfs.ext4 -E nodiscard /dev/mapper/VDO-vol01 mke2fs 1.45.4 (23-Sep-2019) Creating filesystem with 104857600 4k blocks and 26214400 inodes Filesystem UUID: 6deb8f10-3ee9-468e-866c-a2fda4f1c235 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000 Allocating group tables: done Writing inode tables: done Creating journal (262144 blocks): done Writing superblocks and filesystem accounting information: done
Red Hat のドキュメント通り、ファイルシステム作成時に Discard が実行されないよう、オプションで nodiscard を指定している。
■VDO ボリュームのマウント
# mkdir -p /export/VDO-vol01 # cp -piav /etc/fstab /etc/fstab.org # ls -la /etc/fstab* # echo "/dev/mapper/VDO-vol01 /export/VDO-vol01 ext4 defaults,discard,_netdev,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0" >> /etc/fstab # diff /etc/fstab.org /etc/fstab # mount -a # mount # mount | grep VDO-vol01 /dev/mapper/VDO-vol01 on /export/VDO-vol01 type ext4 (rw,relatime,seclabel,discard,_netdev,x-systemd.device-timeout=0) # df -m /export Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/VDO-vol01 402148 73 381580 1% /export/VDO-vol01
システム起動時に自動的にマウントさせる場合、/etc/fstab に追記する。ただし、VDO ボリュームの場合、vdo.service が起動する前にはマウントすることができないため、上記のように requires=vdo を付与する必要がある。
参考:VDO ボリュームのマウント
また、ファイル削除したときに、ブロックの解放が実行されるよう、discard オプションを付けてマウント。
Red Hat のドキュメントにあるように、VDO は Discard によるブロック破棄が必須のようだ。そりゃそうしないと不要になった実使用ブロックがいつまでも解放されないしね。
※ファイル消去するたびに Discard が走るので、不要となった実使用データが即座に開放されます。
■初回ブロック破棄(discard)の実施
# fstrim -av
/export/VDO-vol01: 392.7 GiB (421606600704 bytes) trimmed
かかる時間は CPU の性能に左右されます。
■定期的なブロック破棄(discard)の有効化
# systemctl enable --now fstrim.timer
これを仕込むことで、/usr/sbin/fstrim -av が週に一度動くようになる。
■重複排除の試験
# dd if=/dev/zero of=/export/zero.dat bs=1M oflag=direct status=progress 420856463360 bytes (421 GB, 392 GiB) copied, 452 s, 931 MB/s dd: error writing '/export/zero.dat': No space left on device 402060+0 records in 402059+0 records out 421589417984 bytes (422 GB, 393 GiB) copied, 452.864 s, 931 MB/s # df -m /export Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/VDO-vol01 402148 4021320 100% /export # vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/VDO-vol01 443.0G 23.8G 419.2G 5% 99%
間違いなくインライン重複排除が有効になっている。
■VDO ボリュームの拡張(とファイルシステムの拡張)
# fdisk -l /dev/mapper/VDO-vol01 Disk /dev/mapper/VDO-vol01: 400 GiB, 429496729600 bytes, 104857600 sectors Units: sectors of 1 * 4096 = 4096 bytes Sector size (logical/physical): 4096 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes # vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/VDO-vol01 443.0G 23.8G 419.2G 5% 99% # df -m /export Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/VDO-vol01 402148 402132 0 100% /export # vdo growLogical --name=VDO-vol01 \ --vdoLogicalSize=1T # fdisk -l /dev/mapper/VDO-vol01 Disk /dev/mapper/VDO-vol01: 1 TiB, 1099511627776 bytes, 268435456 sectors Units: sectors of 1 * 4096 = 4096 bytes Sector size (logical/physical): 4096 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes # vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/VDO-vol01 443.0G 23.8G 419.2G 5% 99% # resize2fs /dev/mapper/VDO-vol01 resize2fs 1.45.4 (23-Sep-2019) Filesystem at /dev/mapper/VDO-vol01 is mounted on /export; on-line resizing required old_desc_blocks = 50, new_desc_blocks = 128 The filesystem on /dev/mapper/VDO-vol01 is now 268435456 (4k) blocks long. # df -m /export Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/VDO-vol01 1031095 402130 582891 41% /export # vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/VDO-vol01 443.0G 23.8G 419.2G 5% 99%
なお、上記作業時のログは次の通り。
Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: Using write policy sync automatically. Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: preparing to modify device 'VDO-vol01' Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: Preparing to resize logical to 268435456 Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: Done preparing to resize logical Sep 22 07:06:42 storageserver dmeventd[1373]: No longer monitoring VDO pool VDO-vol01. Sep 22 07:06:42 storageserver UDS/vdodmeventd[78937]: INFO (vdodmeventd/78937) VDO device VDO-vol01 is now unregistered from dmeventd Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: suspending device 'VDO-vol01' Sep 22 07:06:42 storageserver kernel: kvdo0:packerQ: compression is disabled Sep 22 07:06:42 storageserver kernel: kvdo0:packerQ: compression is enabled Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: device 'VDO-vol01' suspended Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: resuming device 'VDO-vol01' Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: Resizing logical to 268435456 Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: Logical blocks now 268435456 Sep 22 07:06:42 storageserver kernel: kvdo0:dmsetup: device 'VDO-vol01' resumed Sep 22 07:06:42 storageserver UDS/vdodmeventd[78943]: INFO (vdodmeventd/78943) VDO device VDO-vol01 is now registered with dmeventd for monitoring Sep 22 07:06:42 storageserver lvm[1373]: Monitoring VDO pool VDO-vol01. Sep 22 07:07:57 storageserver kernel: EXT4-fs (dm-0): resizing filesystem from 104857600 to 268435456 blocks Sep 22 07:07:58 storageserver kernel: EXT4-fs (dm-0): resized filesystem to 268435456
ピンバック: おうち VMware ESXi 7.0 は HCI の夢を見るか | まこぴかっと
ピンバック: Hyper-V のホストサーバ上に All Flash でインライン重複排除ができるストレージサーバを作る | まこぴかっと