自然の赴くままに・そのときの 気分次第で・なんとなく

興味を持ったことを、なんとなく気の向くまま書いています。

VMware Workstation Pro 17 の中身を見る : ゲスト OS 識別編

本記事は、「vExperts Advent Calendar 2022」の最終日用として書いた記事です。
2022年の年の瀬も迫ってきていろいろと忙しくなる時期ですが、そんなときに限って好きなことや興味を持ったことをいろいろと調べ Dive deep したりしてしまいます。
昨年は

imaisato.hatenablog.jp

こんなことを、その前の年は

imaisato.hatenablog.jp

なことをやっていましたが、今年は日本で二人、社員さんを除けば唯一の「vExpert Desktop Hypervisor

vExpert Desktop Hypervisor

にもなったことだし、2年連続の ESXi Arm Edition からはなれて Desktop Hypervisor ネタで締めようと思います。ESXi Arm Edition は最新 version 1.11 になっていますが、vSphere 8 も出てきているのに vSphere 7 ベースのままなので、もうちょっと進化するまでちょっと待ち状態にしています。
ということで、今年は VMware Workstation Pro 17 の中身を見るというテーマで記事を書いてみます。

VMware Workstation Pro 17 とは

2022年11月17日、実際には2022年11月18日に公開された VMware Workstation 16 の後継です。

VMware Workstation Pro 17


この記事執筆の時点の最新版は
VMware-workstation-full-17.0.0-20800274.exe で、以下のページからダウンロードができます。

www.vmware.com

このバージョンの詳細は以下の記事に書いていますのでそちらを参照してください。

imaisato.hatenablog.jp

VMware Workstation Pro 17 の中身を見る」とは

私自身 VMware 創業時から VMware Workstation を使い続けていて、新しいバージョンが出るたびにいろいろな機能が追加されていくということと、それに伴って vmx ファイルに記述されるパラメーターが増えているのがずっと気になっていました。これ、プログラムの中でどのように読み取っているのかなと。また、それぞれのパラメーターの設定はどんなのがあるのかなということも気になっていて、いろいろな情報をあさってみたのですがなかなか細かく書かれてるものにたどり着けません。いくつかの情報は以下のようなサイトに書かれているのですが最新のものは見当たらない。

今年の春に IT 仕事はいったん引退した時点で暇な時間ができたので vmx ファイルを紐解こうと始めたのですが、如何せん調べる範囲が多すぎてなかなかまとめることができません。なので、情報として見つけられたものから徐々にブログに記事として書いていこうと始めたのが今回から始める「VMware Workstation Pro 17 の中身を見る」になります。

この「VMware Workstation Pro 17 の中身を見る」の流れの一部にもなりますが、上に紹介した以前書いた記事を参考に見ていただくと、どのようなことを調べて書いていきたいかが見えてくると思います。

VMware Workstation Pro 17 でゲスト OS を識別するには

VMware Workstation Pro 17 の vmx ファイルには「guestOS」というパラメータがあります。これには以下のように = の後ろに仮想マシンで動作させるゲスト OS を記述します。

guestOS = "windows11-64"

このゲスト OS はどのようなものがあるかは先の記事VMware Workstation 17 Pro 17.0.0 Build 20800274 登場の中の「VMware Workstation 17 Proで利用できるゲスト OS は?」に記述してあります。そして仮想マシンを作成する際に「ゲスト OS の選択」で適切なものを選択されるだけで自動的に設定されます。

ゲスト OS の選択

そして、この「ゲスト OS の選択」は適当なものを選んでも仮想マシンを作成することが出来、また起動することもできてしまいます。これ、何の役に立っているのと疑問に思ったりしながら「Windows 11 無いけれど Windows 10で作っちゃえ」とかやっていたと思います。しかし、VMware Workstation Pro 17 の内部ではこの設定を読み取って設定された ゲスト OS 特有の機能がある場合はそれを動かすようになっています。このゲスト OS の文字列をいちいちプログラムの中で評価していたらそれは大変なので実際には 16進のコードが割り当てられています。VMware Workstation Pro 17 に設定されているコードは以下の通りです。

