2014年1月30日木曜日

自己満足的自宅サーバーディスク構成変更(5)~他のアレイを移行

会社から帰ってきたらRAID 5(2台)の構築は終わっていました。
# mdadm --detail /dev/md5 
/dev/md5:
        Version : 1.2
     Raid Level : raid5
     Array Size : 1953381888 (1862.89 GiB 2000.26 GB)
  Used Dev Size : 1953381888 (1862.89 GiB 2000.26 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Number   Major   Minor   RaidDevice State
       0       8       67        0      active sync   /dev/sde3
       2       8       81        1      active sync   /dev/sdf1
ふむふむ。いい感じです。この状態だと前のRAID 1と(サイズ的にも、冗長性的にも)同等の状態なのでこれを再びLVMに戻して他のディスクをあけます。
# pvcreate /dev/md5
  Physical volume "/dev/md5" successfully created
この時点では、まだVGに属してないボリュームとして見えます。
早速追加します。
# vgextend vg_data /dev/md5
  Volume group "vg_data" successfully extended
pvdisplay等でも正しく追加されたことが確認できますが、GUIでも
のように確認できます。あとはここに次に移行したいアレイから extent を移動します。今度は /dev/md4 をあけました(ってさらって書いてますがこれも5、6時間は放置してたかなw)。同じようにすべて"Unused Space"になっているのを確認して"Remove Volume from Volume Group"してからアレイを停止します。

その外したディスクについて新しくパーティションを切ります。切ったパーティションを今度は前回作ったRAID 5のアレイに追加します。

# mdadm --add /dev/md5 /dev/sdc3 /dev/sdd1 
mdadm: added /dev/sdc3
mdadm: added /dev/sdd1
# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md5 : active raid5 sdd1[4](S) sdc3[3](S) sdf1[2] sde3[0]
      1953381888 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/2] [UU]

# mdadm --detail /dev/md5
/dev/md5:
        Version : 1.2
  Creation Time : Fri Jan 24 09:11:13 2014
     Raid Level : raid5
     Array Size : 1953381888 (1862.89 GiB 2000.26 GB)
  Used Dev Size : 1953381888 (1862.89 GiB 2000.26 GB)
   Raid Devices : 2
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Sat Jan 25 16:20:44 2014
          State : clean 
 Active Devices : 2
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 2

         Layout : left-symmetric
     Chunk Size : 512K

    Number   Major   Minor   RaidDevice State
       0       8       67        0      active sync   /dev/sde3
       2       8       81        1      active sync   /dev/sdf1

       3       8       35        -      spare   /dev/sdc3
       4       8       49        -      spare   /dev/sdd1

