自宅サーバーのディスクが1台壊れたのでRAIDを組み直しました。
mdadmによるRAID構成手順を残しておきます。
・Linux Debian 9.11 (stretch)
・mdadm 3.4-4+b1
RAID構築に必要なパッケージ(mdadm)はすでに入っているものとします
もともと、sdcとsddの2台のディスクでRAID1(ミラーリング)を組んでいたのですが、sddのディスクが壊れた(サーバー起動時になにやら怪しげなエラーが出て立ち上がらなくなった)のです。
S.M.A.R.T. Status Bad. Backup and Replaceと出てます。こわいですね(>_<)
ということで、新しいRAID1を組み直すことにしました。容量も3TBから6TBに増量して。
用意したのは6TB HDD 2台。
これで新しいミラーリングRAIDを組みます。
まず、壊れたsddを取り外し、そこに新しい6TB HDDをつなげます。
sdc1台だけでRAID1を動かしている状態です。(1台だけなので、これは本当はRAIDとは言いませんが)
大切なデータはsdcに残っているのでセーフです。
もしこの状態でsdcも壊れたらデータが消失するので手早く新しいRAIDを構築しちゃいましょう。
まずpartedコマンド。
partedはディスクパーティションの作成や削除など行うコマンドです。
パーティション形式はMBRではなくGPT(GUIDパーティションテーブル)にします。
MBRだとディスク2TBまでしか認識できません。GPTは2TBを超えるディスクをサポートできます。
1 2 3 4 5 6 7 8 9 10 11 12 |
parted /dev/sdd # パーティション形式はgptにする (parted) mklabel gpt # パーティション作成(ext4, 0-6001GB。ディスクサイズは'p'キーで確認できます。 # Warningが出るが、Ignoreで作成) (parted) mkpart Partition name? []? File system type? [ext2]? ext4 Start? 0 End? 6001GB Warning: The resulting partition is not properly aligned for best performance. Ignore/Cancel? Ignore |
pコマンドで確認してみます。
Start:17.4kB End:6001GB のext4のパーティションが作られています。
1 2 3 4 5 6 7 8 9 |
(parted) p Model: ATA WDC WD60EZAZ-00Z (scsi) Disk /dev/sdd: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 6001GB 6001GB ext4 |
quitで終了します。
1 |
(parted) quit |
次に、この新しいディスクsddだけでraid1(ミラーリング)を構成します。
sdd1を1台だけの未完成RAID1としてまず作成するということです。
すでにmd3というRAID1は定義されてしまっているので、ここではmd4という名前を使うことにします。
mdadmコマンド中の’missing /dev/sdd1′ という引数は 「/dev/sdd1が無い」という指定に見えますが、そうではなくて、
「missingオプション(1台だけで構築)。その1台は/dev/sdd1である」という指定になります。まぎらわしいですが。
1 2 3 4 5 6 7 8 9 |
$ mdadm --create /dev/md4 --level=raid1 --raid-devices=2 missing /dev/sdd1 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/md4 started. |
新しいRAID1が組めたので、このraidパーティションをext4でフォーマットします。
コマンドはmkfs.ext4です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ mkfs.ext4 /dev/md4 mke2fs 1.43.4 (31-Jan-2017) /dev/md4 alignment is offset by 3072 bytes. This may result in very poor performance, (re)-partitioning suggested. Discarding device blocks: done Creating filesystem with 1465097856 4k blocks and 183140352 inodes Filesystem UUID: 981b684e-f49f-4ddd-84dd-d253eb32d1e5 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 (262144 blocks): done Writing superblocks and filesystem accounting information: done |
次に、データを移す準備をします。
このRAIDパーティションを/data2にmountします
1 2 |
mkdir /data2 mount /dev/md4 /data2 |
/dev/md3 (/data) → /dev/md4 (/data2) にファイルをコピーします。
行末に&をつけているのは、バックグラウンドで実行するためです。
古い方のRAIDから新しい方のRAIDにデータを移行するというわけです。
1 |
rsync -a /data/* /data2 & |
ここまでできたら、sdcの3TBは不要なのでサーバーを止めて3TBのsdcのディスクを取り出し、
代わりに6TBの新ディスクを接続します。
新しいディスクになった /dev/sdc をセットアップします。
Warningが出ますが、’Ignore’を入力し作成します。
sddをセットアップしたときと要領は同じです。
1 2 3 4 5 6 7 8 9 |
parted /dev/sdc (parted) mklabel gpt (parted) mkpart Partition name? []? File system type? [ext2]? ext4 Start? 0 End? 6001GB Warning: The resulting partition is not properly aligned for best performance. Ignore/Cancel? Ignore |
pコマンドで、確かにパーティション(sdc1)ができていることを確認します。
1 2 3 4 5 6 7 8 9 |
(parted) p Model: ATA WDC WD60EZAZ-00Z (scsi) Disk /dev/sdc: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 6001GB 6001GB |
sdcにパーティションが作れたのでpartdを終了します。
1 |
(parted) quit |
ここで、 lsblkコマンドで確認したら、新しいRAIDはmd4で作ったはずなんですがmd126という番号になってました。
直し方が分からないので、もうこのままいくことにしました。
強制的に変えることもできるようですが、あまり気にしてないのでmd126のままでいきます
1 2 3 4 5 6 7 |
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdc 8:32 0 5.5T 0 disk └─sdc1 8:33 0 5.5T 0 part sdd 8:48 0 5.5T 0 disk └─sdd1 8:49 0 5.5T 0 part └─md126 9:126 0 5.5T 0 raid1 /data/mydata |
sdc1をRAID(md126)にJOINします。
晴れて2台構成のRAID1が完成します
1 |
mdadm /dev/md126 -a /dev/sdc1 |
mdstatを見ると、今まで1台構成だったRAIDが2台になってデータをシンクロ中であることがモニタできます
1 2 3 4 5 6 |
$ cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md126 : active raid1 sdc1[2] sdd1[1] 5860391424 blocks super 1.2 [2/1] [_U] [>....................] recovery = 0.0% (608320/5860391424) finish=481.6min speed=202773K/sec bitmap: 44/44 pages [176KB], 65536KB chunk |
これでRAIDは完成しましたが、起動時に自動的にRAIDディスクをマウントするように設定をしておきます。
1 2 |
$ mdadm --detail --scan ARRAY /dev/md/hostname:5_0 metadata=1.2 spares=1 name=hostname:5 UUID=1356d7a8:82d39f2a:9fccf8d7:8599fa1c |
なぜそうするのか良く分かっていませんが、そうするのが決まりみたいです。
/dev/md/hostname:5_0 というARRAYになっていますが、これは /dev/md126へのシンボリックリンクになっていました。
なぜこういう名前になるのか良く分かりませんが。ま、動いているから良しとします。
/etc/fstab を更新しておきます。
1 |
/dev/md126 /data ext4 errors=remount-ro 0 0 |
以上でうまくRAIDの再構築ができました。
おわり