HDDが一個しかないサーバで後からraid1を構築(その1)


サーバのお引越しを予定していましたが、新しいサーバを頂けなくなったので今動いてるサーバでがんばって言われたみゅみゅです。
今動いているサーバはHDDが一台しかなく、HDDが壊れたら終了です。
せめてミラーでも組まないと精神衛生上よくない上に夜も熟睡できません。

そんなわけで稼働中の単一HDDのサーバをraid1のミラーに変更したいと思います。

前回 raid1を構築しましたので、最終的には最後の図のようになればいいのかなぁ~ と

現在のHDDの状態

現在のHDDの構成を確認します。

root@mdtest:~# parted -l
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 8590MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1049kB  256MB   255MB   primary   ext2              boot
 2    257MB   8589MB  8332MB  extended
 5    257MB   8589MB  8332MB  logical                     lvm


モデル: Linux device-mapper (linear) (dm)
ディスク /dev/mapper/mdtest--vg-swap_1: 533MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: loop

番号  開始   終了   サイズ  ファイルシステム  フラグ
 1    0.00B  533MB  533MB   linux-swap(v1)


モデル: Linux device-mapper (linear) (dm)
ディスク /dev/mapper/mdtest--vg-root: 7764MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: loop

番号  開始   終了    サイズ  ファイルシステム  フラグ
 1    0.00B  7764MB  7764MB  ext4

root@mdtest:~# df -k
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/mdtest--vg-root   7331536 1284088   5651980  19% /
none                                4       0         4   0% /sys/fs/cgroup
udev                           239576       4    239572   1% /dev
tmpfs                           50152     472     49680   1% /run
none                             5120       0      5120   0% /run/lock
none                           250748       0    250748   0% /run/shm
none                           102400       0    102400   0% /run/user
/dev/sda1                      240972   38103    190428  17% /boot

デバイスは3つ
- /dev/sda (物理)
- /dev/mapper/mdtest--vg-swap_1 (LVM)
- /dev/mapper/mdtest--vg-root (LVM)

/dev/sda1は /bootにマウントされています。

LVMの状態を確認

root@mdtest:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               mdtest-vg
  PV Size               7.76 GiB / not usable 2.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              1986
  Free PE               8
  Allocated PE          1978
  PV UUID               PfeUP8-vYhu-d2Gq-7VDz-ijQ8-eV58-AFN2k6

root@mdtest:~# vgdisplay
  --- Volume group ---
  VG Name               mdtest-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               7.76 GiB
  PE Size               4.00 MiB
  Total PE              1986
  Alloc PE / Size       1978 / 7.73 GiB
  Free  PE / Size       8 / 32.00 MiB
  VG UUID               xMRo8d-aZYP-wWWB-qtDF-6ilb-4AkC-Xow59q

root@mdtest:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/mdtest-vg/root
  LV Name                root
  VG Name                mdtest-vg
  LV UUID                8CuLA2-erMg-Y893-V2k6-SKzP-tuXg-jrqltn
  LV Write Access        read/write
  LV Creation host, time mdtest, 2015-05-21 12:47:15 +0900
  LV Status              available
  # open                 1
  LV Size                7.23 GiB
  Current LE             1851
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Path                /dev/mdtest-vg/swap_1
  LV Name                swap_1
  VG Name                mdtest-vg
  LV UUID                53OCrI-0NZ6-NDcJ-gHEF-WmWO-ZDG1-7nYtt8
  LV Write Access        read/write
  LV Creation host, time mdtest, 2015-05-21 12:47:15 +0900
  LV Status              available
  # open                 2
  LV Size                508.00 MiB
  Current LE             127
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

いつもの3つのコマンドです。
【/dev/sda5】から【mdtest-vg】を作りそれぞれrootとswapの論理デバイスを構築です。
。。。よくわからないので図を書いてみると

前回の図の使いまわしです。
RAIDデバイスはないのでこんな感じです。

これにまずはHDDを一個取り付けてみましょう。
取り付けて起動してみると

root@mdtest:~# dmesg | grep sdb
[    1.581832] sd 3:0:0:0: [sdb] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
[    1.583935] sd 3:0:0:0: [sdb] Write Protect is off
[    1.584693] sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[    1.585423] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    1.587692]  sdb: unknown partition table
[    1.588392] sd 3:0:0:0: [sdb] Attached SCSI disk

なんか[unknown partition table]でsdbが認識
まず、こいつをraid1の片肺として認識させます。
・・・RAIDを作るのにmdadmがない言われたのでまずはmdadmのインストール

