[Exadata] KVMゲストの/u01拡張

# はじめに
Exadata X8M-2のOracle Linux KVMゲストの/u01のファイルシステムを拡張した際の手順を共有します。

# 環境
### KVMホスト(kvm01)
Kernel version: 4.14.35-1902.5.1.4.el7uek.x86_64 #2 SMP Wed Oct 9 19:29:16 PDT 2019 x86_64
Image kernel version: 4.14.35-1902.5.1.4.el7uek
Image version: 19.3.2.0.0.191119

### KVMゲスト(guest01)
Kernel version: 4.14.35-1902.5.1.4.el7uek.x86_64 #2 SMP Wed Oct 9 19:29:16 PDT 2019 x86_64
Image kernel version: 4.14.35-1902.5.1.4.el7uek
Image version: 19.3.2.0.0.191119


# 事前確認
KVMゲスト環境の/u01の使用量を確認します。
下記の通り、空き領域が、`3.1G`と心許ない状況です。
```
[root@guest01 ~]# df -h /u01
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VGExaDb-LVDbOra1   20G   17G  3.1G  85% /u01
```

現在の論理ボリューム構成を確認します。20GBである事が確認できます。
```
[root@guest01 ~]# lvs -o lv_name,lv_path,vg_name,lv_size /dev/VGExaDb/LVDbOra1
  LV       Path                  VG      LSize
  LVDbOra1 /dev/VGExaDb/LVDbOra1 VGExaDb 20.00g
```

ボリュームグループVGExaDbの使用可能な領域を確認します。
```
[root@guest01 ~]# vgdisplay VGExaDb -s
  "VGExaDb" 99.24 GiB [98.25 GiB used / 1016.00 MiB free]
```
`1016.00 MiB free`となっており、拡張可能な領域が無いため、LVMディスクをOracle Linux KVMゲストに追加し、ゲストで使用可能なディスク領域の量を増やします。

# 新規LVMディスクの追加
KVMホストにて `/EXAVMIMAGES` の空き領域を確認します。
```
[root@kvm01 ~]# df -h /EXAVMIMAGES
Filesystem                           Size  Used Avail Use% Mounted on
/dev/mapper/VGExaDb-LVDbExaVMImages  1.5T  890G  611G  60% /EXAVMIMAGES
```

20GBの新しいディスクイメージを作成してゲストにアタッチします。
```
[root@kvm01 ~]# /opt/exadata_ovm/vm_maker --create --disk-image /EXAVMIMAGES/GuestImages/guest01/pv2_vgexadb.img --size 20G --attach --domain guest01
[ERROR] Image file pv2_vgexadb.img must be located in /EXAVMIMAGES
```
::: note warn
想定外のエラーが発生しました。/EXAVMIMAGES の下に格納しないと駄目なようです。
:::

仕方がないため、EXAVMIMAGESの下に作成します。
```
[root@kvm01 ~]# /opt/exadata_ovm/vm_maker --create --disk-image /EXAVMIMAGES/pv2_vgexadb.img --size 20G
[INFO] Allocating an image for /EXAVMIMAGES/pv2_vgexadb.img, size 20.000000G...
[INFO] Running 'qemu-img create /EXAVMIMAGES/pv2_vgexadb.img 20.000000G '...
[INFO] Create label gpt on /EXAVMIMAGES/pv2_vgexadb.img.
[INFO]  Running 'parted -a none -s /EXAVMIMAGES/pv2_vgexadb.img mklabel gpt'...
[INFO] Running 'losetup -P -f /EXAVMIMAGES/pv2_vgexadb.img'...
[INFO] Finding loop device...
[INFO]   loop device is /dev/loop0
[INFO] Finding number of sectors...
[INFO]   41943040 sectors
[INFO] Releasing loop device /dev/loop0...
[INFO]   Removing device maps for /dev/loop0...
[INFO]    Running 'kpartx -d -v /dev/loop0'...
[INFO]  Removing loop device /dev/loop0...
[INFO] ##
[INFO] ## Finished .
[INFO] ##
[INFO] Created image /EXAVMIMAGES/pv2_vgexadb.img
```

作成したディスクイメージをアタッチします。
```
[root@kvm01 ~]# /opt/exadata_ovm/vm_maker --attach --disk-image /EXAVMIMAGES/pv2_vgexadb.img --domain guest01
[INFO] File /EXAVMIMAGES/GuestImages/guest01/pv2_vgexadb.img is a reflink from /EXAVMIMAGES/pv2_vgexadb.img and added as disk to domain guest01
[INFO] -------- MANUAL STEPS TO BE COMPLETED FOR MOUNTING THE DISK WITHIN DOMU guest01 --------
[INFO] 1. Check a disk with name /dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk exists.
[INFO] -  Run the command 'lvdisplay' to verify a disk with name '/dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk'  exists.
[INFO] 2. Create a directory that will to be used for mounting the new disk.
[INFO] 3. Add the following line to /etc/fstab: /dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk <mount_point_from_step_2> <fstype> defaults 1 1
[INFO] 4. Mount the newly added disk to mount point through the command: mount -a.
```

