【備忘】Raid1とLVMで構成されている共有フォルダからHDDをひとつ除く

# はじめに
自宅のLinuxサーバーでSambaを使用して共有フォルダを使っています。
この共有フォルダの物理層は、Raid1のHDD×2で構成されています。
今回、この2つのHDDのうち1つを除くことにしました。
そして最終的には、Raidもやめることにしました。（大したデータが入っていなく、他で使いたくなったため）
ここにその時の手順を、備忘録として残そうと思います。
サーバーの再起動を除いて、ダウンタイムはほぼゼロで完了できました。
# 構成
現在の構成を表にすると概ね以下のようになります。
| 項目 | バージョン等 |
|:-----------|:------------|
| ハードウェア基盤       | VMware ESXi 7.0.0 (Build 16324942)       |
| OS       | CentOS Linux 7 (仮想サーバー)       |
| ソフトウェアRaid     | mdadm - v4.1 - 2018-10-01      |

## 作業前と作業後
作業前と作業後の構成図を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/af516129-07e2-dc5f-cb2e-d785c34a6027.png)
## やること
やることは概ね以下のようになります。
1. Raidを構成しているHDDのひとつをRaidから除外。
2. Raidから除外したHDDからパーティションを削除。
3. Raidから除外したHDDをにパーティションを作成。
4. Raidから除外したHDDのパーティションタイプを指定。
5. Linuxを再起動。
6. Raidから除外したHDDの情報を削除。
7. 物理ボリュームを作成。
8. 新規のボリュームグループを作成。
9. 新規の論理ボリュームを作成。
10. 作成した論理ボリュームをフォーマット。
11. Raidを構成している残り1台のHDDから、新規作成した論理ボリュームのHDDへデータをコピー。
12. Raidを削除。
13. コピー元のHDDの初期化。