この状態ではRAID 5(2台+スペア2台)になります。これをRAID 5(3台+スペア1台)に変更します。(再起動した関係でデバイス名が変わっています。)
# mdadm --grow /dev/md127 --raid-devices=3
mdadm: Need to backup 1024K of critical section..
# mdadm --detail /dev/md127
/dev/md127:
        Version : 1.2
  Creation Time : Fri Jan 24 09:11:13 2014
     Raid Level : raid5
     Array Size : 1953381888 (1862.89 GiB 2000.26 GB)
  Used Dev Size : 1953381888 (1862.89 GiB 2000.26 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Sat Jan 25 17:57:44 2014
          State : clean, reshaping 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

 Reshape Status : 0% complete
  Delta Devices : 1, (2->3)

    Number   Major   Minor   RaidDevice State
       0       8       67        0      active sync   /dev/sde3
       2       8       81        1      active sync   /dev/sdf1
       3       8       35        2      active sync   /dev/sdc3

       4       8       49        -      spare   /dev/sdd1
無事3台構成のRAID 5としてreshapeのプロセスに入ったようですね。いつもの /proc/mdstat も見てみましょう。
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md125 : active raid1 sdb1[1] sde1[2] sdc1[3]
      524276 blocks super 1.0 [3/3] [UUU]
      
md126 : active raid1 sdb4[1] sda4[0]
      1676161496 blocks super 1.2 [2/2] [UU]
      
md127 : active raid5 sde3[0] sdc3[3] sdf1[2] sdd1[4](S)
      1953381888 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [>....................]  reshape =  0.1% (2117632/1953381888) finish=1676.8min speed=19393K/sec
えええっ! 1676分!27時間じゃないですか!w ディスク2本のときは6時間だったので1本増えた分で9時間ぐらいかなと思ってたんですが甘かったですね・・・。これ6本になったら3週間ぐらいかかっちゃう!?

今さらだけど、RAID5/2 -> RAID6/4 にするのはエラーになったので、RAID5/2 -> RAID5/3 -> RAID 6/4 という道で行くことにしたんだけど、もしかしてRAID5/2 -> RAID5/4 なら一度で行けたのかな?もしできるなら RAID5/2 -> RAID5/4 -> RAID6/6 としたほうが reshape の数が少なくてよかったのかな・・・。それともやっぱりRAID5/2 -> RAID5/4 もエラー?

まあはじめてしまったのは仕方ないので、27時間待ちますw 問題は定期的に行われる resync? もこのぐらいかかるのだと一日では到底終わらないので困るんですがどうなんだろう。あとやっぱりこんなにかかるとなると、degradeしたときのRAID 5ってやっぱりこわいですね。冗長性を復活させるのに丸一日かかってたら、その間にもう一本やられちゃうこともありそうです。なのでRAID 6の安心にコストを払うのが正解という判断で。

そう思って一晩置いたところ、開始後15時間ほどでまだ50%ぐらいだったんですが、なぜか残り時間が220分とかになってますね。
# cat /proc/mdstat     
md127 : active raid5 sde3[0] sdc3[3] sdf1[2] sdd1[4](S)
      1953381888 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [==========>..........]  reshape = 53.5% (1045575200/1953381888) finish=220.5min speed=68608K/sec
その後もちょくちょくチェックしてたらスピードが最初のころの5倍とかのままでどんどん進んでいます。何か2フェーズにわかれてるのかな?

最終的に23時間ほどで完了しました。
# mdadm --detail /dev/md127
/dev/md127:
        Version : 1.2
  Creation Time : Fri Jan 24 09:11:13 2014
     Raid Level : raid5
     Array Size : 3906763776 (3725.78 GiB 4000.53 GB)
  Used Dev Size : 1953381888 (1862.89 GiB 2000.26 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Sun Jan 26 16:38:19 2014
          State : clean 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

    Number   Major   Minor   RaidDevice State
       0       8       67        0      active sync   /dev/sde3
       2       8       81        1      active sync   /dev/sdf1
       3       8       35        2      active sync   /dev/sdc3

       4       8       49        -      spare   /dev/sdd1
ちゃんとサイズが4TBになっているのがわかりますね。すばらしい。さあいよいよRAID 6です。
# mdadm --grow /dev/md127 --level=6 --raid-devices=4 --backup-file=/root/raid.back
mdadm: level of /dev/md127 changed to raid6
# cat /proc/mdstat 
md127 : active raid6 sde3[0] sdc3[3] sdf1[2] sdd1[4]
      3906763776 blocks super 1.2 level 6, 512k chunk, algorithm 18 [4/3] [UUU_]
      [>....................]  reshape =  0.0% (96256/1953381888) finish=3719.6min speed=8750K/sec
      
わははw 3719分ということは61時間、約3日かかる計算ですw 実際はまた途中から早くなるかもしれないですけど。これは気長に待つしかないですね。

そして1日経過、まだまだw

2日経過、60%は越えましたが途中から早くなるかもという希望は打ち砕かれましたw

開始から2日半でようやく80%台を越え、残り976分と1000分を切りました!w

そして開始から3日と6時間ぐらいたったころ、ようやく完了しました。長かった・・・けどまだ2本追加するんですがw

終わる直前↓w
# cat /proc/mdstat 
md127 : active raid6 sde3[0] sdc3[3] sdf1[2] sdd1[4]
      3906763776 blocks super 1.2 level 6, 512k chunk, algorithm 18 [4/3] [UUU_]
      [===================>.]  reshape = 99.9% (1952316928/1953381888) finish=3.3min speed=5360K/sec

2014年1月28日火曜日

自己満足的自宅サーバーディスク構成変更(4)~RAID 6の元になるアレイの作成

さていよいよ最終的にはでかいRAID 6のアレイに育てるアレイを作ります。まず外したアレイのメンバだった2.0TBのディスクを全体で1つパーティションを切ります。(全体なので切らなくてもいいような気もしますが、これより大きいディスクでサイズをあわせやすくするために一応切っておきます。)そして3.0TBのディスクはシステム部分が入っているとはいえ2.0TB以上あまっているので、ここに同じサイズのパーティションを作成しました。
(parted) unit b                                                           
(parted) print                                                            
Model: ATA WDC WD30EZRX-00D (scsi)
Disk /dev/sde: 3000592982016B
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start          End             Size            File system  Name  Flags
 1      1048576B       537919487B      536870912B      ext4               raid
 2      537919488B     275415826431B   274877906944B                      raid
 3      275415826432B  2275813621759B  2000397795328B                     raid

(parted) select /dev/sdf
Using /dev/sdf
(parted) print                                                            
Model: ATA WDC WD20EARX-00P (scsi)
Disk /dev/sdf: 2000398934016B
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start     End             Size            File system  Name  Flags
 1      1048576B  2000398843903B  2000397795328B                     raid

このように1バイト単位まで同じです。さていよいよ「ディスク2本のRAID 5」は作れるのか!?

# mdadm --create /dev/md5 --level=5 --raid-devices=2 /dev/sde3 /dev/sdf1
mdadm: /dev/sdf1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Tue Jan  1 10:32:54 2013
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md5 : active raid5 sdf1[2] sde3[0]
      1953381888 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
      [>....................]  recovery =  0.1% (3436876/1953381888) finish=389.9min speed=83342K/sec

むむっ、拍子抜けするぐらい普通に作れたんですけどw あ、小さい領域で実験してからにすべきだったか・・・。しかも2.0TB2本で389分ということは、6本全部構成し終わったらresyncに1200分、つまり20時間かかる計算!?w

というわけで、20時間待って失敗は悲しいので、小さい領域で実験してみることにしました。まずは4つパーティションを用意します。
(parted) unit gib
(parted) mkpart primary 1 2                                               
(parted) mkpart primary 2 3
(parted) mkpart primary 3 4
(parted) mkpart primary 4 5
(parted) set 1 raid on
(parted) print                                                            
モデル: ATA M4-CT128M4SSD2 (scsi)
ディスク /dev/sdd: 119GiB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始     終了     サイズ   タイプ   ファイルシステム  フラグ
 1    1.00GiB  2.00GiB  1.00GiB  primary                    raid
 2    2.00GiB  3.00GiB  1.00GiB  primary                    raid
 3    3.00GiB  4.00GiB  1.00GiB  primary                    raid
 4    4.00GiB  5.00GiB  1.00GiB  primary                    raid
違うマシンでやったのでロケールが日本語になってますがご容赦を。さてパーティションは切れたので早速RAID 5のアレイを作ってみます。実際と同様に2台です。
# mdadm --create /dev/md0 --level=5 --raid-devices=2 /dev/sdd1
/dev/sdd2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd2[2] sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
      [====>................]  recovery = 24.1% (253736/1047552) finish=0.1min
speed=84578K/sec
      
# mkfs.ext4 /dev/md0
# mount /dev/md0 /mnt/tmp
ファイルシステムも作ってマウントしました。念のためということでそこにランダムなデータのファイルを作り、それを別のパーティションにもコピーしておきます。
# dd if=/dev/urandom of=random.dat count=1800000
$ cp /mnt/tmp/random.dat .
さあ準備はできたのでいよいよ1パーティション壊してみましょう。まずは fail にしてから remove です。
# mdadm --fail /dev/md0 /dev/sdd2
mdadm: set /dev/sdd2 faulty in /dev/md0
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd2[2](F) sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]

# mdadm --remove /dev/md0 /dev/sdd2
mdadm: hot removed /dev/sdd2 from /dev/md0
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
無事抜けました。この状態でも degraded ですが動いている(はず)。さっきコピーしておいたファイルとマウントしているところにあるファイルを比べてみると
$ diff random.dat /mnt/tmp/random.dat 
$
おお、問題なさそうですね!念のためその外したディスクは別のデータで上書きしてみます。
# mkfs.ext4 /dev/sdd2
# mount /dev/sdd2 /mnt/tmp2
# ls /mnt/tmp2/
lost+found

$ diff random.dat /mnt/tmp/random.dat 
$
やはり問題はないです。すばらしい。 さていよいよ本題のRAID 6への変換です。 先ほど外したパーティションを戻してから、さらに2つのパーティションを追加します。
# umount /mnt/tmp2
# mdadm --add /dev/md0 /dev/sdd2
mdadm: added /dev/sdd2
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd2[2] sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/1] [U_]
      [=============>.......]  recovery = 68.6% (720256/1047552) finish=0.0min
