サーバーコンソリデーションを行うにあたっては、現在利用されている物理マシンをそのまま仮想環境へ移行(P2V)することが求められる。ここでは、既存の Windowsサーバを Walbrixで仮想化する方法について解説する。なお、開発元は情報の精度・鮮度及びこれをもとに行った作業の結果に責任を持てないので了承されたい。

【PR】 サーバコンソリデーション作業のご依頼はワルブリックス株式会社まで

前準備1: 移行先が仮想化命令対応CPUを搭載しているか調べる

Walbrix (Xen) で Windowsを動作させるためには CPUが仮想化命令を搭載している必要があるので、「状態」表示画面から「仮想化命令サポート」が有効なことを確認する。

CPUが十分新しい(全てのCPUに仮想化命令が搭載されるようになったのは2010年以降)はずなのに仮想化命令サポートが有効でない場合、BIOS設定で無効にされている可能性がある。

前準備2: 移行がライセンス的にOKか調べる

Windowsのライセンスは、OS単体で購入した場合と本体にインストールされた状態(OEM版)で購入した場合で扱いが異なる。

OS単体で購入した場合OK: P2V後に再認証を求められるが、大抵の場合そのままインターネット越しのプロダクト認証を通過できる
本体にインストールされた状態で購入した場合NG: OEM版は他のハードウェアに移すことが許されない。P2V後に再認証を求められ、認証は通過できない。どうしてもP2Vしたければ、新しく同じバージョンのOSを単体で買い直してそれに添付のプロダクトキーを使い再認証する。

あくまでこれは「プロダクト認証を通過できるかどうか」という観点からのおおまかな分類で、実際のライセンス形態は様々なので詳しいことはマイクロソフト社の代理店なりに確認されたい。

個人的には、消耗品たるハードウェアはいつか壊れて廃棄しなければいけないにも関わらずOSのライセンスをそこから移すことが出来ない制度にはなはだ疑問を感じざるを得ない。

参考情報: 使用している Windows Server 2003 の入手形態を確認する方法

前準備3: デバイスドライバを揃える

WindowsはOSのインストール時にストレージコントローラの種別を検出し、それに合ったデバイスドライバのみをロードするため、そのまま異なるマシンにハードディスクを移して起動しようとしてもデバイスドライバが合わないため OSをハードディスクからロードできず起動できない。具体的にはこのような画面(STOPエラー 0x0000007b)になる。

これに関連する Xen-usersメーリングリスト内の情報

A problem has been detected and Windows has been shut down to prevent damage to your computer. If this is the first time you've seen this Stop error screen, restart your computer. If this screen appears again, follow there steps: Check for viruses on your computer. Remove any newly installed hard drives or hard drive controllers. Check your hard drive to make sure it is properly configures and terminated. Run CHKDSK /F to check for hard drive corruption, and then restart your computer. Technical information: *** STOP: 0x0000007b

エラーメッセージの内容は全く役に立たないので解説を省略するとして、これを避けるには移行元のマシンからハードディスクを取り外す前にいくつかの準備をする。まず、C:\Windows\system32\drivers に下記のドライバファイルが全て揃っていることを確認する。

atapi.sys
intelide.sys
pciide.sys
pciidex.sys

足りない場合は、C:\Windows\Driver Cache\I386\Driver.cab から拾い出して当該フォルダへコピーする。

ドライバを揃えたら、レジストリにドライバの情報を追加する。下記のページにある "Windows Registry Editor Version 5.00" で始まる一連の内容をメモ帳にコピーし、Mergeide.reg という名前で保存(このさい .txtをファイル名の末尾に付けないようにする)するとファイルのアイコンがレジストリエディタのものになる。これをダブルクリックして開くことによりレジストリに内容が追加される。

参考: Windows XP のシステム ディスクを他のコンピューターに移動した後に STOP 0x0000007B エラーが表示される

Windows XP用の情報となっているが Windows Server 2003でも適用できた。また、このページで解説されている手順では regファイルをフロッピーディスクに保存するとなっているが別にデスクトップでもどこでも良い。

レジストリに情報を追加したらこの作業はこれで完了である。

移行元のマシンがもう起動できない場合

もし、移行元のマシンがもう動作しないなどの理由で上記の操作ができない場合、他の Windowsマシンにハードディスクを接続するか、Walbrix(又はWalbrixのレスキューモード)上で Cドライブのパーティションを何とかマウントして上記と同等の作業をする必要がある。しかしながら、レジストリは単純なテキストファイルではないため専用のツールがないと編集できない。未検証だが、レジストリを編集するには chntpwというツールが存在するようである。Walbrix 3.12以降には chntpwが収録されている。

