LVM RAID Logical Volumeのクラッシュからの復旧

(2014.12.15)

mdではなく, LVM RAID Logical Volumeでの, ディスククラッシュとその復旧手順。

参考:

次のように, root LV をミラー化して, 2つのHDD で動いているとする。

# lvs -a -o vg_name,name,copy_percent,devices,size
  VG     LV              Cpy%Sync Devices                           LSize 
  fedora root              100.00 root_rimage_0(0),root_rimage_1(0) 15.00g
  fedora [root_rimage_0]          /dev/sda2(512)                    15.00g
  fedora [root_rimage_1]          /dev/sdb2(1)                      15.00g
  fedora [root_rmeta_0]           /dev/sda2(4352)                    4.00m
  fedora [root_rmeta_1]           /dev/sdb2(0)                       4.00m
  fedora swap                     /dev/sda2(0)                       2.00g

エラーが発生した場合の、状況確認、ディスクのエラーチェックについては, こちらのページ; Linuxディスクドライブのエラー検査

実験: 片肺飛行

ここから, sdb を取り外してみる.

lvsコマンドで見ると, LV は [root_rimage_0], [root_rimage_1] の二つとも生きているようになっているが, sdb のUUID が missing として警告が表示される.

# lvs -a
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  LV              VG     Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
  root            fedora rwi-aor-p- 15.00g                               100.00        
  [root_rimage_0] fedora iwi-aor--- 15.00g                                             
  [root_rimage_1] fedora iwi-a-r-p- 15.00g                                             
  [root_rmeta_0]  fedora ewi-aor---  4.00m                                             
  [root_rmeta_1]  fedora ewi-a-r-p-  4.00m                                             
  swap            fedora -wi-ao----  2.00g

ケース1: HDDが復活

実際にはあまり想定しにくいが, HDDが復活したケースとして, 同じディスクドライブを接続してみる。

# lvs -a -o vg_name,name,copy_percent,devices,size
  VG     LV              Cpy%Sync Devices                           LSize 
  fedora root              100.00 root_rimage_0(0),root_rimage_1(0) 15.00g
  fedora [root_rimage_0]          /dev/sda2(512)                    15.00g
  fedora [root_rimage_1]          /dev/sdb2(1)                      15.00g
  fedora [root_rmeta_0]           /dev/sda2(4352)                    4.00m
  fedora [root_rmeta_1]           /dev/sdb2(0)                       4.00m
  fedora swap                     /dev/sda2(0)                       2.00g

治った. 1台のときに書き込んだ内容も, 壊れてない.

LV は HDDを取り外してもその段階では除去されないので、元に戻せる。

ケース2: 新しいHDDと交換

普通はこちらのケースだろう。

電源をいったん落とし, あたらしいHDDを接続して再起動する.

pvsコマンドで表示すると, 元の sdb が missing. 下で表示されているのは, 新しいHDD.

# pvs -a
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  PV               VG     Fmt  Attr PSize  PFree
  /dev/fedora/root             ---      0     0 
  /dev/fedora/swap             ---      0     0 
  /dev/sda1                    ---      0     0 
  /dev/sda2        fedora lvm2 a--  19.51g 2.50g
  /dev/sdb                     ---      0     0 

復旧させるには, 2つのステップを行えばいい. PVの除去と, あたらしいPVのVGへの追加。

Step 1: 古いPVの除去

PVの除去は pvremoveコマンドではなく, vgreduceコマンド.

# vgreduce --removemissing --force fedora
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  PV Efy2k4-ZdE3-7kLP-Y11c-eKzu-6aBp-sSnXy3 not recognised. Is the device missing?
  Wrote out consistent volume group fedora

Step 2: 新しい PVの追加

生きてるディスクドライブを参考にして, 必要な領域が取れるようにパーティションを切る。

# fdisk /dev/sdb

もりもり切っていく。

コマンド (m でヘルプ): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0x027f8d33

デバイス  ブート     Start 最後から   Blocks  Id System
/dev/sdb1 *           2048   1026047   512000  83 Linux
/dev/sdb2          1026048  41943039 20458496  8e Linux LVM

PVを作る.

# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created

作ったPVをVGに加える. vgextendコマンド.

# vgextend fedora /dev/sdb2
  Volume group "fedora" successfully extended

Step 3: 再ミラー化

LVは, 元のHDD上にイメージが残ったことになっているので、LVのミラー化をいったん解消して, 再度ミラー化する.

ミラー化を解消。-m 0オプション.

# lvconvert -v -m 0 fedora/root

sda だけに載っていることを確認。

# lvs -a -o vg_name,name,copy_percent,devices,size
  VG     LV   Cpy%Sync Devices        LSize 
  fedora root          /dev/sda2(512) 15.00g
  fedora swap          /dev/sda2(0)    2.00g

再びRAID 1構成に。

# lvconvert -v --type raid1 -m 1 fedora/root

自動的にデータの同期が開始される。

# lvs -a -o vg_name,name,copy_percent,devices,size
  VG     LV              Cpy%Sync Devices                           LSize 
  fedora root                3.57 root_rimage_0(0),root_rimage_1(0) 15.00g
  fedora [root_rimage_0]          /dev/sda2(512)                    15.00g
  fedora [root_rimage_1]          /dev/sdb2(1)                      15.00g
  fedora [root_rmeta_0]           /dev/sda2(4352)                    4.00m
  fedora [root_rmeta_1]           /dev/sdb2(0)                       4.00m
  fedora swap                     /dev/sda2(0)                       2.00g