Edited at

LVMでRAID1の構築、障害対応、他RAIDボリュームの追加

More than 3 years have passed since last update.


前回記事

LVMで論理ボリュームの作成、拡張、縮小、複製


LVM でRAID1 を構築する

次はRAID1 の上にLVM を構築する方法について説明していきます。

今度はRAID1 の上にLVM を構築し、高可用性を実現します。

物理デバイスの構成としてはLVMで論理ボリュームの作成、拡張、縮小、複製 と同じデバイス構成で実施していきます。

/dev/md0/dev/sdb1/dev/sdc1 で、/dev/md1/dev/sdd1/dev/sde1 で構築し、これらがLVM を構築するための物理ボリュームとなります。


必要な容量の見積もりについて

普段、物理的なRAID1 を構築する場合、物理デバイス(例えば1台 100GB 容量のHDD) を2 台でRAID1 を構築しても、利用できる容量は物理デバイス1 台分の100 GB の容量しか使用できないことは、RAID1 構築経験者であれば、理解できるでしょう。

LVM 上でRAID1 を構築する場合は、容量の見積もり感覚が若干異なる点に注意してください。

例えば、100 GB のRAID1 領域を作成したい場合は、その2 倍の領域が必要で、まず物理ボリューム合計で200 GB の領域を確保(できればもう少し余裕をもって確保)し、それを論理ボリュームグループに加え、RAID1 を構築し、100 GB のRAID1 利用可能領域ができるといった感覚で見積もります。

もしくは違う考え方として、最初に200GB の論理ボリュームグループを作成した場合は、その上で構築できるRAID1 領域は100GB 以下になるということを理解してください。