chntpwについての参考情報 LinuxでWindowsレジストリを編集する chntpwコマンド | nexia inc

ただこれは一歩間違えるとOSが起動しなくなる危険な作業であるため、元のハードディスクではなく ddで吸い出したハードディスクイメージに対して行うべきである。

前準備4: ActiveDirectoryのドメインコントローラをやめる

どういう理由かわからないがドメインコントローラの構成情報はハードウェアに依存するらしく、ドメインコントローラとしての機能を持ったままの Windows Serverを P2Vすると OSの起動すら出来なくなる。

次のエラーのため、セキュリティ アカウント マネージャの初期化に失敗しました: ディレクトリ サービスを開始できません。 エラー状態: 0xc00002e1 [OK] をクリックしてシステムをシャットダウンし、再起動するときにディレクトリ サービス の復元モードを選択してください。詳細な情報についてはイベント ログを参照してください。

参考情報: 既存のドメイン コントローラの仮想化 (2053129)

よーし起動時にF8を押してディレクトリ サービスの復元モードを選択すれば復元できるんだな!と思った?
残念!「ディレクトリ サービス復元モードのパスワード」が必要(Administratorとは別)かつ18段階の手順が必要でした!


これを修正する方法が Windows または SBS ベースのドメイン コントローラの起動時に "ディレクトリ サービスを開始できません" というエラー メッセージが表示される に掲載されているが、

_人人人人人人_
> 正直無理 <
 ̄Y^Y^Y^Y^Y ̄

こんな込み入った作業をやる(しかもやったところで本当に問題が解決するかどうかわからない)くらいなら、P2V前にドメインコントローラの機能を削除しておいて P2V後に再度ドメインコントローラの設定を(必要なら)しなおす方がマシだ(みたいなことが上記ページでも示唆されている。ADに依存したネットワークになってる?じゃあ当然セカンダリがあるはずだよね?ニヤニヤ)。

というわけで、可能なら「サーバの役割管理」でドメインコントローラを削除する。

参考情報: Windows Server 2003による社内ネットワークの構築 - Active Directory の削除 -

前準備5: 移行元マシンのメモリ容量とCPU数を確認する

移行先のスペックが移行元より劣ると色々問題があるので、適切なリソースを割り当てるために現在のメモリ容量と CPUコア数をあらかじめ確認する。メモリ容量はコンピュータのプロパティで確認できるし、CPUコア数はタスクマネージャのパフォーマンスを開いて CPU使用率のグラフがいくつ出るかでわかる。

2013年現在でサーバコンソリデーションの対象になるようなマシンであれば、メモリはあっても3GB程度だろうしCPUコア数もせいぜい2個程度のことが多いだろう。

前準備6: VNCクライアントの用意

Walbrixはグラフィック画面を表示する機能を現在のところ持っていないため、仮想化された Windowsを操作するためにはネットワーク越しに VNCを利用して仮想画面に接続する必要がある。

VNCクライアントソフトウェアには色々あるが、Google Chromeを既に使用しているなら VNC Viewer for Google Chrome™を使うのが一番簡単だろう。

移行元のハードディスクを移行先マシンに取り付ける

Windows ServerのCドライブを取り外し、Walbrixの稼働している移行先マシンに取り付ける。移行元のハードディスクを取り付けるには、変換アダプタでUSBに変換するのが一番簡単だ。

PC用ハードディスクの規格には主にパラレルATA(IDE)とシリアルATAがあり、旧式の規格であるパラレルATAは市場から姿を消して久しいが、P2Vの対象となるのはえてして古いコンピュータなのでパラレルATAだと思った方が良い。したがってパラレルATAにも対応できる変換アダプタを調達するのが良いだろう。

移行元ハードディスクのデバイス名を調べる

ハードディスクを接続したら、Walbrix上で lsscsi -s とコマンドを入力してハードディスク一覧を表示し、そのデバイス名(後述)を調べる。接続したばかりのハードディスクなのでおそらくリストの一番下に出ているものが該当するが、念のため表示されているハードディスクのメーカー名と型番、サイズもチェックして人違いがないか確認すると良い。

ハードディスクのデバイス名は(Linux一般では)/dev/sdの後にアルファベット1文字をaから順に割り当てたものとなっている。ここでは仮に、取り付けたディスクが /dev/sdx だったものとして話を進める。

移行元ハードディスクの容量を調べる

