2009年10月27日火曜日

MBRと"/boot"をバックアップして障害に備える、CentOSでiSCSI活用(後編)

前編からの続き
"/boot"だけバックアップした場合の戻し方。
 
 


"boot"だけ残せばよい理由と残す理由


前回記事の起動シーケンスから分かる通り、grubはstage2まで起動してしまえばファイルシステムをバッチリ理解できる。
逆に言うと、stage1.5まではHDDのセクタがそろってない環境にはそのまま戻せない、ということにもなる。
 

grubのstage2は"/boot"にあるので、そこになんとか繋ぐように配置すれば起動までこぎ着けそうな気もするが、そんな心配もいらないので諦めよう。
 

そう、MBRからstage2まで辿るのが難しくなった場合、素直にCDブートのgrubを使えばいい、
>> grub公式のgrub bootableCD作成方法
これはファイルシステムを大概理解できるナイスツール、必携だ。
 

grubさえ立ち上げれば、ext3の領域を読んでくれる = initrdやカーネルを指定してOSを起動することができ、ゆっくりgrub-install実施で元通りとできる。
 
 



ローカルをまっさらなHDDと交換してみる


前回作成したiSCSIを"/"領域にした環境で、ローカルディスクが爆破されたと仮定して"/boot"だけある環境から復旧してみよう。
 

まず適当なLiveCDを用意する。
CentOS5の奴なんかいいんじゃないだろうか、nfsマウント出来るしyumで少々のツールなら追加できる。
実は初期状態では重要なdump&restoreがないが、『yum install dump』で追加OKだ。
 

ではCD起動してからやること。。

  1. fdiskでhddを編集開始、まあ大体 "/dev/sda" だろう
    わからなかったら"fdisk -l"

  2.  
  3. nコマンドで"/boot"用に100Mくらい、SWAPように適当に2048MBくらい確保

  4.  
  5. tコマンドでSWAPスペースのタイプを82に変更

  6.  
  7. aコマンドで"/boot"予定スペースの起動フラグON

  8.  
  9. wコマンドでパーティションテーブル書き込み、fdiskおわり

  10.  
  11. "/boot"のところにファイルシステム作成
    # mkfs.ext3 -L /boot /dev/sda1

  12.  
  13. ついでにSWAPも
    # mkswap -L SWAP-sda2 /dev/sdb2


 


と、ここまでやったら"/mnt" あたりに "/dev/sda1"をマウントして、tarでもrestoreでも好きな方法で旧環境の"/boot"を戻そう。
もってくる方法は特に問わない、なんでもいい。
 
 

以上で ローカルディスクの"/boot"は復活した。
ちなみにfdiskはこんな感じに仕上がった。
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 282 2008125 82 Linux swap / Solaris

 
 


CDからgrubで起動しよう


"/boot"が使えるようになったので、CD起動にしたgrubを使ってみよう。
 

起動したらとりあえずこれだ、
grub>
 

どうしろと言うのか迷うかも知れないが、とりあえずファイルシステムのルートになるパーティションを指定しよう。
途中まで入れたらTABで補完OK。
grub> root (
Possible disks are: fd0 hd0 cd


使えそうなデバイスを見せてくれる、もちろんhd0を選びさらにTAB

grub> root (hd0,
Possible partitions are:
Partition num: 0, Filesystem type is ext2fs, partition type 0x83
Partition num: 1, Filesystem type is unknown, partition type 0x82


パーティションを教えてくれる、さっき自分で作ったのだからどちらかなんて自明。


grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83


選択した領域に"/boot"があったらマウントしてくれる。
 

さああとはinitrd とカーネルを指定するだけだ...って
これがハードル高いと思う日もあるかもしれない。
 

でもそんなことはないんだ、"/boot"はマウントされてるんだよね?
 
 

コンフィグ見りゃいいじゃん。
 

grub> cat /grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda3
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/
initrd /initrd-2.6.18-128.el5.img

 

grubはcat出来る、これは死ぬほど助かる。
 
さあさっさと下記を入力して、bootコマンドを叩くのだ。
"kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/"
"initrd /initrd-2.6.18-128.el5.img"
 
 

さすれば起動する、破壊前の環境そのままだ。
あとは起動後に"grub-install" をしてあげるだけ。
# grub-install --root-directory=/ /dev/sdb
色々理由があって上記になる。
 
 


おまけ、initrdのinit抜いてみた


と、言うことで今回環境のバックアップはおしまい。
結局、/bootのdumpとddと両方採ってるけどね。
 

今度はHDDの代わりにUSBメモリを使ってみようっと。
 
 

さて、"/"からiSCSIってinitrdは何しとるんだと思うじゃない、
なので展開してみた、なるほどねー。
 
長いのでトップでは切っちゃうが。

# cat init
#!/bin/nash
 
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading scsi_transport_iscsi.ko module"
insmod /lib/scsi_transport_iscsi.ko
echo "Loading libiscsi.ko module"
insmod /lib/libiscsi.ko
echo "Loading iscsi_tcp.ko module"
insmod /lib/iscsi_tcp.ko
echo "Loading e1000e.ko module"
insmod /lib/e1000e.ko
echo Bringing up eth1
netname **:**:**:**:**:** eth1
network --device eth1 --bootproto static --ip 192.168.1.2 --netmask 255.255.255.0 --gateway 192.168.1.254 --domain "sawano.local" --dns 192.168.1.10 192.168.1.11
echo Attaching to iSCSI storage
/bin/iscsistart -t iqn.1986-03.com.sun:02:*************************** -i iqn.2005-03.com.max:01******* -g 1 -a 192.168.1.1

echo "Loading libata.ko module"
insmod /lib/libata.ko
echo "Loading ahci.ko module"
insmod /lib/ahci.ko
echo "Loading dm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko
echo "Loading dm-mod.ko module"
insmod /lib/dm-mod.ko
echo "Loading dm-log.ko module"
insmod /lib/dm-log.ko
echo "Loading dm-region_hash.ko module"
insmod /lib/dm-region_hash.ko
echo "Loading dm-message.ko module"
insmod /lib/dm-message.ko
echo "Loading dm-raid45.ko module"
insmod /lib/dm-raid45.ko
echo Waiting for driver initialization.
stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
echo Scanning and configuring dmraid supported devices
resume /dev/sda2
echo Creating root device.
mkrootdev -t ext3 -o defaults,,ro sdb1
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot