しかし、試したシステムは/がext4のHDD1台で構成されていたのでgrub.cfgを弄る程度で問題なかったのですが、/がmdraidの RAID1で出来ている場合は少し手順を踏まないと復元できないと言うことが分かりました。大晦日から元旦にかけて1日中コマンドラインを弄っていたせいで初夢がコマンドラインをいじっている夢でした…。色々やったので忘れないうちにメモしておきます。非常に長くなるので見たい人だけ見てください。
インストールについて
インストールについては、debian等のaptを使うシステムであれば
/etc/apt/sources.list
に
ftp://ftp.mondorescue.org/ squeeze/main
を追記したあとにapt-get updateをして、そのあとにapt-get install mondoをすれば入ります。諸事情でDebian 7 wheezyを使いたかったので僕はdebパッケージを落としてきてdpkg -iしましたが。…ふと思ったのですがwheezyを使ってる場合でもaptにsqueezeと書いておけば入るのですかね?まあもう過ぎてしまったことなのですが。
dpkg -iする場合はまず
buffer
gawk
wodim
bzip2
parted
mtools
genisoimage
dosfstools
syslinux
をapt-get installしたあとに
ftp://ftp.mondorescue.org/debian/6.0/
から
afio_2.5-1_amd64.deb
mindi-busybox_1.18.3-3_amd64.deb
mindi_2.0.7.8-1_amd64.deb
をダウンロードし、afio,mindi-busybox,mindiの順番でインストールします。インストールの時のメモを便りに書いたのでもしかしたら足りないものがあるかもしれないですが、そのときは
~ depends on ~~; however:
Package ~~ is not installed.
といわれると思うのでnotinstalledと言われたパッケージをaptすればおそらく解決できます。また、順番がずれると依存関係でインストールが失敗すると思うので出来るならaptで入れるのが一番簡単だと思います
aptの場合は自動でやってくれるのですが(少なくとも検証用のSqueezeでは)、dpkgでインストールした場合はこのままだとmondoを使うときにmkisofsがないと言われるので、
ln -s /usr/bin/genisoimage /usr/bin/mkisofs
とリンクを作ります。
アーカイブを作る
インストールが無事に出来たら、今度はバックアップアーカイブを作ります。アーカイブを作るには、mondoarchiveを実行します。引数を与えずに起動した場合はGUI(?)が起動します。GUIから実行するときにはHardDriveを選択することによりISOイメージとして保存することが出来ます。
Cron等でバッチ化したい場合は引数をつけます。詳しくは本家に書いてあります。
http://www.mondorescue.org/docs/mondoarchive.8.html
たとえばこんな感じになります
mondoarchive -Oi -d "/home/mondo/" -I / -E "/home/mondo|/tmp" -p backup_`hostname`-`date '+%Y-%m-%d'` -s 4500m -G -3 -S "/tmp/" -T "/tmp/"
これは/home/mondoにISO形式で/をバックアップし、/home/mondoと/tmpをバックアップの対象から外し、ISOを4.5Gずつに分割してgzip -3で圧縮し、ファイル名をbackup_ホスト名-日付とつけると言う意味です。
ここでハマったのがEオプション(Exclude)で、NFSマウントしているフォルダを除外しようと-E “/nfs/”としたのですが何故か除外リストに入らず、膨大なサイズのISOファイルを作成しようとするのです。しばらく悩んだのですが、原因はフォルダの最後に/をつけていたことでした。-E “/nfs”とやると無事に除外されました。除外リストに追加するときは|で区切ります。
この記事を書くために仮想マシンのUbuntu 11.04でもう一度同じ事をしたのですが、何故か
---FATALERROR--- Failed to generate boot+data disks
If you require technical support, please contact the mailing list.
See http://www.mondorescue.org for details.
The list's members can help you, if you attach that file to your e-mail.
Log file: /var/log/mondoarchive.log
FYI, I have gzipped the log and saved it to /var/cache/mondo/MA.log.gz.
Mondo has aborted.
Execution run ended; result=254
Type 'less /var/log/mondoarchive.log' to see the output log
rm: cannot remove `/tmp//mondo.tmp.USPZgV/mnt1': Device or resource busy
と言われ、バックアップに失敗してしまいました。調べてみるとaptでインストールされたmondoのバージョンが2.2.7-2.1だったので手動でv2.2.9.7-r2846を入れたところこの問題は解決しました。テンポラリディレクトリが消せない場合はumount /mondo.tmp*/mntしたあとにrmすればおそらく消せると思います。11.10では直ってると思うのですが参考までに…。
リストア
まっさらなHDDにバックアップしたシステムを復元する場合は、まずAutoを選ぶ(リカバリ先にファイルシステムが存在していたり、バックアップ元と HDDの容量が異なる場合はInteractivelyを選んでHDDの構成を設定し直す必要がある場合がある)と、メディアから/の情報が復元されます。RAID無しの場合は次へ次へで終わります。
RAIDを組んでいる場合
mdadmを使用している場合はリストアが終わってシェルに落ちたら、構成しているドライブにgrubをインストールする必要があります。そのためにまずmd0等の/パーティションをマウントし、chrootします。
mkdir /a
mount /dev/md0 /a
mount --bind /dev /a/dev
chroot /a
chroot出来たら構成しているディスクにgrubをインストールします。
grub-install /dev/sda
grub-install /dev/sdb
これが終わったら再起動します。が、このままでは起動できません。
UUIDの問題
Ubuntuなどのモダンなディストリビューションはディスクの管理を/dev/sda等ではなくUUIDで行っているので、リストアの際にmkfsでファイルシステムを作った場合にUUIDが変わってしまい、そのままだと/をマウントしようとしてもそんなUUIDがないと言われて失敗します。なので grubの起動画面でeを押したあとF2でgrubコマンドラインに落ちて手動でマウントする必要があります。
この段階でおそらくmdraid1x等のモジュールが入っているのでRAIDアレイはみえると思います。lsして(md/0)がみえなかった場合はgrubのモジュールにmdraidを追加する必要がありますがおそらく最初から入っていると思います。
まず必要なモジュールを一応ロードします。
insmod mdraid1x
insmod ext2
次に/bootのあるディスクを指定します
set root=(md/0)
そうしたらlinuxカーネルを指定します。
linux /boot/vmlinuz-xxxx
最後に、initrdをロードします。
initrd /boot/inirtrd-xxx
これらを正しく指定できれば、bootで起動できます。が、raid array assemble failと言われるか、/がないと言われてinitramfsのプロンプトに落ちると思います。これは先述の通りUUIDによるディスク管理の問題です。
initramfsプロンプトになったら
mdadm -A /dev/md0 /dev/sda1 /dev/sdb1
とすることにより新しいmdraidのアレイを構成できます。cat /proc/mdstatしてアレイがみえたら、exitをすればおそらくOSが立ち上がってくると思います。
ここまで来たらひとまずのリカバリーは完了です。しかし、このままでは再起動する度にgrubといちゃいちゃしないといけないのでアップデートをかけます。
最終仕上げ
最後の仕上げとして、mdadmの構成情報の更新、grub.cfgのアップデート、initramfsの更新が必要になります。ここがよく分からず半日あれこれしていました。
まずはmdadmの情報を更新します。
mdadm -Ds
で構成情報を確認したあと、/etc/mdadm/mdadm.confを更新します。必要な場合は手動で更新してください。特に必要がなければ
mdadm -Ds>/etc/mdadm/mdadm.conf
で終わります。
次にgrubの情報を更新します。
# dpkg-reconfigure grub-pc
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
grep: input file `/boot/grub/grub.cfg.new' is also the output
done
最初はこれで終わると思っていたのですが、このままではやはり起動時のradi1アレイのアセンブルを失敗してinitramfsプロンプトで止まってしまいました。何故かなーと色々調べていたら、initramfsがマウントできると知ったのでマウントしてみました。
zcat /boot/initrd.img-2.6.32-5-amd64 >initrd.img
mount -t sysfs initrd.img /a
find /a -name md*
./fs/ext4/md0
./devices/virtual/block/md0
./devices/virtual/block/md0/md
./devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/sda1/holders/md0
./devices/pci0000:00/0000:00:10.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb1/holders/md0
./class/block/md0
./module/md_mod
./block/md0
見た感じboot時に/etc/mdadmではなくinitrdの中の情報を見ているようなので、こちらの情報も更新します。
まず今の情報のバックアップをします。
cp /boot/initrd.img-2.6.32-5-amd64 /boot/initrd.img-2.6.32-5-amd64_2
そうしたらinitramfsの情報をアップデートします。mdadmの情報を更新し忘れるとこのように怒られます。
#update-initramfs -u
update-initramfs: Generating /boot/initrd.img-2.6.32-5-amd64
W: mdadm: the array /dev/md0 with UUID 4ef41cad:0b3d5496:dbab09e3:88bdef22
W: mdadm: is currently active, but it is not listed in mdadm.conf. if
W: mdadm: it is needed for boot, then YOUR SYSTEM IS NOW UNBOOTABLE!
W: mdadm: please inspect the output of /usr/share/mdadm/mkconf, compare
W: mdadm: it to /etc/mdadm/mdadm.conf, and make the necessary changes.
update-ramfs -uが無事に終わったらリカバリは終了です。これで、再起動してもちゃんと立ち上がってくるようになると思います。お疲れ様でした。
え、zfs使えばいいじゃないかって?linuxでネイティブなZFSで/を作るの結構めんどくさいしちょっと不安なんですよね…。試した限りではshapshotに問題はないのですが…。
iSCSIでzvdevをマウントして、SAN側でスナップショットをとる、と言うのが一番スマートな気がするのですが、iSCSIBootって IntelNIC等のNIC以外から起動できるんですかね。時間と気力があればUSBメモリにgPXEを仕込んで起動、とかもしてみたいんですけどね…
遠いところからSolarisをつかえという声が聞こえた気がしますが聞こえなかったことにします。
ツイート
コメントを書く
必要事項とコメントを入力して下さい。