オンラインでRedHatのLVMを拡張する

# はじめに
Azure上のRedHatに構成されてるLVMのディスクをオンライン状態で拡張しました。
Linuxを理解できてる人には簡単なんだろうけど、<br>UNIX系のVM触ると10回に1回ぐらいはVMを破壊して起動できなくしてしまう私にはまだまだ難しい...（笑）<br>ということで備忘録。

# 環境
* Azure上のVM
* RedHat8.6

※拡張はrootユーザで行う必要があります。作業前に`sudo su -`でrootにスイッチしてください。

# 目次
[1.新規ディスクを追加する場合](#1-新規ディスクを追加する場合)
[2.既存ディスクを拡張する場合](#2-既存ディスクを拡張する場合)

# 1. 新規ディスクを追加する場合
既存ディスクのサイズは変更せず、新規にディスクを追加してLVMを拡張します。

1. Azure上でディスクを追加
   Azure Portalにログインして、ディスクを拡張したいVMの「ディスク」画面から新規ディスクを追加します。
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/38915ab3-2e44-60ea-ffc4-8b8b2ed40b6f.jpeg)

1. 対象VMにSSH接続（TeraTerm等で接続）

1. 追加したディスクを確認
   ```
   [localadmin@test-rhel86vm2 ~]$ lsblk
   NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
   sda                     8:0    0   64G  0 disk 
    sda1                  8:1    0  500M  0 part /boot
    sda2                  8:2    0   63G  0 part 
      rootvg-tmplv      253:5    0    2G  0 lvm  /tmp
      rootvg-usrlv      253:6    0   10G  0 lvm  /usr
      rootvg-homelv     253:7    0    1G  0 lvm  /home
      rootvg-varlv      253:8    0    8G  0 lvm  /var
      rootvg-rootlv     253:9    0   42G  0 lvm  /
     sda14                 8:14   0    4M  0 part 
     sda15                 8:15   0  495M  0 part /boot/efi
   sdb                     8:16   0  300G  0 disk 
     sdb1                  8:17   0  300G  0 part /mnt
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sdm                     8:192  0  256G  0 disk   #　←今回の新規追加したディスク
   ```
1. 追加したディスクをアクティブ化
   ```
   [root@test-rhel86vm2 ~]# parted -s -a optimal /dev/sdm -- mklabel gpt mkpart primary 1 -1 set 1 lvm on
   #　特にエラー等が表示されず、コマンドが返ってこれば成功
   ```
1. 物理ボリュームを作成
   ```
   [root@test-rhel86vm2 ~]# pvcreate /dev/sdm1
     Physical volume "/dev/sdm1" successfully created.
   ```

1. 既存のボリュームグループに作成した物理ボリュームを追加
   ```
   [root@test-rhel86vm2 ~]# vgextend <物理ボリュームを追加するvg名> /dev/sdm1
     Volume group "hanavg" successfully extended

   [root@test-rhel86vm2 ~]# vgs
     VG       #PV #LV #SN Attr   VSize    VFree
     hanavg     8   2   0 wz--n-   <2.00t 1.12t　←　追加したvgに空きスペースが作成されることを確認
     mediavg    1   1   0 wz--n- <512.00g    0 
     rootvg     1   5   0 wz--n-  <63.02g    0 
     sharedvg   1   1   0 wz--n- <512.00g    0 
     usrsapvg   1   1   0 wz--n-  <64.00g    0 
   ```

1. LVMを拡張
   ```
   # 追加する容量をGB単位で指定
   [root@test-rhel86vm2 ~]# lvextend -i1 -L +768G <拡張するLVM>
     Size of logical volume hanavg/datalv changed from 511.98 GiB (131068 extents) to <1.25 TiB (327676 extents).
     Logical volume hanavg/datalv successfully resized.
   
   [root@test-rhel86vm2 ~]# lvs
     LV       VG       Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
     datalv   hanavg   -wi-ao----   <1.25t  ←　指定したLVMが拡張されていることを確認                                                    
     loglv    hanavg   -wi-ao---- <383.99g                                                    
     medialv  mediavg  -wi-ao---- <512.00g                                                    
     homelv   rootvg   -wi-ao----    1.00g                                                    
     rootlv   rootvg   -wi-ao----  <42.02g                                                    
     tmplv    rootvg   -wi-ao----    2.00g                                                    
     usrlv    rootvg   -wi-ao----   10.00g                                                    
     varlv    rootvg   -wi-ao----    8.00g                                                    
     sharedlv sharedvg -wi-ao---- <512.00g                                                    
     usrsaplv usrsapvg -wi-ao----  <64.00g                                                    

   ```
 
1. ファイルシステムを拡張
   ```
   [root@test-rhel86vm2 ~]# xfs_growfs /dev/hanavg/datalv
   meta-data=/dev/mapper/hanavg-datalv isize=512    agcount=16, agsize=8388288 blks
            =                       sectsz=4096  attr=2, projid32bit=1
            =                       crc=1        finobt=1, sparse=1, rmapbt=0
            =                       reflink=1    bigtime=0 inobtcount=0
   data     =                       bsize=4096   blocks=134212608, imaxpct=25
            =                       sunit=64     swidth=256 blks
   naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
   log      =internal log           bsize=4096   blocks=65533, version=2
            =                       sectsz=4096  sunit=1 blks, lazy-count=1
   realtime =none                   extsz=4096   blocks=0, rtextents=0
   data blocks changed from 134212608 to 335540224
   ```

ここまでやって、dfコマンドを実行したらディスクが拡張されてることが確認できました。
   ```
   [root@test-rhel86vm2 ~]# df -Th
   Filesystem                    Type      Size  Used Avail Use% Mounted on
   devtmpfs                      devtmpfs  252G     0  252G   0% /dev
   tmpfs                         tmpfs     252G     0  252G   0% /dev/shm
   tmpfs                         tmpfs     252G  9.0M  252G   1% /run
   tmpfs                         tmpfs     252G     0  252G   0% /sys/fs/cgroup
   /dev/mapper/rootvg-rootlv     xfs        43G  368M   42G   1% /
   /dev/mapper/rootvg-usrlv      xfs        10G  1.9G  8.2G  19% /usr
   /dev/mapper/rootvg-homelv     xfs      1014M   40M  975M   4% /home
   /dev/mapper/rootvg-tmplv      xfs       2.0G   47M  2.0G   3% /tmp
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   /dev/mapper/hanavg-datalv     xfs       1.3T  518G  763G  41% /hana/data ← 拡張したディスク（Sizeが増えます）
   /dev/sdb1                     ext4      2.0T  2.1G  1.9T   1% /mnt
   ```

# 2. 既存ディスクを拡張する場合
今度は新規ディスクの追加ではなく、既存ディスクを拡張してLVMを拡張します。
※Azureの仕様上、OSディスクはオフライン状態でないと拡張できないので、<br>本手順はOSディスク以外を拡張する場合です。

1. Azure上でディスクを拡張
   Azure Portalにログインして、ディスクを拡張したいVMの「ディスク」画面から既存ディスクを拡張します。
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/d77b16b6-1286-776c-c435-d769cafe0dff.jpeg)

