Hatena::ブログ(Diary)

那由多屋 開発日誌 RSSフィード

2009-02-04

Mondo Rescueを使い、物理マシンを仮想マシン化する方法

 こんにちは。那由多屋の加藤です。

 2009年1月23日に『Fedora Core 6にMondo Rescueをインストール』という記事を書いて以来、試行錯誤していたリストア作業ですが、やっと成功しましたので、簡単にまとめたいと思います。

目標

作業の流れ

 今回は、下記の流れで仮想マシンへの移行を行いました。

  1. 物理マシンの構成を記録
  2. 物理マシンにMondo Rescueをインストール
  3. 物理マシンをMondo Rescueでバックアップ
  4. 仮想マシンを構築
  5. 仮想マシンバックアップリストア

物理マシンの構成を記録

 リストアを効率的に行うため、物理マシンのディスク構成などを記録しておきました。

 今回、仮想マシン化を行った物理マシン(以下、対象マシン)は、下記のような構成です。

$ cat /etc/redhat-release
Fedora Core release 6 (Zod)

$ sudo /sbin/fdisk -l
Disk /dev/sda: 73.4 GB, 73407865856 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        8924    71577607+  8e  Linux LVM

$ df -ha
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       65G  7.5G   54G  13% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
/dev/sda1              99M   16M   78M  18% /boot
tmpfs                1014M     0 1014M   0% /dev/shm
none                     0     0     0   -  /proc/sys/fs/binfmt_misc
sunrpc                   0     0     0   -  /var/lib/nfs/rpc_pipefs

$ sudo /sbin/lvm pvscan
  PV /dev/sda2   VG VolGroup00   lvm2 [68.25 GB / 32.00 MB free]
  Total: 1 [68.25 GB] / in use: 1 [68.25 GB] / in no VG: 0 [0   ]

$ sudo /sbin/lvm vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VolGroup00" using metadata type lvm2

$ sudo /sbin/lvm lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [66.28 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [1.94 GB] inherit

物理マシンにMondo Rescueをインストール

 対象マシンにMondo Rescueをインストールしました。

 各ディストリビューション向けのインストール方法については、Web上に豊富な情報がありますので、それらを参考にしてください。また、過去記事『Fedora Core 6にMondo Rescueをインストール』も参考にどうぞ。

物理マシンをMondo Rescueでバックアップ

 対象マシンでMondo Rescueを実行して、バックアップを行いました。今回は、DVD-R用のISOイメージとしてバックアップしました。

 SELinuxを有効にしている場合は、バックアップ時に無効にしておくと問題が少ないようです。(SELinuxを有効な状態でバックアップを行うと、リストア時にLVMの構成に失敗する、との情報をどこかで見かけました)

 また、可能であればシングルユーザモード(init 1)で実行してください。今回はサーバが稼働中だったため、マルチユーザモード(init 3)で実行しました。

$ sudo mkdir /backup
$ sudo /usr/sbin/setenforce 0
$ /usr/sbin/getenforce
Permissive
$ sudo /usr/sbin/mondoarchive -Oi -g -L -N -s 4200m -d /backup -E /backup
$ sudo /usr/sbin/setenforce 1
$ /usr/sbin/getenforce
Enforcing

 なお、mondoarchiveコマンドで生成されるISOイメージは自動的にバックアップ対象から除外されるため、バックアップ先(今回は/backup)が空ディレクトリであれば、-Eオプションを指定する必要はありません。

仮想マシンを構築

 今回は、Microsoft Virtual PC 2007 (6.0.756.0)上に仮想マシンを構築しました。割当メモリは256MB、仮想ディスクは少々キツキツではありますが8GBとしました。

仮想マシンバックアップリストア

 リストア時には、罠が満載です。:-) 詳細は後述の「ハマったところ」をご参照ください。

 今回は、下記の方法でリストアしました。

  1. 仮想マシンにmondoarchiveコマンドで生成されたISOイメージをセット
  2. 仮想マシンを起動
  3. ブートプロンプト(boot:)に[expert]を入力
  4. fdiskコマンドでパーティションを作成(詳細は後述)
  5. lvmコマンドでLVMを構成(詳細は後述)
  6. mkfsコマンドでパーティションをフォーマット(詳細は後述)
  7. mondorestoreコマンドでリストア(詳細は後述)
  8. X Windowの設定を調整(詳細は後述)
  9. SELinuxのラベルを再設定(詳細は後述)
fdiskコマンドでパーティションを構成

 今回はバックアップ時とは異なるディスク環境にリストアするため、fdiskコマンドを用いて手動でパーティションの構成を行いました。

# fdisk /dev/hda

 対象マシンと同様、ブート用のパーティションと、LVM用のパーティションの合計2つのプライマリパーティションを作成しました。また、ブート用はブート可能としました。

 下記の2つの表は、将来の参考用です。:-)

コマンド説明
p パーティションテーブルを表示
d パーティションを削除
n パーティションを作成
t パーティションのシステムIDを変更
a パーティションにブート可能フラグを変更
w パーティションテーブルを書き込んで終了
システムIDシステム名
83 Linux
8e Linux LVM
lvmコマンドでLVMを構成

 パーティションと同様、LVMも手動で構成を行いました。論理ボリュームのサイズは、ルート用が6.5GB、swap用が1GBとしました。

# lvm pvscan
# lvm vgscan
# lvm lvscan

# lvm pvcreate /dev/hda2
# lvm pvscan
# lvm pvdisplay /dev/hda2

