nigakyのブログ

雑多なメモです。

Ubuntu を BeyondRAID 環境へ移行する (1/2)

最近はディスクも安くなってきたので、既存の1ディスクで運用しているファイルサーバ (Ubuntu) を RAID 環境に移行してみたいと思います。

複数の容量の異なるディスクで冗長性をもたせるには BeyondRAID というやりかたがおもしろそうです。すでに同じことをされている方もいますが、既存の環境を壊さずに移行するというところにこだわってやってみたいと思います。
nakanote blog 
UbuntuでDrobo風なNASを作る

環境

移行前

1TB のディスク1つ、RAID なし。

  • sda(1TB) : OS領域(20GB), スワップ(2GB), ファイル置き場(978GB)
移行後
  • OS領域は RAID1、ファイル置き場は BeyondRAID で冗長性と拡張性を持たせる
  • 400GB, 1TB, 2TB のディスク3つで冗長性を持たせた環境を構築
  • ファイルシステムext4 に移行
Drives
|  sdc   |  sda   |  sdb   |
| 400 GB |  1 TB  |  2 TB  |
                   ---------
                  |  sdb6  |       (1TB)                 -> TMP領域(RAID なし)
                   ---------
         -------------------
         |  sda5  |  sdb5  | RAID1 (2 x 600GB)           -> md3 (600GB)
         -------------------
----------------------------
| sdc4   | sda4   | sdb4   | RAID5 (3 x 378GB)           -> md2 (756GB)
----------------------------
----------------------------
| sdc3   | sda3   | sdb3   | RAID1 (2 x 20GB + 1 spare)  -> /: md1 (20GB)
----------------------------
----------------------------
| sdc2   | sda2   | sdb2   | Swap  (3 x 1GB)             -> 個別にマウント (3GB)
----------------------------
----------------------------
| sdc1   | sda1   | sdb1   |       (3 x 512MB)           -> /boot: (512MB)
----------------------------

OS 領域の移行

まずは sda に入っていた OS 領域を RAID1 環境に移行します。
以下のような流れで行います。

  1. パーティション設定
  2. MDRAID 構築
  3. LVM、ファイルシステム構築
  4. 既存 OS 領域をコピー
  5. 新しい OS 領域から起動
パーティション設定

4k セクタ (AFT) 対応に注意しながらパーティションを切ります。
最近の parted はアラインされていないと警告が出るようになっていました。

  • 2TB ディスクは 4k セクタ (AFT) なのでパーティションのアラインメントに注意する
  • 開始は 2048 セクタから(Win7 標準?)
  • 2TB ディスクは GPT で(LinuxMBR でも GPT でもどちらでもブートできるようです)
sdc (400GB) のパーティション設定

# parted /dev/sdc
(parted) mklabel msdos
(parted) mkpart primary 2048s 512M
(parted) mkpart primary 512M 1512M
(parted) mkpart primary 1512M 20G
(parted) mkpart extended 20G -1
(parted) mkpart logical 20G -1
(parted) set 1 raid on
(parted) set 3 raid on
(parted) set 5 raid on

(parted) print
モデル: ATA ST3400820AS (scsi)
ディスク /dev/sdc: 400GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1049kB  512MB   511MB   primary   ext3              raid
 2    512MB   1512MB  1000MB  primary   linux-swap(v1)
 3    1512MB  20.0GB  18.5GB  primary                     raid
 4    20.0GB  400GB   380GB   extended                    lba
 5    20.0GB  400GB   380GB   logical                     raid
sdb (2TB) のパーティション設定
# parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart /boot 2048s 512M
(parted) mkpart swap 512M 1512M
(parted) mkpart OSImageVG0 1512M 20G
(parted) mkpart BeyondRAID0 39063552s 781422591s   ☆小さいディスクにセクタ単位で合わせます
(parted) mkpart BeyondRAID1 781422592s 1953520063s ☆小さいディスクにセクタ単位で合わせます
(parted) set 1 raid on
(parted) set 3 raid on
(parted) set 4 raid on
(parted) set 5 raid on

(parted) print
モデル: ATA WDC WD20EARS-00M (scsi)
ディスク /dev/sdb: 2000GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt

番号  開始    終了    サイズ  ファイルシステム  名前         フラグ
 1    1049kB  512MB   511MB   ext3              /boot        raid
 2    512MB   1512MB  1000MB                    swap
 3    1512MB  20.0GB  18.5GB                    OSImageVG0   raid
 4    20.0GB  400GB   380GB                     BeyondRAID0  raid
 5    400GB   1000GB  600GB                     BeyondRAID1  raid