1. 対象VMにSSH接続

1. 拡張したディスクをOS上のディスク情報に反映
   ```
   [root@test-rhel86vm2]# echo 1 > /sys/block/sdX/device/rescan
   # sdXの"X"は拡張したディスクデバイスを指定
   ```
1. 拡張したディスクを確認 
    ```
   [root@test-rhel86vm2 ~]# lsblk
   NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
   sda                     8:0    0   64G  0 disk 
     sda1                  8:1    0  500M  0 part /boot
     sda2                  8:2    0   63G  0 part 
       rootvg-tmplv      253:5    0    2G  0 lvm  /tmp
       rootvg-usrlv      253:6    0   10G  0 lvm  /usr
       rootvg-homelv     253:7    0    1G  0 lvm  /home
       rootvg-varlv      253:8    0    8G  0 lvm  /var
       rootvg-rootlv     253:9    0   42G  0 lvm  /
     sda14                 8:14   0    4M  0 part 
     sda15                 8:15   0  495M  0 part /boot/efi
   sdb                     8:16   0    2T  0 disk 
     sdb1                  8:17   0    2T  0 part /mnt
   sdc                     8:32   0  256G  0 disk             ←　rescan実行後に拡張したdiskのSIZEが増える
     sdc1                  8:33   0  128G  0 part 
       hanavg-datalv     253:3    0  512G  0 lvm  /hana/data
   ```

