VMware仮想マシンでは今のところ3種類のNIC(Network Interface Card)のエミュレートができる。
- vlance
- 俗に言うAMD PCnet32 10Mbps 遅い
- e1000
- 俗に言うIntel PRO1000 1000Mbps 速い
- vmxnet
- VMware独自のNIC 1000Mbps相当 速い
vlanceとe1000は、ゲストOSに該当ハードウェア用のドライバが用意されていればそのドライバを利用することが出来る。
ただし、実際のハードウェアと完全な互換を保つ必要があるため、ホストOS(ESXならvmkernel)でのCPU負荷が大きい。ネットワーク負荷に伴って、CPUリソースがどんどん食われる傾向にある。
そこで利用されるのがvmxnetで、これはゲストOS上で専用のデバイスドライバが必要だが、ハードウェアと完全互換を保つ必要がなく、NICとしての必要十分な機能が実装されているもの。完全仮想化に対して、準仮想化(para-virtualization)などと言う。
vmxnetの他にもVGAドライバやマウスドライバに準仮想化ドライバが用意されていて、それらは各ゲストOS用のvmware-toolsに含まれている。
VGAやマウスドライバは、準仮想化ドライバをインストールしない限り、ゲストOSからは基本的な機能しか持たない完全仮想化デバイスとして動作し、準仮想化ドライバをインストールした時点で、準仮想化デバイスとして利用できるようになる。
NICの場合もデフォルトではflexibleと言って、通常はvlanceとして動作し、準仮想化ドライバをインストールするとvmxnet相当の準仮想化デバイスとして動作するようになる。
ただし、Linux等ではvmware-toolsに含まれるvmxnet.ko(準仮想化ドライバ)をinsmodしても、flexibleデバイスがvmxnetとして認識せず、vlanceとしてしか動作しなかったり、デバイスの認識順が変わってしまうなどの問題が出ることがある。
この場合には、NICを固定的に指定することができるが、VMware InfrastructureやVMware ServerではGUIが用意されていない(vSphereやWorkstationは未確認)。
大まかには該当仮想マシンの仮想マシン構成ファイル(拡張子が.vmxのファイル)を更新するのだが、ESXやVirtual Centerのインベントリに追加されている状態では、直接ファイルを編集することができない(ファイルだけ編集してもメモリ上の状態で上書きされてしまう)。
そのため、ESXやVirtual Center管理ならば、一端インベントリから削除して作業を行う必要がある。VMWare Serverならプロセスなりサービスなりを停止してから作業すると良い。
ESXやVirtual Centerのインベントリから削除する方法は二つ。
- 仮想マシンを右クリックして「インベントリから削除」を選択する方法
- 仮想マシンテンプレートに変換する方法
インベントリから削除する場合は誤ってディスクから削除しないこと。仮想マシンテンプレートに変換すると、仮想マシン定義ファイル(拡張子.vmx)は仮想マシンテンプレート定義ファイル(拡張子.vmtx)にリネームされるので注意。
仮想マシン(テンプレート)定義ファイルに追記する内容は以下のとおり。
ethernet0.virtualDev = "vmxnet" ethernet0.virtualDev = "vlance" ethernet0.virtualDev = "e1000"
このいずれかを指定すれば良い。2つめ以降のNICはethernet1,ethernet2…とする。
定義ファイルの編集方法は、ESXでVMFSデータストアならば、service consoleにsshなりコンソールなりでログインすると、/vmfs/volumes/[データストア名]/でデータストアにアクセスできるためそこで編集すれば良い(service consoleのないESXiの手段は不明・・・)。VMware ServerやWorkstationならホストOS上で直接エディタで開いてしまうのが良い。
ESXやVirtual Centerで、編集が終わった後のインベントリへの再追加方法は、そのデータストアを参照できるESXのデータストアアイコンを右クリックして「データストア内を参照」、該当のvmxファイルを探して右クリックし「インベントリに追加」する。元あったクラスタやリソースプールに追加できる。テンプレートから戻す場合には、「仮想マシンおよびテンプレート」のインベントリから、該当のテンプレートを右クリックし「仮想マシンに変換」で良い。同様に元あったクラスタやリソースプールに追加する。テンプレートがインベントリに見つからない場合は、上記vmxと同様にデータストアからインベントリに追加すると良い。
どのNICを利用すべきかは、性能の観点からは間違いなくvmxnetだろう。ただし、LinuxなどのOSの場合、vmxnetはvmware-toolsによってLKM(vmxnet.ko)として提供される。そのため、他のサードパーティ製LKMと同様に、kernelをupdateする度にドライバをそのkernel versionに合ったディレクトリの下に再配置する手間が発生する。
vmware-toolsではvmware-config-tools.plというスクリプトがこのへんの処理もまとめてやってくれるが、いかんせんkernelのupdate直後に(NICのドライバが入っていなくてネットが使えないので)コンソールでログインしてそのスクリプトを実行するというのが面倒な場面がある。台数が増えればかなりめんどくさい作業になるだろう。もし頻繁にkernelのupdateを予定しているのであればe1000ドライバを利用するのも良いアイデアかもしれない(性能もちょっと試して見た感じでは言うほどCPUリソースを食うわけでもなかったが、具体的な数字は失念)。
なお、64bit仮想マシンではNICはe1000固定になる。選択可能なのはあくまで32bit仮想マシンの場合だけだ。