Cách dễ dàng để xác định công nghệ ảo hóa


115

Tôi có quyền truy cập dòng lệnh vào máy Linux có thể được ảo hóa. Tôi muốn xác định loại công nghệ ảo hóa nào nó chạy trên, nếu có (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Đây không phải là một môi trường thù địch: Tôi không cố gắng chống lại một VM đang cố gắng ngụy trang, tôi đang chẩn đoán một máy chủ không ổn định mà tôi biết rất ít.

Chính xác hơn, tôi đang giúp ai đó chẩn đoán vấn đề, tôi không ngồi vào vị trí lãnh đạo. Vì vậy, tôi phải truyền đạt các hướng dẫn như sao chép-dán lệnh này và không được chọc vào /procđâu đó. Lý tưởng nhất, nó sẽ là một cái gì đó như lshw: một lệnh dễ cài đặt (nếu không được cài đặt sẵn) để chọc vào và in ra thông tin liên quan.

Cách dễ nhất để xác định công nghệ ảo hóa nào mà hệ thống này có thể là khách của? Tôi đánh giá cao nếu các đề xuất đề cập đến những công nghệ nào (bao gồm cả phần cứng trần) có thể được phát hiện một cách thuyết phục và có thể được loại bỏ một cách thuyết phục. Tôi hầu hết quan tâm đến Linux, nhưng nếu nó cũng hoạt động cho các đơn vị khác thì tốt.


Câu trả lời:


128

dmidecode -s system-product-name

Tôi đã thử nghiệm trên Vmware Workstation, VirtualBox, QEMU với KVM, QEMU độc lập với Ubuntu là hệ điều hành khách. Những người khác đã thêm các nền tảng bổ sung mà họ cũng quen thuộc.

Công nghệ ảo hóa

  • VMware Workstation

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

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

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu (mô phỏng)

    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
    

Trên kim loại trần, điều này trả về một nhận dạng của mô hình máy tính hoặc bo mạch chủ.

/dev/disk/by-id

Nếu bạn không có quyền chạy dmidecodethì bạn có thể sử dụng:

Công nghệ ảo hóa: QEMU

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

Đầu ra

[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

Người giới thiệu


5
Hyper-V trả về một gần vô giá trị Virtual Machinecho dmidecode -s system-product-name. Không có gì rõ ràng dưới / dev / đĩa / by-id cả. facter xuất hiện để phát hiện hyperv bằng cách nhìn vào đầu ra lspci.
Zoredache

1
Mở kiểm tra VZ cho /proc/user_beancounters
exussum

+1 cho /proc/user_beancountershơn OpenVZ có thể là ví dụ trên VPS giá rẻ.
erm3nda

Cả hai dmidecode/dev/disk/by-idgiải pháp đều thất bại trong một container Docker. Xem unix.stackexchange.com/a/257207/106572
Martin Bramwell

3
với qemu 2.5.0 (ít nhất), dmidecode -s system-product-nametrả về mô tả phần cứng chung thay vì "KVM" hoặc "Bochs" được hiển thị ở trên. Đối với tôi, chuỗi này là Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturertrả về chuỗi ít chung chung QEMU. Vì qemu cho phép cung cấp dữ liệu DMI, tôi nghi ngờ dmidecode tương đối dễ bị lừa - bất kể trường được đọc.
Đánh dấu

38

Nếu container đang chạy systemd:

$ systemd-detect-virt
lxc

Trên KVM chẳng hạn, nó trả về:

kvm

và trên một máy chủ không ảo hóa:

none

Xem thêm:


Điều này làm việc cho openvz là tốt.
Lepe

Nó xuất ra kvmcho Google Compute Engine, đó là những gì tôi đã cố gắng tìm ra. Cảm ơn!
snetch

Lệnh đơn giản hoạt động như một bùa mê trên Ubuntu 18.04! Cảm ơn rất nhiều :)
develCuy

28

Phương pháp mong muốn

lshw

Lệnh này tạo đầu ra sau cho khách công nghệ VM có vai.

$ sudo lshw -class system

Đầu ra

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Hộp ảo

    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
    

Viết kịch bản

Nếu bạn đang sử dụng Ubuntu / Debian, gói open-vm-toolscó thể được cài đặt. Nó cung cấp vmware-checkvm. Nó chỉ trả về một chữ số aa. A 0có nghĩa là VM, 1nghĩa là hệ thống vật lý.

Phương pháp ít mong muốn

Nếu đó là KVM, các tùy chọn /proc/scsi/scsiethtoolhiển thị như sau:

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

Ethio_net là một phần của KVM. Thông báo /proc/scsi/scsicho bạn biết rằng bạn đang ở trong máy ảo và rất có thể bạn là KVM.

dmesg

Sử dụng các lệnh sau đây grepthông qua dmesgnhật ký.

$ 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 hoặc KVM

    Nếu "-cpu host"tùy chọn chưa được sử dụng, QEmu và KVM sẽ tự nhận mình là:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    mặt khác, thông tin CPU của máy chủ sẽ được sử dụng cả trong dmesghoặc trong /proc/cpuinfo. Tuy nhiên, bạn sẽ thấy một cái gì đó như:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Trong các hạt nhân mới hơn hiểu rằng chúng đang chạy theo 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
    

Người giới thiệu


Kiểu chọc vào trình điều khiển đó là điều tôi hy vọng tránh: nó sẽ khác với mọi công nghệ VM và phụ thuộc vào cài đặt. Tên sản phẩm được báo cáo bởi lshw -class systemdmidecodechính xác là những gì tôi đã hy vọng tìm thấy.
Gilles

@Gilles - vâng tôi không có ý cho bạn sử dụng chúng thực tế, chỉ để nắm bắt các phương pháp. Tôi hiện đang đưa ra các phiên bản Virtual Box và VMWare để xác nhận lshwđầu ra cho các nền tảng đó. Hãy cho tôi vài phút và tôi sẽ cập nhật A.
slm

@Gilles - có vẻ như lshw có thể thực hiện công việc tốt cho tất cả các công nghệ. Tôi đã chuyển câu trả lời xuống cuối câu trả lời rằng đó không phải là thứ bạn đang tìm kiếm để người khác không phải bỏ qua chúng.
slm

dmesg lấp đầy một bộ đệm vòng kích thước cố định với tất cả các loại công cụ. Nó hoàn toàn không phù hợp cho nhiệm vụ này. Xem unix.stackexchange.com/a/257207/106572
Martin Bramwell

@Martin - và đó là lý do tại sao nó nằm trong phần ít mong muốn hơn trong câu trả lời của tôi. Tôi thường viết câu trả lời bao gồm tất cả, hiển thị nhiều phương pháp.
slm

16

Các virt-whatkịch bản dường như bao gồm hầu hết các trường hợp tốt ...

Tôi làm như khuyến cáo từ các tác giả:

Hầu hết thời gian, sử dụng chương trình này là điều sai lầm để làm. Thay vào đó, bạn nên phát hiện các tính năng cụ thể mà bạn thực sự muốn sử dụng.

Nó xuất hiện trên các hệ thống EL5 và EL6 của tôi trong vài năm qua như là một phần của cài đặt mặc định. Ubuntu có nó, và nguồn cũng có sẵn.

Các sự kiện được phát hiện bởi tập lệnh được liệt kê ở đây , nhưng có thể dễ dàng được mở rộng cho các trường hợp cạnh.


Liên kết? Những hệ thống nào nó nhận ra?
Gilles

1
@Gilles Đã chỉnh sửa: Nhưng tập lệnh thường phát hiện KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... nên bao gồm LXC?
ewwhite

LXC được bao gồm ngay bây giờ.
ewwhite

Kể từ tháng 1 năm 2016, nó đã thất bại với Docker. Xem 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; }

