これは、あけび猫が使っているマシンのディスクが壊れた時にあけび猫が復旧のやり方を思い出せるように作ったメモです。Debian「squeeze」で試したものです。RAIDレベルは「RAID 1」です。
- 1. RAIDデバイスの状態確認
- 2. RAIDデバイスの管理
- 2.1. mdadm
- 2.2. mdadm.conf
- 2.3. fstab
- 2.4. initrd
- 3. ディスクの管理
- 3.1. パーティション
- 3.2. ファイルシステムのタイプ
- 3.3. GRUB2を使ったブートプログラムのインストール
- 3.4. フロッピーディスクを使ったシステムの起動
- 3.4.1. 起動用FDの作成
- 3.4.2. システムの起動
- 4. ディスクが壊れた場合の復旧方法
- 4.1. パーティションサイズの変更が伴わない場合
- 4.2. パーティションサイズの変更をする場合
- 4.3. 動作確認
- 5. 既存のシステムをRAID化する
- 6. コマンド例
- 6.1. アレイの作成
- 6.2. アレイにディスクを追加
- 6.3. アレイからディスクを削除
- 6.4. アレイを削除
- 6.5. アレイの状態を表示
- 6.6. アレイの状態をmdadm.confに記述する形式で表示
- 6.7. アレイの復活
- 6.8. アレイのディスクを再追加
- 6.9. スーパーブロックを消去
1. RAIDデバイスの状態確認
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1]
19534912 blocks [2/2] [UU]
sda1やsdb1は論理ディスク(パーティション)です。これらは、sdaやsdbといったディスクデバイス内に存在します。md0はRAIDデバイス(ディスクアレイ)です。この中には複数の論理ディスクを含めることが出来ます。
2. RAIDデバイスの管理
2.1. mdadm
mdadmを使って、ディスクアレイ内の任意のディスクを不良とマークしたり、削除したり、ディスクを追加したりできます。詳しくは、mdadmのマニュアルを参照して下さい。
2.2. mdadm.conf
mdadmを使うと、その結果は即座にシステムの動作に反映しますが、mdadm.confはmdadmによって更新されないので、mdadm.confは手動で編集する必要があります。mdadm.confはシステム起動時に必要なinitrdを生成する時に重要な意味を持ちます。
また、「/dev/md0」というようなディスクアレイの名前を決定するのにも使われます。
DEVICE partitions
ARRAY /dev/md0 metadata=0.90 UUID=795c0099:5cc0971c:9f2d6dfe:8e9f661e
DEVICE partitions
- ここで、あらかじめARRAYで使われるデバイスを列挙する必要がありますが、「DEVICE
partitions」としておけば、/proc/partitionsにあるデバイスが列挙されたことになります。
- ARRAY
- ここで、ディスクアレイ毎の設定を記述します。ここに記述すべきパラメータは、mdadmを使うと得られます。先ずmdadmでディスクアレイを編成し、稼動させておいてから、mdadmを使ってmdadm.confに記述すべきパラメータを得るとお手軽です。
# mdadm --detail --scan
ARRAY /dev/md0 metadata=0.90 UUID=795c0099:5cc0971c:9f2d6dfe:8e9f661e
これをそのまま写せばOKです。UUIDはディスクアレイを再編成すると変わることがあるので注意して下さい。
ディスクアレイの名前を変更したい場合には、「/dev/md0」の部分を、たとえば、「/dev/md1」とかに変更してから、シェルにて、「/etc/init.d/mdadm-raid
restart」を実行するとよいです。システムをリブートした時に、これが反映されない時には、initrdを再作成すると反映されるようになります。
単に現在のディスクアレイの状態を示すmdadm.confを作成したい場合には、現在のmdadm.confのバックアップを取ってから、下記のコマンドを実行するとよいです。
/usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf
2.3. fstab
fstabもシステム起動時に必要なinitrdを生成する時に重要な意味を持ちます。
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/md0 / ext4 noatime,errors=remount-ro 0 1
このように起動時にマウントさせるディスクアレイを記述しておきます。各詳細なパラメータは各自の環境に合わせて設定します。
2.4. initrd
ディスクアレイを構成した結果、構成が以前のものと変わったり、UUIDが変わった場合には、initrdを再作成する必要があります。さもないと、システムの起動時にディスクアレイが正しく編成されず、システムが起動できなくなることがあります。initrdを再作成するには以下のコマンドが使えます。
dpkg-reconfigure linux-image-`uname -r`
上記のコマンドは、同時にGRUBのメニューの更新も行うので、それが嫌な場合には以下のコマンドで代替できるでしょう。
mkinitramfs -o /boot/initrd.img-`uname -r` `uname -r`
上記の各コマンドを実行する前には必ずinitrdファイルのバックアップを取っておきます。同じディレクトリに適当なファイル名でコピー又はリネームしておけばよいでしょう。さすれば、万一起動に失敗した場合でもGRUB等のブートローダでinitrdをバックアップしておいたものに指定しなおせば、取りあえず起動できます。
上記の各コマンドを実行する前に、mdadm.confやfstabを正しく編集しておく必要があります。
3. ディスクの管理
3.1. パーティション
パーティションは、fdiskやcfdiskやpartedを使って管理します。
pear:/etc
# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa2d2a046
Device Boot Start End Blocks Id System
/dev/sda1 * 1 2432 19535008+ 83 Linux
/dev/sda2 2433 19453 136721182+ 83 Linux
/dev/sda3 19454 60789 332031420 83 Linux
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x72d62953
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 2432 19535008+ 83 Linux
/dev/sdb2 2433 19453 136721182+ 83 Linux
/dev/sdb3 19454 60789 332031420 83 Linux
/dev/sdb4 60790 121577 488279610 5 Extended
/dev/sdb5 60790 121577 488279578+ 83 Linux
Disk /dev/md0: 20.0 GB, 20003749888 bytes
2 heads, 4 sectors/track, 4883728 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
3.2. ファイルシステムのタイプ
ファイルシステムのタイプは、マウントしてみると分かります。既にマウントされているファイルシステムのタイプは、単に「mount」とタイプすれば出てきます。
# mount
/dev/md0 on / type ext4 (rw,noatime,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdb5 on /mnt/3 type ext4 (rw,noatime)
または、「df -T」とタイプすると、もう少し見やすい表形式で表示されます。
3.3. GRUB2を使ったブートプログラムのインストール
GRUB2を使っている場合には、「grub-install」コマンドを使います。
上記は、ディスク「/dev/sda」にインストールする例です。エラーが出る場合には、下記のように、「--recheck」オプションを使ってみるとよいです。
grub-install --recheck /dev/sda
3.4. フロッピーディスクを使ったシステムの起動
マシンを新しいディスクを取り付けたりしてごそごそしていると、何故かブートプログラムのインストールを忘れていたりうまくいってなかったりして、HDDからシステムが起動しなくなることがよくあります。その時に備えて起動用の
フロッピーディスクを作っておくと便利です。
「Super Grub2 Disk」というのを使うのがお手軽です。「super_grub_disk_hybrid-1.98s1.iso」というようなファイルをFDやCD-Rに書き込
みます。これのFDへの書き込みには、NTRawriteが使えます。
Super Grub2 Disk起動し、出てきたメニューから「Detect any OS」を選ぶと自動的に起動可能なOSを列挙してくれます。CD-Rから起動した場合には、FDDが繋がっていないFDDコントローラが有効だと列挙に時間がかかことがあるみたいなので、あらかじめ、BIOS設定でFDDを無効にしておくとよいみたいです。
4. ディスクが壊れた場合の復旧方法
4.1. パーティションサイズの変更が伴わない場合
- mdadm を使って壊れたディスクをディスクアレイから削除します。
- マシンの電源を落とし、新しいディスクに取り替え、電源を入れます。
- システムが起動しない場合にはBIOS設定にてもう片方のディスクから起動するようにします。
- cfdiskやparted
を使って新しいディスクのパーティションを設定します。パーティションサイズは片方のディスクのものと同じ大きさかそれよりも大きくなるようにします。
- mdadm を使って新しいディスクをディスクアレイに追加します。
- grub-install を使って新しいディスクにブートプログラムをインストールします。
4.2. パーティションサイズの変更をする場合
- mdadm を使って壊れたディスクをディスクアレイから削除し、マシンの電源を落とし、新しいディスクに取り替え、
追加したいディスクがあれば、それも取り付け、電源を入れます。
- cfdiskやparted
を使って新しいディスクや追加したディスクのパーティションを設定します。パーティションのサイズは、現在稼働中のファイルシステムが入る大きさでお好みにします。
- mdadm
を使ってディスクアレイを編成します。その際、ディスクアレイに現在稼働中のパーティションを含みたい場合は、新しいディスクのみの縮退状態にします。これは、現在稼動中のパーティションはディスクアレイに加えることができないからです。
ディスクアレイの名前は現在稼働中のものとは異なる何か適当な名前にします。たとえば、現在稼働中のが「/dev/md0」だとすると、新しいものは「/dev/md10」にする等です。メタデータの形式は、ブートローダが理解できる形式にしておきます。
- 「mdadm --detail --scan」を実行し、出力された結果をmdadm.confに書き込みます。その際、「ARRAY」で始まる各行のデバイス名の部分を、現在稼働中のものと新しいものとで入替えておきます。この場合、fstabは弄る必要がありません。
- initrdを作成しなおします。ちなみに、この時点では再起動しないでおきます。もし、再起動してしまった場合には、現在稼働中のディスクアレイと新しいディスクアレイとで名前が入れ替わっているかもしれないので、注意が必要です。
- 新しいディスクアレイをマウント(たとえば、「/mnt/md10」に)し、現在稼動中のパーティションの中身をそこへコピーします。
現在稼動中のパーティションをルート以外のディレクトリ(たとえば、「/mnt/md0」に)にマウント(ルートへマウントしたまま重複してマウントできるみたい)してから、その中身をディスクアレイをマウントしたディレクトリに全てコピー(たとえば、「cp
-a /mnt/md0/* /mnt/md10」)するとお手軽です。
- マシンを再起動させます。ブートローダの設定は新しいディスクアレイから起動するようにします。
これをするには、ブートメニューが出たらキーボードから「e」を入力し、編集画面が出たら、たとえば、「root=UUID=…」というふうにルートデバイスがUUIDで設定されているとすると、それを「root=/dev/md0」というようにデバイス名に書換えます。4のデバイス名の入替え操作により、新しいディスクアレイのデバイス名は、以前のシステムのルートデバイスの名前と同じになるはずです。
-
新しいディスクアレイよりシステムが起動したことを確認したら、不要になったディスクアレイを削除し、新しいディスクアレイにお好みのパーティションを追加します。3で新しいディスクアレイを縮退状態で作成していた場合には、このタイミングで残りのパーティションをディスクアレイに加えることができます。
- grub-installを使って、それぞれのディスクにブートプログラムをインストールします。
もしもエラーが出る場合には、「--recheck」オプションを使ってみます。
- update-grubでGRUBのメニューを更新します。
- マシンの電源を落とし、不要になったディスクがあれば、それを取り外し、電源を入れます。
ディスクアレイの構成を変えた時には、2.2を参考にして、設定ファイル等に矛盾が無いか確認し、再起動させてもディスクアレイが正しく保たれているか確認します。動作がおかしな場合には設定ファイルを修正し、initrdを作成しなおします。
5. 既存のシステムをRAID化する
- マシンの電源を落とし、新しいディスクを取り付け、電源を入れます。
- cfdiskやpartedを使って新しいディスクのパーティションを設定します。
このパーティションは、RAID化しようとしているシステムが入っているパーティション(現在稼働中のパーティション)と同じ大きさかそれよりも小さくなるようにします。
- mdadmを使ってディスクアレイを編成します。その際、ディスクアレイは、新しいディスクのみの縮退状態にします。
これは、現在稼動中のパーティションはディスクアレイに加えることができないからです。メタデータの形式は、ブートローダが理解できる形式にしておきます。
- RAIDデバイスの管理を参考にして、mdadm.confとfstabを編集し、initrdを作成しなおします。
-
ディスクアレイをフォーマットして、マウント(たとえば、「/mnt/md0」に)し、現在稼動中のパーティションの中身をそこへコピーします。
現在稼動中のパーティションをルート以外のディレクトリ(たとえば、「/mnt/sda1」に)にマウント(ルートへマウントしたまま重複してマウントできるみたい)してから、その中身をディスクアレイをマウントしたディレクトリに全てコピー(たとえば、「cp
-a /mnt/sda1/* /mnt/md0」)するとお手軽です。
- マシンを再起動させます。ブートローダの設定はディスクアレイから起動するようにします。よく分からない場合には、Super
Grub2 Diskを使うのがお手軽です。
- mdadmを使って以前稼動していたパーティションをディスクアレイに追加します。
- grub-installを使って、それぞれのディスクにブートプログラムをインストールします。
もしもエラーが出る場合には、「--recheck」オプションを使ってみます。
- update-grubでGRUBのメニューを更新します。
6. コマンド例
下記のコマンド例を実行する場合には、各コマンドのオプションのデバイス名や、その他のオプションを各自のシステム環境に合うように修正してから実行して下さい。そのままターミナルにコピペしたりすると、取り返しの付かない事態になることがありえます。
- 6.1. アレイの作成
- mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
ただし、ブートデバイスにしたい場合には、下記の方がよい。
mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb1 missing
そして、2TBを超えるパーティションで失敗(…というか、ログにカーネルからの警告が記録されるだけで、mdadmは無言で処理を戻してしまう。)した場合には、先の方法を試してみるとよい。
- 6.2. アレイにディスクを追加
- mdadm /dev/md0 -a /dev/sda1
- 6.3. アレイからディスクを削除
- mdadm /dev/md0 -f /dev/sda2 -r /dev/sda2
- 6.4. アレイを削除
- mdadm --stop /dev/md0
- 6.5. アレイの状態を表示
- cat /proc/mdstat
- 6.6. アレイの状態をmdadm.confに記述する形式で表示
- mdadm --detail --scan
- 6.7. 削除したアレイを復活
- mdadm --assemble /dev/md0 /dev/sda1
復活したいアレイの情報が設定ファイルに記述されている場合には、下記のようにしてもよい。
mdadm --assemble --scan
- 6.8. アレイのディスクを再追加
- mdadm /dev/md0 -f /dev/sda1 -r /dev/sda1 -a /dev/sda1
- 6.9. スーパーブロックを消去
- mdadm --zero-superblock /dev/sda1