wiki:LinuxRAID1Transition

Version 5 (modified by sgk, 12 years ago) (diff)

--

最小限のダウンタイムでRAIDに移行する

この項目の内容は現在実施途中なので、うまくいくかどうか結論は出ていません。

LinuxのソフトウェアRAIDで助かったのに気をよくしていたら、他のサーバが心配になってきました。 個人管理のサーバって、どういうわけか数台有るのです。 そういや、「そのうちRAIDにしよう」なんて言ったきり数年、放置してました。 残りのサーバも、なるべく急いで順次RAIDに移行したいと思います。 この項目では、Linuxの普通のディスクからRAID1に移行する手順を、解説するのでなくて記録していきます。 現在実施途中なので、この方針でうまくいくかどうかはまだ結論が出ていません。 今回の課題は、ダウンタイムを最小限にすることです。 なにしろ、いろいろ重要なウェブサイトが動いているのです。

伝言

うちのスタッフに伝言です。 当社自身のサーバはスタッフにまかせます。 身に覚えのあるスタッフの人は、早めに取りかかってください。 こういうことを経験するチャンスを奪っちゃいけないなあと、最近は反省しています。

サーバの構築とかメンテって、難しいかなあ?  難しくないと思うんだけどな。 情報収集と、正しい情報の見極めさえちゃんとやれば難しくはない。 僕だって、やり方をいちいち覚えているわけではないよ。調べながらやっている。 あとは、最悪の場合の復旧手段の確保(バックアップと切り戻し手順の確認)と、リスクの分析、評価、リスクヘッジをして、最後は思い切り。

細かいことだけど、どっかの知らない人が書いたウェブの内容なんて信用してはいけない。結構、間違い情報が多い。 参考にするのはいいことだけど、ちゃんと自分でmanとかinfoで調べて検証すること。

前提の状況

  • OSは、Linux Debian 4.0 (Etch)。
  • 1Uサーバ。
  • 80GBのSATAドライブ2台を内蔵。
    1. 1台目、sdaはルートファイルシステムとスワップ領域。ルートファイルシステムに全部入っている。
    2. 2台目、sdbはカラっぽ。他のマシンのバックアップ領域として使っていたけど、不要になった。

方針

  1. カラっぽだったドライブで、ドライブ1台だけでRAID1を作る。
  2. ルートファイルシステムから中身をコピーする。
  3. 作ったRAIDをルートファイルシステムとして動くように、起動の設定を変更する。
  4. 再起動する。
  5. 元々ルートファイルシステムだったドライブを消去し、RAIDに参加させる。
  6. リビルドが終わるのを待つ(放置)。

準備

mdadm」をインストールします。

# apt-get install mdadm

いろいろ聞かれます。

  • rootファイルシステムに必要な MDアレイ」には「all」と答えます。
  • mdadmは、毎月MDアレイの冗長性チェックを行いますか?」は「はい」でいいでしょう。
  • MD監視デーモンを起動しますか?」は「はい」がいいでしょう。
  • メール通知の宛先」は「root」のままにしておきます。

いくつかウォーニングが出ますが、とりあえずは気にしないことにします。 あと、メールの設定をいじって、root宛のメールがちゃんと人間に届くようにしておきます。

ちなみに、上記の設定を後から変更したいときは、「dpkg-configure mdadm」コマンドを実行してください。

これだけの操作で、mdadmがインストールされ、最小限の設定がされます。 さらに、自動的にinitrd.imgが作り直され、OSの起動時にRAIDを起動するように設定されます。 Debianすごいな(Debianに限らないでしょうけれど)。

あと、くだらないことですが、/etc/fstabでsdb1をマウントするようにしていたのをやめ、アンマウントしました。

fdisk

現在ルートファイルシステムとして使っているsda1は、最終的にRAIDに参加させる予定です。 そのため、sda1と同じサイズのパーティションをsdbに作成することにしました。 パーティションのタイプ(システムID)は「fd(Linux raid autodetect)」にします。 余った部分は、スワップ領域として使うことにします。 この後の「GRUB stage1/stage2をインストール」とも関係しますが、sdb1に起動フラグをつけておきます。

fdiskの結果はこんな感じです。もちろん、サイズなどは個々の環境によって異なります。

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1        9388    75409078+  fd  Linux raid autodetect
/dev/sdb2            9389        9964     4626720   82  Linux swap / Solaris

ドライブ1台だけでRAID1を作る

RAID1にはドライブが2台必要なのに、何を言ってるんだ…と言われそうです。 RAID1に必要なドライブ2台のうち、1台が壊れて取り外しているのと同じ状態にします。

