Cara mudah untuk menentukan teknologi virtualisasi


115

Saya memiliki akses baris perintah ke mesin Linux yang mungkin atau mungkin tidak tervirtualisasi. Saya ingin menentukan jenis teknologi virtualisasi yang dijalankannya, jika ada (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Ini bukan lingkungan yang bermusuhan: Saya tidak mencoba untuk bekerja melawan VM yang mencoba untuk menyamarkan dirinya sendiri, saya mendiagnosis server serpihan yang saya tahu sedikit tentang.

Lebih tepatnya, saya membantu seseorang mendiagnosis masalah ini, saya tidak duduk di belakang. Jadi saya harus menyampaikan instruksi seperti "salin-tempel perintah ini" dan bukan "menyodok di /procsuatu tempat". Idealnya, itu akan menjadi seperti lshw: perintah yang mudah diinstal (jika tidak diinstal) yang melakukan pencarian dan mencetak informasi yang relevan.

Apa cara termudah untuk menentukan teknologi virtualisasi apa yang mungkin dimiliki oleh sistem ini? Saya akan menghargai jika proposal menyebutkan teknologi mana (termasuk perangkat keras) yang dapat dideteksi secara meyakinkan dan yang dapat dihilangkan secara meyakinkan. Saya sebagian besar tertarik pada Linux, tetapi jika itu juga berfungsi untuk unix lain itu bagus.


Jawaban:


128

dmidecode -s system-product-name

Saya telah menguji Vmware Workstation, VirtualBox, QEMU dengan KVM, QEMU mandiri dengan Ubuntu sebagai OS tamu. Yang lain telah menambahkan platform tambahan yang mereka kenal juga.

Teknologi virtualisasi

  • VMware Workstation

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

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • Qemu dengan KVM

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu (ditiru)

    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
    

Pada bare metal, ini mengembalikan identifikasi model komputer atau motherboard.

/dev/disk/by-id

Jika Anda tidak memiliki hak untuk menjalankan, dmidecodeAnda dapat menggunakan:

Teknologi Virtualisasi: QEMU

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

Keluaran

[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

Referensi


5
Hyper-V mengembalikan hampir tidak berharga Virtual Machineuntuk dmidecode -s system-product-name. Tidak ada yang jelas di bawah / dev / disk / by-id. facter muncul untuk mendeteksi hyperv dengan melihat output lspci.
Zoredache

1
Buka cek VZ untuk /proc/user_beancounters
exussum

+1 untuk /proc/user_beancounterslebih dari OpenVZ yang kemungkinan pada VPS murah sebagai contoh.
erm3nda

Keduanya dmidecodedan /dev/disk/by-idsolusi gagal dalam wadah Docker. Lihat unix.stackexchange.com/a/257207/106572
Martin Bramwell

3
dengan qemu 2.5.0 (setidaknya), dmidecode -s system-product-namemengembalikan deskripsi perangkat keras generik alih-alih "KVM" atau "Bochs" yang ditunjukkan di atas. Bagi saya, string ini Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturermengembalikan string yang jauh lebih umum QEMU. Karena qemu memungkinkan data DMI disediakan, saya menduga dmidecode relatif mudah dibodohi - tidak peduli bidang yang sedang dibaca.
Markus

38

Jika wadah berjalan systemd:

$ systemd-detect-virt
lxc

Pada KVM misalnya mengembalikan:

kvm

dan pada host non-virtual:

none

Lihat juga:


Ini berfungsi untuk openvz juga.
lepe

Ini output kvmuntuk Google Compute Engine, yang saya coba cari tahu. Terima kasih!
ambil

Perintah sederhana yang bekerja seperti pesona di Ubuntu 18.04! Terima kasih banyak :)
develCuy

28

Metode yang diinginkan

lih

Perintah ini menghasilkan output berikut pada tamu teknologi VM vairous.

$ sudo lshw -class system

Keluaran

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Kotak Virtual

    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
    

Scripting

Jika Anda menggunakan Ubuntu / Debian ada paket yang open-vm-toolsdapat diinstal. Itu menyediakan vmware-checkvm. Hanya mengembalikan satu digit. A 0berarti itu VM, 1artinya itu sistem fisik.

Metode yang kurang diinginkan

Jika KVM /proc/scsi/scsidan ethtoolopsi muncul sebagai berikut:

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 adalah bagian dari KVM. The /proc/scsi/scsimemberitahu Anda bahwa Anda berada dalam VM, dan bahwa Anda kemungkinan besar KVM.

dmesg

Menggunakan perintah berikut grepmelalui dmesglog.

$ 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 atau KVM

    Jika "-cpu host"opsi belum digunakan, QEmu dan KVM akan mengidentifikasi diri mereka sebagai:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    jika tidak, informasi CPU host akan digunakan baik dalam dmesg, atau dalam /proc/cpuinfo. Namun, Anda harus melihat sesuatu seperti:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Di kernel yang lebih baru, mereka memahami bahwa mereka berjalan di bawah paravirtualization.

  • 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
    

Referensi


Semacam itu menyodok driver adalah apa yang saya harapkan untuk dihindari: itu akan berbeda untuk setiap teknologi VM dan tergantung pada pengaturan. Nama produk dilaporkan oleh lshw -class systemdan dmidecodepersis apa yang saya harapkan.
Gilles

@Gilles - ya saya tidak bermaksud agar Anda benar-benar menggunakannya, hanya untuk menangkap metode. Saya membawa Virtual Box dan instance VMWare sekarang untuk mengkonfirmasi lshwoutput juga untuk platform tersebut. Beri saya beberapa menit dan saya akan memperbarui A.
slm

@Gilles - sepertinya lshw dapat melakukan pekerjaan dengan baik untuk semua teknologi. Saya telah memindahkan jawaban ke bagian bawah jawaban yang bukan yang Anda cari sehingga orang lain tidak perlu melewati mereka.
slm

dmesg mengisi buffer cincin ukuran tetap dengan semua jenis barang. Sama sekali tidak pantas untuk tugas ini. Lihat unix.stackexchange.com/a/257207/106572
Martin Bramwell

@ Martin - dan itulah mengapa ini ada di bagian yang kurang diinginkan dari jawaban saya. Saya biasanya menulis jawaban yang semuanya inklusif, menunjukkan berbagai metode.
slm

16

The virt-whatScript tampaknya untuk menutupi sebagian besar kasus juga ...

Saya lakukan seperti disclaimer dari penulis:

Sebagian besar waktu, menggunakan program ini adalah hal yang salah untuk dilakukan. Alih-alih, Anda harus mendeteksi fitur spesifik yang sebenarnya ingin Anda gunakan.

Itu muncul di sistem EL5 dan EL6 saya selama beberapa tahun terakhir sebagai bagian dari instalasi default. Ubuntu memilikinya, dan sumbernya juga tersedia.

Fakta - fakta yang terdeteksi oleh skrip tercantum di sini , tetapi dapat dengan mudah diperluas untuk kasus tepi.


Tautan? Sistem mana yang dikenali?
Gilles

1
@Gilles Diedit: Tetapi skrip umumnya mendeteksi KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... haruskah LXC dimasukkan?
ewwhite

LXC sudah termasuk sekarang.
ewwhite

Pada Januari 2016, gagal dengan Docker. Lihat unix.stackexchange.com/a/257207/106572
Martin Bramwell

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

Itu adalah tes yang kami gunakan di perusahaan saya.


9

Jika Anda mendapatkan orang yang Anda bantu pasang facter, Anda bisa melakukannya

facter virtual

Tidak diperlukan akses root.

Debian Guest on Tuan rumah Debian:

[user@guest]$ facter virtual
virtualbox

Saya tidak dapat menjamin seberapa baik ini akan bekerja dengan Xen / KVM / Qemu ...


8

hostnamectladalah teman Anda (wajib systemd).

Beberapa contoh:

Laptop tanpa virtualisasi apa pun

$ 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

bagaimana OS menentukan apakah itu berjalan di dalam mesin virtual? seharusnya tidak, saya telah menginstal debian yang sangat mendasar dari command line dan hostnamectl menunjukkan Virtualization: oracleterlepas dari saya belum menginstal paravirtualization | Tambahan tamu Virtualbox
Ivanzinho

7

Di kernel linux "baru-baru ini", kernel mendeteksi hypervisor untuk Anda dan mencetak pesan yang mudah didapat dmesg. Ini hanya akan memberi tahu Anda:

dmesg | grep "Hypervisor detected"

Sebagai contoh:

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

Mengenai apa arti "baru-baru ini", saya tidak jelas versi kernel mana yang secara resmi dirilis, tetapi komit yang memperkenalkan fitur ini dalam basis kode adalah pada 7 Mei 2010. Lihat di sini .


dmesgmengisi buffer cincin ukuran tetap dengan semua jenis barang. Sama sekali tidak pantas untuk tugas ini. Lihat unix.stackexchange.com/a/257207/106572
Martin Bramwell

3

Untuk VirtualBox, Anda bisa lspci | grep -i virtualbox, yang memberikan:

$ 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

Atau, dmidecode -s system-product-name(seperti yang disarankan @Rahul Patil) bahkan lebih langsung ke intinya (tetapi perlu root):

$ sudo dmidecode -s system-product-name
VirtualBox

Untuk QEMU non-KVM, secara dmidecode -s system-product-namemembingungkan mengembalikan Bochs, tetapi dmesg | grep -i qemuberfungsi (perangkat penyimpanan yang ditiru QEMU biasanya memiliki nama QEMU HARDDISK, QEMU DVD-ROMdll ...).


3

Terkadang rumit :)

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

