วิธีง่ายๆในการพิจารณาเทคโนโลยีการจำลองเสมือน


115

ฉันมีการเข้าถึงบรรทัดคำสั่งไปยังเครื่อง Linux ซึ่งอาจหรือไม่อาจเป็นเสมือนจริง ฉันต้องการพิจารณาว่าเทคโนโลยีเวอร์ชวลไลเซชันชนิดใดที่ใช้งานได้ถ้ามี (VMware, VirtualBox, KVM, OpenVZ, Xen,) นี่ไม่ใช่สภาพแวดล้อมที่เป็นศัตรู: ฉันไม่ได้พยายามที่จะทำงานกับ VM ที่พยายามปลอมตัวเองฉันกำลังวินิจฉัยเซิร์ฟเวอร์ที่ไม่สม่ำเสมอซึ่งฉันรู้เพียงเล็กน้อย

แม่นยำมากขึ้นฉันกำลังช่วยคนที่วินิจฉัยปัญหาฉันไม่ได้นั่งอยู่ที่หางเสือ ดังนั้นฉันต้องถ่ายทอดคำแนะนำเช่น“ คัดลอกวางคำสั่งนี้” และไม่“ แหย่ที่/procใดที่หนึ่ง” จะเป็นการดีที่มันจะเป็นเช่นlshw: คำสั่งติดตั้งได้ง่าย (ถ้าไม่ได้ติดตั้งไว้ล่วงหน้า) ที่จะ poking รอบและพิมพ์ข้อมูลที่เกี่ยวข้อง

อะไรคือวิธีที่ง่ายที่สุดในการพิจารณาว่าเทคโนโลยีระบบเสมือนจริงใดที่ระบบนี้อาจเป็นแขกของ ฉันขอขอบคุณหากข้อเสนอดังกล่าวระบุว่าเทคโนโลยีใด (รวมถึงฮาร์ดแวร์เปล่า) สามารถตรวจพบได้อย่างแน่นอนและสามารถกำจัดได้อย่างแน่นอน ฉันสนใจ Linux เป็นส่วนใหญ่ แต่ถ้ามันใช้ได้กับ unices อื่น ๆ ก็ดี


คำตอบ:


128

dmidecode -s system-product-name

ฉันได้ทดสอบกับ Vmware Workstation, VirtualBox, QEMU กับ KVM, QEMU แบบสแตนด์อโลนกับ Ubuntu ในฐานะแขกของระบบปฏิบัติการ คนอื่น ๆ ได้เพิ่มแพลตฟอร์มเพิ่มเติมที่พวกเขาคุ้นเคยเช่นกัน

เทคโนโลยีการจำลองเสมือน

  • VMware Workstation

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

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • Qemu ด้วย KVM

    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
    

สำหรับโลหะเปลือยนี่จะส่งคืนรหัสของคอมพิวเตอร์หรือรุ่นมาเธอร์บอร์ด

/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 ตรวจจับ hyperv โดยดูที่เอาต์พุต lspci
Zoredache

1
เปิดการตรวจสอบ VZ สำหรับ /proc/user_beancounters
exussum

+1 /proc/user_beancountersนานกว่า OpenVZ ซึ่งน่าจะเป็นตัวอย่างของ VPS ราคาถูก
erm3nda

ทั้งสอง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

มันออกมาkvmสำหรับ Google Compute Engine ซึ่งเป็นสิ่งที่ฉันพยายามจะคิดออก ขอบคุณ!
snetch

คำสั่งง่ายๆที่ใช้งานได้ดีใน Ubuntu 18.04! ขอบคุณมาก :)
develCuy

28

วิธีการที่พึงประสงค์

lshw

คำสั่งนี้สร้างเอาต์พุตต่อไปนี้สำหรับผู้เยี่ยมชมเทคโนโลยี vairous 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/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ผ่าน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
    

    ในเมล็ดที่ใหม่กว่าที่เข้าใจว่ากำลังทำงานภายใต้ 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
    

อ้างอิง


ประเภทของการกระตุ้นรอบไดรเวอร์คือสิ่งที่ฉันหวังว่าจะหลีกเลี่ยง: มันจะแตกต่างกันไปสำหรับเทคโนโลยี VM ทุกประเภทและขึ้นอยู่กับการตั้งค่า ชื่อผลิตภัณฑ์รายงานโดยlshw -class systemและdmidecodeเป็นสิ่งที่ฉันหวังว่าจะพบ
Gilles

@Gilles - ใช่ฉันไม่ได้ตั้งใจให้คุณใช้มันจริงๆเพื่อจับวิธีเท่านั้น ฉันกำลังนำกล่องเสมือนและ VMWare อินสแตนซ์ตอนนี้เพื่อยืนยันการlshwส่งออกเช่นกันสำหรับแพลตฟอร์มเหล่านั้น ให้เวลาฉันสักสองสามนาทีแล้วฉันจะอัปเดต A.
slm

@Gilles - ดูเหมือน lshw สามารถทำงานได้ดีสำหรับเทคโนโลยีทั้งหมด ฉันได้ย้ายคำตอบไปที่ด้านล่างของคำตอบที่ไม่ใช่สิ่งที่คุณกำลังมองหาเพื่อให้คนอื่นไม่ต้องข้ามผ่านพวกเขา
slm