1. パーティション再作成
`gdisk`で対象ディスクに接続後は、`d`で削除→`n`で再作成→`w`で上書き保存です。<br>`p`でパーティションが確認できます。

   ```
   [root@test-rhel86vm2 ~]# gdisk /dev/sdc
   GPT fdisk (gdisk) version 1.0.3

   Partition table scan:
     MBR: protective
     BSD: not present
     APM: not present
     GPT: present

   Found valid GPT with protective MBR; using GPT.

   Command (? for help): p   # 現状のパーティションの確認
   Disk /dev/sdc: 536870912 sectors, 256.0 GiB
   Model: Virtual Disk    
   Sector size (logical/physical): 512/4096 bytes
   Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX
   Partition table holds up to 128 entries
   Main partition table begins at sector 2 and ends at sector 33
   First usable sector is 34, last usable sector is 536870878
   Partitions will be aligned on 2048-sector boundaries
   Total free space is 268439485 sectors (128.0 GiB)

   Number  Start (sector)    End (sector)  Size       Code  Name
      1            2048       268433407   128.0 GiB   8E00  primary

   Command (? for help): d   # パーティションを削除（作成前に上書き保存しない限りはOS上では削除されません）
   Using 1

   Command (? for help): n   # パーティションを再作成
   Partition number (1-128, default 1): 
   First sector (34-536870878, default = 2048) or {+-}size{KMGTP}: 
   Last sector (2048-536870878, default = 536870878) or {+-}size{KMGTP}: 
   Current type is 'Linux filesystem'
   Hex code or GUID (L to show codes, Enter = 8300): 8e00 # LVMを指定
   Changed type of partition to 'Linux LVM'

   Command (? for help): p   # パーティションを確認
   Disk /dev/sdc: 536870912 sectors, 256.0 GiB
   Model: Virtual Disk    
   Sector size (logical/physical): 512/4096 bytes
   Disk identifier (GUID): 508E4F5E-D05B-479C-AF20-8A655EA6D22C
   Partition table holds up to 128 entries
   Main partition table begins at sector 2 and ends at sector 33
   First usable sector is 34, last usable sector is 536870878
   Partitions will be aligned on 2048-sector boundaries
   Total free space is 2014 sectors (1007.0 KiB)

   Number  Start (sector)    End (sector)  Size       Code  Name
      1            2048       536870878   256.0 GiB   8E00  Linux LVM  ← Sizeが拡張されていることを確認

   Command (? for help): w   # 上書き保存

   Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
   PARTITIONS!!

   Do you want to proceed? (Y/N): y　# yを入力して確定
   OK; writing new GUID partition table (GPT) to /dev/sdc.
   Warning: The kernel is still using the old partition table.
   The new table will be used at the next reboot or after you
   run partprobe(8) or kpartx(8)
   The operation has completed successfully.
   ```

1. 再作成したパーティション情報を反映
   ```
   [root@test-rhel86vm2 ~]# sudo partprobe

   [root@test-rhel86vm2 ~]# lsblk
   NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
   sda                     8:0    0   64G  0 disk 
     sda1                  8:1    0  500M  0 part /boot
     sda2                  8:2    0   63G  0 part 
       rootvg-tmplv      253:5    0    2G  0 lvm  /tmp
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sdc                     8:32   0  256G  0 disk             
     sdc1                  8:33   0  128G  0 part             ←　partprobe実行後に拡張したpartのSIZEが増える
       hanavg-datalv     253:3    0  512G  0 lvm  /hana/data
   ```
1. 物理ボリュームを拡張（同時にボリュームグループも拡張される）
   ```
   [root@test-rhel86vm2 ~]# pvresize /dev/sdc1
     Physical volume "/dev/sdc1" changed
     1 physical volume(s) resized or updated / 0 physical volume(s) not resized

   [root@test-rhel86vm2 ~]# pvs
     PV         VG       Fmt  Attr PSize    PFree  
     /dev/sda2  rootvg   lvm2 a--   <63.02g      0 
     /dev/sdc1  hanavg   lvm2 a--  <256.00g 128.00g   ← 拡張した物理ボリュームに空き容量ができる

   [root@test-rhel86vm2 ~]# vgs
     VG       #PV #LV #SN Attr   VSize    VFree  
     hanavg     7   2   0 wz--n-   <1.75t 128.00g   ← 物理ボリュームが追加されているvgも同時に拡張される
     mediavg    1   1   0 wz--n- <512.00g      0 
   ```

1. LVMを拡張
   ```
   # 追加する容量をGB単位で指定
   [root@test-rhel86vm2 ~]# lvextend -i1 -L +768G <拡張するLVM>
     Size of logical volume hanavg/datalv changed from 511.98 GiB (131068 extents) to <1.25 TiB (327676 extents).
     Logical volume hanavg/datalv successfully resized.
   
   [root@test-rhel86vm2 ~]# lvs
     LV       VG       Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
     datalv   hanavg   -wi-ao----   <1.25t  ←　指定したLVMが拡張されていることを確認                             
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   ```

1. ファイルシステムを拡張
   ```
   [root@test-rhel86vm2 ~]# xfs_growfs /dev/hanavg/datalv
   meta-data=/dev/mapper/hanavg-datalv isize=512    agcount=16, agsize=8388288 blks
            =                       sectsz=4096  attr=2, projid32bit=1
            =                       crc=1        finobt=1, sparse=1, rmapbt=0
            =                       reflink=1    bigtime=0 inobtcount=0
   data     =                       bsize=4096   blocks=134212608, imaxpct=25
            =                       sunit=64     swidth=256 blks
   naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
   log      =internal log           bsize=4096   blocks=65533, version=2
            =                       sectsz=4096  sunit=1 blks, lazy-count=1
   realtime =none                   extsz=4096   blocks=0, rtextents=0
   data blocks changed from 134212608 to 335540224
   ```

dfコマンドを実行すれば、ディスクが拡張されているはず。
※途中の`rescan`や`partprove`で更新したディスクやパーティションの情報が反映されなければ、<br>OSを再起動する必要があります。
   ```
   [root@test-rhel86vm2 ~]# df -Th
   Filesystem                    Type      Size  Used Avail Use% Mounted on
   devtmpfs                      devtmpfs  252G     0  252G   0% /dev
   tmpfs                         tmpfs     252G     0  252G   0% /dev/shm
   tmpfs                         tmpfs     252G  9.0M  252G   1% /run
   tmpfs                         tmpfs     252G     0  252G   0% /sys/fs/cgroup
   /dev/mapper/rootvg-rootlv     xfs        43G  368M   42G   1% /
   /dev/mapper/rootvg-usrlv      xfs        10G  1.9G  8.2G  19% /usr
   /dev/mapper/rootvg-homelv     xfs      1014M   40M  975M   4% /home
   /dev/mapper/rootvg-tmplv      xfs       2.0G   47M  2.0G   3% /tmp
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   /dev/mapper/hanavg-datalv     xfs       1.3T  518G  763G  41% /hana/data ← 拡張したLVM（Sizeが増えます）
   /dev/sdb1                     ext4      2.0T  2.1G  1.9T   1% /mnt
   ```

# おわりに
本当はこれくらいさくっとできるようになりたい...けどいろいろ知らなさすぎてやたらと時間かかりました(´・ω・｀)
検証してるときにRedHatのWebコンソールの存在を教えてもらったので、今度はそっちでできるか検証したいです。

***