Tengo acceso de línea de comando a una máquina Linux que puede o no ser virtualizada. Quiero determinar en qué tipo de tecnología de virtualización se ejecuta, si hay alguna (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Este no es un entorno hostil: no estoy tratando de trabajar contra una máquina virtual que está tratando de disfrazarse, estoy diagnosticando un servidor inestable del que sé poco.
Más precisamente, estoy ayudando a alguien a diagnosticar el problema, no estoy sentado al timón. Así que tengo que transmitir instrucciones como "copiar y pegar este comando" y no "hurgar en /proc
alguna parte". Idealmente, sería algo así como lshw
: un comando fácilmente instalable (si no está preinstalado) que hace la búsqueda e imprime información relevante.
¿Cuál es la forma más fácil de determinar de qué tecnología de virtualización puede ser invitado este sistema? Agradecería que las propuestas mencionaran qué tecnologías (incluido el hardware desnudo) pueden detectarse de manera concluyente y cuáles pueden eliminarse de manera concluyente. Estoy principalmente interesado en Linux, pero si también funciona para otros dispositivos, está bien.
Respuestas:
dmidecode -s system-product-name
He probado en Vmware Workstation, VirtualBox, QEMU con KVM, QEMU independiente con Ubuntu como SO huésped. Otros han agregado plataformas adicionales con las que también están familiarizados.
Tecnologías de virtualización
VMware Estación de trabajo
VirtualBox
Qemu con KVM
Qemu (emulado)
Microsoft VirtualPC
Virtuozzo
Xen
En metal desnudo, esto devuelve una identificación del modelo de computadora o placa base.
/dev/disk/by-id
Si no tiene los derechos para ejecutar
dmidecode
, puede usar:Tecnología de virtualización: QEMU
Salida
Referencias
fuente
Virtual Machine
paradmidecode -s system-product-name
. Tampoco hay nada obvio en / dev / disk / by-id. Facter parece detectar hyperv mirando la salida de lspci./proc/user_beancounters
/proc/user_beancounters
más de OpenVZ, lo que probablemente sea un VPS barato como ejemplo.dmidecode
y las/dev/disk/by-id
soluciones fallan en un contenedor Docker. Ver unix.stackexchange.com/a/257207/106572dmidecode -s system-product-name
devuelve una descripción genérica de hardware en lugar del "KVM" o "Bochs" que se muestran arriba. Para mí, esta cadena esStandard PC (i440FX + PIIX, 1996)
.dmidecode -s system-manufacturer
devuelve la cadena mucho menos genéricaQEMU
. Dado que qemu permite que se proporcionen datos DMI, sospecho que dmidecode es relativamente fácil de engañar, sin importar el campo que se lea.Si el contenedor se está ejecutando
systemd
:En KVM, por ejemplo, devuelve:
y en un host no virtualizado:
Ver también:
fuente
kvm
para Google Compute Engine, que es lo que estaba tratando de resolver. ¡Gracias!Método deseable
lshw
Este comando produce el siguiente resultado en invitados de tecnología VM variados.
Salida
KVM
Caja virtual
VMWare
Scripting
Si estás en Ubuntu / Debian, hay un paquete que
open-vm-tools
se puede instalar. Proporcionavmware-checkvm
. Solo devuelve un dígito. A0
significa que es una VM,1
significa que es un sistema físico.Métodos menos deseables
Si es KVM, las opciones
/proc/scsi/scsi
y seethtool
muestran de la siguiente manera:SCSI
ethtool
El virtio_net es parte de KVM. El
/proc/scsi/scsi
te dice que estás en una VM, y que probablemente eres KVM.dmesg
Usando los siguientes comandos
grep
'a través deldmesg
registro.VMWare
QEmu o KVM
Si la
"-cpu host"
opción no se ha utilizado, QEmu y KVM se identificarán como:de lo contrario, la información de la CPU del host se usará tanto en
dmesg
como en/proc/cpuinfo
. Sin embargo, debería ver algo como:En núcleos más nuevos que entienden que se están ejecutando bajo paravirtualización.
Microsoft VirtualPC
Xen
Virtuozzo
Referencias
fuente
lshw -class system
ydmidecode
es exactamente lo que esperaba encontrar.lshw
salida también para esas plataformas. Dame un par de minutos y actualizaré el A.El
virt-what
guión parece cubrir bien la mayoría de los casos ...Yo hago como el descargo de responsabilidad de los autores:
La mayoría de las veces, usar este programa es algo incorrecto. En su lugar, debe detectar las características específicas que realmente desea utilizar.
Apareció en mis sistemas EL5 y EL6 durante los últimos años como parte de las instalaciones predeterminadas. Ubuntu lo tiene, y la fuente también está disponible.
Los hechos detectados por el script se enumeran aquí , pero pueden ampliarse fácilmente para casos extremos.
fuente
Esas son las pruebas que utilizamos en mi empresa.
fuente
Si obtiene la persona que está ayudando a instalar
facter
, puede hacerloNo se necesita acceso de root.
Invitado de Debian en el host de Debian:
No puedo garantizar cuán bien funcionaría esto con Xen / KVM / Qemu ...
fuente
hostnamectl
es tu amigo (requieresystemd
)Algunos ejemplos:
Laptop sin ninguna virtualización
Xen
OpenVZ
KVM
fuente
Virtualization: oracle
independientemente de que no haya instalado ninguna paravirtualización | Adiciones de invitados de VirtualboxEn los núcleos "recientes" de Linux, el núcleo detecta el hipervisor por usted e imprime un mensaje que está fácilmente disponible
dmesg
. Esto te dirá simplemente:Por ejemplo:
En cuanto a lo que significa "reciente", no estoy claro en qué versión del kernel se lanzó oficialmente, pero el compromiso que introdujo esta característica en la base del código fue el 7 de mayo de 2010. Vea aquí .
fuente
dmesg
llena un búfer de anillo de tamaño fijo con todo tipo de cosas. Es completamente inapropiado para esta tarea. Ver unix.stackexchange.com/a/257207/106572Para VirtualBox, podría
lspci | grep -i virtualbox
, eso da:Alternativamente,
dmidecode -s system-product-name
(como sugiere @Rahul Patil) es aún más directo al punto (pero necesita root):Para QEMU no KVM,
dmidecode -s system-product-name
devuelve Bochs de manera confusa, perodmesg | grep -i qemu
funciona (los dispositivos de almacenamiento que emula QEMU generalmente tienen el nombreQEMU HARDDISK
,QEMU DVD-ROM
etc.).fuente
A veces es complicado :)
fuente
systemd-detect-virt
Esto detectará el tipo de tecnología de virtualización utilizada y la generará.
Distinguir entre virtualización de máquinas y virtualización de contenedores
Use las opciones
--container
y--vm
para limitar el tipo de virtualización que se detecta.Códigos de salida
Si solo desea saber si se detecta la virtualización o no, sin los detalles, entonces es más fácil verificar el código de salida. Devolverá el código de salida 0 si se detecta virtualización y, de lo contrario, no será cero.
fuente
Aparentemente, la virtualización viene en varias partes, en mi caso QEMU, Bochs y KVM (luego Ubuntu 14.04). Encontré que la forma más fácil de descubrir el hipervisor en uso era:
que en mi caso devolvió simplemente
kvm
cuál era la información básica que estaba buscando (también el OP, creo), porque me dice lo que tengo permitido hacer (por ejemplo, ejecutar ipset para bloquear un ataque DDoS) y cómo se comparten los recursos entre las máquinas virtuales .Además lo intenté
y
ninguno de los cuales menciona KVM, pero ambos me informaron que mi emulación de hardware fue proporcionada por
Bochs
lo que confieso que ni siquiera había oído hablar, pero una búsqueda rápida arrojó información interesante ( http://en.wikipedia.org/wiki/ Bochs ). El comando lshw es un poco más informativo que dmidecode (por ejemplo, me dice que es de 64 bits).Las otras respuestas realmente no me dijeron nada útil:
facter virtual
solo regresaronphysical
yls -1 /dev/disk/by-id/
regresaron, loata-QEMU_DVD-ROM_QM00003
que muestra que QEMU está involucrado, pero de todos modos no tengo acceso al DVD-ROM emulado.fuente
Debian viene con este pequeño paquete para detectar el tipo de virtualización:
y un poco más grande debido a las dependencias de Perl:
Como siempre corre:
fuente