本番機を手元にVMware Hypervisorのゲストにバックアップしておき、必要な時に起動できるようにしておく、ということを実施しようと思います。実はかつて同じことをやっているのですが、もう一度この時点でやっておきます。
ESXiの適当なゲストに、現在とは別のディスクを作成し、利用できるようにします。
今回は、データストアDISK2に80GBの新規ディスクを追加してみました。
仮想ゲストを起動して、作成したディスクを使える状態にします。
このゲストは、ZFSで構成して作成しているマシンでした。
これは特にかまいません。
bsdconfigというコマンドを入れて、操作することにします。
元マシンのSWAPを確認します。
# pstat -s Device 1K-blocks Used Avail Capacity /dev/mirror/gm0s1b 2060200 44 2060156 0%
こんな感じで前提は完了して先に進みます。
スクリプトを作る感じで実行していきます。
# cd /usr # mkdir tmp # cd tmp # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/mirror/gm0s1a 507630 281568 185452 60% / devfs 1 1 0 100% /dev /dev/mirror/gm0s1e 4954158 100 4557726 0% /tmp /dev/mirror/gm0s1f 63239328 8235618 49944564 14% /usr /dev/mirror/gm0s1d 4954158 1631490 2926336 36% /var # dump -0Lauf - /dev/mirror/gm0s1a | bzip2 > /usr/tmp/gm0s1a.dump DUMP: Date of this level 0 dump: Mon Apr 28 20:31:25 2014 DUMP: Date of last level 0 dump: the epoch DUMP: Dumping snapshot of /dev/mirror/gm0s1a (/) to standard output DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 278918 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 278918 tape blocks DUMP: finished in 80 seconds, throughput 3486 KBytes/sec DUMP: level 0 dump on Mon Apr 28 20:31:25 2014 DUMP: DUMP IS DONE # dump -0Lauf - /dev/mirror/gm0s1e | bzip2 > /usr/tmp/gm0s1e-tmp.dump DUMP: Date of this level 0 dump: Mon Apr 28 20:34:13 2014 DUMP: Date of last level 0 dump: the epoch DUMP: Dumping snapshot of /dev/mirror/gm0s1e (/tmp) to standard output DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 364 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 283 tape blocks DUMP: finished in less than a second DUMP: level 0 dump on Mon Apr 28 20:34:13 2014 DUMP: DUMP IS DONE # dump -0Lauf - /dev/mirror/gm0s1d | bzip2 > /usr/tmp/gm0s1d-var.dump DUMP: Date of this level 0 dump: Mon Apr 28 20:35:07 2014 DUMP: Date of last level 0 dump: the epoch DUMP: Dumping snapshot of /dev/mirror/gm0s1d (/var) to standard output DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 1667719 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: 39.88% done, finished in 0:07 at Mon Apr 28 20:47:40 2014 DUMP: 92.18% done, finished in 0:00 at Mon Apr 28 20:45:58 2014 DUMP: DUMP: 1667660 tape blocks DUMP: finished in 660 seconds, throughput 2526 KBytes/sec DUMP: level 0 dump on Mon Apr 28 20:35:07 2014 DUMP: DUMP IS DONE # ll total 1108930 -rw-r--r-- 1 root wheel 110670386 Apr 28 20:32 gm0s1a.dump -rw-r--r-- 1 root wheel 1024243347 Apr 28 20:46 gm0s1d-var.dump -rw-r--r-- 1 root wheel 17544 Apr 28 20:34 gm0s1e-tmp.dump # mv gm0s1* /tmp # cd /tmp # dump -0Lauf - /dev/mirror/gm0s1f | bzip2 > /tmp/gm0s1f-usr.dump DUMP: Date of this level 0 dump: Mon Apr 28 20:52:01 2014 DUMP: Date of last level 0 dump: the epoch DUMP: Dumping snapshot of /dev/mirror/gm0s1f (/usr) to standard output DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 8250820 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: 7.68% done, finished in 1:00 at Mon Apr 28 21:57:11 2014 DUMP: 16.16% done, finished in 0:51 at Mon Apr 28 21:53:58 2014 DUMP: 22.41% done, finished in 0:51 at Mon Apr 28 21:59:01 2014 DUMP: 29.12% done, finished in 0:48 at Mon Apr 28 22:00:46 2014 DUMP: 36.97% done, finished in 0:42 at Mon Apr 28 21:59:43 2014 DUMP: 44.24% done, finished in 0:37 at Mon Apr 28 21:59:54 2014 DUMP: 52.95% done, finished in 0:31 at Mon Apr 28 21:58:12 2014 DUMP: 61.92% done, finished in 0:24 at Mon Apr 28 21:56:41 2014 DUMP: 72.64% done, finished in 0:16 at Mon Apr 28 21:54:03 2014 DUMP: 81.76% done, finished in 0:11 at Mon Apr 28 21:53:15 2014 DUMP: 90.45% done, finished in 0:05 at Mon Apr 28 21:52:54 2014 DUMP: 99.18% done, finished in 0:00 at Mon Apr 28 21:52:35 2014 DUMP: DUMP: 8253997 tape blocks DUMP: finished in 3620 seconds, throughput 2280 KBytes/sec DUMP: level 0 dump on Mon Apr 28 20:52:01 2014 DUMP: DUMP IS DONE # ll gm0s1* -rw-r--r-- 1 root wheel 110670386 Apr 28 20:32 gm0s1a.dump -rw-r--r-- 1 root wheel 1024243347 Apr 28 20:46 gm0s1d-var.dump -rw-r--r-- 1 root wheel 17544 Apr 28 20:34 gm0s1e-tmp.dump -rw-r--r-- 1 root wheel 3203383111 Apr 28 21:52 gm0s1f-usr.dump
約2時間でバックアップのデータは取得できた。
後はこれを週で実行させて、別のサーバやディスクに移せば良いです。
今回はこれをrsyncで転送させます。
rsyncの受信側に、鍵を未作成の場合には作成しておきます。
特に専用のポートで浮かべたりせずでそのままやってみます。
% ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/rcvuser/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/rcvuser/.ssh/id_rsa. Your public key has been saved in /home/rcvuser/.ssh/id_rsa.pub. The key fingerprint is: 89:40:ac:1f:14:4d:20:a6:4a:15:7d:ad:19:dd:ed:45 rcvuser@host.example.co.jp The key's randomart image is: +--[ RSA 2048]----+ | o+*=. o . . .E | | o.o.o.o o . . . | |.. o. . + . . | |o . .. + . . | |. . .. S | | . | | | | | | | +-----------------+
ここでできあがった公開鍵(cat id_rsa.pub)をcatで表示させて、内容をコピーします。
% cat id_rsa.pub
そして、送信側のユーザの.sshのディレクトリで以下の作業を行います。
以下のように、対象ユーザの.sshディレクトリで、echoでリダイレクトを使って、先ほどの鍵をペーストします。
% cd .ssh % echo "ssh-rsa BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE rcvuser@host.example.co.jp" >> authorized_keys
これで、受信側ではパスワードなしでログインできるようになったはずです。
さて、受信側にrsyncのパッケージを追加します。
# pkg install rsync
これでできあがり。
実際に一回試しで転送してみます。
% rsync -av -e "ssh" snduser@host2.example.co.jp:/tmp/backup /var/tmp
パスワード聞かれちゃいました。なんだか良くわかりませんが、hostsに接続元を記述することで鍵認証でいくようになりました。
転送中放置して出かけて帰って来たら既に完了していました。
どの程度の時間を要していたのかは不明です。(ファイルのタイムスタンプは、元のものになっているため)
旧サーバのディスクの大きさなどと同様にして、bsdconfigでスライスは切ってあるので、これをマウントしてリストアすればいいはず。
bzip2で圧縮していたので、bzcatで解凍しながらリストアすれば元に戻るはず。
.snapというファイルは後で削除すれば良かったはずなので、こんな感じで実施してみた。
# mount /dev/da2a /mnt # cd /mnt # mkdir usr var # mount /dev/da2d /mnt/var # mount /dev/da2e /mnt/usr # bzcat /var/tmp/backup/gm0s1a.dump | restore rf - warning: ./.snap: File exists warning: ./tmp: File exists warning: ./usr: File exists warning: ./var: File exists expected next file 46, got 45 # cd /mnt/var # bzcat /var/tmp/backup/gm0s1d-var.dump | restore rf - warning: ./.snap: File exists expected next file 47112, got 4 # cd /mnt/usr # bzcat /var/tmp/backup/gm0s1f-usr.dump | restore rf - warning: ./.snap: File exists expected next file 70692, got 4
restoresymtableというファイルも不要だったはずなので、確認してみる。
(※tmpは戻さないことにしましたので、上記より削っています。以下で戻した前提で書かれている部分があれば気にせずに…)
# cd /mnt # find ./ -name restoresymtable -ls 273 74368 -rw------- 1 root wheel 38032960 Apr 29 22:07 ./usr/restoresymtable 9 26752 -rw------- 1 root wheel 13660440 Apr 29 21:41 ./var/restoresymtable 5 736 -rw------- 1 root wheel 374208 Apr 29 21:33 ./restoresymtable
いますね。
これは、単純に rm で削除可能でした。一応書くかな。
# rm ./usr/restoresymtable # rm ./var/restoresymtable # rm ./restoresymtable # rm -rf .snap/ # rm -rf ./var/.snap/ # rm -rf ./usr/.snap/
で、失念しているけど、.sujournalというファイルが残るはずで、これがうまく消えたかなと微妙。
# rm .sujournal override r-------- root/wheel schg,sunlnk,nodump for .sujournal? y rm: .sujournal: Operation not permitted # ls -lo .sujournal -r-------- 1 root wheel schg,sunlnk,nodump 4194304 Apr 29 21:32 .sujournal # chflags noschg,nosunlnk .sujournal # ls -lo .sujournal -r-------- 1 root wheel nodump 4194304 Apr 29 21:32 .sujournal # rm .sujournal # chflags noschg,nosunlnk ./usr/.sujournal ./var/.sujournal # rm ./usr/.sujournal ./var/.sujournal
消えますね。良かった。
で、次は /etc/fstabだったので、これを修正。
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1e /tmp ufs rw 2 2 /dev/mirror/gm0s1f /usr ufs rw 2 2 /dev/mirror/gm0s1d /var ufs rw 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0
RAID1な形になっているはずなので、現状にするんだけど、ゲストOSであげる際には、/dev/da2aみたいな感じではないはず。
以下は、ちょっと設定ミスした箇所もあるままの画像ですが気にせずにどうぞ。
試行錯誤の上、ログインまではできました。
上記で止まっているのは、fsckした後はログインできました。
# mount / # mount /usr # mount /var # fsck # reboot
でログインできました。(/etc/fstabのtmpはコメントにした)
/tmpが/の中で作られても影響ないし。
# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/da0a 495516 283584 172292 62% / devfs 1 1 0 100% /dev /dev/da0f 3044988 24632 2776760 1% /tmp /dev/da0e 70077180 8684072 55786936 13% /usr /dev/da0d 5061628 1764932 2891768 38% /var # cat /etc/fstab # Device Mountpoint FStype Options Dump Pass# /dev/da0b none swap sw 0 0 /dev/da0a / ufs rw 1 1 /dev/da0f /tmp ufs rw 2 2 /dev/da0e /usr ufs rw 2 2 /dev/da0d /var ufs rw 2 2 # pstat -s Device 1K-blocks Used Avail Capacity /dev/da0b 2097152 0 2097152 0%
こんな感じで移行できました。
上記には書きましたが、tmpをda0bとして作業しちゃったので、少し手戻り作業していました。
その後da0fとして再度訂正し、restoreはもはやしないであげちゃったのです。
ページはいつか類似作業した際に更新したい予定ですが、まぁ…、わかりますよね??
以下は実際に移行後の仮想ゲストをつくった例です。
ここでハードディスクは、元ホストのゲストにあったストレージをマウントしています。
このタイミング前で、元ホストのゲスト側のハードディスクは、削除(物理削除ではないですよ)して利用することを忘れずに。
/etc/rc.confのネットワーク関係部分などを修正し、起動し直せば手元でも利用可能になりました。
ネットワークは、自分のアクセス可能なVLAN側に設定してログインできるようにしました。
この辺りはご自由にという感じです。
まずは、自動で取得しておくようにします。
/etc/crontabに追加。
00 2 * * 1 root /bin/sh /usr/local/etc/backup.sh 1> /dev/null 2>&1 /dev/null
こんな感じ。
スクリプトは、手で入力したそのまま。/usr/local/etc/backup.shの例。
#!/bin/sh cd /tmp/backup rm -f gm0s1* #dump -0Lauf - /dev/mirror/gm0s1a | bzip2 > /tmp/backup/gm0s1a.dump dump -0Lauf - /dev/mirror/gm0s1e | bzip2 > /tmp/backup/gm0s1e-tmp.dump dump -0Lauf - /dev/mirror/gm0s1d | bzip2 > /tmp/backup/gm0s1d-var.dump dump -0Lauf - /dev/mirror/gm0s1f | bzip2 > /tmp/backup/gm0s1f-usr.dump
後は、自動で手元に持ってくるように。
【改訂履歴】作成:2014/04/27 更新:2014/09/20
【参考リンク】
FreeBSD backup-restore - DaemonForums
その他、自分の過去ページ類
design テンプレート