Enterprise Linux で重複排除を使ってみる

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
カテゴリー: めも パーマリンク

2 Responses to Enterprise Linux で重複排除を使ってみる

  1. ピンバック: おうち VMware ESXi 7.0 は HCI の夢を見るか | まこぴかっと

  2. ピンバック: Hyper-V のホストサーバ上に All Flash でインライン重複排除ができるストレージサーバを作る | まこぴかっと

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です