市民、あなたのCPUは完全仮想化に対応ですか

仮想マシンで Windowsを動作させるには「完全仮想化」が必要です。(それに対し、Walbrixで通常ダウンロードして利用する Linux仮想マシンは「準仮想化」を使用しています)

Walbrixで完全仮想化を利用するには、お使いのCPUが仮想化命令に対応している必要があります。仮想化命令に対応しているかどうかは、「状態」画面から「仮想化命令サポート」の欄を確認してください。

CPUに仮想化命令(Intel VT, AMD-V)が標準的に搭載されるようになったのはごく最近です。AMD製CPUでは下位モデルにも比較的早くから仮想化命令が搭載されていましたが、2010年頃になっても Intel CPUだと上位モデル以外では仮想化命令が意図的に外されていました。

仮想化命令サポートが「なし」になっている場合

ZAPZAPZAP

残念ながらおそらくここで全ての方が脱落です。普通に考えて、最新型のマシンに Walbrixをインストールする人は(当社関係者を除けば)いないからです。

仮想化命令サポートが「なし」の場合、Windowsは動きませんのであきらめてください。マイクロソフトは、準仮想化対応の Windowsを出す気はないようです(彼らにメリットが何もないので当然ですが)。

もし 2011年以降のCPUを使用しているのに仮想化命令サポートが「なし」になっている場合は、BIOS設定で無効になっているケースが多いですので BIOS設定をチェックしてみてください。

余談ですが、Walbrixが「古いPCでも動作する」ことを全面に押し出しているのは、他の仮想化製品が仮想化命令対応のCPUを搭載したコンピュータでないと一切動作しないことに対する独自の利点を表示するためだったりします。

というわけで、以降は誰にも必要のない情報だということがわかってしまっているので完全に惰性で書きます。

Cドライブにするハードディスクを特定する

説明を簡単にするため、ここでは Walbrixの動作しているマシンに(物理的な)ハードディスクを追加接続して Windows専用とすることにします。

わかる方は Walbrixの既存ボリュームグループに仮想のCドライブを(論理ボリュームとして)作成して利用することもできます。lvcreateして今後はハードディスクのデバイス名を論理ボリュームのデバイス名で読み替えてください。

ハードディスクを物理的に続したら、それにどのようなデバイス名がついているか lsscsiコマンドでハードディスクの型番と照らしあわせて確認してください。

# lsscsi
   :
[4:0:0:0]    disk    ATA      WDC WD20EARS-00M 50.0  /dev/sdb
   :

この例の場合は、/dev/sdb がこれからCドライブとして用いるハードディスクのデバイス名となります。

CD-ROMドライブを特定する

OSをインストールするにはCD(又はDVD,BD)-ROMドライブも必要なので、これも lsscsiコマンドで型番と照らしあわせてデバイス名を確認してください。

# lsscsi
[0:0:0:0]    cd/dvd  PIONEER  BD-RW   BDR-208  1.10  /dev/sr0 

OSのインストールに使うディスクドライブは /dev/sr0 ということになります。(たいていこのデバイス名です)

VNCクライアントの用意

コマンド操作の可能な Linuxと違い、Windowsはグラフィック画面がなければ何ひとつできません。

仮想マシンの世界では画面も仮想画面なので、画面を表示・操作するためにはネットワーク越しに VNCクライアントから接続する必要があります。Walbrix自身は仮想マシンの画面を表示する機能を今のところ持っていません。

VNCクライアントには色々種類がありますが、一番手軽なものとして Google Chrome用の VNCビューアアプリをお勧めしておきます。

仮想マシン設定ファイルを作成する

下記のような内容で、仮想マシン設定ファイルを /etc/xen 以下に作成してください。ファイル名は仮想マシン名と同じにします。例えば winxp という名前の仮想マシンを作成するのであれば /etc/xen/winxp になります。

builder='hvm'
memory = 1024
name = "winxp"
vcpus=1
acpi=1
apic=1
vif = [ 'type=ioemu,bridge=eth0']
disk = [ 'phy:/dev/sdb,ioemu:hda,w','phy:/dev/sr0,hdc:cdrom,r' ]
boot='dc'
sdl=0
vnc=1
vnclisten='0.0.0.0'
localtime=1
usb=1
usbdevice='tablet'

下記の設定項目は自分の環境に合わせて調整してください。

memory

仮想マシンに与えるメモリの容量を MB 単位で指定します。仮想マシンに与えるメモリは物理的に足りている必要があります。スワップは使用できません。

name

