Ubuntu を BeyondRAID 環境へ移行する (1/2)
最近はディスクも安くなってきたので、既存の1ディスクで運用しているファイルサーバ (Ubuntu) を RAID 環境に移行してみたいと思います。
複数の容量の異なるディスクで冗長性をもたせるには BeyondRAID というやりかたがおもしろそうです。すでに同じことをされている方もいますが、既存の環境を壊さずに移行するというところにこだわってやってみたいと思います。
nakanote blog
UbuntuでDrobo風なNASを作る
環境
- Ubuntu 10.04
移行後
- 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 環境に移行します。
以下のような流れで行います。
- パーティション設定
- MDRAID 構築
- LVM、ファイルシステム構築
- 既存 OS 領域をコピー
- 新しい OS 領域から起動
パーティション設定
4k セクタ (AFT) 対応に注意しながらパーティションを切ります。
最近の parted はアラインされていないと警告が出るようになっていました。
- 2TB ディスクは 4k セクタ (AFT) なのでパーティションのアラインメントに注意する
- 開始は 2048 セクタから(Win7 標準?)
- 2TB ディスクは GPT で(Linuxは MBR でも 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