仮想化テクノロジーを決定する簡単な方法


115

Linuxマシンへのコマンドラインアクセスがあり、仮想化されている場合とされていない場合があります。実行している仮想化テクノロジーの種類(VMWare、VirtualBox、KVM、OpenVZ、Xenなど)がある場合、それを判断したいと思います。これは敵対的な環境ではありません。自分自身を偽装しようとしているVMに対して作業しようとするのではなく、ほとんど知らない不安定なサーバーを診断しています。

より正確には、私は誰かが問題を診断するのを手伝っています。私は実権を握っていません。そのため、「このコマンドをコピーして貼り付ける」などの指示を伝える必要があり/procます。理想的には、次のようなものになりますlshw。簡単にインストールできる(プリインストールされていない場合)コマンドは、突っ走り、関連情報を出力します。

このシステムがどの仮想化テクノロジーのゲストであるかを判断する最も簡単な方法は何ですか?提案で、どのテクノロジー(ベアハードウェアを含む)を最終的に検出でき、どのテクノロジーを最終的に削除できるかについて言及していただければ幸いです。私は主にLinuxに興味がありますが、それが他の大学でも機能するなら、それは素晴らしいことです。


回答:


128

dmidecode -s system-product-name

Vmware Workstation、VirtualBox、KVMを含むQEMU、UbuntuをゲストOSとして使用するスタンドアロンQEMUでテストしました。他のユーザーは、使い慣れたプラットフォームを追加しています。

仮想化技術

  • VMwareワークステーション

    root@router:~# dmidecode -s system-product-name
    VMware Virtual Platform
    
  • VirtualBox

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • KVMを使用したQemu

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu(エミュレート)

    root@router:~# dmidecode -s system-product-name
    Bochs
    
  • Microsoft VirtualPC

    root@router:~# dmidecode | egrep -i 'manufacturer|product'
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    
  • ヴィルトゥオッツォ

    root@router:~# dmidecode
    /dev/mem: Permission denied
    
  • Xen

    root@router:~# dmidecode | grep -i domU
    Product Name: HVM domU
    

ベアメタルでは、これはコンピューターまたはマザーボードモデルのIDを返します。

/dev/disk/by-id

実行する権限がない場合は、dmidecode次を使用できます。

仮想化テクノロジー:QEMU

ls -1 /dev/disk/by-id/

出力

[root@host-7-129 ~]# ls -1 /dev/disk/by-id/
ata-QEMU_DVD-ROM_QM00003
ata-QEMU_HARDDISK_QM00001
ata-QEMU_HARDDISK_QM00001-part1
ata-QEMU_HARDDISK_QM00002
ata-QEMU_HARDDISK_QM00002-part1
scsi-SATA_QEMU_HARDDISK_QM00001
scsi-SATA_QEMU_HARDDISK_QM00001-part1
scsi-SATA_QEMU_HARDDISK_QM00002
scsi-SATA_QEMU_HARDDISK_QM00002-part1

参照資料


5
Hyper-Vは、ほとんど役に立たないVirtual Machineを返しますdmidecode -s system-product-name。/ dev / disk / by-idの下にも明らかなものはありません。facterは、lspciの出力を見て、hypervを検出しているようです。
ゾレダチェ

1
VZチェックを開く /proc/user_beancounters
-exussum

/proc/user_beancounters例として、安価なVPSでOpenVZ を超える+1 が考えられます。
erm3nda

Dockerコンテナーでは、両方dmidecode/dev/disk/by-idソリューションが失敗します。unix.stackexchange.com/a/257207/106572
Martin Bramwell

3
qemu 2.5.0(少なくとも)dmidecode -s system-product-nameでは、上記の「KVM」または「Bochs」の代わりに一般的なハードウェア記述を返します。私にとって、この文字列はStandard PC (i440FX + PIIX, 1996)です。 dmidecode -s system-manufacturerはるかに少ない汎用文字列を返しますQEMU。qemuはDMIデータの提供を許可しているので、フィールドが読み取られていても、dmidecodeはだまされやすいと思います。
マーク

38