root@mdtest:~# apt-get install mdadm

接続したHDDのサイズが2TB以下なのでラベルを【msdos】で設定
(2TB以上ならラベル名は【gpt】です)

root@mdtest:~# parted /dev/sdb
GNU Parted 2.3
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) print
エラー: /dev/sdb: ディスクラベルが認識できません。
(parted) mklabel msdos
(parted) print
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sdb: 8590MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始  終了  サイズ  タイプ  ファイルシステム  フラグ

(parted) mkpart
パーティションの種類?  primary/プライマリ/extended/拡張? primary
ファイルシステムの種類?  [ext2]?
開始? 1049kB
終了? 8589MB
(parted) set 1 raid on
(parted) set 1 boot on
(parted) print
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sdb: 8590MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  8590MB  8589MB  primary                    boot, raid
(parted) q
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。

サイズは前回のコピペです。
raidやらbootのフラグを忘れないでください。

次にraid1を行うので、mdを作って先ほど作った/dev/sdb1をぶち込みます。

root@mdtest:~# mdadm -C /dev/md0 -l1 -n2 /dev/sdb1 missing
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array?
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@mdtest:~#

なんか注意を受けたけど気にせずに
-l1 → raid 1
-n2 → HDD2個使うよ
missing → 二つ使うって言ったけ一つしか用意してないんだー だからブランクにしといて

できたと思われる/dev/md0を確認

root@mdtest:~# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Thu May 21 15:47:58 2015
     Raid Level : raid1
     Array Size : 8383424 (8.00 GiB 8.58 GB)
  Used Dev Size : 8383424 (8.00 GiB 8.58 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Thu May 21 15:47:58 2015
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : mdtest:0  (local to host mdtest)
           UUID : 78f1d07c:f84952e0:44ebf35c:aa20c469
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       0        0        1      removed

なんとなく出来てるっぽい
/dev/md0にパーティションを作ってみる

root@mdtest:~# parted /dev/md0
GNU Parted 2.3
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) print
エラー: /dev/sdb: ディスクラベルが認識できません。
(parted) mklabel msdos
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始  終了  サイズ  タイプ  ファイルシステム  フラグ

(parted) mkpart
パーティションの種類?  primary/プライマリ/extended/拡張? primary
ファイルシステムの種類?  [ext2]? ext2
開始? 2048s
終了? 255MB
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了   サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  255MB  254MB   primary

(parted) mkfs 1 ext2
警告: ファイルシステムに対して parted による操作(mkfs)を行おうとしています。
parted のファイルシステム操作コードは、e2fsprogs のようなファイルシステム専
用のものほど堅固に作られていません。可能なかぎり parted をパーティションテー
ブルの操作だけに用いることをお勧めします。ほとんどのファイルシステムに
対するほとんどの操作は今後のリリースで削除される予定です。
警告: いま存在しているファイルシステムは破壊され、このパーティションの全データが失われます。続行しますか?
はい(Y)/Yes/いいえ(N)/No? y
パーティション番号? 1
ファイルシステムの種類?  [ext2]? ext2
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了   サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  255MB  254MB   primary  ext2

(parted) mkpart
パーティションの種類?  primary/プライマリ/extended/拡張? extended
開始? 255MB
終了? -1s
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1049kB  255MB   254MB   primary   ext2
 2    255MB   8585MB  8330MB  extended                    lba

(parted) set 2 lba off
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1049kB  255MB   254MB   primary   ext2
 2    255MB   8585MB  8330MB  extended

(parted) mkpart logical 499712s 16766847s
(parted) unit MB
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1.05MB  255MB   254MB   primary   ext2
 2    255MB   8585MB  8330MB  extended
 5    256MB   8585MB  8329MB  logical

(parted) set 5 lvm on
(parted) print
モデル: Linux Software RAID Array (md)
ディスク /dev/md0: 8585MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ    ファイルシステム  フラグ
 1    1.05MB  255MB   254MB   primary   ext2
 2    255MB   8585MB  8330MB  extended
 5    256MB   8585MB  8329MB  logical                     lvm

「警告: 操作の結果できるパーティションはアライメントが正しくないためにパフォーマンスがでません。」
こんなメッセージが色々でてきてめんどくさかったー
調べてみたら、パーティションの開始を2048シリンダーで割り切れる数なら怒られないということで、途中で

unit s ← printの表示をシリンダー数に変更

これでシリンダー単位で計算してパーティションを作りました。
(なので無駄が多いです!)