ゲスト OS

ゲスト OS ID

almaLinux-64 

 0x5030

amazonlinux2-64

 0x5083

amazonlinux3-64

 0x5084

arm-almaLinux-64

 0x5031

arm-debian10-64

 0x503D

arm-debian11-64

 0x503D

arm-debian12-64

 0x503D

arm-Fedora-64

 0x5031

arm-freeBSD13-64

 0x504A

arm-freeBSD14-64

 0x504D

arm-other-64

 0x5037

arm-other5xlinux-64

 0x5031

arm-other6xlinux-64

 0x5034

arm-rhel9-64

 0x5041

arm-rockyLinux-64

 0x5031

arm-ubuntu-64

 0x5031

arm-vmkernel7

 0x5070

arm-vmkernel8

 0x5072

arm-vmware-photon-64

 0x5074

arm-windows10-64

 0x5016

arm-windows11-64

 0x5018

arm-windows12-64

 0x501A

asianux3

 0x5029

asianux3-64

 0x502A

asianux4

 0x5029

asianux4-64

 0x502A

asianux5-64

 0x502C

asianux7-64

 0x502C

asianux8-64

 0x502C

asianux9-64

 0x5030

centos

 0x507C

centos-64

 0x507D

centos6

 0x507E

centos6-64

 0x507F

centos7-64

 0x5080

centos8-64

 0x5081

centos9-64

 0x5082

coreos-64

 0x502C

CRXPod1-64

 0x5086

CRXSys1-64

 0x5085

darwin

 0x5054

darwin-64

 0x5055

darwin10

 0x5056

darwin10-64

 0x5057

darwin11

 0x5058

darwin11-64

 0x5059

darwin12-64

 0x505A

darwin13-64

 0x505B

darwin14-64

 0x505C

darwin15-64

 0x505D

darwin16-64

 0x505E

darwin17-64

 0x505F

darwin18-64

 0x5060

darwin19-64

 0x5061

darwin20-64

 0x5062

darwin21-64

 0x5063

darwin22-64

 0x5064

darwin23-64

 0x5065

debian10

 0x503B

debian10-64

 0x503C

debian11

 0x503B

debian11-64

 0x503C

debian12

 0x503B

debian12-64

 0x503C

debian4

 0x503B

debian4-64

 0x503C

debian5

 0x503B

debian5-64

 0x503C

debian6

 0x503B

debian6-64

 0x503C

debian7

 0x503B

debian7-64

 0x503C

debian8

 0x503B

debian8-64

 0x503C

debian9

 0x503B

debian9-64

 0x503C

dos

 0x5001

eComStation

 0x5023

eComStation2

 0x5024

Fedora

 0x5029

Fedora-64

 0x502A

flatcar-64

 0x5030

freeBSD

 0x5042

freeBSD-64

 0x5043

freeBSD11

 0x5044

freeBSD11-64

 0x5045

freeBSD12

 0x5046

freeBSD12-64

 0x5047

freeBSD13

 0x5048

freeBSD13-64

 0x5049

freeBSD14

 0x504B

freeBSD14-64

 0x504C

linux

 0x5025

linuxMint-64

 0x5087

longhorn

 0x500C

longhorn-64

 0x500D

mandrake

 0x5029

mandrake-64

 0x502A

mandriva

 0x5029

mandriva-64

 0x502A

netware4

 0x5068

netware5

 0x5069

netware6

 0x506A

nld9

 0x5029

nt4

 0x5006

oes

 0x5029

openserver5

 0x5066

openserver6

 0x5066

opensuse

 0x5029

opensuse-64

 0x502A

oraclelinux

 0x5075

oraclelinux-64

 0x5076

oraclelinux6

 0x5077

oraclelinux6-64

 0x5078

oraclelinux7-64

 0x5079

oraclelinux8-64

 0x507A

oraclelinux9-64

 0x507B

os2

 0x5022

os2experimental

 0x5022

other

 0x5035