speed=102893K/sec

# mdadm --add /dev/md0 /dev/sdd[34]
mdadm: added /dev/sdd3
mdadm: added /dev/sdd4
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd4[4](S) sdd3[3](S) sdd2[2] sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [2/2] [UU]

# mdadm --detail /dev/md0
/dev/md0:
    Number   Major   Minor   RaidDevice State
       0       8       49        0      active sync   /dev/sdd1
       2       8       50        1      active sync   /dev/sdd2

       3       8       51        -      spare   /dev/sdd3
       4       8       52        -      spare   /dev/sdd4
はい。2台追加されてスペアとなっています。これを4台のRAID 6に・・・と思ったらエラーになりました。1台ずつしかできないのかな?とにかく1台ずつ行きます。3台ではまだRAID 6にできないので、まずは3台のRAID 5にします。
# mdadm --grow /dev/md0 --raid-devices=3
mdadm: Need to backup 1024K of critical section..
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdd4[4] sdd3[3](S) sdd2[2] sdd1[0]
      1047552 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=====>...............]  reshape = 26.1% (273920/1047552) finish=0.4min
speed=30321K/sec

なんか Need to backup... って言われたのでコマンドはrejectされたのかと思いきや普通にRAID 5への変換が行われました。いいねいいね。終わったらいよいよRAID 6への変換です。
# mdadm --grow /dev/md0 --level=6 --raid-devices=4
mdadm: level of /dev/md0 changed to raid6
mdadm: /dev/md0: Cannot grow - need backup-file
mdadm: aborting level change

