UbuntuでのRAIDハードディスクの交換

(追記)GPTパーティションを使用する場合、先頭に1MB程度以上のbios reservedなパーティションを用意する必要があります!さもないとその時は問題なくとも再起動できなくて、トラブルが発生して挙句にパーティションの再編成に時間を費やすことになるでしょう!(体験談)
(詳細はよく知らないしちゃんと調べるのは保留するので具体的な容量は自分で調べてください。どうせMB単位なので不安なら多めに確保しても気にするものではないと思います。)

うちのファイルサーバーはLinuxでよく使われる普通のソフトウェアRAID(mdadm)を用いて構成していたが、今回これをサーバーの電源を落とさず交換し、最後に容量を大きくしたのでその手順を書いておく。

もう二年ぐらい使っているサーバーで、ヒューレット・パッカード社のML115という安さに定評のあるサーバーをベースに、メインメモリ、CPU(買うのが遅くて中古で買った)、ハードディスクを交換していて運用していた。ML115は格安ながらハードディスクのオンラインスワップに対応しているため、サーバーを止めることなくディスクを交換することができる。

もともと1TBのハードディスク2台で冗長構成で容量1TBとして使用していたが、今回新たに3TBのハードディスク二台を購入、これらに置き換えて元のHDDはバックアップ用にでも使うことに。

RAID 1で構成しているので、一台が故障してももう一台で動き続ける構成になっている。つまり、二台とも故障していない状態であれば、一台を停止しても動き続けるし、もう一台をさしてそちらとの同期が完了すればまた二台で動き始める。基本的にはこれを二回繰り返す。

ここで、

  • 一台目のHDD: /dev/sda
  • 二台目のHDD: /dev/sdb
  • /dev/sda1, /dev/sdb1 が /dev/md0
  • /dev/sda2, /dev/sdb2がswap
  • /dev/sda3, /dev/sdb3が/dev/md1
  • swap以外のパーティションは全て/dev/md*になっている
  • /dev/md1を拡大する
  • 新しいHDDの容量は2TiB以上(もちろん2TiB未満でも構わない)

とする。必要に応じて読み替えて作業を進めること。

当然だが、作業前にバックアップを怠ってはいけない。この手順に誤りがあったり作業ミスがあったりしてデータが飛んでも誰も責任は負えない。
まず、/dev/sdaから交換していこう。/dev/sdaにあるパーティションを全部使わないようにする。

$ sudo mdadm --fail /dev/md0 /dev/sda1
$ sudo mdadm --remove /dev/md0 sda1
$ sudo mdadm --fail /dev/md1 /dev/sda3
$ sudo mdadm --remove /dev/md1 sda3
$ sudo swapoff /dev/sda2

mdadm –failでディスクを故障と認識させて同期を停止させ、mdadm –removeでRAID構成から取り除く。また、スワップの利用も外す。

外したら、もうsdaが使われていないことを確認する。

$ cat /proc/mdstat
$ cat /proc/swaps

ここにsdaのパーティションが現れないことを確認したら、sdaを取り外す。sdaがどのディスクであるか確認するために、sdaのシリアル番号を確認する。

$ sudo smartctl -a /dev/sda

シリアル番号などをよく確認して、sdaを本体から取り外す(※マザーボードがオンラインスワップに対応していない時は、サーバーの電源を落とす必要がある。)。サーバーの蓋を開けた今もサーバーは動いているので余計なところに触らぬよう注意する。
また、この時取り外したディスクはこの瞬間のバックアップディスクとしてあとから復元が一応できるようなので(当然突然シャットダウンした時のような状態にはなるが)、安定運用が確認できるまでは手っ取り早いバックアップファイルとして丁重に扱うこと。(–failのフラッグをつけたときに使用不能にする操作などないか若干不安だったが、実際にこの時のディスクを別のパソコンにつないでVMwareで起動してみたところ正常に起動され、ファイルも読み込めた。)

続いて、新しいディスクをとりつける。とりつけたら、まずパーティションを作成する。