other-64

 0x5036

other24xlinux

 0x5027

other24xlinux-64

 0x5028

other26xlinux

 0x5029

other26xlinux-64

 0x502A

other3xlinux

 0x502B

other3xlinux-64

 0x502C

other4xlinux

 0x502D

other4xlinux-64

 0x502E

other5xlinux

 0x502F

other5xlinux-64

 0x5030

other6xlinux

 0x5032

other6xlinux-64

 0x5033

otherlinux

 0x5035

otherlinux-64

 0x5036

redhat

 0x5029

rhel2

 0x5027

rhel3

 0x5027

rhel3-64

 0x5028

rhel4

 0x5029

rhel4-64

 0x502A

rhel5

 0x5029

rhel5-64

 0x502A

rhel6

 0x503E

rhel6-64

 0x503F

rhel7

 0x503E

rhel7-64

 0x503F

rhel8-64

 0x503F

rhel9-64

 0x5040

rockyLinux-64

 0x5030

sjds

 0x5027

sles

 0x5029

sles-64

 0x502A

sles10

 0x5029

sles10-64

 0x502A

sles11

 0x5029

sles11-64

 0x502A

sles12

 0x5029

sles12-64

 0x502A

sles15-64

 0x502C

sles16-64

 0x5030

solaris10

 0x5051

solaris10-64

 0x5052

solaris11-64

 0x5053

solaris6

 0x504E

solaris7

 0x504E

solaris8

 0x504F

solaris9

 0x5050

suse

 0x5029

suse-64

 0x502A

turbolinux

 0x5029

turbolinux-64

 0x502A

ubuntu

 0x5038

ubuntu-64

 0x502A

unixware7

 0x5067

vmkernel

 0x506B

vmkernel5

 0x506C

vmkernel6

 0x506D

vmkernel65

 0x506E

vmkernel7

 0x506F

vmkernel8

 0x5071

vmware-photon-64

 0x5073

whistler

 0x5008

win2000

 0x5007

win2000AdvServ

 0x5007

win2000Pro

 0x5007

win2000Serv

 0x5007

win31

 0x5002

win95

 0x5003

win98

 0x5004

windows11-64

 0x5017

windows12-64

 0x5019

windows2019srv-64

 0x501E

windows2019srvNext-64

 0x501F

windows2022srvNext-64

 0x5020

windows7

 0x5010

windows7-64

 0x5011

windows7srv-64

 0x501B

windows8

 0x5012

windows8-64

 0x5013

windows8srv-64

 0x501C

windows9

 0x5014

windows9-64

 0x5015

windows9srv-64

 0x501D

winHyperV

 0x5021

winMe

 0x5005

winNetBusiness

 0x500A

winNetDatacenter

 0x500A

winNetDatacenter-64

 0x500B

winNetEnterprise

 0x500A

winNetEnterprise-64

 0x500B

winNetStandard

 0x500A

winNetStandard-64

 0x500B

winNetWeb

 0x500A

winNT

 0x5006

winServer2008Cluster-32

 0x500C

winServer2008Cluster-64

 0x500D

winServer2008Datacenter-32

 0x500C

winServer2008Datacenter-64

 0x500D

winServer2008DatacenterCore-32

 0x500C

winServer2008DatacenterCore-64

 0x500D

winServer2008Enterprise-32

 0x500C

winServer2008Enterprise-64

 0x500D

winServer2008EnterpriseCore-32

 0x500C

winServer2008EnterpriseCore-64

 0x500D

winServer2008SmallBusiness-32

 0x500C

winServer2008SmallBusiness-64

 0x500D

winServer2008SmallBusinessPremium-32

 0x500C

winServer2008SmallBusinessPremium-64

 0x500D

winServer2008Standard-32

 0x500C

winServer2008Standard-64

 0x500D

winServer2008StandardCore-32

 0x500C

winServer2008StandardCore-64

 0x500D

winServer2008Web-32

 0x500C

winServer2008Web-64

 0x500D

winVista

 0x500E