おお、今度はちゃんとrejectされました。バックアップファイルを指定して再実行です。
# mdadm --grow /dev/md0 --level=6 --raid-devices=4
--backup-file=/home/raid.back
mdadm: level of /dev/md0 changed to raid6
# cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] 
md0 : active raid6 sdd4[4] sdd3[3] sdd2[2] sdd1[0]
      2095104 blocks super 1.2 level 6, 512k chunk, algorithm 18 [4/3] [UUU_]
      [>....................]  reshape =  1.5% (16384/1047552) finish=2.0min
speed=8192K/sec

すばらしい。うまくいきました。

でもこれってつまり2台追加するときは2回 reshape するってことよね。2.0TBが2台で6時間として、3台は9時間、4台は12時間、5台は15時間、6台が18時間、それぞれ全部やらないといけないということは合計39時間w

2014年1月26日日曜日

自己満足的自宅サーバーディスク構成変更(3)~システムパーティションの移動

前回LVMから外した3.0TBのディスクに/bootと/を持ってきます。切りなおしてファイルコピーでもいいんですが、せっかくなのでRAID 1の機能を使って行きましょう。

まず現状を確認です。
# parted
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit b                                                           
(parted) print                                                            
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sda: 2000398934016B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start          End             Size            Type     File system  Flags
 1      1048576B       537919487B      536870912B      primary  ext4         boot, raid
 2      537919488B     9127854079B     8589934592B     primary               raid
 3      9127854080B    284005761023B   274877906944B   primary               raid
 4      284005761024B  2000396321279B  1716390560256B  primary               raid

(parted) select /dev/sde
Using /dev/sde
(parted) print                                                            
Model: ATA WDC WD30EZRX-00D (scsi)
Disk /dev/sde: 3000592982016B
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start           End             Size            File system  Name  Flags
 1      1048576B        2000398843903B  2000397795328B                     raid
 2      2000398843904B  3000592498687B  1000193654784B

