私が実行している(実際にインストールしている)OSがVMWareマシンで実行されているかどうかを確認する方法はありますか?仮想マシンで自動インストールを行う場合はntp
設定を無効にする必要がありますが、ベアメタルにインストールする場合は有効のままにしておきます。
dmidecode
またはlshw
およびgrep
ingを使用することが、調べるための最良の方法のようです。
Linuxは、カーネルが何らかのハイパーバイザーでの実行を検出した場合、hypervisor
フラグを/proc/cpuinfo
に追加します。
Linuxでは、コマンドvirt-what
を使用できます
[root@myhost]# virt-what
vmware
Windows上のLinuxの出力例HyperV
[root@linuxvm11~] # virt-what
hyperv
これは、メーカーと製品名に関する特定の情報を提供するので、私にとってはうまくいきました。
dmidecode -t system|grep 'Manufacturer\|Product'
Dellサーバーでの出力:
Manufacturer: Dell Inc.
Product Name: PowerEdge C5220
Virtualbox VMでの出力:
Manufacturer: innotek GmbH
Product Name: VirtualBox
KVM/QEMUでの出力:
Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)
これは、サーバーをより適切に識別するためにこれらを解析できるスクリプトには最適ですが、インフラストラクチャでChefを使用している場合は、chefサーバーのノード属性Virtualization -> system
を確認できます。
実行:
$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
OS /ホストが仮想化されたホストかどうかを確認する方法が必要な場合は、PerlモジュールSys :: Detect :: Virtualizationとそれを含むスクリプトvirtdetect
を用意するだけです。すべての可能なヒューリスティック/推測検出を行い、検出されたOS環境を報告します。試してみる。
http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect
最良のアイデアは、おそらくハードウェアを見ることでしょう。少なくともVirtualBoxを使用すると、一部のハードウェアデバイスの名前(たとえば、/sys/block/sda/device/model
は「VBOX HARDDISK」と表示されます)。
すべてのマシンがVMwareであるため、それらのいずれかを選択して確認してください。
これらすべての回答が機能する場合とそうでない場合があります。
たとえば、起動ログの詳細がまだリングバッファーにある間はdmesg
に依存できますが、長時間実行されているマシンでは失敗する可能性があります。さらに悪いことに、実行中のハイパーバイザーに関するメッセージがベアメタルOSによってログに記録される可能性があります。その場合、dmesg | grep -i vmware
のような単純なテストは偽陽性を返します。
Dockerでのテストはかなり異なります。 Dockerには独自の/proc/cpuinfo
はありません。代わりに、ホストマシンの情報を渡します。その間、dmidecode
はDockerが認識しない/dev/mem
ディレクトリの読み取りに失敗します。
virt-what
はDockerコンテナーを検出しますが、コンテナー特権の最近の変更に対処するにはパッチを適用する必要があります。 Dockerのテストに到達する前に/proc/1/environ
にアクセスしようとするとクラッシュします。
virt-what
の警告エンプターに注意を払うことが重要です:
ほとんどの場合、このプログラムを使用することは間違っています。代わりに、実際に使用したい特定の機能を検出する必要があります。
私の場合、tonをインストールするチュートリアルを公開すると、結局のところユーザーが欲しくない可能性があります。このテストを使用して、ベアメタルでの実行を拒否します。
[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;
注:OPが質問の本文でVMWareについて具体的に尋ねていることを理解していますが、質問のタイトルは、より一般的なケースを探している多くの読者(私のような)を引き付けます。
私はそれをしました:
hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"
スクリプトに役立ちます
まあ、私がいつも行う最も直感的な方法は:
$ dmesg | grep -i vmware
APICが必要で、仮想マシンの場合は0、物理コンピューターの場合は1を返します。
grep -q VBOX /sys/firmware/acpi/tables/APIC