web-dev-qa-db-ja.com

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

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

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

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

dmidecode -s system-product-name

Vmware Workstation、VirtualBox、KVMを備えたQEMU、ゲストOSとしてUbuntuを備えたスタンドアロン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
    
  • Virtuozzo

    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

参考文献

130
Rahul Patil

コンテナがsystemdを実行している場合:

$ systemd-detect-virt
lxc

KVMたとえば、次を返します:

kvm

そして非仮想化ホスト上:

none

以下も参照してください。

41
starfry

望ましい方法

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 を提供します。数字のみを返します。 0はVMであることを意味し、1は物理システムであることを意味します。

あまり望ましくない方法

KVM=の場合、/proc/scsi/scsiおよびethtoolオプションは次のように表示されます。

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

以下のコマンドを使用して、grep 'ing〜dmesgログ。

$ 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
    
  • Virtuozzo

    # 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
    

参考文献

28
slm

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

著者からの免責事項が好きdo

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

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

スクリプトによって検出されたファクトここにリストされています ですが、エッジの場合に簡単に拡張できます。

16
ewwhite
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; }

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

13
John Kugelman

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
9
Derick

インストールを手伝っている人がfacterを入手したら、次のことができます

facter virtual

Rootアクセスは必要ありません。

Debianホスト上のDebianゲスト:

[user@guest]$ facter virtual
virtualbox

これがXen/KVM/Qemuでどれほどうまく機能するかについては保証できません...

9
Joseph R.

「最近の」Linuxカーネルでは、カーネルがハイパーバイザーを検出し、dmesgで簡単に利用できるメッセージを出力します。これは単にあなたに教えてくれます:

dmesg | grep "Hypervisor detected"

例えば:

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

「最近」の意味については、正式にリリースされたカーネルのバージョンは不明ですが、この機能をコードベースに導入したコミットは2010年5月7日でした。 ここ を参照してください。

7
Russ

systemd-detect-virt

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

systemd-detect-virt

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

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

終了コード

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


3
Owen Pauling

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が示唆しているように)は、より直接的です(ただし、ルートが必要です)。

$ 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
Renan

時にはそれはトリッキーです:)

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
3
jan.polnicky

どうやら仮想化にはいくつかの部分があります-私の場合、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ビットであると教えてくれます)。

他の回答では、実際に役立つ情報は何もありませんでした-facter virtualphysicalを返し、ls -1 /dev/disk/by-id/ata-QEMU_DVD-ROM_QM00003を返しました。これは、QEMUが関与していることを示していますが、アクセスできませんとにかくエミュレートされた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
1
gavenkoa