(parted)
ここでsdaの1と3が/bootと/なのでこれと同じサイズのパーティションを作成します。
(parted) rm 1                                                             
(parted) rm 2                                                             
(parted) unit mib                                                         
(parted) mkpart                                                           
Partition name?  []?                                                      
File system type?  [ext2]?                                                
Start? 1                                                                  
End? 513                                                                  
(parted) mkpart                                                           
Partition name?  []?                                                      
File system type?  [ext2]?                                                
Start? 513                                                                
End? 262657                                                               
(parted) set 1 raid on                                                    
(parted) set 2 raid on                                                    
(parted) unit b                                                           
(parted) print                                                            
Model: ATA WDC WD30EZRX-00D (scsi)
Disk /dev/sde: 3000592982016B
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start       End            Size           File system  Name  Flags
 1      1048576B    537919487B     536870912B                        raid
 2      537919488B  275415826431B  274877906944B                     raid

(parted) 
これでサイズも全く同じパーティションができました。これをアレイに追加します。
# mdadm --add /dev/md0 /dev/sde1
mdadm: added /dev/sde1
# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 sde1[2](S) sdb1[1] sda1[0]
      524276 blocks super 1.0 [2/2] [UU]

スペアとして追加されてることがわかります。それを3台構成のRAID 1として定義しなおします。
# mdadm --grow /dev/md0 --raid-devices=3
raid_disks for /dev/md0 set to 3
# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 sde1[2] sdb1[1] sda1[0]
      524276 blocks super 1.0 [3/2] [UU_]
      [============>........]  recovery = 62.5% (327680/524276) finish=0.0min speed=109226K/sec
問題なさそうですね。同じことを / 用のアレイにも行えば /boot と / を3.0TBのディスクに移動したのと等価になります。

さて、あとは忘れずにこのディスクにもGRUBを入れなければいけません。
grub> root (hd4,0)
root (hd4,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd4)
setup (hd4)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd4)"... failed (this is not fatal)
 Running "embed /grub/e2fs_stage1_5 (hd4,0)"... failed (this is not fatal)
 Running "install /grub/stage1 (hd4) /grub/stage2 p /grub/grub.conf "... succeeded
Done.
果たしてこれで立ち上がってくれるのか?

一応確認のため、UEFIの起動順をこのディスクに変えて起動。大丈夫そうです。まあ厳密には他のディスクを外してみないと、本当にこのディスクだけから立ち上がってるかどうかの確認はできてないですが。

最後の仕上げで、今は3台のRAID 1になってるので、それから1台抜いて2台に戻します。
# mdadm --fail /dev/md0 /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md0
# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 sdb1[1] sde1[2] sda1[0](F)
      524276 blocks super 1.0 [3/2] [_UU]

# mdadm --remove /dev/md0 /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md0
You have new mail in /var/spool/mail/root
# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 sdb1[1] sde1[2]
      524276 blocks super 1.0 [3/2] [_UU]

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.0
  Creation Time : Fri Dec 21 23:57:28 2012
     Raid Level : raid1
     Array Size : 524276 (512.07 MiB 536.86 MB)
  Used Dev Size : 524276 (512.07 MiB 536.86 MB)
   Raid Devices : 3
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Jan 24 08:24:51 2014
          State : clean, degraded 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       17        1      active sync   /dev/sdb1
       2       8       65        2      active sync   /dev/sde1