新規ディスクイメージがアタッチされたことを確認します。
下記の通り、pv2_vgexadb.img がアタッチされていることが確認できます。
```
[root@kvm01 ~]# /opt/exadata_ovm/vm_maker --list --disk-image --domain guest01
File /EXAVMIMAGES/GuestImages/guest01/System.img
File /EXAVMIMAGES/GuestImages/guest01/grid19.9.0.0.201020.img
File /EXAVMIMAGES/GuestImages/guest01/db19.9.0.0.201020_3.img
File /EXAVMIMAGES/GuestImages/guest01/pv1_vgexadb.img
File /EXAVMIMAGES/GuestImages/guest01/pv2_vgexadb.img
```

ゲスト側にて、新しく追加されたディスクを `lvdisplay` コマンドを使用して確認します。
```
[root@guest01 ~]# lvdisplay /dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk
  --- Logical volume ---
  LV Path                /dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk
  LV Name                LVDBDisk
  VG Name                VGExaDbDisk.pv2_vgexadb.img
  LV UUID                vHqfHY-ArJn-lsiP-duXJ-Vc0x-Sagh-ZbxG3J
  LV Write Access        read/write
  LV Creation host, time kvm01, 2023-06-13 13:25:41 +0900
  LV Status              available
  # open                 0
  LV Size                <20.00 GiB
  Current LE             5119
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:19
```

追加したディスク用に作成された論理ボリュームを削除し、空き領域を作ります。
```
[root@guest01 ~]# lvremove /dev/VGExaDbDisk.pv2_vgexadb.img/LVDBDisk
Do you really want to remove active logical volume VGExaDbDisk.pv2_vgexadb.img/LVDBDisk? [y/n]: y
  Logical volume "LVDBDisk" successfully removed
```

続いて、ボリューム・グループを削除します。
```
[root@guest01 ~]# vgremove VGExaDbDisk.pv2_vgexadb.img
  Volume group "VGExaDbDisk.pv2_vgexadb.img" successfully removed
```

`pvdisplay`コマンドを使用して、新しい物理ボリュームを確認します。
```
[root@guest01 ~]# pvdisplay
(省略)
 "/dev/sdv1" is a new physical volume of "<20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdv1
  VG Name
  PV Size               <20.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               w3g5wH-wPcz-VAUY-auhn-WecG-Mliu-KMCW7w
```

ボリューム・グループを拡張します。
```
[root@guest01 ~]# vgextend VGExaDb /dev/sdv1
  Volume group "VGExaDb" successfully extended
```

拡張後の空き領域を確認します。下記の通り、`20GB`の空き領域が確認できます。
```
[root@guest01 ~]# vgdisplay -s
  "VGExaDb" <119.24 GiB [98.25 GiB used / <20.99 GiB free]
  "VGExaDbDisk.db-klone-Linux-x86-64-19000201020.50.img" <50.00 GiB [<50.00 GiB used / 0    free]
  "VGExaDbDisk.grid-klone-Linux-x86-64-19000201020.50.img" <50.00 GiB [<50.00 GiB used / 0    free]
```

論理ボリュームを、`lvextend` コマンドにて拡張します。
```
[root@guest01 ~]# lvextend -L +20G /dev/VGExaDb/LVDbOra1
  Size of logical volume VGExaDb/LVDbOra1 changed from 20.00 GiB (5120 extents) to 40.00 GiB (10240 extents).
  Logical volume VGExaDb/LVDbOra1 successfully resized.
```

`xfs_growfs`コマンドを使用して、パーティションのサイズを変更します。
```
[root@guest01 ~]# xfs_growfs /u01
meta-data=/dev/mapper/VGExaDb-LVDbOra1 isize=256    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0 rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5242880 to 10485760
```

dfコマンドを使用して、領域が拡張されたことを確認します。
空きが、`24G`になりました。
```
# df -h /u01
[root@guest01 ~]# df -h /u01
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VGExaDb-LVDbOra1   40G   17G   24G  41% /u01
```

# 参考資料
[Oracle® Exadata Database Machineメンテナンス・ガイド](https://docs.oracle.com/cd/F47141_01/dbmmn/index.html)