dmesg เติมบัฟเฟอร์วงแหวนขนาดคงที่ด้วยสิ่งของทุกชนิด มันไม่เหมาะสมอย่างสมบูรณ์สำหรับงานนี้ ดูunix.stackexchange.com/a/257207/106572
Martin Bramwell

@ มาร์ติน - และนั่นคือเหตุผลที่อยู่ในส่วนที่ต้องการน้อยกว่าในคำตอบของฉัน ฉันมักจะเขียนคำตอบที่รวมทุกอย่างแสดงวิธีการที่หลากหลาย
slm

16

virt-whatสคริปต์ดูเหมือนว่าจะครอบคลุมกรณีที่ดีที่สุด ...

ฉันทำเหมือนข้อจำกัดความรับผิดชอบจากผู้เขียน:

ส่วนใหญ่แล้วการใช้โปรแกรมนี้เป็นสิ่งที่ผิด แต่คุณควรตรวจสอบคุณสมบัติเฉพาะที่คุณต้องการใช้จริง ๆ

มันปรากฏในระบบ EL5 และ EL6 ของฉันในช่วงไม่กี่ปีที่ผ่านมาซึ่งเป็นส่วนหนึ่งของการติดตั้งเริ่มต้น อูบุนตูมีมันและแหล่งที่มาก็ใช้ได้เช่นกัน

ข้อเท็จจริงที่ตรวจพบโดยสคริปต์ที่จะอยู่ที่นี่แต่สามารถขยายได้สำหรับกรณีขอบ


เชื่อมโยง? ระบบใดที่รับรู้?
Gilles

1
@Gilles แก้ไข: แต่สคริปต์ตรวจพบโดยทั่วไป KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V อืม ... ควรรวม LXC ด้วยเหรอ?
ewwhite

LXC รวมอยู่ในขณะนี้
ewwhite

เมื่อวันที่มกราคม 2016 มันล้มเหลวด้วย Docker ดู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; }

นี่คือการทดสอบที่เราใช้ที่ บริษัท ของฉัน


9

หากคุณได้คนที่คุณกำลังช่วยติดตั้งfacterคุณสามารถทำได้

facter virtual

ไม่จำเป็นต้องเข้าถึงรูท

Debian Guest บนโฮสต์ 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

ระบบปฏิบัติการตรวจสอบว่ามันทำงานอยู่ภายในเครื่องเสมือนจริงอย่างไร? ไม่ควรฉันติดตั้งเดเบียนพื้นฐานมากจากบรรทัดคำสั่งและ hostnamectl แสดงให้เห็นVirtualization: oracleว่าฉันไม่ได้ติดตั้ง paravirtualization ใด ๆ | การเพิ่มแขก Virtualbox
Ivanzinho

7

ใน "ล่าสุด" dmesgเมล็ดลินุกซ์เคอร์เนลตรวจพบไฮเปอร์ไวเซอร์สำหรับคุณและพิมพ์ข้อความที่เป็นได้อย่างง่ายดายสามารถใช้ได้กับ สิ่งนี้จะบอกคุณง่ายๆ:

dmesg | grep "Hypervisor detected"

ตัวอย่างเช่น:

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

เป็นสิ่งที่ "ล่าสุด" หมายถึงฉันไม่ชัดเจนรุ่นที่มันถูกปล่อยออกอย่างเป็นทางการใน แต่การกระทำที่นำคุณลักษณะนี้ในฐานรหัสได้วันที่ 7 พฤษภาคม 2010 ดูเคอร์เนลที่นี่


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 แนะนำ) ยิ่งตรงไปยังจุดนั้น (แต่ต้องการรูท):

$ sudo dmidecode -s system-product-name
VirtualBox

สำหรับผู้ที่ไม่ KVM QEMU, dmidecode -s system-product-nameพลุกพล่านผลตอบแทน Bochs แต่dmesg | grep -i qemuทำงาน (อุปกรณ์จัดเก็บข้อมูลที่ QEMU มัก emulates มีชื่อQEMU HARDDISK, QEMU 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 ตรวจพบ-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) และวิธีการใช้ทรัพยากรร่วมกันระหว่าง VMs .

นอกจากนี้ฉันพยายาม

sudo dmidecode -s system-product-name

และ

sudo lshw -class system

ไม่ได้พูดถึง KVM แต่พวกเขาทั้งสองแจ้งให้ฉันทราบว่าการจำลองฮาร์ดแวร์ของฉันมีให้โดยBochsที่ฉันยอมรับว่าฉันไม่เคยได้ยิน แต่การค้นหาอย่างรวดเร็วทำให้เกิดข้อมูลที่น่าสนใจ ( http://en.wikipedia.org/wiki/ Bochs ) คำสั่ง lshw ให้ข้อมูลมากกว่า dmidecode เล็กน้อย (เช่นบอกฉันว่าเป็น 64- บิต)

คำตอบอื่น ๆ ไม่ได้บอกอะไรที่มีประโยชน์เลย - facter virtualแค่ส่งคืนphysicalและ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

คุณทุบตีฉันให้สวมเสื้อและฉันก็ไม่รู้จักคุณธรรม - อะไร คุณจะให้รายละเอียดผลลัพธ์ของทั้งคู่เป็นคำตอบก่อนหน้าเพื่อปรับปรุงโพสต์ของคุณหรือไม่
Rui F Ribeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.