Ini akan mendeteksi jenis teknologi virtualisasi yang digunakan, dan mengeluarkannya.

systemd-detect-virt

Membedakan antara virtualisasi mesin dan virtualisasi wadah

Gunakan opsi --containerdan --vmuntuk membatasi jenis virtualisasi yang terdeteksi.

Kode keluar

Jika Anda hanya ingin tahu apakah virtualisasi terdeteksi atau tidak, tanpa spesifik, maka lebih mudah untuk memeriksa kode keluar. Ini akan mengembalikan kode keluar 0 jika virtualisasi terdeteksi, dan bukan nol sebaliknya.



1

Rupanya virtualisasi datang dalam beberapa bagian - dalam kasus saya QEMU, Bochs dan KVM (kemudian Ubuntu 14.04). Saya menemukan cara termudah untuk menemukan hypervisor yang digunakan adalah:

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

yang dalam kasus saya dikembalikan hanya kvmyang merupakan informasi dasar yang saya cari (juga OP saya pikir), karena itu memberitahu saya apa yang saya boleh lakukan (misalnya menjalankan ipset untuk memblokir serangan DDoS) dan bagaimana sumber daya dibagi antara VMs .

Selain itu saya mencoba

sudo dmidecode -s system-product-name

dan

sudo lshw -class system

tidak ada yang menyebutkan KVM tetapi mereka berdua memberi tahu saya bahwa emulasi perangkat keras saya disediakan oleh Bochsyang saya akui bahkan belum pernah saya dengar, tetapi pencarian cepat menghasilkan informasi yang menarik ( http://en.wikipedia.org/wiki/ Bochs ). Perintah lshw sedikit lebih informatif daripada dmidecode (misalnya mengatakan itu 64-bit).

Jawaban lain tidak benar-benar memberi tahu saya sesuatu yang berguna - facter virtualbaru saja kembali physicaldan ls -1 /dev/disk/by-id/kembali ata-QEMU_DVD-ROM_QM00003yang menunjukkan bahwa QEMU terlibat, tetapi saya tidak memiliki akses ke DVD-ROM yang ditiru.


1

Debian hadir dengan paket kecil ini untuk mendeteksi tipe virtualisasi:

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

dan sedikit lebih besar karena dependensi Perl:

$ sudo apt-get install imvirt
$ imvirt

Seperti biasa dijalankan:

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

Anda memukuli saya sampai mati, dan saya tidak tahu apa-apa. apakah Anda akan merinci output dari keduanya sebagai jawaban sebelumnya untuk meningkatkan posting Anda?
Rui F Ribeiro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.