# 手順
手順をコマンドベースで残します。すべてrootユーザーで行っています。
## 現状確認
### Raidの状態確認
```text
# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdc[1] sdb[0]
      5851760832 blocks super 1.2 [2/2] [UU]
      bitmap: 0/44 pages [0KB], 65536KB chunk

unused devices: <none>
```
```text
# mdadm --detail /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Wed Jan 13 07:48:12 2021
        Raid Level : raid1
        Array Size : 5851760832 (5.45 TiB 5.99 TB)
     Used Dev Size : 5851760832 (5.45 TiB 5.99 TB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Tue Jan 24 13:54:28 2023
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : FILEVM01:0  (local to host FILEVM01)
              UUID : 3954bb00:4a32a654:69751b93:d4e5a938
            Events : 36380

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
```
RaidはRaid1であり、`/dev/sdb`と`/dev/sdc`で構成されていることがわかりました。
### LVMの現状確認
```text
# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/md0   VGroup1 lvm2 a--  <5.45t    0 
  /dev/sda3  VGroup0 lvm2 a--  48.75g    0 
# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  VGroup0   1   6   0 wz--n- 48.75g    0 
  VGroup1   1   1   0 wz--n- <5.45t    0 
# lvs
  LV        VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LVolume01 VGroup0 -wi-ao---- 30.00g                                                    
  LVolume02 VGroup0 -wi-ao----  4.00g                                                    
  LVolume03 VGroup0 -wi-ao----  2.00g                                                    
  LVolume04 VGroup0 -wi-ao----  1.00g                                                    
  LVolume05 VGroup0 -wi-ao----  8.00g                                                    
  LVolume06 VGroup0 -wi-ao----  3.75g                                                    
  LVolume11 VGroup1 -wi-ao---- <5.45t 
```
Raidの`md0`が物理ボリュームとして指定されています。
共有フォルダのボリュームグループは`VGroup1`になります。
共有フォルダの論理ボリュームは`LVolume11`になります。
### ファイルシステム確認
```text
# df -mT
ファイルシス                  タイプ   1M-ブロック    使用  使用可 使用% マウント位置
devtmpfs                      devtmpfs         860       0     860    0% /dev
tmpfs                         tmpfs            872       0     872    0% /dev/shm
tmpfs                         tmpfs            872       1     871    1% /run
tmpfs                         tmpfs            872       0     872    0% /sys/fs/cgroup
/dev/mapper/VGroup0-LVolume01 ext4           30110    3750   24809   14% /
/dev/sda2                     ext4             976     195     715   22% /boot
/dev/sda1                     vfat             250      12     239    5% /boot/efi
/dev/mapper/VGroup0-LVolume05 ext4            7936    1319    6192   18% /var
/dev/mapper/VGroup0-LVolume04 ext4             976       3     907    1% /home
/dev/mapper/VGroup0-LVolume03 ext4            1952       7    1828    1% /tmp
/dev/mapper/VGroup0-LVolume06 ext4            3716      15    3493    1% /var/crash
/dev/mapper/VGroup1-LVolume11 ext4         5669426 2984245 2399435   56% /var/shared
tmpfs                         tmpfs            175       0     175    0% /run/user/1001
```
ファイルシステムは`ext4`であることがわかりました。
## 変更作業
### Raid1から片系のHDDを1台除外
```text
# mdadm --manage /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0
# mdadm --manage /dev/md0 --remove /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0
```
`faulty`状態にしてから`remove`しないと`mdadm: hot remove failed for /dev/sdc: Device or resource busy`が発生したためこの手順になっています。
### Raidの状態確認
```text
# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdc[1](F) sdb[0]
      5851760832 blocks super 1.2 [2/1] [U_]
      bitmap: 0/44 pages [0KB], 65536KB chunk

unused devices: <none>
```
```text
# mdadm --detail /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Wed Jan 13 07:48:12 2021
        Raid Level : raid1
        Array Size : 5851760832 (5.45 TiB 5.99 TB)
     Used Dev Size : 5851760832 (5.45 TiB 5.99 TB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Tue Jan 24 14:11:51 2023
             State : clean, degraded 
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 1
     Spare Devices : 0

Consistency Policy : bitmap

              Name : FILEVM01:0  (local to host FILEVM01)
              UUID : 3954bb00:4a32a654:69751b93:d4e5a938
            Events : 36382

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       -       0        0        1      removed

       1       8       32        -      faulty   /dev/sdc
```
`/dev/sdc`が除外され、`/dev/sdb`だけになりました。
### パーティションの削除
```text
# fdisk /dev/sdc 

WARNING: The size of this disk is 6.0 TB (5992338370560 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

コマンド (m でヘルプ): d
Selected partition 1
Partition 1 is deleted

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```
`fdisk`コマンドを使います。`d`がパーティション削除で、`w`が上書き保存です。
### パーティション再作成
```text
# fdisk /dev/sdc

WARNING: The size of this disk is 6.0 TB (5992338370560 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
パーティション番号 (1-4, default 1): 
最初 sector (2048-4294967295, 初期値 2048): 
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-4294967294, 初期値 4294967294): 
初期値 4294967294 を使います
Partition 1 of type Linux and of size 2 TiB is set

コマンド (m でヘルプ): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```
パーティション削除と同時にできると思いますが、ここでは別で実行しました。
`fdisk`コマンドを使い、`n`で新規パーティション作成、`t`でパーティションタイプ指定になります。
パーティションタイプは`8e`が`Linux LVM`です。
`w`で上書き保存します。
### デバイス状態の確認
```text
# fdisk -l /dev/sdc

Disk /dev/sdc: 5992.3 GB, 5992338370560 bytes, 11703785880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x9cbb1901

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1            2048  4294967294  2147482623+  8e  Linux LVM
```
Raidから切り離した`/dev/sdc`にパーティションができあがり、パーティションタイプは`Linux LVM`になっています。
### サーバー再起動
```text
# shutdown -r now
```
ここでサーバーを再起動しました。
### Raid情報の削除
```text
# wipefs -a /dev/sdc
/dev/sdc: 4 bytes were erased at offset 0x00001000 (linux_raid_member): fc 4e 2b a9
/dev/sdc: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdc: calling ioclt to re-read partition table: 成功です
```
`/dev/sdc`をRaid情報から削除します。これをやっていないと、`pvcreate`が失敗しました。
### LVMの作成
#### 物理ボリュームの作成
```text
# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.
# pvs
  PV         VG      Fmt  Attr PSize  PFree 
  /dev/md0   VGroup1 lvm2 a--  <5.45t     0 
  /dev/sda3  VGroup0 lvm2 a--  48.75g     0 
  /dev/sdc           lvm2 ---  <5.45t <5.45t
```
物理ボリュームを作成しました。
#### ボリュームグループの作成
```text
# vgcreate VGroup2 /dev/sdc
  Volume group "VGroup2" successfully created
# vgs
  VG      #PV #LV #SN Attr   VSize  VFree 
  VGroup0   1   6   0 wz--n- 48.75g     0 
  VGroup1   1   1   0 wz--n- <5.45t     0 
  VGroup2   1   0   0 wz--n- <5.45t <5.45t
```
ボリュームグループを`Vgroup2`という名前で作成しました。
#### 論理ボリュームの作成
```text
# lvcreate -l 100%VG -n LVolume12 VGroup2
WARNING: LVM2_member signature detected on /dev/VGroup2/LVolume12 at offset 536. Wipe it? [y/n]: y
  Wiping LVM2_member signature on /dev/VGroup2/LVolume12.
  Logical volume "LVolume12" created.
# lvs
  LV        VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LVolume01 VGroup0 -wi-ao---- 30.00g                                                    
  LVolume02 VGroup0 -wi-ao----  4.00g                                                    
  LVolume03 VGroup0 -wi-ao----  2.00g                                                    
  LVolume04 VGroup0 -wi-ao----  1.00g                                                    
  LVolume05 VGroup0 -wi-ao----  8.00g                                                    
  LVolume06 VGroup0 -wi-ao----  3.75g                                                    
  LVolume11 VGroup1 -wi-ao---- <5.45t                                                    
  LVolume12 VGroup2 -wi-a----- <5.45t 
```
`LVolume12`という名前で論理ボリュームを作成しました。
### フォーマット
```text
# mkfs.ext4 /dev/mapper/VGroup2-LVolume12
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
182874112 inodes, 1462972416 blocks
73148620 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3611295744
44647 block groups
32768 blocks per group, 32768 fragments per group
4096 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
```
新しく作った`LVolume12`という論理ボリュームを`ext4`でフォーマットしました。
### マウント
```text
# mkdir /var/shared2
# mount /dev/mapper/VGroup2-LVolume12 /var/shared2
```
`/var/shared2`というディレクトリを新しく作成してマウントしました。
### ファイルのコピー
```text
# \cp -frp /var/shared/* /var/shared2/
```
Raidを構成しているHDDから、新しく論理ボリュームを作ったHDDへ、全ファイルをコピーしました。
### fstab編集
```text
# cat fstab

#
# /etc/fstab
# Created by anaconda on Sat May  1 00:52:40 2021
#
# 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
#
/dev/mapper/VGroup0-LVolume01 /                       ext4    defaults        1 1
UUID=4199baa8-8df4-431a-841d-27be41a9832c /boot                   ext4    defaults        1 2
UUID=7C33-B4A2          /boot/efi               vfat    umask=0077,shortname=winnt 0 0
/dev/mapper/VGroup0-LVolume04 /home                   ext4    defaults        1 2
/dev/mapper/VGroup0-LVolume03 /tmp                    ext4    defaults        1 2
/dev/mapper/VGroup0-LVolume05 /var                    ext4    defaults        1 2
/dev/mapper/VGroup0-LVolume06 /var/crash              ext4    defaults        1 2
/dev/mapper/VGroup0-LVolume02 swap                    swap    defaults        0 0
# /dev/VGroup1/LVolume11        /var/shared/            ext4    defaults        0 0
/dev/VGroup2/LVolume12        /var/shared2/           ext4    defaults        0 0
```
`/etc/fstab`を編集して、サーバー起動時に`LVolume12`が`/var/shared2`にマウントされるようにします。
### サーバー再起動
```text
# shutdown -r now
```
## 削除作業
LVMを使用していたので、LVMから削除していきます。
### 論理ボリュームの削除
```text
# lvremove /dev/VGroup1/LVolume11 
Do you really want to remove active logical volume VGroup1/LVolume11? [y/n]: y
  Logical volume "LVolume11" successfully removed
# lvs
  LV        VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LVolume01 VGroup0 -wi-ao---- 30.00g                                                    
  LVolume02 VGroup0 -wi-ao----  4.00g                                                    
  LVolume03 VGroup0 -wi-ao----  2.00g                                                    
  LVolume04 VGroup0 -wi-ao----  1.00g                                                    
  LVolume05 VGroup0 -wi-ao----  8.00g                                                    
  LVolume06 VGroup0 -wi-ao----  3.75g                                                    
  LVolume12 VGroup2 -wi-ao---- <5.45t
```
`LVolume11`が無くなって`LVolume12`が残っている状態です。
### ボリュームグループの削除
```text
# vgremove VGroup1 
  Volume group "VGroup1" successfully removed
# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  VGroup0   1   6   0 wz--n- 48.75g    0 
  VGroup2   1   1   0 wz--n- <5.45t    0 
```
`VGroup1`が削除されました。
### 物理ボリュームの削除
```text
# pvremove /dev/md0
  Labels on physical volume "/dev/md0" successfully wiped.
# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/sda3  VGroup0 lvm2 a--  48.75g    0 
  /dev/sdc   VGroup2 lvm2 a--  <5.45t    0 
```
`/dev/md0`の物理ボリュームを削除しました。
### Raidの削除
```text
# mdadm --misc --stop /dev/md0
mdadm: stopped /dev/md0
# cat /proc/mdstat 
Personalities : [raid1] 
unused devices: <none>
# mdadm --misc --zero-superblock /dev/sdb
```
`mdadm --misc --stop`コマンドでRaidを削除しました。
`mdadm --misc --zero-superblock`コマンドでスーパーブロックを削除しました。
### サーバーシャットダウン
あとは後片付けです。
```text
# shutdown -h now
```
仮想サーバーをシャットダウンしました。
### ESXiシャットダウン
ホストであるESXiをシャットダウンします。このときESXiはメンテナンスモードにします。
### HDD取り外し
物理的にHDDを取り外しました。
### ESXi起動
これだけでは仮想サーバーは起動しません。
取り外したHDDに対応するデータストアを削除します。
### 取り外したHDDのデータストアを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/1af6a688-d785-c274-472a-49df3f5453f8.png)
ESXiコンソールにログインして、対象の仮想サーバーの設定画面を開きます。
対応するデータストアを削除します。
### メンテナンスモード解除と仮想サーバー起動
ESXiのメンテナンスモードを解除して、仮想サーバーを起動しました。
これで作業は完了です。
# 補足(個人的なもの)

# 参考サイト
https://futuremix.org/2009/05/linux-raid-mdadm-manage-remove-disk-partition
https://progzakki.sanachan.com/os/how-to-extend-logical-volume/
https://abelog.tech/archives/187
https://atmarkit.itmedia.co.jp/ait/articles/1909/12/news018.html
https://atmarkit.itmedia.co.jp/ait/articles/1909/13/news019.html
https://ex1.m-yabe.com/archives/3125