仮想マシン名です。Walbrixでは、仮想マシンの設定ファイル名と一致している必要があります。

vcpus

仮想マシンに与えるCPUコア数です。

disk

先だって lsscsiコマンドで確認しておいた、ハードディスク(Cドライブ)とCD-ROMドライブ(Dドライブ)をここで指定します。/dev/XXX の部分のみ自分の環境にあわせて書き換えてください。

仮想マシンの起動

設定ファイルが完成したら、Windowsのインストールディスクをドライブに挿入し、Walbrixから画面操作で仮想マシンを起動するか、コンソールから下記のような Xenコマンドを入力してください。

xl create /etc/xen/winxp

設定ファイルに間違いがなければ数秒で仮想マシンの電源がオンになり、シェルのプロンプトに戻ってきます。画面表示は一切行われませんが、裏では仮想マシンが既に動作を開始しています。

VNCクライアントで仮想マシンの画面を表示する

動き出した仮想マシンの画面を表示するには手元のコンピュータで VNCクライアントを起動し、WalbrixのIPアドレスに対して接続を行なってください。

注意点として、VNCの接続先IPアドレスは仮想マシンではなく Walbrix本体のものだということです。現状で仮想マシンはこれからOSをインストールしようという状態なのですから、どっちにしろまだIPアドレスを持っていません。

インストール操作を行う

VNC接続がうまくいけば、Windowsのインストーラが見えるはずです。設定ファイルで指定したハードディスクがインストーラから見えているはずなので、全体をNTFSでクイックフォーマットして先に進んでください。

Windowsのインストーラは途中でシステムの再起動を行います。仮想マシンが再起動されると Network connection lost. などと言われて VNCが切断されてしまいますが、手動で再接続してやればインストーラの続きの画面を表示することができます。通常の Windowsインストールと同様、プロダクトキーを入力して先に進んでください。

インストール完了

インストールが完了するとシステムが再起動されますので、またVNCを再接続してください。インストールがうまくいっていれば、初回起動時の設定をいくつか求められたのちにおなじみの画面が表示されるでしょう。

ここでは Windows XPの Home Editionを例にしていますが、Professional Editionであればリモートデスクトップを有効にすればより広い画面で高速に表示ができ、音声の出力にも対応できます。VNC接続の場合と違ってリモートデスクトップ接続の場合は Walbrix本体ではなく仮想マシンのIPアドレスに対して接続する必要があることに注意してください。

おまけとして下記の情報へリンクしておきます。でもやるなよ。絶対にやるなよ。

Windows XP Professionalをマルチユーザー仕様に改造する

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

完全仮想マシンは Walbrix(Xen)の通常のシャットダウン操作ではシャットダウンできないので、VNCかリモートデスクトップで接続してOSの通常手順でシャットダウン操作を行なってください。なおリモートデスクトップ接続の場合、スタートメニューにシャットダウンの選択肢が現れないのでタスクマネージャからシャットダウンするという技が必要です。

Windows側に Xenのツールをインストールすると Walbrixからのシャットダウン命令が効くようになります。(最近試していないのでうまくいくかよくわかりません)

ハードディスクのデバイス名について

Linuxでは、OSが認識した順に /dev/sda /dev/sdb... というように /dev/sd に続いて1文字のアルファベットをつけたものをデバイス名として割り当てます。ところが、様々な都合でその順番が変わることがあるため、いま /dev/sdb として認識されていたハードディスクが次回の起動以降も /dev/sdb である保証はありません(例えばHDDを増設した時など、増設したディスクが間に入って以降がズレるなど。取り外した際も同様)。そうすると当然設定ファイルに書いた内容と食い違うはめになります。

この問題を避けるには、/dev/sdXのような通し番号的な名前ではなくもっと詳細なデバイス名でハードディスクを特定します。詳細な名前は /dev/disk/by-id 以下にあります。

# ls /dev/disk/by-id
   :
ata-WDC_WD20EARS-00MVWB0_WD-WMAZA0199833
   :

この場合、ハードディスクを挿し直したりしてもずっと変わらないであろうデバイス名は /dev/disk/by-id/ata-WDC_WD20EARS-00MVWB0_WD-WMAZA0199833 ということになります。だいぶ長くて不便ですが仕方ありません。

名前の最後に -part1 などと付いているデバイスは、ハードディスクそのものではなくハードディスク内のパーティションに対応しています。今回の例の場合、仮想マシンに割り当てるのは「ハードディスク全体」なので、パーティションを間違えて指定してしまわないよう注意してください。