コンテナが実行されている場合systemd

$ systemd-detect-virt
lxc

たとえば、KVMでは以下を返します。

kvm

および非仮想化ホスト上:

none

こちらもご覧ください:


これはopenvzでも機能します。
lepe

kvmGoogle Compute Engineの出力であり、私が理解しようとしていたものです。ありがとう!
16年

Ubuntu 18.04でチャームのように機能するシンプルなコマンド!どうもありがとう:)
develCuy

28

望ましい方法

lshw

このコマンドは、さまざまなVMテクノロジーゲストで次の出力を生成します。

$ sudo lshw -class system

出力

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • バーチャルボックス

    fedora17                  
        description: Computer
        product: VirtualBox ()
        vendor: innotek GmbH
        version: 1.2
        serial: 0
        width: 64 bits
        capabilities: smbios-2.5 dmi-2.5 vsyscall32
    
  • VMWare

    partedmagic
        description: Computer
        product: VMware Virtual Platform ()
        vendor: VMware, Inc.
        version: None
        serial: VMware-56 4d 94 a0 53 e3 f3 c6-f9 a6 eb 1a 89 70 04 57
        width: 32 bits
        capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp
    

スクリプティング

Ubuntu / Debianを使用している場合は、パッケージopen-vm-toolsをインストールできます。提供しますvmware-checkvm。数字のみを返します。Aは0、それはVMの意味1、それは物理的なシステムを意味します。

あまり望ましくない方法

KVMの場合/proc/scsi/scsiethtoolオプションとオプションは次のように表示されます。

SCSI

$ cat /proc/scsi/scsi 
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: QEMU     Model: QEMU DVD-ROM     Rev: 0.9.
  Type:   CD-ROM                           ANSI  SCSI revision: 05

ethtool

$ ethtool -i eth0
driver: virtio_net
version: 
firmware-version: 
bus-info: virtio0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

virtio_netはKVMの一部です。/proc/scsi/scsiあなたがVMにいること、そしてあなたが最も可能性の高いKVMをしていることを示しています。

dmesg

以下のコマンドを使用しgrepdmesgログを記録します。

$ sudo dmesg | grep -i virtual
  • VMWare

    VMware vmxnet virtual NIC driver
     Vendor: VMware    Model: Virtual disk      Rev: 1.0 
    hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
    
  • QEmuまたはKVM

    "-cpu host"オプションが使用されていない場合、QEmuおよびKVMは次のように識別します。

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    そうでない場合、ホストのCPU情報はdmesg、またはの両方で使用され/proc/cpuinfoます。ただし、次のようなものが表示されるはずです。

    [    0.000000] Booting paravirtualized kernel on KVM
    

    準仮想化で実行されていることを理解している新しいカーネル。

  • Microsoft VirtualPC

    hda: Virtual HD, ATA DISK drive
    hdc: Virtual CD, ATAPI CD/DVD-ROM drive
    
  • Xen

    $ sudo dmesg | grep -i xen
    Xen virtual console successfully installed as tty1
    
  • ヴィルトゥオッツォ

    # method #1
    $ sudo dmesg
    (returns no output)
    
    # method #2
    $ sudo cat /var/log/dmesg
    (returns no output)
    
    # method #3
    $ sudo ls -al /proc/vz
    veinfo  veinfo_redir  veredir  vestat  vzaquota  vzdata
    

参照資料


この種のドライバーを突くのは避けたいと思ったものです。VMテクノロジーごとに異なり、設定によって異なります。報告された製品名lshw -class systemとはdmidecode、私が見つけることを望んでいたまさにです。
ジル

@Gilles-はい、実際に使用するつもりはありませんでした。メソッドをキャプチャするためだけです。lshwこれらのプラットフォームの出力を確認するために、Virtual BoxとVMWareインスタンスを今すぐ起動しています。私に数分を与えると私はA.を更新します
SLM

@Gilles-lshwはすべてのテクノロジーに対して同様に仕事をすることができるようです。他の人がそれらを過ぎてスキップする必要がないように、あなたが探していたものではなかった答えを答えの一番下に移動しました。
slm