winVista-64

 0x500F

winXPHome

 0x5008

winXPPro

 0x5008

winXPPro-64

 0x5009

ちなみにこのリストを ゲスト OS ID 順に並べると

ゲスト OS ID

ゲスト OS

 0x5001 dos
 0x5002 win31
 0x5003 win95
 0x5004 win98
 0x5005 winMe
 0x5006 nt4
 0x5006 winNT
 0x5007 win2000
 0x5007 win2000AdvServ
 0x5007 win2000Pro
 0x5007 win2000Serv
 0x5008 whistler
 0x5008 winXPHome
 0x5008 winXPPro
 0x5009 winXPPro-64
 0x500A winNetBusiness
 0x500A winNetDatacenter
 0x500A winNetEnterprise
 0x500A winNetStandard
 0x500A winNetWeb
 0x500B winNetDatacenter-64
 0x500B winNetEnterprise-64
 0x500B winNetStandard-64
 0x500C longhorn
 0x500C winServer2008Cluster-32
 0x500C winServer2008Datacenter-32
 0x500C winServer2008DatacenterCore-32
 0x500C winServer2008Enterprise-32
 0x500C winServer2008EnterpriseCore-32
 0x500C winServer2008SmallBusiness-32
 0x500C winServer2008SmallBusinessPremium-32
 0x500C winServer2008Standard-32
 0x500C winServer2008StandardCore-32
 0x500C winServer2008Web-32
 0x500D longhorn-64
 0x500D winServer2008Cluster-64
 0x500D winServer2008Datacenter-64
 0x500D winServer2008DatacenterCore-64
 0x500D winServer2008Enterprise-64
 0x500D winServer2008EnterpriseCore-64
 0x500D winServer2008SmallBusiness-64
 0x500D winServer2008SmallBusinessPremium-64
 0x500D winServer2008Standard-64
 0x500D winServer2008StandardCore-64
 0x500D winServer2008Web-64
 0x500E winVista
 0x500F winVista-64
 0x5010 windows7
 0x5011 windows7-64
 0x5012 windows8
 0x5013 windows8-64
 0x5014 windows9
 0x5015 windows9-64
 0x5016 arm-windows10-64
 0x5017 windows11-64
 0x5018 arm-windows11-64
 0x5019 windows12-64
 0x501A arm-windows12-64
 0x501B windows7srv-64
 0x501C windows8srv-64
 0x501D windows9srv-64
 0x501E windows2019srv-64
 0x501F windows2019srvNext-64
 0x5020 windows2022srvNext-64
 0x5021 winHyperV
 0x5022 os2
 0x5022 os2experimental
 0x5023 eComStation
 0x5024 eComStation2
 0x5025 linux
 0x5027 other24xlinux
 0x5027 rhel2
 0x5027 rhel3
 0x5027 sjds
 0x5028 other24xlinux-64
 0x5028 rhel3-64
 0x5029 asianux3
 0x5029 asianux4
 0x5029 Fedora
 0x5029 mandrake
 0x5029 mandriva
 0x5029 nld9
 0x5029 oes
 0x5029 opensuse
 0x5029 other26xlinux
 0x5029 redhat
 0x5029 rhel4
 0x5029 rhel5
 0x5029 sles
 0x5029 sles10
 0x5029 sles11
 0x5029 sles12
 0x5029 suse
 0x5029 turbolinux
 0x502A asianux3-64
 0x502A asianux4-64
 0x502A Fedora-64
 0x502A mandrake-64
 0x502A mandriva-64
 0x502A opensuse-64
 0x502A other26xlinux-64
 0x502A rhel4-64
 0x502A rhel5-64
 0x502A sles10-64
 0x502A sles11-64
 0x502A sles12-64
 0x502A sles-64
 0x502A suse-64
 0x502A turbolinux-64
 0x502A ubuntu-64
 0x502B other3xlinux
 0x502C asianux5-64
 0x502C asianux7-64
 0x502C asianux8-64
 0x502C coreos-64
 0x502C other3xlinux-64
 0x502C sles15-64
 0x502D other4xlinux
 0x502E other4xlinux-64
 0x502F other5xlinux
 0x5030 almaLinux-64 
 0x5030 asianux9-64
 0x5030 flatcar-64
 0x5030 other5xlinux-64
 0x5030 rockyLinux-64
 0x5030 sles16-64
 0x5031 arm-almaLinux-64
 0x5031 arm-Fedora-64
 0x5031 arm-other5xlinux-64
 0x5031 arm-rockyLinux-64
 0x5031 arm-ubuntu-64
 0x5032 other6xlinux
 0x5033 other6xlinux-64
 0x5034 arm-other6xlinux-64
 0x5035 other
 0x5035 otherlinux
 0x5036 other-64
 0x5036 otherlinux-64
 0x5037 arm-other-64
 0x5038 ubuntu
 0x503B debian10
 0x503B debian11
 0x503B debian12
 0x503B debian4
 0x503B debian5
 0x503B debian6
 0x503B debian7
 0x503B debian8
 0x503B debian9
 0x503C debian10-64
 0x503C debian11-64
 0x503C debian12-64
 0x503C debian4-64
 0x503C debian5-64
 0x503C debian6-64
 0x503C debian7-64
 0x503C debian8-64
 0x503C debian9-64
 0x503D arm-debian10-64
 0x503D arm-debian11-64
 0x503D arm-debian12-64
 0x503E rhel6
 0x503E rhel7
 0x503F rhel6-64
 0x503F rhel7-64
 0x503F rhel8-64
 0x5040 rhel9-64
 0x5041 arm-rhel9-64
 0x5042 freeBSD
 0x5043 freeBSD-64
 0x5044 freeBSD11
 0x5045 freeBSD11-64
 0x5046 freeBSD12
 0x5047 freeBSD12-64
 0x5048 freeBSD13
 0x5049 freeBSD13-64
 0x504A arm-freeBSD13-64
 0x504B freeBSD14
 0x504C freeBSD14-64
 0x504D arm-freeBSD14-64
 0x504E solaris6
 0x504E solaris7
 0x504F solaris8
 0x5050 solaris9
 0x5051 solaris10
 0x5052  
 0x5053 solaris11-64
 0x5054 darwin
 0x5055 darwin-64
 0x5056 darwin10
 0x5057 darwin10-64
 0x5058 darwin11
 0x5059 darwin11-64
 0x505A darwin12-64
 0x505B darwin13-64
 0x505C darwin14-64
 0x505D darwin15-64
 0x505E darwin16-64
 0x505F darwin17-64
 0x5060 darwin18-64
 0x5061 darwin19-64
 0x5062 darwin20-64
 0x5063 darwin21-64
 0x5064 darwin22-64
 0x5065 darwin23-64
 0x5066 openserver5
 0x5066 openserver6
 0x5067 unixware7
 0x5068 netware4
 0x5069 netware5
 0x506A netware6
 0x506B vmkernel
 0x506C vmkernel5
 0x506D vmkernel6
 0x506E vmkernel65
 0x506F vmkernel7
 0x5070 arm-vmkernel7
 0x5071 vmkernel8
 0x5072 arm-vmkernel8
 0x5073 vmware-photon-64
 0x5074 arm-vmware-photon-64
 0x5075 oraclelinux
 0x5076 oraclelinux-64
 0x5077 oraclelinux6
 0x5078 oraclelinux6-64
 0x5079 oraclelinux7-64
 0x507A oraclelinux8-64
 0x507B oraclelinux9-64
 0x507C centos
 0x507D centos-64
 0x507E centos6
 0x507F centos6-64
 0x5080 centos7-64
 0x5081 centos8-64
 0x5082 centos9-64
 0x5083 amazonlinux2-64
 0x5084 amazonlinux3-64
 0x5085 CRXSys1-64
 0x5086 CRXPod1-64
 0x5087 linuxMint-64