Đó là những bài kiểm tra chúng tôi sử dụng tại công ty của tôi.


9

Nếu bạn nhận được người bạn đang giúp cài đặt facter, bạn có thể làm

facter virtual

Không cần truy cập root.

Debian Guest trên máy chủ Debian:

[user@guest]$ facter virtual
virtualbox

Tôi không thể đảm bảo việc này sẽ hoạt động tốt như thế nào với Xen / KVM / Qemu ...


8

hostnamectllà bạn của bạn (yêu cầu systemd).

Một vài ví dụ:

Laptop không ảo hóa

$ 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

Làm thế nào để hệ điều hành xác định nếu nó đang chạy bên trong một máy ảo? Không nên, tôi đã cài đặt một debian rất cơ bản từ dòng lệnh và hostnamectl hiển thị Virtualization: oraclebất kể tôi chưa cài đặt bất kỳ paravirtualization nào | Bổ sung khách
ảo

7

Trong các nhân linux "gần đây", kernel phát hiện trình ảo hóa cho bạn và in một thông báo có sẵn dễ dàng dmesg. Điều này sẽ cho bạn biết đơn giản:

dmesg | grep "Hypervisor detected"

Ví dụ:

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

Về phần "gần đây" nghĩa là gì, tôi không rõ phiên bản kernel nào được phát hành chính thức, nhưng cam kết giới thiệu tính năng này trong cơ sở mã là vào ngày 7 tháng 5 năm 2010. Xem tại đây .