MDRAID 構築

OS 領域は RAID1 で構築します。
/boot も RAID1 にするつもりでしたが、grub2 のバグ?でできなかったので、ブートに利用する sda1 は単体にしました。
(sdb1 と sdc1 で RAID1 にして、手動で sda1 のバックアップを取ることにしました。)
Bug #527401 “grub-installer fails to install on a raid1 array” : Bugs : “grub2” package : Ubuntu

# mdadm -C -l1 -n2 -e1  --assume-clean /dev/md0 /dev/sdb1 /dev/sdc1
# mdadm -C -l1 -n2 -e1  --assume-clean /dev/md1 /dev/sdb3 /dev/sdc3
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb3[2] sdc3[0]
      18054072 blocks super 1.0 [2/2] [UU]

md0 : active raid1 sdb1[2] sdc1[0]
      498676 blocks super 1.0 [2/2] [UU]

(initrd も更新しないと新しい OS 領域からブート出来なかったのでここで更新しておきます。)
# mv /boot/initrd.img-2.6.32-24-generic{,.org}
# mkinitramfs -o /boot/initrd.img-2.6.32-24-generic `uname -r`
LVM、ファイルシステム構築

MD の上に LVM を構築して ext4 でフォーマットします。

# pvcreate /dev/md1
# vgcreate OSImageVG0 /dev/md1
# lvcreate -n Ubuntu10.04 -L 17.21g OSImageVG0
# lvs -o +devices
  LV          VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert Devices
  Ubuntu10.04 OSImageVG0 -wi-ao 17.21g                                       /dev/md1(0)
# mkfs -t ext4 /dev/mapper/OSImageVG0-Ubuntu10.04
既存 OS 領域をコピー

既存の OS 領域をコピーするために CDROM などから Linux を起動します。
私は Ubuntu 10.10 Server を USB メモリブートで利用したのですが、rsync が入っていなくて面倒だったので他のものにした方がいいかもしれません。(Desktop 版では mdadm と lvm2 が入っていないので Server にしたのですが。)

rsync で OS 領域をコピー

# mount /dev/sda5 /mnt/0  ☆古い OS 領域をマウント
# mount /dev/mapper/OSImageVG0-Ubuntu10.04 /mnt/1
# rsync -av /mnt/0/ /mnt/1/ ☆OS 領域を丸ごとコピー
# vim /mnt/1/etc/fstab      ☆ fstab を新しい OS 領域 (/dev/mapper/OSImageVG0-Ubuntu10.04) に変更

新しい OS 領域からブートするため、新しい grub エントリを追加します。
/etc/grub.d/40_custom に以下を追加します。(uuid は適宜変更してください。)

menuentry 'Ubuntu, with Linux 2.6.32-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        search --no-floppy --fs-uuid --set aaaa-bbbb-cccc-dc5be58cec49
        linux   /vmlinuz-2.6.32-27-generic root=/dev/mapper/OSImageVG0-Ubuntu10.04 ro apparmor=0
        initrd  /initrd.img-2.6.32-27-generic
}

/etc/default/grub を編集して grub の選択画面が出るようにします。

#GRUB_HIDDEN_TIMEOUT=0             ☆コメントアウト
#GRUB_HIDDEN_TIMEOUT_QUIET=true    ☆コメントアウト
GRUB_HIDDEN_TIMEOUT_QUIET=false    ☆追加
GRUB_TIMEOUT=3                     ☆変更
新しい OS 領域から起動

初回のみ新しい OS 領域からブートするため、ブート時の OS 選択画面で先ほど追加したエントリを選択します。
以降自動的に新しい OS 領域からブートするようにするため、grub.cfg を更新しておきます。

# update-grub2

ルートパーティションが新しい LVM ボリュームになっていたら移行完了です。

# df
ファイルシステム           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/OSImageVG0-Ubuntu10.04
                      17763668   5046296  11815024  30% /
none                   1764460       344   1764116   1% /dev
none                   1769508         0   1769508   0% /dev/shm
none                   1769508       344   1769164   1% /var/run
none                   1769508         0   1769508   0% /var/lock
none                   1769508         0   1769508   0% /lib/init/rw
none                  17763668   5046296  11815024  30% /var/lib/ureadahead/debugfs
/dev/sda1               482214     56211    401104  13% /boot