一番最初、自分はこれで失敗しました...(;´Д`A)


デバイスパーティションの削除

パーティションを再度作成します。

これより前の手順で既にパーティションが作成されている場合は、次のような手順で一旦削除してください。

$ sudo fdisk /dev/sdb

Command (m for help): d
Selected partition 1

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

/dev/sdb のパーティションを削除したら、他のデバイスにも構成をコピーします。

$ for I in {c,d,e,f}; do sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sd${I} --force; done


ボリュームの作成

新たにfdisk コマンドで各デバイスに20GB のボリュームを作成します。

$ sudo fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xccc65e15.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-83886079, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83886079, default 83886079): +20G

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

パーティションを他デバイスにコピーします。

$ for I in {c,d,e}; do sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sd${I} --force; done

論理ボリュームを構築します。

$ sudo pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

$ sudo vgcreate lvg-share /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
$ sudo lvcreate --name public --size 18G lvg-share
$ sudo lvcreate --name media --size 8GB lvg-share
$ sudo lvcreate --name document --size 6GB lvg-share

ファイルシステムを作成します。

$ sudo mkfs.ext4 /dev/lvg-share/public

$ sudo mkfs.xfs /dev/lvg-share/media
$ sudo mkfs.reiserfs /dev/lvg-share/document

ファイルシステムを作成したら、一旦マウントしてみます。

$ sudo mount /dev/lvg-share/public /mnt/public

$ sudo mount /dev/lvg-share/media /mnt/media
$ sudo mount /dev/lvg-share/document /mnt/document
$ df -h
.......
/dev/mapper/lvg--share-public 18G 44M 17G 1% /mnt/public
/dev/mapper/lvg--share-media 8.0G 33M 8.0G 1% /mnt/media
/dev/mapper/lvg--share-document 7.0G 33M 7.0G 1% /mnt/document


既存データの退避

ここで、/dev/sdc1(/dev/md0 のセカンダリ)と/dev/sde1(/dev/md1 のセカンダリ)のデータを残りのパーティション(/dev/sdb1, /dev/sdd1)に退避していきます。

この2 つの物理ボリュームは、後ほどRAID1 を構築するときにフォーマットをして、RAID1 のセカンダリボリュームとして追加しますが、既に保存されているデータを失わないようにするための方法です。

まず、現在の論理ボリュームの状態を確認してみます。

$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/sdb1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 511
Allocated PE 4608
PV UUID Sf0Pph-cQxd-fRJH-1TdU-iiCR-WjmF-w9fdxL

--- Physical volume ---
PV Name /dev/sdc1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 1535
Allocated PE 3584
PV UUID u0oCVN-FH5t-nsXn-32zr-x0wL-PLEH-Bm5pQO

--- Physical volume ---
PV Name /dev/sdd1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID Qaj34D-N5Fj-ktA1-OO5M-lwf2-COM5-VzABEK

--- Physical volume ---
PV Name /dev/sde1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID NUBljh-9EnD-e2oT-9MYS-vckQ-DKdz-TQxaRU

/dev/sdc1 のデータを退避します。

$ sudo modprobe dm-mirror

$ sudo pvmove /dev/sdc1
/dev/sdc1: Moved: 0.1%
/dev/sdc1: Moved: 4.7%
.......
/dev/sdc1: Moved: 97.9%
/dev/sdc1: no pvmove in progress - already finished or aborted.

/dev/sdc1 のデータ移行が完了したら、pvdisplay コマンドで結果を確認してみます。

$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/sdb1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 511
Allocated PE 4608
PV UUID Sf0Pph-cQxd-fRJH-1TdU-iiCR-WjmF-w9fdxL

--- Physical volume ---
PV Name /dev/sdc1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID u0oCVN-FH5t-nsXn-32zr-x0wL-PLEH-Bm5pQO

--- Physical volume ---
PV Name /dev/sdd1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 1535
Allocated PE 3584
PV UUID Qaj34D-N5Fj-ktA1-OO5M-lwf2-COM5-VzABEK

--- Physical volume ---
PV Name /dev/sde1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID NUBljh-9EnD-e2oT-9MYS-vckQ-DKdz-TQxaRU

上記の結果を確認すると、/dev/sdc1 に格納されていた3584 物理エクステントが、/dev/sdd1 に移動していることがわかります。

データの退避が確認できたら、/dev/sdc1 を論理ボリュームグループからはずし、物理ボリュームも削除します。

$ sudo vgreduce lvg-share /dev/sdc1

$ sudo pvremove /dev/sdc1
$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 511
Allocated PE 4608
PV UUID Sf0Pph-cQxd-fRJH-1TdU-iiCR-WjmF-w9fdxL

--- Physical volume ---
PV Name /dev/sdd1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 1535
Allocated PE 3584
PV UUID Qaj34D-N5Fj-ktA1-OO5M-lwf2-COM5-VzABEK

--- Physical volume ---
PV Name /dev/sde1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID NUBljh-9EnD-e2oT-9MYS-vckQ-DKdz-TQxaRU

続けて/dev/sde1 物理ボリュームに格納されているデータを移行します。

$ sudo pvmove /dev/sde1

No data to move for lvg-share

今回は、/dev/sde1 にデータは含まれていなかったため、何も起こりませんでした。

/dev/sde1 を論理ボリュームグループからはずし、物理ボリュームも削除します。

$ sudo vgreduce lvg-share /dev/sde1

$ sudo pvremove /dev/sde1
$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 511
Allocated PE 4608
PV UUID Sf0Pph-cQxd-fRJH-1TdU-iiCR-WjmF-w9fdxL

--- Physical volume ---
PV Name /dev/sdd1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 1535
Allocated PE 3584
PV UUID Qaj34D-N5Fj-ktA1-OO5M-lwf2-COM5-VzABEK


RAID1 パーティションの作成

物理ボリュームの取り外しが完了したら、/dev/sdc1/dev/sde1 をLinux RAID autodetect パーティションを作成します。

$ sudo fdisk /dev/sdc

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

/dev/sdc のパーティションを/dev/sde にコピーします。

$ sudo sfdisk -d /dev/sdc | sudo sfdisk /dev/sde --force

現在のデバイスの状態を確認します。

$ sudo fdisk -l

......

Disk /dev/sdc: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors
Units # sectors of 1 * 512 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sdc1 2048 41945087 20971520 fd Linux raid autodetect

......

Disk /dev/sde: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors
Units # sectors of 1 * 512 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sde1 2048 41945087 20971520 fd Linux raid autodetect

次に、RAID1 を構築していきます。

RAID1 を構築するために/dev/sdc1/dev/md0 デバイスに、/dev/sde1/dev/md1 デバイスに追加します。

/dev/sdb1/dev/sdd1 は、まだこの段階では追加しません。

そのため、/dev/sdc1, /dev/sde1 を追加するにはmdadm コマンドにmissing オプションを使用して実行します。

$ sudo mdadm --create /dev/md0 --auto=yes -l 1 -n 2 /dev/sdc1 missing

mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

$ sudo mdadm --create /dev/md1 --auto=yes -l 1 -n 2 /dev/sde1 missing
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.


RAID1 のデバイス名ズレ解消

OS 再起動時にRAID1 のデバイス名(md0, md1)がずれる(md127 等に)ことがあるので、事前にmdadm.conf ファイルに設定を追加しておきます。


/etc/mdadm/mdadm.conf

$ cp -ip /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.org

$ echo "DEVICE partitions" | sudo tee -a /etc/mdadm/mdadm.conf
DEVICE partitions

$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata#1.2 name=lvm-test-on-pdv:0 UUID7a359312:522cb81f:a99b6b1b:b9b3efb9
ARRAY /dev/md1 metadata#1.2 name=lvm-test-on-pdv:1 UUIDda70e87b:01242494:f0b45f80:e575ea0e


/etc/mdadm/mdadm.conf ファイルを開き、ファイルの最後の方に次のような定義が追加されていることを確認します。

$ sudo vim /etc/mdadm/mdadm.conf

.......
DEVICE partitions
ARRAY /dev/md0 metadata#1.2 name=lvm-test-on-pdv:0 UUID7a359312:522cb81f:a99b6b1b:b9b3efb9
ARRAY /dev/md1 metadata#1.2 name=lvm-test-on-pdv:1 UUIDda70e87b:01242494:f0b45f80:e575ea0e

initramfs イメージを再作成します。

$ sudo update-initramfs -u

可能であれば、OS を再起動してRAID デバイス名が変更されていないことを確認してみてください。


RAID1 の構築

/dev/md0/dev/md1 を物理ボリュームとして登録します。

$ sudo pvcreate /dev/md0 /dev/md1

Physical volume "/dev/md0" successfully created
Physical volume "/dev/md1" successfully created

/dev/md0/dev/md1lvg-share ボリュームグループに追加します。

$ sudo vgextend lvg-share /dev/md0 /dev/md1

Volume group "lvg-share" successfully extended

pvdisplay コマンドとvgdisplay コマンドを実行して状態を確認します。


pvdisplay

$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/sdb1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 511
Allocated PE 4608
PV UUID MQWAVQ-IAY5-0KPR-F5Dq-WbI9-jk8T-7UuIyz

--- Physical volume ---
PV Name /dev/sdd1
VG Name lvg-share
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 1535
Allocated PE 3584
PV UUID NHHOBT-eAkD-Uffv-CAcs-oa2y-2yqN-cho3UO

--- Physical volume ---
PV Name /dev/md0
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 5115
Allocated PE 0
PV UUID nKzZBM-UEi0-jK0T-2riv-ceej-7a0N-hmWupv

--- Physical volume ---
PV Name /dev/md1
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 5115
Allocated PE 0
PV UUID M7oAVU-kU9W-vhxf-80Cx-fGHw-yHMw-VjZXS3



vgdisplay

$ sudo vgdisplay

--- Volume group ---
VG Name lvg-share
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 11
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 4
Act PV 4
VG Size 79.95 GiB
PE Size 4.00 MiB
Total PE 20468
Alloc PE / Size 8192 / 32.00 GiB
Free PE / Size 12276 / 47.95 GiB
VG UUID Xkf0yt-YxbZ-dTN3-KFMa-g1wz-ax3v-4dSfAf

いよいよ/dev/sdb1/dev/md0 へ、/dev/sdd1/dev/md1 RAID アレイへ追加していきます。

まずは、/dev/sdb1/dev/sdd1 のデータを/dev/md0 及び/dev/md1 へ退避します。

$ sudo pvmove /dev/sdb1 /dev/md0

/dev/sdb1: Moved: 0.1%
.......
/dev/sdb1: Moved: 100.0%

$ sudo pvmove /dev/sdd1 /dev/md1
/dev/sdd1: Moved: 0.0%
.......
/dev/sdd1: Moved: 100.0%

/dev/sdb1/dev/sdd1 をボリュームグループから外します。

$ sudo vgreduce lvg-share /dev/sdb1 /dev/sdd1

Removed "/dev/sdb1" from volume group "lvg-share"
Removed "/dev/sdd1" from volume group "lvg-share"

$ sudo pvremove /dev/sdb1 /dev/sdd1
Labels on physical volume "/dev/sdb1" successfully wiped
Labels on physical volume "/dev/sdd1" successfully wiped

pvdisplay コマンドでボリュームを確認します。

/dev/md0, /dev/md1 のみが残っている状態です。

$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/md0
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 507
Allocated PE 4608
PV UUID nKzZBM-UEi0-jK0T-2riv-ceej-7a0N-hmWupv

--- Physical volume ---
PV Name /dev/md1
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 1531
Allocated PE 3584
PV UUID M7oAVU-kU9W-vhxf-80Cx-fGHw-yHMw-VjZXS3

次に、先ほどボリュームグループから外した/dev/sdb1/dev/sdd1 をLinux raid autodetect でフォーマットします。

$ sudo fdisk /dev/sdb

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sdd --force

/dev/sdb1/dev/md0, /dev/sdd1/dev/md1 へ追加します。

$ sudo mdadm --manage /dev/md0 --add /dev/sdb1

mdadm: added /dev/sdb1

$ sudo mdadm --manage /dev/md1 --add /dev/sdd1
mdadm: added /dev/sdd1

これでRAID1 の同期が開始されました。

同期の進捗は次のコマンドを実行することで確認できます。

$ sudo cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdd1[2] sde1[0]
20955008 blocks super 1.2 [2/1] [U_]
[>....................] recovery # 1.7% (368000/20955008) finish=22.3min speed15333K/sec

md0 : active raid1 sdb1[2] sdc1[0]
20955008 blocks super 1.2 [2/1] [U_]
[#=>..................] recovery = 10.7% (2259008/20955008) finish=12.7min speed24390K/sec

unused devices: <none>

同期が完了すると以下のようになります。

unuses devices: <none>

nalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdd1[2] sde1[0]
20955008 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdb1[2] sdc1[0]
20955008 blocks super 1.2 [2/2] [UU]

unused devices: <none>

同期が完了すれば、RAID1 の構築は完了です。


ディスク障害を想定した手順

ここでは、/dev/sdc/dev/sde ディスクに障害が発生した場合を想定した手順を実施していきます。

まずは、mdadm コマンドの--failで不良パーティションとして定義します。

次に--remove を使用して不良パーティションをRAID から切り離します。

$ sudo mdadm --manage /dev/md0 --fail /dev/sdc1

mdadm: set /dev/sdc1 faulty in /dev/md0
$ sudo mdadm --manage /dev/md0 --remove /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md0
$ sudo mdadm --manage /dev/md1 --fail /dev/sde1
mdadm: set /dev/sde1 faulty in /dev/md1
$ sudo mdadm --manage /dev/md1 --remove /dev/sde1
mdadm: hot removed /dev/sde1 from /dev/md1

RAID1 の状態を確認します。

$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdd1[2]
20955008 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[2]
20955008 blocks super 1.2 [2/1] [_U]

unused devices: <none>

切り離しが完了しました。

この後、実際の業務等では物理デバイスを入れ替え、/dev/sdc, /dev/sde を取り替えをしておきます。

ここでは学習目的なので、物理デバイスの入れ替えは行わず、パーティションを削除して未フォーマット状態の物理デバイスとして再生します。


わざとパーティションを壊す

$ for I in {c,e}; do sudo dd if#/dev/zero of=/dev/sd${I} bs=1024 count$(echo "1 * 1024 * 100" | bc); done

.......

$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors
Units # sectors of 1 * 512 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdc doesn't contain a valid partition table

$ sudo fdisk -l /dev/sde
.......


/dev/sdb のパーティションを/dev/sdc, /dev/sde にコピーします。

$ for I in {c,e}; do sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sd${I} --force; done

※今回は/dev/sdb と同じ構成で問題ないためこのようにしています。

/dev/sdc/dev/sde を、それぞれ/dev/md0/dev/md1 に追加します。

$ sudo mdadm --manage /dev/md0 --add /dev/sdc1

mdadm: added /dev/sdc1

$ sudo mdadm --manage /dev/md1 --add /dev/sde1
mdadm: added /dev/sde1

同期の進捗状態を確認します。

$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sde1[3] sdd1[2]
20955008 blocks super 1.2 [2/1] [_U]
[>....................] recovery # 1.5% (332544/20955008) finish=22.7min speed15115K/sec

md0 : active raid1 sdc1[3] sdb1[2]
20955008 blocks super 1.2 [2/1] [_U]
[#==>.................] recovery = 18.0% (3784640/20955008) finish=12.1min speed23564K/sec

unused devices: <none>

同期が完了すれば成功です。


物理デバイスのあまり領域を使用してもうひとつRAID1 を作成する

/dev/md2/dev/md3 を物理デバイスの残り領域を使用して作成してみましょう。

ここでは、/dev/sdb/dev/sdc に余りの未フォーマット領域があることを想定し、/dev/md2/dev/sdb2/dev/sdc2/dev/md3/dev/sdd2/dev/sde2 を使用してもうひとつRAID1 を作成してみます。

今回の手順は、VM を使用していますが、実際は例えば/dev/sdg/dev/sdh 等の物理デバイスを増設して 論理ボリュームの容量を増やすといったシチュエーションで役に立ったりします。

まず、各物理デバイスの残り領域をフォーマットします。

$ sudo fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 42.9 GB, 42949672960 bytes
246 heads, 3 sectors/track, 113666 cylinders, total 83886080 sectors
Units # sectors of 1 * 512 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x253bf895

Device Boot Start End Blocks Id System
/dev/sdb1 2048 41945087 20971520 fd Linux raid autodetect

Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2):
Using default value 2
First sector (41945088-83886079, default 41945088):
Using default value 41945088
Last sector, +sectors or +size{K,M,G} (41945088-83886079, default 83886079):
Using default value 83886079

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

他の物理デバイスにパーティションをコピーします。

$ for I in {c,d,e}; do sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sd${I} --force; done


TODO: OS を再起動しないと/dev/sdb2〜/dev/sde2 が出現しない!?


今回の自分の環境ではOS を再起動することで/dev/sdb2〜/dev/sde2 が出現しました。

/dev/sdb2/dev/sdc2/dev/md2 へ取り込みます。

$ sudo mdadm --create /dev/md2 --auto=yes -l 1 -n 2 /dev/sdb2 /dev/sdc2

mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

/dev/sdd2/dev/sde2/dev/md3 へ取り込みます。

$ sudo mdadm --create /dev/md3 --auto=yes -l 1 -n 2 /dev/sdd2 /dev/sde2

mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md3 started.

デバイス名のズレを防止するために、mdadm.conf ファイルを編集します。

$ sudo mdadm --detail --scan | egrep '^ARRAY /dev/md[23]' | sudo tee -a /etc/mdadm/mdadm.conf

ARRAY /dev/md2 metadata#1.2 name=lvm-test-on-pdv:2 UUID366d696f:c5a69c4f:8b1d198e:d0c88a13
ARRAY /dev/md3 metadata#1.2 name=lvm-test-on-pdv:3 UUID0cf37c81:ec6324c2:01de9bd6:a23d8fb8

initramfs イメージを再作成します。

$ sudo update-initramfs -u

/dev/md2/dev/md3 RAID1 の同期進捗を確認します。

$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md3 : active raid1 sde2[1] sdd2[0]
20953984 blocks super 1.2 [2/2] [UU]

md2 : active raid1 sdc2[1] sdb2[0]
20953984 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sde1[3] sdd1[2]
20955008 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdc1[3] sdb1[2]
20955008 blocks super 1.2 [2/2] [UU]

unused devices: <none>

物理ボリュームとして/dev/md2, /dev/md3 を追加します。

$ sudo pvcreate /dev/md2 /dev/md3

/dev/md2, /dev/md3 をボリュームグループに追加します。

$ sudo vgextend lvg-share /dev/md2 /dev/md3

pvdisplay を実行します。

$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/md0
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 507
Allocated PE 4608
PV UUID lMgkug-CfZE-STFc-L0aJ-mz77-BZnw-FMaeaU

--- Physical volume ---
PV Name /dev/md1
VG Name lvg-share
PV Size 19.98 GiB / not usable 3.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 1531
Allocated PE 3584
PV UUID kq6z6E-6nYu-u1Ad-TUEe-TZfL-RPHi-Lq18Jd

--- Physical volume ---
PV Name /dev/md2
VG Name lvg-share
PV Size 19.98 GiB / not usable 2.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 5115
Allocated PE 0
PV UUID qp8YU4-wuH3-VI3q-PnFD-bY4e-szHP-MVk2Mq

--- Physical volume ---
PV Name /dev/md3
VG Name lvg-share
PV Size 19.98 GiB / not usable 2.88 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5115
Free PE 5115
Allocated PE 0
PV UUID 2DXJxE-Kow7-1p8j-jw2I-29WI-VVNx-9NoeKt


vgdisplay

$ sudo vgdisplay

--- Volume group ---
VG Name lvg-share
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 21
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 0
Max PV 0
Cur PV 4
Act PV 4
VG Size 79.92 GiB
PE Size 4.00 MiB
Total PE 20460
Alloc PE / Size 8192 / 32.00 GiB
Free PE / Size 12268 / 47.92 GiB
VG UUID DBgEtU-tjpa-jqcN-tKGV-Ped5-WKT0-BcGuv1


lvdisplay

$ sudo lvdisplay

--- Logical volume ---
LV Path /dev/lvg-share/public
LV Name public
VG Name lvg-share
LV UUID s6aaIK-Dfaz-dIkL-sybW-W5q2-9ANc-rorUbQ
LV Write Access read/write
LV Creation host, time lvm-test-on-pdv, 2015-03-14 18:20:00 +0900
LV Status available
# open 0
LV Size 18.00 GiB
Current LE 4608
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0

--- Logical volume ---
LV Path /dev/lvg-share/media
LV Name media
VG Name lvg-share
LV UUID FZzDeD-lPFn-WEH3-JKPH-93eS-9y0z-RQeGht
LV Write Access read/write
LV Creation host, time lvm-test-on-pdv, 2015-03-14 18:20:04 +0900
LV Status available
# open 0
LV Size 8.00 GiB
Current LE 2048
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:1

--- Logical volume ---
LV Path /dev/lvg-share/document
LV Name document
VG Name lvg-share
LV UUID d00kFR-a0jk-YGwn-j53z-ZMav-nyy9-O9c3ft
LV Write Access read/write
LV Creation host, time lvm-test-on-pdv, 2015-03-14 18:20:10 +0900
LV Status available
# open 0
LV Size 6.00 GiB
Current LE 1536
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:2


上記コマンド結果で特に問題が無いことが確認できました。

論理ボリュームグループの容量が増えたので、これで他の論理ボリュームの容量を増やすことができるようになりました。

今回はxfs ファイルシステムの/dev/lvg-share/media の容量を8GiB から28GiB に拡張してみます。

$ sudo lvextend -L 28G /dev/lvg-share/media

Extending logical volume media to 28.00 GiB
Logical volume media successfully resized

xfs ファイルシステムを拡張します。

$ sudo xfs_growfs /dev/lvg-share/media 

meta-data#/dev/mapper/lvg--share-media isize=256 agcount=4, agsize524288 blks
# sectsz=512 attr2
data # bsize=4096 blocks=2097152, imaxpct25
# sunit=0 swidth0 blks
naming #version 2 bsize=4096 ascii-ci0
log #internal bsize=4096 blocks=2560, version2
# sectsz=512 sunit=0 blks, lazy-count1
realtime #none extsz=4096 blocks=0, rtextents0
data blocks changed from 2097152 to 7340032

df -h コマンドでボリュームが拡張されたことを確認します。

$ df -h 

Filesystem Size Used Avail Use% Mounted on
/dev/sda1 75G 1.2G 70G 2% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 4.0K 2.0G 1% /dev
tmpfs 394M 3.2M 391M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/mapper/lvg--share-media 28G 33M 28G 1% /mnt/media
/dev/mapper/lvg--share-public 18G 44M 17G 1% /mnt/public
/dev/mapper/lvg--share-document 6.0G 33M 6.0G 1% /mnt/document

/mnt/media の領域が拡張されていることがわかります。


次の記事

LVMでスナップショットの作成と状態の復元