32bit版は平気だけど64bit版は大変。
すんげー大変でした。
なんでこんなアホな仕様になってしまったんだろう。WOW64の弊害?
- メモ帳を右クリックして「管理者として実行」
- 開く
- 右下を「テキスト文書」から「すべてのファイル」に変更
- ファイル名に「c:\windows\sysnative」と入力すると隠しフォルダの中身が見える
- drivers/etc/hostsを開く。
デフォルトでlocalhostがコメントアウトされてるのも地味に凶悪な仕様変更だと思う。
管理PCで管理したい場合は「Hyper-V Server R2導入 3時間クッキング」の記事でも見てください。
シチュエーション
- このサーバはインターネット(sshトンネルされたrdp 7.0)経由で管理できるようにする。
- sshdは別途用意されており、インターネット経由でログイン可能になっているものとする。
- 用意出来ないならルータを設定してRDPポートを直接開放しても良いがセキュリティに十分注意する。
- 管理用の端末はrdp 6.0にも対応出来るようにする(MSは非推奨だがsshを経由しているので良しとする)
- Windows XPはrdp 7.0に対応していない。
- 管理PCはサーバと同一のサブネットには存在しない。よってHyper-Vマネージャも使えない。
- Windows 7が無いとHyper-Vマネージャが用意できないのでRDPに頼ることになる。
- 仮想環境ももちろん管理できるようにする。今回は以下の仮想環境を導入した。
- Windows Web Server 2008 R2(常時起動)
- Windows Web Server 2008 R1 x64(正式名称ではないが便宜上R1と記載)
- CentOS 5.4 x64(常時起動)
- CentOS 5.4 x86(常時起動)
- Windows 7(後に撤回)
- Windows Vista(今回は用意しなかった)
- Windows XP(後に撤回)
- ディスク構成の要件
- ディスクの故障によりシステムが停止しないよう、システムディスクはRAID1で構築する。
- パフォーマンスの確保のためにVHDは固定ディスクとする。
- VHDを配置するディスクに十分な空き容量を確保する。
- 物理メモリを8GB実装する。また、Hyper-Vの都合により、メモリと同容量のハードディスク領域を確保する。
- システム用のハードディスクの他にデータ用のディスクを接続する。これは仮想環境からのみアクセスする。
- ディスク構成
- C: (1TBx2 ハードウェアRAID1)
- D: (データ用のディスク。Hyper-Vからはオフラインとする)
- DVDドライブ(OSインストール後は物理的に取り外す)
導入の初期設定
- ホストOS用の GRMHVxFRE1_DVD.iso ダウンロード。
- http://technet.microsoft.com/ja-jp/evalcenter/dd776191.aspx
- DVDへの書き込み。InfraRecorderの出番か。
- ホストOSをインストールする。2~3回再起動。パスワードの設定。
- コンピューター名(hypervhost)の変更。再起動。
- ローカル管理者(hyperv)の追加。パスワードの設定。
- リモートデスクトップ。有効。RDP 6.0に対応させるなら「低」。さもなくば「高」。
- ここからは同一サブネット内からリモートで作業可能。
- リモート管理の構成。 Windows PowerShell を有効にする。再起動。
- 更新プログラムのダウンロードとインストール。a。a。(すべて適用)。再起動。
- ネットワーク設定。DHCPを無効。IPアドレスを設定。DNSサーバを指定。
ホスト管理のための設定
コマンドはすべて黒い窓に打つ。
// firewallを全部offにする(必要ないかも。offにしなくてもrdpとファイル共有は使える)
netsh advfirewall set currentprofile state off
// 共有フォルダ share を作成する
mkdir c:\share
net share share=c:\share /grant:hyperv,full
// 共有フォルダ share の共有を解除する
net share share /delete
// ユーザーのパスワードの有効期限を無期限にする
wmic useraccount where (Name = "Administrator") set PasswordExpires=False
wmic useraccount where (Name = "hyperv") set PasswordExpires=False
// ユーザーのパスワードの有効期限を確認する
wmic useraccount where (Name = "Administrator") get PasswordExpires
wmic useraccount where (Name = "hyperv") get PasswordExpires
VMを管理する
PowerShell Management Library for Hyper-V
http://www.codeplex.com/PSHyperv
PDFと本体の両方をダウンロードしておく。コマンドが多すぎる上にメニューが無いので使い勝手は悪い。
ところで、今回はWMIの設定もfirewallの設定もしてないのに、管理PCから接続できた。なんでだろ・・・。
PowerShellで打つコマンド
// ダウンロードして展開したPowerShell Management Library for Hyper-Vのインストール
cd (共有フォルダのパス)
cd HyperV_Install
install
// PowerShellを起動する
powershell
// スクリプトを読み込むためのセキュリティ設定の緩和
Set-ExecutionPolicy Unrestricted
// スクリプトを読み込む(毎回必要?)
Import-Module 'C:\Program Files\modules\HyperV\HyperV.psd1'
// VMの一覧を取得
get-vm
// VMの新規作成
new-vm -name "hoge"
// VHDを容量固定に変換
PS E:\g> convert-vhd -VHDPaths "変換元" -type "Fixed" -DestPath "変換先"
// w2k8r2の事例
new-vm -name "w2k8r2"
set-vmmemory "w2k8r2" -memory 2048MB
set-vmcpucount "w2k8r2" -CPUCount 1
set-vm -vm "w2k8r2" -autoStart AlwaysStartup
add-vmdisk "w2k8r2" 0 0 'VHDのパス'
add-vmnic "w2k8r2"
start-vm "w2k8r2"
get-vmsummary "w2k8r2"
// 終わり
exit
現時点でわからないこと。
- 「仮想ネットワークマネージャ」の「新しい仮想ネットワーク」に相当するコマンド操作。たぶんSwitchに関係するのだと思う が・・・。
- VMの設定で上記仮想ネットワークに接続する方法。たぶんSet-VMNicSwitchだと思うが設定しても変化がない。
- 仮想環境に「接続」する方法。
- vmconnect.exeをサーバにコピーしたら、起動したが接続できずに待たされ続ける。
- Windows 7 amd64用のHyper-Vマネージャをインストールしようとしたが拒否された。
仮想ネットワークを増やすような運用はいまのところ予定していないからいいが、VMの追加は普通に想定される。
その都度、管理PCを用意して運用しなければいけないとしたら苦痛にもほどがある。
物理ディスクを管理する
LSI MegaRAIDみたいなサードパーティ製ソフトウェアRAIDを使うと苦労する。
Hyper-V R2に監視ツールをインストール出来て、RAIDの状態を自動通知出来るハードウェアRAIDを探すか、
さもなくばWindowsの標準機能でお茶を濁す方が無難。
また、仮想環境から物理ディスクにアクセスするためには、事前に物理ディスクをオフラインにする必要がある。
これらは diskpart というコマンドで操作する。
// diskpartを起動する。
diskpart
// ディスクの一覧を出す
list disk
// ディスクを選択する
select disk 1
// 選択したディスクをオフラインにする
offline disk
// 別のディスクをミラーするために追加する
add disk 2
// 終わり
exit
// 以下はコマンドプロンプトで実行
// ボリュームの状態を標準出力に吐き出す(都合上diskpart.txtというファイルが生成されるので注意)
// あとはこのファイルを解析して処理するスクリプトなどを別途作成すれば良いはず。
echo list volume > diskpart.txt
diskpart /s diskpart.txt
「まとも」の定義。
仮想化で得られる利点は、信頼性、冗長性、保守性、利便性、コストパフォーマンスである。
- ゲスト環境と物理ハードウェアの相性問題に悩む必要がなく、環境を構築できる。
- ゲスト環境を複製したり増設したり出来る。バックアップも出来る。
- ゲスト環境がたとえフリーズしても、リモートで診断や電源断や再起動が安全に行える。
- リモート管理画面が備わっており、物理的な操作よりも管理がしやすい。
- 1台のPCで複数の環境を同時実行出来る。
デメリットはパフォーマンスの低下。
選択肢は、仮想化専用OSで動く、VMWare ESXi、Hyper-V、Xen、KVMと、
普通のOS上で動く、VMWare Server、Microsoft Virtual PCのようなもの。
ホストOSを通常使用した結果フリーズさせたりするのはナンセンスなので、
ホストOSが仮想化専用に特化している事は良い事だと思う。
VMWareも、VMWare Serverは開発やテスト用でありパフォーマンスも低下するとアナウンスしている。
クライアントOSをゲストにするのに最も有力な選択肢はVMWare ESXiだ。
Hyper-Vと比べて管理PCが不要でグラフィック描画が優れている。
しかし、WindowsをゲストにするのであればHyper-VのブランドとRDP 7.0の機能があれば、上記のメリットを十分補える。
とはいえ、管理PCが別途必要になる事はとても煩わしい。
Hyper-VマネージャのWMIポートについては、まず135/tcpで通信して、それから1024-1034を使うらしい。
トンネルを設定し づらいことこの上ない。
たぶん、Hyper-Vマネージャは諦めて、RDPとPowerShellで運用したほうがいいんだろうな。
もしもゲストOSがGUI無しのLinuxだけでいいなら、XenやKVMも良い選択肢になると思う。
もっとも、その場合はエミュレーションより効率的な、環境の仮想化が将来的に出来るはずだとも思うが。
というわけで、(ちょっと苦しいけど)Hyper-Vという選択肢も十分考えられるわけです。
Hyper-V のパフォーマンスおよび容量の要件
http://technet.microsoft.com/ja-jp/library/dd277865.aspx
Hyper-VのCPUリソース管理について - Windows Server Insider - @IT
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46307&forum=6
Hyper-V Tipsその1 仮想OSにまつわるHDD容量設計 - 戦艦ゆにっき
http://techbank.jp/Community/blogs/nora/archive/2009/11/27/22838.aspx
記事の話をまとめると、こういうことになりそうだ。
- NUMAアーキテクチャの場合、1ゲストあたりのメモリ容量は、物理容量をコア数で割った数以下が良い。
- OpteronとかXeonとか一部のCore i7/i5がNUMAアーキテクチャらしい。
- Core 2 Duo E6300はNUMAアーキテクチャではないので関係無い。
- HTのスレッド数の事をLPと呼び、仮想プロセッサをVPと呼ぶ。同時起動するのはLP>=VPが良い。
- LPとVPは別物なので、LPを超えるVPを設定しても起動出来るが遅くなるらしい。
- LPは必ず最低一つのVPを持ち、必要次第VPを増やしていく仕組みらしい。
- きちんとホストとゲストの両方に更新プログラムを適用しないとパフォーマンスが出ない。
- IPv6を使わないならオフにしたほうがパフォーマンスは伸びる。
- ディスクは、容量固定のVHDを使うか物理ディスクを割り当てる。
- 2つのゲストを同時起動した時のパフォーマンスが良いので、それを前提にした運用をしたほうが得。
- ゲストOSに割り当てたメモリ容量と同様の容量かホストのディスク内に必要となる。
あと、ここには書いてないけど、曖昧な根拠で書いてあったこと。
- Hyper-V自身もCPUとメモリを食っているため、それなりに余裕もった方ががいい。
- ゲストに割り当てたメモリの量が不足すると、ホストOS上でスワップアウトが行われる。
- ゲストに割り当てたメモリの量が不足すると、そもそもゲストの起動時にエラーが表示されて起動できない。
それぞれの情報は一部矛盾してるんだけど、たぶんホストOSの負荷がある程度高いのだろう。
VMWare ESXiでは、USBメモリからのブートも出来るので、少なくともswapが肥大化してホストが落ちる事は無さそう。
少なくとも再起動には成功しそう。
ゲストOSのメモリが肥大化した事によりメモリ不足に陥りそうな場合は、ゲストOSを強制終了して生き延びるのが適切だと思うけど。(それはそれで問題あるんだけど)それに加えてメールで通知してくれたりしたらなんも文句ない。
まとめ。
- 物理コアと物理メモリのすべてを仮想環境に割り当ててはいけない。ホスト用の余裕を残す。
- 仮想CPUは物理コア数より増やしてもエラーの原因にはならないが、仮想メモリはエラーの原因になる。パフォーマンス的には物理コア数-1までに留めるほうが無難。
- Hyper-Vホストの入ったパーティションは、VHDも含めて容量のかさむものを入れてはならない。
- どこまで肥大化するかわからないホストOS用のswapファイルを受容出来る程度の空き容量を作っておく。(物理メモリの2倍? 固定化できないのかしら?)
- 運用環境に対しては、VHDは容量固定にして、スナップショット機能を使ってはいけない。容量が可変になってもいいのは、目の届くところで操作している開発時やテスト目的での使用だけ。
- 容量固定にしたVHDの中でスワップが発生してもホストOSのエラーには影響しない・・・はず・・・。
割り当て例
E6300(4LP)、2GBの物理メモリ、160GBの物理ハードディスクのサーバにHyper-Vを入れる場合
- Cドライブ(20GB)
- Hyper-VホストOS(1VP, 空きメモリ512MB, 16GBのシステムファイル)
- swapファイル用の空き容量(4GB)
- Dドライブ(42GB以上)
- Windows Web Server 2008 R2(2VP, メモリ1GB, 32GB固定VHD+1GB仮想メモリファイル)
- Linux (1VP, メモリ512MB, 8GB固定VHD+512MB仮想メモリファイル)
あなたが不安であればあるほど、Cドライブの容量は大きめにとったほうがいいです。
あと、VHDファイルを物理パーティションにしない理由は、冒頭に述べた「バックアップ出来る」保守性に障るから。
PowerShellで物理パーティションとVHDファイルの相互変換が出来たりするようなら、物理的に分けてもいいかも。