dmesgは、固定サイズのリングバッファをあらゆる種類のもので満たします。このタスクにはまったく不適切です。unix.stackexchange.com/a/257207/106572
Martin Bramwell

@Martin-それが、私の答えのあまり望ましくないセクションにある理由です。私は通常、包括的でさまざまな方法を示す回答を書きます。
slm

16

virt-whatスクリプトはうまくほとんどのケースをカバーしているようです...

著者からの免責事項好きです

ほとんどの場合、このプログラムを使用するのは間違っています。代わりに、実際に使用したい特定の機能を検出する必要があります。

過去数年間、デフォルトのインストールの一部として、私のEL5およびEL6システムに登場しました。Ubuntuにはそれがあり、ソースも利用可能です。

事実スクリプトによって検出はされてここに記載されているが、簡単にエッジケースのために拡張することができます。


リンク?どのシステムを認識しますか?
ジル14年

1
@Gilles編集:ただし、スクリプトは通常、KVM、Xen、QEMU、VirtualBox、Parallels、OpenVZ、IBM System Z、LPAR、z / VM、Hitachi Virtage、VMWare、Microsoft Hyper-Vを検出します。うーん... LXCを含めるべきですか?
ewwhite 14年

LXCは現在含まれています。
ewwhite

2016年1月の時点で、Dockerで失敗します。参照してくださいunix.stackexchange.com/a/257207/106572
マーティン・ブラムウェルに

13
isVMware() { [[ $(dmidecode -s system-manufacturer) = 'VMware, Inc.' ]]; }
isXen   () { [[ $(dmidecode -s system-manufacturer) = 'Xen'          ]]; }
isKVM   () { [[ $(dmidecode -s system-product-name) = 'KVM'          ]]; }
isVBox  () { [[ $(dmidecode -s system-product-name) = 'VirtualBox'   ]]; }
isVM    () { isVMware || isXen || isKVM || isVBox; }

これらは私たちの会社で使用しているテストです。


9

facterあなたがインストールを手伝っている人を取得した場合、あなたは行うことができます

facter virtual

ルートアクセスは必要ありません。

Debianホスト上のDebianゲスト:

[user@guest]$ facter virtual
virtualbox

これがXen / KVM / Qemuでどれだけうまく機能するかを保証できません...


8

hostnamectlあなたの友達です(必須systemd)。

いくつかの例:

仮想化なしのラップトップ

$ hostnamectl status
   Static hostname: earth.gangs.net
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 18a0752e1ccbeef09da51ad17fab1f1b
           Boot ID: beefdc99969e4a4a8525ff842b383c62
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 4.4.0-66-generic
      Architecture: x86-64

Xen

$ hostnamectl status
   Static hostname: pluto.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beef39aebbf8ba220ed0438b54497609
           Boot ID: beefc71e97ed48dbb436a470fe1920e1
    Virtualization: xen
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 3.13.0-37-generic
      Architecture: x86-64

OpenVZ

$ hostnamectl status
   Static hostname: mars.gangs.net
         Icon name: computer-container
           Chassis: container
        Machine ID: 55296cb0566a4aaca10b8e3a4b28beef
           Boot ID: 1bb259b0eb064d9eb8a22d112211beef
    Virtualization: openvz
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 2.6.32-042stab120.16
      Architecture: x86-64

KVM

$ hostnamectl status
   Static hostname: mercury.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beeffefc50ae499881b024c25895ec86
           Boot ID: beef9c7662a240b3b3b04cef3d1518f0
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-514.10.2.el7.x86_64
      Architecture: x86-64

OSは、仮想マシン内で実行されているかどうかをどのように判断しますか?すべきではない、コマンドラインから非常に基本的なdebianをVirtualization: oracleインストールし、準仮想化をインストールしていないにもかかわらず、hostnamectlが表示される Virtualboxゲストの追加
イヴァンジーニョ

7

「最近の」Linuxカーネルでは、カーネルがハイパーバイザーを検出し、で簡単に入手できるメッセージを出力しますdmesg。これにより、次のことがわかります。

