VMware ESX上で動作していた仮想マシンを、ハードウェアリプレースに伴いそのまま新しいハードウェアに移行しました。
そのまま仮想マシンを移行したのに、ゲストOS上のとあるプログラムが動作しない・・・。
ハードウェアが変わると仮想マシンでも変わる点があるのでしょうか?
レジュメ
ハードウェアが変わると仮想マシンでも変わる点・違いがあるのでしょうか?VMware
環境・前提条件:
今回、経験した事象の場合は
- VMware ESX 3.5 から VMware vSphere ESXi 5.5 への移行
- ゲストOSはWindows Server 2003
- ハードウェアはもちろん新しいハードウェアへ移行
- 仮想マシンのバージョン・VMwareToolsバージョンは変更しない時点で発生。
VMwareのバージョンアップ時に発生しましたが、バージョンアップに関わらず場合によっては発生しうる現象です。
違いがあります!それは仮想CPUが物理CPUと同じで変わる
仮想マシンと言ううくらいなので、ゲストOSから見た仮想のハードウェアは全部”仮想”です。
なので、実際の物理ハードウェアが変更されても”何も変わらない”と思われるのですが(それが仮想化のメリットの一つでもありますので)、一点だけ変わる部分があります。
それは、仮想CPUです!
仮想CPUだけは、ゲストOSからそのまま物理CPUが見えている状態になっています。
(他の仮想ハードウェアは”仮想”というオブラートに包まれているのですが、CPUだけは違うんです)
まあ、通常はCPUが変わったくらいでプログラムの動作が変わる事は無いと思うのですが、注意点があります。
注意点は仮想マシンのCPUのCPUID(NX/XDフラグ)
NX/DXフラグとは、簡単に言うと
「データの誤実行を防ぎセキュリティを高めるためのCPUの機能です」
Windows Server 2003時代くらいからCPUに搭載されたはじめ、この機能を使用するか使用しないかオン/オフをBIOSで設定出来ました。
さらに、Windows OSのBoot.iniでも設定出来たりしました。(今現在のWindows Server OS 2008以降ではデフォルト有効とのことです。)
この機能で、CPUの動きは内部的にはかなり代わり、プログラム的には動作がエラーとなる場合があるようです。
参考までに、この機能は
- インテルCPUではXDビット(eXecute Disable)と言われ
- AMDのCPUではNXビット(No eXecute)と言われます
名前は違いますが、動作的には同じ機能です。
もしも旧ハードウェアではNX/XDが無効になっており(そもそも無いとか)、新ハードウェアではNX/DXが有効になっていた場合、仮想マシンにも同じ違いが出るという訳です。
仮想マシンでNX/XDビットを無効にする方法
ゲストOSをシャットダウンして仮想マシンの編集にて作業する必要があります。
ゲストOSがオンラインだとグレーアウトされ設定変更できません。
該当のゲストOSをシャットダウンさせ、「設定の編集」より「仮想ハードウェア」タブを開き
「CPU」を展開し「CPUIDマスク」で「NX/XDフラグをゲストに非表示」を選択し、「OK」ボタンを押します。
これでゲストOSとしてはNX/XDが無効の仮想CPUでプログラムを動作させる事が出来ます