가상화 기술을 쉽게 결정할 수있는 방법


115

가상화되었거나 가상화되지 않은 Linux 시스템에 대한 명령 행 액세스 권한이 있습니다. VM웨어, VirtualBox, KVM, OpenVZ, Xen 등 어떤 종류의 가상화 기술이 실행되는지 확인하고 싶습니다. 이것은 적대적인 환경이 아닙니다. 자신을 위장하려고하는 VM에 대해 노력하지 않고, 내가 거의 알지 못하는 색다른 서버를 진단하고 있습니다.

더 정확하게 말하면, 나는 누군가가 문제를 진단하는 것을 돕고 있습니다. 따라서“ /proc어딘가에 찌르지 말고”“이 명령을 복사하여 붙여 넣기”와 같은 지침을 전달해야합니다 . 이상적으로는 다음과 lshw같습니다. 쉽게 설치할 수있는 (사전 설치되지 않은 경우) 명령으로 주변을 파고 관련 정보를 인쇄합니다.

이 시스템의 게스트가 될 가상화 기술을 결정하는 가장 쉬운 방법은 무엇입니까? 어떤 기술 (베어 하드웨어 포함)이 결정적으로 감지되고 제거 될 수 있는지 언급 한 제안에 감사드립니다. 나는 주로 리눅스에 관심이 있지만, 다른 유니스에도 적용된다면 좋다.


답변:


128

dmidecode -s system-product-name

Vmware Workstation, VirtualBox, QEMU with KVM, Ubuntu가있는 독립형 QEMU에서 게스트 OS로 테스트했습니다. 다른 사람들도 익숙한 추가 플랫폼을 추가했습니다.

가상화 기술

  • 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
    
  • 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에는 분명한 것이 없습니다. 사실 lspci 출력을 보면 hyperv를 감지하는 것으로 보입니다.
Zoredache

1
오픈 VZ 점검 /proc/user_beancounters
exussum

/proc/user_beancounters예를 들어 OpenVZ 이상의 +1은 저렴한 VPS에 있습니다.
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를 쉽게 속일 수 있습니다.
Mark

38

컨테이너가 실행중인 경우 systemd:

$ systemd-detect-virt
lxc

예를 들어 KVM에서는 다음을 반환합니다.

kvm

그리고 가상화되지 않은 호스트에서 :

none

또한보십시오:


이것은 openvz에서도 작동합니다.
lepe

kvmGoogle Compute Engine에 대한 출력 으로, 내가 알아 내려고했습니다. 감사!
잡아 먹기

우분투 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/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

로그 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
    

    반 가상화에서 실행되고 있음을 이해하는 최신 커널에서.

  • Microsoft VirtualPC

    hda: Virtual HD, ATA DISK drive
    hdc: Virtual CD, ATAPI CD/DVD-ROM drive
    
  • $ 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 systemdmidecode정확히 같은 제품 이름 입니다.
Gilles

@Gilles-네, 실제로 사용하는 것이 아니라 메소드를 캡처하는 것만은 아닙니다. 이제 Virtual Box 및 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 Edited : 그러나 스크립트는 일반적으로 KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V를 감지합니다. 흠 ... LXC가 포함되어야합니까?
ewwhite

LXC가 포함되었습니다.
ewwhite

2016 년 1 월 현재 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

루트 액세스가 필요하지 않습니다.

데비안 호스트의 데비안 게스트 :

[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

$ 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가 가상 머신 내에서 실행 중인지 어떻게 확인합니까? 안된다. 나는 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이 제안한 것처럼 요점에 더 직접적이지만 루트가 필요합니다.

$ sudo dmidecode -s system-product-name
VirtualBox

비 KVM QEMU를 들어, dmidecode -s system-product-name혼동 Bochs와를 반환하지만 dmesg | grep -i qemu(QEMU는 일반적으로 이름을 에뮬레이트 저장 장치 작동 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-detect-virt

사용 된 가상화 기술의 유형을 감지하여 출력합니다.

systemd-detect-virt

머신 가상화와 컨테이너 가상화의 구별

--container--vm옵션을 사용하여 감지되는 가상화 유형을 제한하십시오.

종료 코드

세부 사항없이 가상화가 감지되는지 여부를 알고 싶다면 종료 코드를 확인하는 것이 더 쉽습니다. 가상화가 감지되면 종료 코드 0을 리턴하고 그렇지 않으면 0이 아닌 값을 리턴합니다.



1

분명히 가상화는 여러 부분으로 나옵니다. 제 경우에는 QEMU, Bochs 및 KVM (Ubuntu 14.04)입니다. 사용중인 하이퍼 바이저를 발견하는 가장 쉬운 방법은 다음과 같습니다.

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

내 경우에는 kvm내가 찾고있는 기본 정보 (내가 생각하는 OP) 중 하나를 반환했습니다. .

또한 나는 시도했다

sudo dmidecode -s system-product-name

sudo lshw -class system

어느 쪽도 KVM을 언급하지는 않았지만 내 하드웨어 에뮬레이션이 제공 Bochs되지 않았다고 고백 했지만 하드웨어를 에뮬레이션했다는 사실을 알려 주 었지만 빠른 검색으로 흥미로운 정보를 얻었습니다 ( http://en.wikipedia.org/wiki/ 보치 ). lshw 명령은 dmidecode보다 약간 더 유익합니다 (예 : 64 비트라고 알려줍니다).

다른 답변은 실제로 유용한 것을 말하지 않았습니다. QEMU가 관련되어 있음을 보여주는 facter virtual반환 physical되어 ls -1 /dev/disk/by-id/반환 ata-QEMU_DVD-ROM_QM00003되었지만 어쨌든 에뮬레이트 된 DVD-ROM에 액세스 할 수 없습니다.


1

데비안은 가상화 유형을 탐지하기 위해 다음과 같은 작은 패키지를 제공합니다.

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