# mdadm --create /dev/md0 --auto=md --level=1 --raid-devices=2 /dev/sdb1 missing

実行すると「このディスク、ext2みたいなんだけど、どうする?」みたいなことを聞かれることがあります。 これは、以前にext2/3でフォーマットして使っていたからです。 指定したデバイスに間違いが無くて、確かに消してしまっていいのであれば、「y」と答えます。

  • --auto=md」を指定しないと、「/dev/md0が無いぞ」というようなエラーで止まります。
  • --level=1」は、RAID1を選択する指示です。
  • --raid-devices=2 /dev/sdb1 missing」でドライブを指定しています。RAIDは2台で構成する、1台目は/dev/sdb1、2台目は「まだ無い」という指示です。

RAIDはこれでできあがりですが、設定ファイル「mdadm.conf」に反映しておきます。 このファイルに関係なくRAIDを動かすことができますが、何かと不便なのです。

# mdadm --detail /dev/md0

mdadm --detail」を実行するとRAIDの状態などが表示されます。 この中に「UUID」があるので、値をコピーしておきます。 UUIDは「e3f637a8:0ba8f91b:4c7f4245:5fbcddbb」というような形式です。 次に、「/etc/mdadm/mdadm.conf」を編集して、以下のような内容にします。

DEVICE partitions
ARRAY /dev/md0 UUID=e3f637a8:0ba8f91b:4c7f4245:5fbcddbb
MAILADDR root

もちろん、「UUID=」の右の部分はさっきコピーしたUUIDの値にします。

最後に、通常は必要ありませんが、RAIDの止め方、動かし方をメモしておきます。

  • RAIDを止めたければ、「mdadm --stop /dev/md0」です。
  • 止まってるRAIDを動かすには、「mdadm --assemble /dev/md0」です。 ただし、作ったRAIDをmdadm.confに反映してない場合は、「mdadm --assemble /dev/md0 /dev/sdb1」です。

ルートファイルシステムから中身をコピーする

ここは特記するようなことはありません。ファイルシステムを作って、rsyncでコピーするだけです。

# mkfs -t ext3 /dev/md0
# mount /dev/md0 /mnt
# rsync -aH --one-file-system / /mnt

GRUB stage1/stage2をインストール

GRUBのstage1を、sdbのMBRおよび、sdb1の最初にインストールします。 パーティションに直接にファイルシステムを入れてある場合には簡単なのですが、パーティションでRAIDを構成し、その中にファイルシステムが有る場合には、ちょっと面倒です。

grub」コマンドを実行して、以下のように操作します。

# grub

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]

grub> device (hd0) /dev/sdb
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 (hd0,0)/boot/grub/menu.lst
grub> install /boot/grub/stage1 d (hd0) /boot/grub/stage2 (hd0,0)/boot/grub/menu.lst
grub> quit
# 

上記の「/boot/grub/stage2」の後に「0x8000」を指定する流儀もあるようですが、指定しなければ自動的に決定されます。 むしろ、指定しない方がいいと思います。

device (hd0) /dev/sdb
今回の操作の中で「(hd0)」とは「/dev/sdb」のことだと宣言します。
root (hd0,0)
今回の操作の中で「ルートデバイス」は「(hd0,0)」だと宣言します。
install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 (hd0,0)/boot/grub/menu.lst
stage1をsdb1パーティションの先頭に、その後ろにstage2をインストールします。
install /boot/grub/stage1 d (hd0) /boot/grub/stage2 (hd0,0)/boot/grub/menu.lst
stage1をsdbドライブの先頭に、その後ろにstage2をインストールします。 起動時に「起動ドライブ(stage1を読み込んだドライブ)以外のドライブでもstage2を探す」ことを、「d」で指示します。

起動の設定を変更する

GRUBの設定を変更して、ルートファイルシステムのデバイス名を変更します。

# vi /boot/grub/menu.lst

このファイルの最後の方、以下のようになっている部分を探します(もちろん、環境によって細部は異なります)。

title           Debian GNU/Linux, kernel 2.6.18-4-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-4-686 root=/dev/sda1 ro
initrd          /boot/initrd.img-2.6.18-4-686
savedefault

title           Debian GNU/Linux, kernel 2.6.18-4-686 (recovery mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-4-686 root=/dev/sda1 ro single
initrd          /boot/initrd.img-2.6.18-4-686
savedefault

ここで、「root=/dev/sda1」となっているのを、「root=/dev/md0」に変更します。

今日はここまで

今日はここまで。続き、つまり最大の山場は、サーバの設置場所に行ったときにやります。 このまま遠隔操作でなんとかできちゃう気もするのですが、何か間違えたときにどうにもならないので、それはやめておきます。

2008/1/6 sgk