dmesg | grep "Hypervisor detected"

例えば:

$ dmesg | grep "Hypervisor detected"
Hypervisor detected: VMware

「最近」の意味については、どのカーネルバージョンが公式にリリースされたかはわかりませんが、この機能をコードベースに導入したコミットは2010年5月7日でした。こちらを参照してください


dmesg固定サイズのリングバッファをあらゆる種類のもので満たします。このタスクにはまったく不適切です。unix.stackexchange.com/a/257207/106572
Martin Bramwell

3

VirtualBoxの場合、次のようlspci | grep -i virtualboxになります。

$ lspci | grep -i virtualbox
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service

または、dmidecode -s system-product-name(@ Rahul Patilが示唆しているように)ポイントにさらに直接的です(ただし、rootが必要です):

$ sudo dmidecode -s system-product-name
VirtualBox

非KVM QEMUの場合、dmidecode -s system-product-name紛らわしいBochsのを返しますが、dmesg | grep -i qemu(QEMUは通常の名前を持っているエミュレートストレージデバイス働きQEMU HARDDISKQEMU DVD-ROM...など)。


3

時々それは難しいです:)

root@server:~# dmidecode -s system-product-name
Bochs

root@server:~# dmidecode | egrep -i 'manufacturer|product|vendor'
        Vendor: Bochs
        Manufacturer: Bochs
        Product Name: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs

root@server:~# virt-what
root@server:~# dpkg -l |grep virt-what
ii  virt-what                           1.2-1                        detect if we are running in a virtual machine

root@server:~# egrep -i 'virtual|vbox' /var/log/dmesg
[    0.000000] Booting paravirtualized kernel on KVM
[    0.385701] input: Macintosh mouse button emulation as /devices/virtual/input/input0

2

systemd-detect-virt

これにより、使用されている仮想化テクノロジーのタイプが検出され、出力されます。

systemd-detect-virt

マシンの仮想化とコンテナーの仮想化の区別

--containerおよび--vmオプションを使用して、検出される仮想化のタイプを制限します。

終了コード

仮想化が検出されたかどうかを詳細なしで知りたい場合は、終了コードを確認する方が簡単です。仮想化が検出された場合は終了コード0を返し、そうでない場合はゼロ以外を返します。



1

どうやら仮想化にはいくつかの部分があります-私の場合、QEMU、Bochs、KVM(Ubuntu 14.04)です。使用中のハイパーバイザーを見つける最も簡単な方法は次のとおりです。

sudo apt-get install virt-what
sudo virt-what

私の場合、kvmこれは私が探している基本情報である(私が思うOPでもあります)、それは私ができることを教えてくれるので(たとえば、ipsetを実行してDDoS攻撃をブロックする)、リソースがVM間で共有される方法。

さらに試した

sudo dmidecode -s system-product-name

そして

sudo lshw -class system

どちらもKVMに言及していませんが、彼らは両方とも私のハードウェアエミュレーションが提供されBochsたことを知らせてくれたので、聞いたことすらありませんでしたが、簡単な検索で興味深い情報が見つかりましたhttp://en.wikipedia.org/wiki/ Bochs)。lshwコマンドは、dmidecodeよりも少し情報が豊富です(たとえば、64ビットだと教えてくれます)。

他の答えは本当に有用なことを私に教えてくれませんでした-QEMUが関与していることを示すfacter virtualだけで戻っphysicalls -1 /dev/disk/by-id/きましata-QEMU_DVD-ROM_QM00003たが、とにかくエミュレートされたDVD-ROMにアクセスできません。


1

Debianには、仮想化タイプを検出するための次の小さなパッケージが付属しています。

$ sudo apt-get install virt-what
$ virt-what

Perlの依存関係のため、少し大きくなっています。

$ sudo apt-get install imvirt
$ imvirt

通常どおり実行:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo

あなたは私を打ち負かしました、そして、私は美徳-何を知りませんでした。あなたの投稿を改善するための以前の回答として、両方の出力を詳しく説明しますか?
ルイFリベイロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.