RHEL9 におけるストレージ機能 VDO の使い方

# はじめに
本記事は RHCSA 試験対策として RHEL9 におけるストレージ機能 VDO の使い方を紹介しています。

私は RHCSA 認定試験 (EX200) を受験のため、現在は絶賛勉強中です。
2022年12月時点では RHEL8 または RHEL9 を選択でき、私は RHEL9 で受験予定です。

https://www.redhat.com/ja/services/training/ex200-red-hat-certified-system-administrator-rhcsa-exam

# VDO (Virtual Data Optimizer) 機能とは

[Red Hat による VDO の記述](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/deduplicating_and_compressing_logical_volumes_on_rhel/introduction-to-vdo-on-lvm_deduplicating-and-compressing-logical-volumes-on-rhel)を引用します。

> VDO (Virtual Data Optimizer) 機能は、ストレージ用にインラインのブロックレベルの重複排除、圧縮、およびシンプロビジョニングを提供します。

RHEL8 までは VDO 機能は Python ベースの管理ソフトウェアが提供されていました。
Qiita でもその記述があり、RHEL9 でも同様に vdo コマンドで勉強しようとしていました。

https://qiita.com/lab8010/items/4388a6ac6119f4a0f726

実際に RHEL9 で vdo をインストールしてから vdo コマンドを打ってみると、エラーが返ってきました。

```
[root@servera ~]# dnf install vdo kmod-kvdo
...
Complete!
[student@servera ~]$ vdo
bash: vdo: command not found...
```

# RHEL9 における VDO 機能

調べてみると、Red Hat に記載があり、RHEL9 では vdo コマンドは廃止となり、lvm で使用・管理するようです。

> VDO Management ソフトウェアが削除
> python ベースの VDO Management ソフトウェアは、RHEL 9 では利用できなくなりました。このソフトウェアの代わりに、LVM-VDO 実装を使用して VDO ボリュームを管理します。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html-single/considerations_in_adopting_rhel_9/index

せっかくなので lvm-vdo 実装での VDO 作成を試してみました。

# RHEL9 における VDO ボリュームの作成

VirtualBox 上に RHEL9.1 の仮想マシンを作成しました。
VDO 検証用に 5GB のストレージを /dev/sdb として追加しました。
まずは /dev/sdb を LVM として設定しました。

```
[root@servera ~]# parted /dev/sdb p
Error: /dev/sdb: unrecognised disk label
Model: ATA VBOX HARDDISK (scsi)                                           
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags: 

[root@servera ~]# parted /dev/sdb mklabel gpt

[root@servera ~]# parted /dev/sdb mkpart primary xfs 0% 100%

[root@servera ~]# parted /dev/sdb set 1 lvm on

[root@servera ~]# parted /dev/sdb p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  5368MB  5367MB               primary  lvm
```

/dev/sdb1 を物理ボリューム (PV) にし、ボリュームグループ vg0 を作成しました。

```
[root@servera ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@servera ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb1       lvm2 ---  <5.00g <5.00g

[root@servera ~]# vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created
[root@servera ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg01   1   0   0 wz--n- <5.00g <5.00g
```

vg0 をまるまる VDO の論理ボリューム(LV) vdo01として作成しました。
VDO は最小サイズがデフォルト設定だと 4.7GB らしいのでギリギリでした。。。
VDO は lvcreate コマンドの --type オプションで vdo を指定します。
VDO ボリュームを作成すると、vpool0 の VDO　プールが作られました。

```
[root@servera ~]# lvcreate --type vdo -n vdo01 -l 100%FREE vg01
    Logical blocks defaulted to 523108 blocks.
    The VDO volume can address 2 GB in 1 data slab.
    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.
  Logical volume "vdo01" created.
[root@servera ~]# lvs
  LV     VG   Attr       LSize  Pool   Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   rhel -wi-ao---- <9.21g                                                      
  swap   rhel -wi-ao----  1.20g                                                      
  vdo01  vg01 vwi-a-v---  1.99g vpool0        0.00                                   
  vpool0 vg01 dwi------- <5.00g               60.00   
```

あとはファイルフォーマットしてからマウントすれば認識しました。

```
root@servera ~]# mkfs.xfs /dev/vg01/vdo01 
meta-data=/dev/vg01/vdo01        isize=512    agcount=4, agsize=130560 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=522240, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.

[root@servera ~]# mkdir /vdo01
[root@servera ~]# mount /dev/vg01/vdo01 /vdo01

[root@servera ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                4.0M     0  4.0M   0% /dev
tmpfs                   976M     0  976M   0% /dev/shm
tmpfs                   391M  5.8M  385M   2% /run
/dev/mapper/rhel-root   9.2G  4.4G  4.9G  47% /
/dev/sda2              1014M  242M  773M  24% /boot
/dev/sda1               599M  7.0M  592M   2% /boot/efi
tmpfs                   196M   40K  195M   1% /run/user/1000
/dev/mapper/vg01-vdo01  2.0G   47M  2.0G   3% /vdo01
```

/etc/fstab は通常のファイルシステムの記載で再起動後も自動マウントされました。
RHEL8 だと x-systemd.requires=vdo.service みたいな呪文が必要でしたが、不要なようです。

```
[student@servera ~]$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Nov 20 09:56:11 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
...
/dev/mapper/vg01-vdo01	/vdo01			xfs	defaults	0 0
```

# まとめ

RHCSA試験対策として、RHEL9における LVM-VDO 実装の使い方を紹介しました。
試験対策のため、容量削減率の確認とかはしていませんが、性能が良くなっているんでしょうか。
RHEL8 から RHEL9 になって多少機能が変わっているようなので難しいですね。