ゲスト OS ID は対象となるゲスト OS のプロダクトに対して値が割り当てられていますが、実は 1 対 1 になっているようでなっていないのがこのゲスト OS ID を見ると分かります。例えば Windows 2000 と付くものはすべて 0x5007で、Windows Server 2008 の 32ビットは 0x500C のようになっています。これらは VMware Workstation Pro 17 の中では同じものとして扱われますが、しかし同じ Windows 名称でも異なる ゲスト OS ID を付与されているものがあり windows 2019 は 2種類 0x501E と 0x501F が使われています。これは現在のバージョンと次の機能追加されたバージョンのように一部変更があった場合に付与されて識別されるようになっていて、例えば 同じな名前でもベースのカーネルが変わったりした場合に識別できるようにしているようです。また逆に別のゲスト OS ID が割り当てられているけれど同じとして扱われるものもいくつかあり、例えば Windows 95, Windows 98 そして Windows ME はすべて Win9x 、arm はゲスト OS が何であっても同じ 0x5031 として扱われています。つまり、ゲスト OS の名前は違っていても基本部分は同じなので別々のものとして処理せずにまとめちゃえという感じです。この ゲスト OS ID は vmx ファイルに記述される guestOS パラメーターにはしっかり意味があることがわかります。例えば仮想マシン作成時のデフォルト設定などに使われ、特にゲスト OS 固有の機能を使う仮想マシンを作る際には適切な値を設定して使うことが重要になります。またこのゲスト OS ID が付与されていないオペレーティングシステムVMware Workstation Pro 17 で動かすことは可能ですが、それらは 0x5000 の ゲスト OS ID が振られて扱われるようになっているようです。

