LVMを使用したミラー(RAID1)構成をした話
目次
概要
TX100 S3 の MegaRAID で 1TBHDD を 2 台つかって RAID1 しようとしたところ、SSD を認識したりしなくなったり、作った論理ボリュームが急に消えたりと不安定なため、あゆむさんより LVM での RAID 構成についてメモをいただいたので構築しました。
でてくるコマンド
- pvs・・・物理ボリュームの情報を表示する
- pvcreate・・・物理ボリュームを作成する
- vgcreate・・・ボリュームグループを作成する
- vgextend・・・ボリュームグループへ物理ボリュームを追加する
- vgreduce・・・ボリュームグループから物理ボリュームを削除する
- vgs・・・ボリュームグループの情報を表示する
- lvcreate・・・論理ボリュームを作成する
- lvremove・・・論理ボリュームを削除する(参考)
- lvconvert・・・論理ボリュームに含まれるミラー(RAID)を操作する
- lvs・・・論理ボリュームの情報を表示する
- parted・・・パーティションの操作に使用する
- fdisk・・・パーティションテーブルの操作に使用する
- mkfs・・・指定したファイルシステムでフォーマットをする
- blkid・・・ブロックデバイスの属性を表示する
- dd・・・ブロック単位でファイルをコピーする
環境
- 本体:Fujitsu PRIMAGY TX100 S3
- OS:ProxmoxVE8.2.2
- CPU:Intel Xeon E3-1240
- メモリ
- 4GB2 2GB2 合計 12GB
- ストレージ
- /dev/sda Samsung SSD 840 120GB
- /dev/sdb KIOXIA-EXCERIA S 447.13 GiB
- /dev/sdc TOSHIBA DT01ABA1 931.51 GiB
- /dev/sdd TOSHIBA DT01ABA1 931.51 GiB
概念図
やったこと
- /dev/sdc と/dev/sdd をミラー構成にした
- 障害検証をした
ミラー構成
- パーティションテーブルを MBR(msdos)にする
parted /dev/sdc mklabel msdos parted /dev/sdd mklabel msdos
- 物理ボリュームを作成する
pvcreate /dev/sdc /dev/sdd
- ボリュームグループを作成して sdc と sdd を加える
vgcreate vg1t /dev/sdc /dev/sdd
- 論理ボリュームを RAID1、ボリュームグループ vg1t の領域 100%で raid1 という名前で作成する。
lvcreate --type raid1 -m 1 -l 100%VG -n raid1 vg1t
- 論理ボリュームを ext4 でフォーマットする
mkfs.ext4 /dev/vg1t/raid1
- マウントする
mount /dev/vg1t/raid1 /mnt/storage1
- 起動時に自動でマウントするように設定
blkid /dev/vg1t/raid1 /dev/vg1t/raid1: UUID="c2347c4b-e525-4d28-96e5-ab6971d77f8b" BLOCK_SIZE="4096" TYPE="ext4" vim /etc/fstab # 追記(ext4はautoでもいいという噂を聞いたけど敢えて指定する) UUID=c2347c4b-e525-4d28-96e5-ab6971d77f8b /mnt/storage1 ext4 defaults 0 0
- 再起動してマウントされることを確認
cat /etc/mtab /dev/mapper/vg1t-raid1 /mnt/storage1 ext4 rw,relatime 0 0
- 実際にアクセスしてファイルが置ければ OK
- DD コマンドで Read 速度を確認したところ 140MB/s ぐらいでした
root@pve:~# dd if=/dev/vg1t/raid1 of=/dev/null bs=16k status=progress 3366289408 bytes (3.4 GB, 3.1 GiB) copied, 24 s, 140 MB/s^C 206446+0 records in 206445+0 records out 3382394880 bytes (3.4 GB, 3.2 GiB) copied, 24.1147 s, 140 MB/s
障害検証
片方壊す(parted コマンドでパーティションを作成する)
parted /dev/sdd mklabel msdos
lvs pvs で確認すると unknown になっている
root@pve:~# lvs -a -o +devices WARNING: Couldn't find device with uuid 7SYOSV-qNwe-ijgv-IwCC-Qz64-DpIH-hTs8w6. WARNING: VG vg1t is missing PV 7SYOSV-qNwe-ijgv-IwCC-Qz64-DpIH-hTs8w6 (last written to [unknown]). WARNING: Couldn't find all devices for LV vg1t/raid1-1t_rimage_1 while checking used and assumed devices. WARNING: Couldn't find all devices for LV vg1t/raid1-1t_rmeta_1 while checking used and assumed devices. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices data pve twi-a-tz-- <53.93g 0.00 1.59 data_tdata(0) [data_tdata] pve Twi-ao---- <53.93g /dev/sda3(12175) [data_tmeta] pve ewi-ao---- 1.00g /dev/sda3(25980) [lvol0_pmspare] pve ewi------- 1.00g /dev/sda3(26236) root pve -wi-ao---- <39.56g /dev/sda3(2048) swap pve -wi-ao---- 8.00g /dev/sda3(0) raid1-1t vg1t rwi-a-r-p- <931.51g 15.20 raid1-1t_rimage_0(0),raid1-1t_rimage_1(0) [raid1-1t_rimage_0] vg1t Iwi-aor--- <931.51g /dev/sdc(1) [raid1-1t_rimage_1] vg1t Iwi-aor-p- <931.51g [unknown](1) [raid1-1t_rmeta_0] vg1t ewi-aor--- 4.00m /dev/sdc(0) [raid1-1t_rmeta_1] vg1t ewi-aor-p- 4.00m [unknown](0) root@pve:~# pvs WARNING: Couldn't find device with uuid 7SYOSV-qNwe-ijgv-IwCC-Qz64-DpIH-hTs8w6. WARNING: VG vg1t is missing PV 7SYOSV-qNwe-ijgv-IwCC-Qz64-DpIH-hTs8w6 (last written to [unknown]). WARNING: Couldn't find all devices for LV vg1t/raid1-1t_rimage_1 while checking used and assumed devices. WARNING: Couldn't find all devices for LV vg1t/raid1-1t_rmeta_1 while checking used and assumed devices. PV VG Fmt Attr PSize PFree /dev/sda3 pve lvm2 a-- <118.24g 14.75g /dev/sdb ssd512 lvm2 a-- <447.13g <447.13g /dev/sdc vg1t lvm2 a-- 931.51g 0 [unknown] vg1t lvm2 a-m 931.51g 0
壊れた HDD を取り外す
vgreduce --removemissin vg1t
pvs で確認すると unknown が消える
root@pve:~# pvs PV VG Fmt Attr PSize PFree /dev/sda3 pve lvm2 a-- <118.24g 14.75g /dev/sdb ssd512 lvm2 a-- <447.13g <447.13g /dev/sdc vg1t lvm2 a-- 931.51g 0
新しいディスクでフィジカルボリュームを作成する
root@pve:~# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created. root@pve:~# pvs PV VG Fmt Attr PSize PFree /dev/sda3 pve lvm2 a-- <118.24g 14.75g /dev/sdb ssd512 lvm2 a-- <447.13g <447.13g /dev/sdc vg1t lvm2 a-- 931.51g 0 /dev/sdd lvm2 --- 931.51g 931.51g
ボリュームグループに物理ボリュームを追加する
root@pve:~# vgextend vg1t /dev/sdd Volume group "vg1t" successfully extended
ミラー化ボリュームをリペアします。
root@pve:~# lvconvert --repair vg1t/raid1-1t Attempt to replace failed RAID images (requires full device resync)? [y/n]: y Faulty devices in vg1t/raid1-1t successfully replaced.
論理ボリューム一覧を確認して、ボリュームグループが正常なことを確認します。
root@pve:~# lvs -a -o +devices LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices data pve twi-a-tz-- <53.93g 0.00 1.59 data_tdata(0) [data_tdata] pve Twi-ao---- <53.93g /dev/sda3(12175) [data_tmeta] pve ewi-ao---- 1.00g /dev/sda3(25980) [lvol0_pmspare] pve ewi------- 1.00g /dev/sda3(26236) root pve -wi-ao---- <39.56g /dev/sda3(2048) swap pve -wi-ao---- 8.00g /dev/sda3(0) raid1-1t vg1t rwi-a-r--- <931.51g 0.22 raid1-1t_rimage_0(0),raid1-1t_rimage_1(0) [raid1-1t_rimage_0] vg1t iwi-aor--- <931.51g /dev/sdc(1) [raid1-1t_rimage_1] vg1t Iwi-aor--- <931.51g /dev/sdd(1) [raid1-1t_rmeta_0] vg1t ewi-aor--- 4.00m /dev/sdc(0) [raid1-1t_rmeta_1] vg1t ewi-aor--- 4.00m /dev/sdd(0)
おまけ
GPTテーブルのエラーについて
fdisk した時に「The backup GPT table is corrupt, but the primary appears OK, so that will be used.」というのが出ることがある。これはパーティションテーブルが読み取れない時に出るらしい。GPT はパーティションテーブルをプライマリ・バックアップと持っているが、今回はバックアップが壊れている状態。
```
root@pve:~# fdisk -l
The backup GPT table is corrupt, but the primary appears OK, so that will be used.
Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 250069680 sectors
Disk model: Samsung SSD 840
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: F5A57025-3A16-4AC0-AFA5-48EC657D7B09
Device Start End Sectors Size Type
/dev/sda1 34 2047 2014 1007K BIOS boot
/dev/sda2 2048 2099199 2097152 1G EFI System
/dev/sda3 2099200 250069646 247970447 118.2G Linux LVM
```
パーティションテーブルに対して操作を行えばこのエラーは解消される。
root@pve:~# fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
The backup GPT table is corrupt, but the primary appears OK, so that will be used.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
# パーティションテーブルを表示する
Command (m for help): p
Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 250069680 sectors
Disk model: Samsung SSD 840
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: F5A57025-3A16-4AC0-AFA5-48EC657D7B09
Device Start End Sectors Size Type
/dev/sda1 34 2047 2014 1007K BIOS boot
/dev/sda2 2048 2099199 2097152 1G EFI System
/dev/sda3 2099200 250069646 247970447 118.2G Linux LVM
# パーティションテーブルを検証する
Command (m for help): v
No errors detected.
Header version: 1.0
Using 3 out of 128 partitions.
A total of 0 free sectors is available in 0 segments (the largest is 0 B).
# テーブルをディスクに書き込む
Command (m for help): w
The partition table has been altered.
Syncing disks.
```
エラーが消えた
root@pve:~# fdisk -l Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 250069680 sectors Disk model: Samsung SSD 840 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: F5A57025-3A16-4AC0-AFA5-48EC657D7B09
Device Start End Sectors Size Type
/dev/sda1 34 2047 2014 1007K BIOS boot
/dev/sda2 2048 2099199 2097152 1G EFI System
/dev/sda3 2099200 250069646 247970447 118.2G Linux LVM
```
Proxmoxでディレクトリとして追加する場合の設定について
Proxmoxの他のマウントと同様にサービスでマウントするようにする
vim /etc/systemd/system/mnt-pve-storage1.mount
[Install]
WantedBy=multi-user.target
[Mount]
Options=defaults
Type=ext4
What=/dev/disk/by-uuid/ba016986-1d3c-43e0-bb1d-2d3d176c440d
Where=/mnt/pve/storage1
[Unit]
Description=Mount storage 'storage1' under /mnt/pve
実際に利用するストレージとして登録する
vim /etc/pve/storage.cfg
# 追記
dir: storage1
path /mnt/pve/storage1
content images,iso,rootdir,snippets,backup,vztmpl
is_mountpoint 1
nodes pve