ライン

ポイント:マニュアルでP2Vする

ライン

 はじめに

dumpとrsync

 本番機を手元にVMware Hypervisorのゲストにバックアップしておき、必要な時に起動できるようにしておく、ということを実施しようと思います。実はかつて同じことをやっているのですが、もう一度この時点でやっておきます。

 VMware Hypervisorのゲストにバックアップ

FreeBSD 9.2-RELEASEのゲストに追加でストレージを追加

 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に接続元を記述することで鍵認証でいくようになりました。
転送中放置して出かけて帰って来たら既に完了していました。
どの程度の時間を要していたのかは不明です。(ファイルのタイムスタンプは、元のものになっているため)

 ゲストOSに書き戻し

続きを実施

 旧サーバのディスクの大きさなどと同様にして、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

その他、自分の過去ページ類

Copyright © 1996,1997-2006,2007- by F.Kimura,