/dev/sdxからデータをコピーする先として、Walbrix側に移行元のハードディスクと同じ容量を明示的に割り当てる必要があるので、fdisk -l コマンドで元のハードディスクの正確な容量(※)を調べる。

※仕様上例えば80GBとされているハードディスクでも正確な容量は1バイト違わず80GBなわけではないため、完全なコピーを作成するためには正確な容量を調べなければならない

# fdisk -l /dev/sdx
  :
Disk /dev/sda: 80.0 GB, 80026361856 bytes, 156301488 sectors
  :

これで移行元ハードディスクの正確な容量が 80026361856バイトであることがわかった。

移行先のボリュームを作成する

Walbrixの領域(仮にデフォルト領域 wbvgを使うものとする) に、元のハードディスクからデータを完全にコピーする先となるボリュームを作成する。これがP2V後の仮想ハードディスクとなる。Walbrixではボリューム名を仮想マシン名と合わせるようにしているので、今回移行する Windowsのコンピュータ名を仮に w2k3とするならボリュームの名前も w2k3 とする。

(サーバでそういうことをする人はよもやいないと思うが、コンピュータ名が日本語の場合は仕方ないのでここで適当にローマ字表記か英語名を考えてつける)

領域 wbvg 内に、80026361856バイトのボリュームを w2k3 という名前で作成するにはこのようにする。80026361856の後に単位としてアルファベットのbを付けなければいけないことに注意すること。

# lvcreate -n w2k3 -L 80026361856b wbvg

これで領域wbvgにボリューム w2k3が作成される。中途半端なサイズが指定されたので適当なところまで切り上げたよという警告が出るかもしれないがそれは問題ない。

このボリュームにアクセスするためのデバイス名は /dev/wbvg/w2k3 となる。

データをコピーする

元のハードディスクからデータを完全にコピーするには ddコマンドを使う。if=の後にコピー元デバイス名、of=の後にコピー先デバイス名を指定することでコピーが行われる。

# dd if=/dev/sdx of=/dev/wbvg/w2k3 bs=4096

bs=4096は、コピーを多少速くするためのおまじないである。

ddコマンドのif (入力元)とof (出力先)を取り違えると元のハードディスクを全て消去してしまうという大事故が起こるので、このコマンドを実行する前に何度も指さし確認すること。

何にせよこれには時間がかかる。ハードウェアの諸条件が良くても 80GBのコピーで30分かかることは免れない。

UNIXの操作がわかる人向け情報: ddのプロセスに対して SIGUSR1を送ることで進捗状況を表示することが出来る

仮想マシン設定ファイルの作成

/etc/xen 以下に仮想マシンの設定ファイルを作成する。仮想マシン名が w2k3なら、仮想マシンの設定ファイルは /etc/xen/w2k3 となる。

builder='hvm'
memory = 2048
name = 'w2k3'
vcpus=1
acpi=1
apic=1
vif = [ 'type=ioemu,bridge=eth0']
disk = [ 'phy:/dev/wbvg/w2k3,ioemu:hda,w' ]
boot='dc'
sdl=0
vnc=1
vnclisten='0.0.0.0'
localtime=1
usb=1
usbdevice='tablet' 

仮想マシンの起動と確認

# xl create /etc/xen/w2k3

で、仮想マシン w2k3が起動する。xlコマンドが即時にエラーを返す場合は、disk=行の指定が間違っているか、CPUが仮想化命令に対応していない。

仮想マシンが起動しているかどうかは xl list コマンドでわかる。起動した仮想マシンの状態が p のままずっと変わらないようであれば何かが間違っている可能性があるので、xl destroy w2k3 のようにして仮想マシンを強制停止し設定を再度チェックする。

仮想マシンが無事に起動しているようであれば、VNCクライアントから WalbrixのIPアドレス(「状態」画面でわかる)に対して接続を行うことで画面にアクセスできる。VNCのポート番号はデフォルトで5900番だが、先に別の仮想マシンが画面を持っている場合 5901, 5902...と1番ずつ大きなポートが用いられる。

初回起動時にライセンス認証が求められるが、仮想ネットワークアダプタがインターネットへ正常につながっていれば(と、ライセンス形態の問題がなければ。どこかから拾ってきたクラック版などはもってのほか)、そのまま認証を通過できるはずだ。

Windows仮想マシンのシャットダウン

Walbrixの仮想マシン一覧画面から、又は xl shutdownコマンドで Windows仮想マシンをシャットダウンできるようにするには GPLPV ドライバを Windows側にインストールする必要がある。

GPLPVドライバを入れない場合は、VNCやリモートデスクトップを使って Windowsの画面からシャットダウンを行う必要がある。