パーティションの作成はfdiskでも作成することができるが、fdiskは2TiB以上のディスクに対応することができない。2TiB以上のディスクに対応するためにはGPTというタイプのパーティションを作成する必要があるので、partedを使ってパーティションを組む。

$ sudo parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

さて、まずはディスク全体をGPTとしてラベル付する。なおこの作業で、sdaに既存のパーティションテーブルがあった場合それはまっさらになる。

(parted) mklabel gpt

partedのコマンドリストはhelpと入力すると出てくる。なお、unitコマンドは

(parted) unit KiB

とかする。また、色々なコマンドで場所を指定する時はunitコマンドで指定した単位がデフォルトで、KiBなどをつけるとそれに合わせられる。
ということでパーティションを作る。新しくRAID構成にするパーティションは既存のパーティションと同じまたはそれ以上の容量にすること。容量拡大を狙っているパーティションは拡大後の予定サイズにする。また、パーティションの位置や順番は既存のものと異なっても構わないし、これまで同じディスクにあったものを違うディスクに配置することもできる(必要な数のディスクがある場合)

(parted) mkpart primary 1024KiB 50GiB
(parted) mkpart primary 50GiB 54GiB
(parted) mkpart primary 54GiB -1
(parted) set 1 bios_grub on

mkpart PART-TYPE START ENDとしてパーティションを作成するが、ENDを-1にすると最後までとなる。なお、sudo parted /dev/sdbしてprintするとすでにあるパーティションの構成を見られるので、既存のパーティションと同じにしたい部分はunit KiBした上でprintして出てきたSTART ENDをコピペするとよい。
また、GRUBをインストールできるよう、従来型のBootフラッグをオンにする。
パーティションを作成したら、partedを終了する。

(parted) quit

パーティションの作成が完了したら、sdaをRAIDやSWAPに組み入れる。
まず

$ sudo partprobe /dev/sda

としてパーティションの情報の再読み込みを行い、

$ sudo mdadm --add /dev/md0 /dev/sda1
$ sudo mdadm --add /dev/md1 /dev/sda3
$ sudo swapon /dev/sda2

こうすると同期が始まる。同期の状況は

$ cat /proc/mdstat

すると見られる。再同期はまあ、ディスク全部を同期するので予想どおりの時間がかかる。
あと、GRUBのインストールを忘れない。

sudo grub-install /dev/sda --recheck

同期が完了したら、もう一台のディスクも同様に交換する。なお、実際にやってみたところ、sda, sdbの二台構成でsdbを交換すると、sdaは交換後もsdaだったがsdbを交換すると新しいディスクはsdcになった。

二台とも交換が終わったら、現在古い容量のままになっているパーティションを新しい容量に合わせる。現在、パーティションそのものの大きさはpartedで新たに指定したものとなっているが、その中に入っているRAIDの大きさ(すなわち/dev/md1の大きさ)や、そのRAIDの中に入っているファイルシステムの大きさは古いままとなっている。これを外側から大きくしていく。

まず、RAIDの大きさをパーティションの大きさに合わせる。これは、

$ sudo mdadm --grow /dev/md1 --size=max

とかしてやる。なお今回はmaxだから関係ないが、この–sizeは「一台あたりの」大きさである。サイズを大きくしたパーティションの数だけこれを行う。なお、これは現在追加されているディスク全てが同期されている状態でないとできないので注意。
続いて、ext3/4の場合はオンラインでのファイルサイズ拡大ができるので、

$ sudo resize2fs /dev/md1

とかしてやると、ファイルシステムのサイズが望む大きさになる。なお、resize2fsは非常に時間がかかるので注意。この方法で容量を増やすと、徐々に容量が増えるらしく、Muninのディスク利用率のログが
diskusage
こんな風になっていた。
その他のファイルシステムは各自「ファイルシステムの」拡大の方法を調べて行う必要がある。

パーティションを縮小することを考えている場合は、ディスクを交換するまえにファイルシステムを縮小、続いてmdadmでRAIDの大きさを縮小してから作業することになるが、執筆時点ではext3/4はオンラインリサイズは拡大のみで、縮小する場合は一度アンマウントする必要がある。