# lvm vgcreate VolGroup00 -s 32m /dev/hda2
# lvm vgscan
# lvm vgdisplay

# lvm lvcreate -L 6500m -n LogVol00 VolGroup00
# lvm lvcreate -L 1000m -n LogVol01 VolGroup00
# lvm lvscan
# lvm lvdisplay
mkfsコマンドでパーティションをフォーマット

 fdisk、lvmコマンドで作成したパーティション、論理ボリュームを手動でフォーマットしました。

# mkfs.ext3 -j /dev/hda1
# mkfs.ext3 -j /dev/VolGroup00/LogVol00
# mkswap /dev/VolGroup00/LogVol01
mondorestoreコマンドでリストア

 ディスクの構成が完了した後、リストアを行いました。

# mondorestore

 テキストによるGUI画面が表示され、選択肢はそれぞれ下記の通り入力しました。

  • モードは[Interactively]
  • 読み込み元は[DVD disks]
  • mountlistは、/dev/sdaを/dev/hdaに、サイズを0MBにそれぞれ変更
  • Are you sure you want to save your mountlist and continue? [Yes]
  • Do you want to erase and partition your hard drives? [No]
  • Do you want to format your hard drives? [No]
  • Do you want me to restore all of your data? [Yes]
  • Initialize the boot loader? [Yes]
  • Did you change the mountlist? [Yes]
  • Boot device [/dev/hda]
  • fstabは、そのまま保存
  • mtabは、[/dev/sda1]になっている箇所を[/dev/hda1]に変更
  • grub.confは、そのまま保存
  • device.mapは、[/dev/sda]になっている箇所を[/dev/hda]に変更
  • Label/Identify your ext2 and ext3 paritions if necessary? [Yes]

 mountlistには、下記の通り入力しました。

/dev/hda2                lvm   lvm  0
/dev/VolGroup00/LogVol00 /     ext3 0
/dev/hda1                /boot ext3 0
/dev/VolGroup00/LogVol01 swap  swap 0

 上記の作業が完了後、仮想マシン再起動すると、仮想化された対象マシンのブートが始まります。

X Windowの設定を調整

 今回は移行先にVirtual PCを使用したため、下記の設定を行いました。

 カーネルパラメータの変更は、シングルユーザモードにて起動後、grub.confを編集して「vga=788 i8042.noloop」を追加しました。

# vi /etc/grub.conf

 「vga=788」はコンソール画面を800x600x16bitで動作させるための、「i8042.noloop」はX Windowにてマウスを使用するための指定です。

 また、X Windowの設定を変更して、800x600x16bitモードで動作するように変更しました。

# vi /etc/X11/xorg.conf

 変更後のxorg.confは下記の通りです。(修正箇所のみ抜粋)

Section "Device"
  Driver "s3"
EndSection

Section "Screen"
  DefaultDepth 16
  SubSection "Display"
    Depth 16
    Modes "800x600" "640x480"
  EndSubSection
EndSection
SELinuxのラベルを再設定

 Mondo Rescueによるバックアップリストアでは、SELinuxのラベルが保存されないため、手動でリラベルを行いました。ラベルが不正な状態ではログインすら行えないため、シングルユーザモード、またはenforcing以外のSELinuxモード(disable、またはpermissive)で行う必要があります。

# fixfiles relabel

ハマったところ

 バックアップよいよい、リストア怖い・・・。バックアップは簡単なMondo Rescueですが、リストアは一筋縄では行きませんでした。

 下記に合致する場合、expertモードで作業を行った方が早そうです。

nukeモードにて「Switch to Interactive Mode?」

 そもそも、nukeモード(全自動モード)は、バックアップしたマシンにリストアする場合しか使えません。今回はディスク構成が異なるため、interactiveモードへの移行を促されましたが、最終的にはexpertモードでリストアしました。

LVMの初期化にて「Failed to initialize LVM」

 interactiveモードにてリストアする際、パーティションテーブルの編集はできるのですが、LVM構成の編集はできません。そのため、バックアップ元と同様のLVMを構成しようとしてしまい、失敗します。

 /tmp/i-want-my-lvmというスクリプト(?)が内部で実行されているようなのですが、そのファイルを修正しても反映されませんでした。

 今回は、手動でLVMを構成することで対処しました。

パーティショニングで「Segmentation fault」

 interactiveモードでパーティショニングを行うと、Segmentation faultが発生してしまいました。

 今回は、手動でパーティションを構成することで対処しました。

フォーマットで「Segmentation fault」

 interactiveモードでフォーマットを行うと、Segmentation faultが発生してしまいました。その際のエラーメッセージは、下記の通り。

Failed.
Errors occurred during the formatting of your had drives.
Segmentation fault

 今回は、手動でフォーマットすることで対処しました。

LVMを使用しないと書き換え箇所多数

 LVM関連で色々と問題が発生したため、リストア時にLVMを使用しない構成としてみました。しかし、各種設定ファイルの書き換えが必要だったため、結局はLVMを使用する構成としました。

Virtual PC上でブート画面、X Windowの画面が乱れる

 Virtual PC上でLinuxを動かす場合の共通の問題です。

 今回は、カーネルパラメータの追加、X Windowの設定変更を行うことで対処しました。

最後に

 以上、Mondo Rescueによるバックアップ仮想マシンへの移行について、簡単ではありますがまとめてみました。なんらかの参考になれば幸いです。

 今後も3台ほどの物理マシンを仮想マシンに移行する予定のため、また気づいた箇所があったら記事を更新したいと思います。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。