一瞬 degraded になりますが(当然メールも飛びますが)、2台体制に戻します。
# mdadm --grow /dev/md0 --raid-devices=2
raid_disks for /dev/md0 set to 2
# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.0
  Creation Time : Fri Dec 21 23:57:28 2012
     Raid Level : raid1
     Array Size : 524276 (512.07 MiB 536.86 MB)
  Used Dev Size : 524276 (512.07 MiB 536.86 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Jan 24 08:26:04 2014
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

    Number   Major   Minor   RaidDevice State
       1       8       17        0      active sync   /dev/sdb1
       2       8       65        1      active sync   /dev/sde1

これで問題なく移動が完了しました。/ 用のアレイについても同様に処理しました。

まあこの移行の間にディスクが故障するってことを警戒しなければ、3つにして1つ抜くなんてしないでいきなり1つ抜いて別のと sync すりゃいいんだと思うんですが、基本ディスクは壊れるものという信念で作業しておりますw

2014年1月25日土曜日

自己満足的自宅サーバーディスク構成変更(2)~LVMからアレイを外す

それでは<お約束>ここに書かれていることを試す場合はデータをバックアップし、自己責任でお願いします。間違い等があっても責任は負いません。</お約束>

さて、まずは領域をあけます。ディスク上の不要なデータを削除して、なんとか2.5TBぐらいは開き領域を作成しました。つまり4TB程度はデータがある状態になります。Logical Volume Management を開き、必要ならLVのサイズを減らし、空きextentを確保します。この状態で、除去しようとしているアレイから使用中の extentを他のアレイに移動しなければいけません。早速行ってみましょう。

まず除去しようとしているアレイを Physical View でポイントします。すると以下のような絵が出てくると思います。この時点で全部が"Unused Space"だったら今すぐにでも除去できるわけですが、たいていの場合このように使用中になっていると思います。その場合は移動したいextent、下だとlv_shareが割り当てられているところをクリックします。あ、もちろんこの時点で他のPhysical Volumeに今選んでいる領域が使っているextentの数以上の空きextentがあることは確認してください。大丈夫であれば"Migrate Selected Extent(s) From Volume"をクリックします。


すると、確認のダイアログが出ます。

ここで適当に移動してもらってもいい場合は Automatically ... で、指定したい場合は Destination を選んでいざ OK を押します。

あれ、今さら気づいたけど、"Only migrate extends belonging to LV" ってのがチェックされてないってことは、もしかしてこれって選択してる領域にかかわらず全部移動するのかな?未確認。もし複数のLVがある場合はお気をつけください。

ともかくこれを実行してのんびり待つと空のPhysical Volumeとなります。今回の場合は2時間ぐらい後に見たら終わってました。
 こんな感じに全部が Unused Space になったらあとは"Remove Volume from Volume Group"をクリックするだけです。こちらはすぐに終わります。

せっかくなのでアレイの停止とかもGUIでやってみますか。Disk Utilityを開いて"Stop RAID Array"を押します。これは慎重に。間違えちゃだめなやつですよね?w
これでアレイは停止状態になりました。ちなみにコマンドでは mdadm -S <device> ですね。

自己満足的自宅サーバーディスク構成変更(1)~計画

先日のエントリで会社の開発機に起きた顛末をつらつらと書き連ねましたが、無事復活したことで急に家のサーバーのディスクは大丈夫かいなと思い始めました。ディスクの稼動時間なら会社のやつに負けないよ?いっぱい壊れてるかもよ?w

早速帰宅して調べたところ、すばらしいことにどのディスクも1つも不良セクタはないようです(ディスクが気づいてないだけかもw)。一番長いやつで 3.4 years となっているので3年以上稼動しているようですが。とりあえずそんなひどい状況ではないようです。

自宅サーバーはこんな感じでRAID 1のアレイをいくつか作り、それをLVMで取りまとめていたわけですが、今回LinuxのソフトウェアRAIDの便利さに感銘を受けたので、もっと使い込もうかなと。しかも当時誤解していたのか、ソフトウェアRAIDって0/1/10ぐらいしかできないと思ってたのに5や6もできるんですね。Linuxすばらしい。

現状のディスクはちょっとずつ買ったせいでサイズはまちまちです。
  1. 2.0TB (/boot, swap, /, pv(1))
  2. 2.0TB (/boot, swap, /, pv(1))
  3. 2.5TB (pv(2))
  4. 2.5TB (pv(2))
  5. 3.0TB (pv(3), data)
  6. 2.0TB (pv(3))
/boot, /, pv(1), pv(2), pv(3) はすべてRAID 1、swap は RAID 0、data は素の領域となっています。これをもっと改善できないかな?

/boot や / は何もディスクをケチるほど大きくないので RAID 1 のままでよいとして、他はせっかく6台もあることだし、RAID 5/6 にしたいですよね。私は個人的にはRAID 5が嫌いなので6にしたいかなと。もし/bootや/を2.5TBや3.0TBのディスクに移動できれば、2.0TBx6(RAID 6)=8.0TB になるわけで、現状の約6.0TBから2.0TBも増やせた上に冗長性が高くなります。これはやらない手はない。なぜRAID 5が嫌いかというと、5ってリビルドの負荷がかなり高くて、その間に大丈夫だったディスクがやられちゃうのが怖いのです。 6なら仮にそれがおきてもさらに1台やられない限り大丈夫なので気持ちの余裕が違うかなと。

しかしやるとなっても、システムには既にデータが数TBオーダーで置いてあるので、退避して戻すのは不可能。そんなでかいストレージは他にないです。なのでオンラインで変更できるわけもないし無理かなーと思っていたのですが、できそうなんですよ。確かに言われて見ると、「2台のRAID 5」=「RAID 1」なわけで、それをRAID 5、さらに6と上げていくのは技術的には可能でおかしくはないか。このあたりを読むとRAID 5から6への変更は mdadm コマンドでできるっぽいので、もしかしたらRAID 1から5もできたりしないのかな?

しかし、それができるとわかっても、やっぱりデータが載ってるRAID 1のアレイをリンク先の手順に書いてあるように一度消して作り直すのはちょっと怖い。なので、やるなら以下の方法がいいかなと思ったわけです。
  1. 現状LVMに参加しているアレイの最大サイズ(2.5TB)の分だけなんとか領域をあける
  2. そのアレイをLVMから抜く
  3. そのアレイをRAID5/2(RAID5の2台の意)にする
  4. 再びLVMに参加
  5. 別のアレイをLVMから抜く
  6. そのアレイを壊して3で作ったアレイに追加し、RAID5/2+2(RAID5の2台+スペア2台)
  7. RAID5/2+2をRAID6/4に変更
  8. 最後のアレイをLVMから抜く
  9. そのアレイを壊して7のアレイに追加し、RAID6/6に変更
 いやこれはまた壮大ですねw

しかも理想的には最低サイズ(2.0TB)にあわせてアレイを構築したほうがいいので、 /boot 等のシステム用のパーティションはでかいディスクに移したいわけです。まずはそこから手をつけるか?
  1. 3.0TBが参加しているアレイをLVMから抜く
  2. パーティションを切りなおし、既存の2.0TBのシステム用パーティションにあわせる
  3. RAID 1として参加させる
  4. GRUBをセットアップ
  5. 既存のディスクをアレイから抜く
基本これでいけるはず。じゃあアレイの構築とか相当時間がかかると思うのでのんびり行きますか。

2014年1月23日木曜日

再びディスクの話

おっと気づいたら2014年初エントリですね。つまりこんな感じで頻繁に書くものではないですが、今年もよろしくお願いします。

突然ですが、私はソフトウェア開発を生業としております。従って会社でもプログラムを書く仕事をしていて、机にはいわゆる「開発機」という開発専用のマシンを所有して(もちろん正確には貸与されて)います。会社は社員にノートPC(Windows)を貸与しているので日々の業務アプリケーション等は Windows が基本ですが、WindowsでないとできないものはノートPCでやればいいので、開発機は各自の自由な管理となっています。大半の人はWindowsですけどね。私はもちろんLinux - Red Hat Enterprise Linux を入れて活用しています。

その開発機もディスクが飛んですべて吹っ飛ぶのはいやなので、家のサーバーのように RAID 1 で冗長化しています。正確には、悲しいかな会社で使うマシンはうちのマシンより高いくせに貧弱(失礼)で、ディスクも 1.5TB/1.0TB/500GB を後生大事に使い続けるという状態なので、大事なデータを RAID 1 (1.5TB のうち 1.0TB と 1.0TB)と RAID 0 (1.5TB のうち 500GB と 500GB)で運用しています。しかもその1.5TBと1.0TBは前のマシンから転用してきたので結構前からあるやつです。

それが先週ふと GNOME の上のバーのところに、ディスクのアイコンに「!」がついてるアイコンがでていることに気づきました。最初は「何だろ?ディスクいっぱいにでもなったかな?」と思ったのですが、クリックしてみると

「ディスクが壊れかけています」(うろ覚え)

!!!
これはまずいと思いさらにクリックだかダブルクリックだかでディスクユーティリティーなるものが開くので見てみます。(余談ですが Linux もずいぶん便利になりましたよね。)すると、1.0TBのディスクの表示が既に「故障しています」になっているではないですか。 orz

どうも SMART の情報に何かあるということでクリックしてみると、"Reallocated Sector Count" という項目に赤が。ダメになって別のところが使われたと判定されたセクタの数ということですね。警告の出る閾値が確か100ぐらいだったんですがなんと2000越え。これは危険だ。仕方ないので交換用のディスクを注文し、翌日見ると3000越え。その翌々日見たら4000越えと日増しに増えてました。

とはいえ、上に書いたようにこのディスクは基本 RAID 1 のメンバーなので、最悪吹き飛んでもいいわけです。なのでのんびり見てたんですが、さすがにこんだけ増えてくるとなるともう外したほうがいいかと思って物理的に外しました。/proc/mdstat を見るとしっかり全部 degrade 状態に変化します。

秋葉原で買ってくれば即日なのに会社ってのは面倒なもんで、指定した業者から納品されたのは1週間後ぐらいでしたか。秋葉原で買ってくれば半額ぐらいなのに。 早速つないで RAID を再構築です。全く簡単な話で、既にあるアレイと同じか大きいパーティションを作成し、
# mdadm --add /dev/md127 /dev/sdb1
などとするだけです。しばらくして resync が終われば冗長性も完全復活です。

しかしですね、もうお分かりかと思うんですが、今さら同じサイズ(1.0TB)のディスク買う理由はないのですよ。というわけで今回買ったのは秋葉原なら普通に3.0TBや4.0TBも買えるのになぜか2.0TBの大容量!w つまり1.0TBも多いのです!(遠い目

なので、そのあまった分も RAID に組み入れたい、と思ったわけですが。当然アレイのサイズは変えられないし、別のアレイを作って LVM に追加かなぁと思っていたところ、アレイのサイズは変えられるんですね。Linux えらい。

詳細な手順は間違えているかもしれませんが、覚えている限りやったのは以下です。上の mdadm --add する前、既存のアレイが degraded の状態からです。
  1. 大きくしたいサイズでパーティションを切る(私の場合既存のアレイが800GB ぐらいでしたが、1.3TB ぐらいで切りました)
  2. mdadm --add して追加する
  3. mdadm --detail や /proc/mdstat 等で resync が終わるのを待つ
  4. mdadm --fail や物理的に外すなどで元の小さいパーティションをアレイから除く
  5. パーティションを切りなおす
  6. mdadm --add して追加する
この時点ではまだアレイのサイズは変わりませんが、アレイが乗っているディスクのサイズはどちらも増えた状態ということになります。なのでアレイのサイズを増やすことができます。
  1. mdadm --grow <device> -z max
これで使える最大サイズのアレイとなりました。実行する前と後で mdadm --detail <device> | grep Size などとすれば違いがわかると思います。

私はこのアレイをさらに LVM で使っていたので、PV としても大きくなってもらわなければ意味がありません。が、pvdisplay 等で見てもまだ前のサイズのままです。なのでもうひと手間かけましょう。
  1. pvresize <device>
これで無事 PV としても大きなサイズになりました。めでたしめでたし。

ちなみにパーティションのサイズは完全に一致している必要はありません。追加するほうがちょっと大きいぐらいなら無駄にはなりますが全く問題はありません。が、しかし、小さいとちょっと面倒です。先に大きいほうのパーティションでアレイを構築してしまうと、「アレイのサイズ」=「大きいほうのパーティションのサイズ」となってしまい、後から小さいのを追加すると怒られます。アレイのサイズを小さくすればいいのかもですが、大きくするのに比べて小さくするのはちょっと怖い感じですので・・・。(昔乗ってるファイルシステムよりLVを小さくしてぶち壊した経験ありますw)

さらになんでこのエントリが「自宅サーバー」ラベルなのか?それはこの出来事に触発されて自宅サーバーをいじることにしたからです。それはまた後日。