web-dev-qa-db-ja.com

OSが仮想環境で実行されているかどうかを確認する

私が実行している(実際にインストールしている)OSがVMWareマシンで実行されているかどうかを確認する方法はありますか?仮想マシンで自動インストールを行う場合はntp設定を無効にする必要がありますが、ベアメタルにインストールする場合は有効のままにしておきます。

52
ulve

dmidecodeまたはlshwおよびgrepingを使用することが、調べるための最良の方法のようです。

11
ulve

Linuxは、カーネルが何らかのハイパーバイザーでの実行を検出した場合、hypervisorフラグを/proc/cpuinfoに追加します。

68
Jan Henke

Linuxでは、コマンドvirt-whatを使用できます

[root@myhost]# virt-what
vmware

Windows上のLinuxの出力例HyperV

[root@linuxvm11~] # virt-what
hyperv
26
user66871

これは、メーカーと製品名に関する特定の情報を提供するので、私にとってはうまくいきました。

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を確認できます。

19
OkezieE

実行:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

OS /ホストが仮想化されたホストかどうかを確認する方法が必要な場合は、PerlモジュールSys :: Detect :: Virtualizationとそれを含むスクリプトvirtdetectを用意するだけです。すべての可能なヒューリスティック/推測検出を行い、検出されたOS環境を報告します。試してみる。

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

最良のアイデアは、おそらくハードウェアを見ることでしょう。少なくともVirtualBoxを使用すると、一部のハードウェアデバイスの名前(たとえば、/sys/block/sda/device/modelは「VBOX HARDDISK」と表示されます)。

すべてのマシンがVMwareであるため、それらのいずれかを選択して確認してください。

3
tante

Joanna Rutkowskaの Red Pill を試すことができます。この小さなプログラムは SIDT 命令(x86のみ)を使用してIDTR(割り込み記述子テーブルレジスタ)を調べます。 VMMによって設定が異なります。

3
Bruce Ediger

これらすべての回答が機能する場合とそうでない場合があります。

たとえば、起動ログの詳細がまだリングバッファーにある間は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について具体的に尋ねていることを理解していますが、質問のタイトルは、より一般的なケースを探している多くの読者(私のような)を引き付けます。

2
Martin Bramwell

私はそれをしました:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

スクリプトに役立ちます

まあ、私がいつも行う最も直感的な方法は:

$ dmesg | grep -i vmware

1
Shâu Shắc

APICが必要で、仮想マシンの場合は0、物理コンピューターの場合は1を返します。

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115