vmx ファイルはどこで読み取られるの?

VMware Workstation Pro 17 が起動される最初のプログラムは、フォルダー C:\Program Files (x86)\VMware\VMware Workstation にある vmware.exe です。このプログラムでは VMware Workstation Pro 17 自体の起動と各種動作に必要なサブプログラムのコントロールなどを行っています。なので、この vmware.exe の中には vmx ファイルにある関する情報は扱いません。vmx ファイルにある情報を扱うのはあくまでもフォルダー C:\Program Files (x86)\VMware\VMware Workstation\x64 にある vmware-vmx.exe 他が行います。このフォルダー内には仮想マシンを起動する際に使用される ROM、仮想インターフェースの ROM などが含まれており、VMware Workstation Pro 17 で仮想マシンを実行する際の重要なファイルが集められています。(Docker などはフォルダー C:\Program Files (x86)\VMware\VMware Workstation\bin に、kvm は C:\Program Files (x86)\VMware\VMware Workstation に含まれていたりしますが、これらはメインではなくて後々に追加されたものなのでバラバラなのか、それとも意図してそこに置いてあるのかはわかりません。)

※これら2つはそれぞれ VMware KVM Mode、VMware Workstation Container という別の機能になりますので別においているのだと考えています。この二つはいずれ記事にしていく予定です。

なんで VMware Workstation Pro 17 の実行ファイルは vmware.exe なの?

これは VMware が創業した際に製品名につけた名前が VMware だった名残でしょう。この辺りは以前の記事に書いてありますのでご興味あればご覧ください。

imaisato.hatenablog.jp

VMwareBroadcom への買収が EU の反トラスト法調査で 2023年5月11日まで延命しました。それでもその合併吸収の後は VMNware という会社名は消滅し VMware というソフトウエア製品群の総称に変わることが発表されています。四半世紀前に創業した際のソフトウエアの名前が VMware、そしてそこから四半世紀後に会社が消滅してソフトウエア製品群の総称になるということは、人の人生で 60歳で還暦を迎え出生時に還りを迎え心機一転というのがありますが、VMware も四半世紀でソフトウエア名に還り心機一転という感じ、今回の件はなんとなくそんな感じに思えてしまいます。
私のこのブログでの VMware ネタ、合併吸収までの間で次回以降どんなネタを書いていくか・・・・・それとも今回で終わりになるかそれ以降も書くかは、これからの VMware の動きや自分の気分次第暇あり次第ということで。。。。。