dmesglấp đầy một vòng đệm kích thước cố định với tất cả các loại công cụ. Nó hoàn toàn không phù hợp cho nhiệm vụ này. Xem unix.stackexchange.com/a/257207/106572
Martin Bramwell

3

Đối với VirtualBox, bạn có thể lspci | grep -i virtualbox, điều đó mang lại:

$ 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

Ngoài ra, dmidecode -s system-product-name(như @Rahul Patil gợi ý) thậm chí còn trực tiếp hơn đến điểm (nhưng cần root):

$ sudo dmidecode -s system-product-name
VirtualBox

Đối với QEMU không KVM, dmidecode -s system-product-nametrả lại Bochs một cách khó hiểu, nhưng dmesg | grep -i qemuhoạt động (các thiết bị lưu trữ mà QEMU mô phỏng thường có tên QEMU HARDDISK, QEMU DVD-ROMv.v ...).


3

Đôi khi thật khó khăn :)

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-dò-đức

Điều này sẽ phát hiện loại công nghệ ảo hóa được sử dụng và xuất ra nó.

systemd-detect-virt

Phân biệt giữa ảo hóa máy và ảo hóa container

Sử dụng --container--vmcác tùy chọn để giới hạn loại ảo hóa được phát hiện.

Mã thoát

Nếu bạn chỉ muốn biết liệu ảo hóa có được phát hiện hay không, không có thông tin cụ thể, thì việc kiểm tra mã thoát sẽ dễ dàng hơn. Nó sẽ trả về mã thoát 0 nếu ảo hóa được phát hiện và khác không.



1

Rõ ràng ảo hóa có nhiều phần - trong trường hợp của tôi là QEMU, Bochs và KVM (sau đó là Ubuntu 14.04). Tôi tìm thấy cách dễ nhất để khám phá các trình ảo hóa đang sử dụng là:

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

trong trường hợp của tôi trả về đơn giản kvmđó là thông tin cơ bản mà tôi đang tìm kiếm (cũng là OP tôi nghĩ), vì nó cho tôi biết những gì tôi được phép làm (ví dụ: chạy ipset để chặn cuộc tấn công DDoS) và cách chia sẻ tài nguyên giữa các VM .

Ngoài ra tôi đã thử

sudo dmidecode -s system-product-name

sudo lshw -class system

không ai trong số đó đề cập đến KVM nhưng cả hai đều thông báo cho tôi rằng việc mô phỏng phần cứng của tôi được cung cấp Bochsmà tôi thú nhận rằng tôi thậm chí chưa từng nghe nói, nhưng một tìm kiếm nhanh đã đưa ra thông tin thú vị ( http://en.wikipedia.org/wiki/ Thuyền ). Lệnh lshw có nhiều thông tin hơn một chút so với dmidecode (ví dụ: cho tôi biết đó là 64-bit).

Các câu trả lời khác không thực sự cho tôi biết bất cứ điều gì hữu ích - facter virtualchỉ cần trả lại physicalls -1 /dev/disk/by-id/trả lại ata-QEMU_DVD-ROM_QM00003cho thấy QEMU có liên quan nhưng dù sao tôi cũng không có quyền truy cập vào DVD-ROM giả lập.


1

Debian đi kèm với gói nhỏ này để phát hiện loại ảo hóa:

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

và lớn hơn một chút vì phụ thuộc vào Perl:

$ sudo apt-get install imvirt
$ imvirt

Như thường lệ chạy:

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

Bạn đánh tôi để bắt chước, và tôi không biết đức hạnh gì. bạn sẽ chi tiết đầu ra của cả hai như câu trả lời trước để cải thiện bài viết của bạn?
Rui F Ribeiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.