mdにパーティションを切りましたのでデバイスが出来てるはず

root@mdtest:~# ls -al /dev/md*
brw-rw---- 1 root disk   9, 0  5月 21 16:39 /dev/md0
brw-rw---- 1 root disk 259, 0  5月 21 16:13 /dev/md0p1
brw-rw---- 1 root disk 259, 2  5月 21 16:31 /dev/md0p2
brw-rw---- 1 root disk 259, 3  5月 21 16:31 /dev/md0p5

デバイスが出来てました。

念の為、bootに使うところをext2でファイルシステム作成

root@mdtest:~# mkfs.ext2 /dev/md0p1

/bootの中身をすべてコピー

root@mdtest:~# cd /
root@mdtest:/# mkdir newboot
root@mdtest:/# mount /dev/md0p1 newboot
root@mdtest:/# cp -dpr /boot/* newboot/

/bootのマウント先をマウントを新しく作った/dev/md0p1に変更

root@mdtest:/# tune2fs -l /dev/md0p1 | grep UUID
Filesystem UUID:          9a08b33b-aba8-4b9d-b6ed-8423117a76d2
root@mdtest:/# vi /etc/fstab

/bootのマウントポイントが変わったのを確認

root@mdtest:/# umount newboot
root@mdtest:/# umount /boot
root@mdtest:/# rmdir newboot
root@mdtest:/# mount /boot
root@mdtest:/# df -k
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/mdtest--vg-root   7331536 1291548   5644520  19% /
none                                4       0         4   0% /sys/fs/cgroup
udev                           239576       8    239568   1% /dev
tmpfs                           50152     504     49648   2% /run
none                             5120       0      5120   0% /run/lock
none                           250748       0    250748   0% /run/shm
none                           102400       0    102400   0% /run/user
/dev/md0p1                     239979   38492    189097  17% /boot

新しいHDDにgrabを入れて、古いHDDのbootフラグを落とします。

root@mdtest:/# grub-install /dev/sdb
Installing for i386-pc platform.
grub-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
grub-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Installation finished. No error reported.
root@mdtest:/# update-grub
Generating grub configuration file ...
Linux イメージを見つけました: /boot/vmlinuz-3.16.0-30-generic
Found initrd image: /boot/initrd.img-3.16.0-30-generic
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
完了

root@mdtest:/# parted /dev/sda set 1 boot off

これでrebootを行って立ち上がればbootはOKです。
ただし、私が使ってるのはOracle Virtual Boxでbootフラグを落としても、一番目のHDDを見に行って起動するそうです。
(一番目のHDDに起動の設定がなければ、起動できませんってことで終了)
なので、立ち上がるときに【F12】を押して

こんな画面を出して、2番目のHDDを選択(2を押す)
これで、2番目のHDDから起動を開始します。

リブート後

root@mdtest:~# ls -al /dev/md*
brw-rw---- 1 root disk   9, 127  5月 21 17:14 /dev/md127
brw-rw---- 1 root disk 259,   0  5月 21 17:14 /dev/md127p1
brw-rw---- 1 root disk 259,   1  5月 21 17:14 /dev/md127p2
brw-rw---- 1 root disk 259,   2  5月 21 17:14 /dev/md127p5

/dev/md:
合計 0
drwxr-xr-x  2 root root  120  5月 21 17:14 .
drwxr-xr-x 17 root root 4280  5月 21 17:14 ..
lrwxrwxrwx  1 root root    8  5月 21 17:14 mdtest:0 -> ../md127
lrwxrwxrwx  1 root root   10  5月 21 17:14 mdtest:0p1 -> ../md127p1
lrwxrwxrwx  1 root root   10  5月 21 17:14 mdtest:0p2 -> ../md127p2
lrwxrwxrwx  1 root root   10  5月 21 17:14 mdtest:0p5 -> ../md127p5

なんか色々と名前が書き換わってる。。。
(md0 → md127 あとへんなリンク貼られてる。。。)

root@mdtest:~# df -k
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/mdtest--vg-root   7331536 1292032   5644036  19% /
none                                4       0         4   0% /sys/fs/cgroup
udev                           239384       4    239380   1% /dev
tmpfs                           50152     504     49648   2% /run
none                             5120       0      5120   0% /run/lock
none                           250748       0    250748   0% /run/shm
none                           102400       0    102400   0% /run/user
/dev/md127p1                   239979   38497    189092  17% /boot

とりあえず図で書くとここまでできました。

次は残りの部分を作成していきたいと思います。