Eu tenho acesso por linha de comando a uma máquina Linux que pode ou não ser virtualizada. Quero determinar em que tipo de tecnologia de virtualização ele é executado, se houver (VMWare, VirtualBox, KVM, OpenVZ, Xen). Este não é um ambiente hostil: não estou tentando trabalhar contra uma VM que está tentando se disfarçar, estou diagnosticando um servidor esquisito sobre o qual sei pouco.
Mais precisamente, estou ajudando alguém a diagnosticar o problema, não estou sentado ao leme. Então, eu tenho que transmitir instruções como "copiar e colar este comando" e não "mexer em /proc
algum lugar". Idealmente, seria algo como lshw
: um comando facilmente instalável (se não pré-instalado) que faz a busca e imprime informações relevantes.
Qual é a maneira mais fácil de determinar de que tecnologia de virtualização este sistema pode ser convidado? Eu apreciaria se as propostas mencionassem quais tecnologias (incluindo hardware vazio) podem ser detectadas conclusivamente e quais podem ser eliminadas conclusivamente. Estou interessado principalmente no Linux, mas se ele também funcionar para outros departamentos, isso é bom.
Respostas:
dmidecode -s system-product-name
Eu testei no Vmware Workstation, VirtualBox, QEMU com KVM, QEMU autônomo com Ubuntu como sistema operacional convidado. Outros adicionaram plataformas adicionais com as quais estão familiarizados.
Tecnologias de virtualização
Estação de trabalho VMware
VirtualBox
Qemu com KVM
Qemu (emulado)
Microsoft VirtualPC
Virtuozzo
Xen
No bare metal, isso retorna uma identificação do modelo do computador ou da placa-mãe.
/dev/disk/by-id
Se você não tem os direitos de execução
dmidecode
, pode usar:Tecnologia de virtualização: QEMU
Resultado
Referências
fonte
Virtual Machine
paradmidecode -s system-product-name
. Também não há nada óbvio em / dev / disk / by-id. O facter parece detectar o hyperv observando a saída lspci./proc/user_beancounters
/proc/user_beancounters
mais de OpenVZ, o que é provável em VPS baratos como exemplo.dmidecode
e/dev/disk/by-id
falham em um contêiner do Docker. Veja unix.stackexchange.com/a/257207/106572dmidecode -s system-product-name
retorna uma descrição genérica de hardware em vez dos "KVM" ou "Bochs" mostrados acima. Para mim, essa string éStandard PC (i440FX + PIIX, 1996)
.dmidecode -s system-manufacturer
retorna a string muito menos genéricaQEMU
. Como o qemu permite que dados DMI sejam fornecidos, suspeito que o dmidecode seja relativamente fácil de enganar - não importa o campo que esteja sendo lido.Se o contêiner estiver em execução
systemd
:No KVM, por exemplo, ele retorna:
e em um host não virtualizado:
Veja também:
fonte
kvm
para o Google Compute Engine, que é o que eu estava tentando descobrir. Obrigado!Método desejável
lshw
Este comando produz a seguinte saída em convidados de tecnologia VM válidos.
Resultado
KVM
Virtual Box
VMWare
Script
Se você estiver no Ubuntu / Debian, o pacote
open-vm-tools
pode ser instalado. Fornecevmware-checkvm
. Retorna apenas um dígito. A0
significa que é uma VM,1
significa que é um sistema físico.Métodos menos desejáveis
Se for KVM, as opções
/proc/scsi/scsi
eethtool
aparecerão da seguinte maneira:SCSI
ethtool
O virtio_net faz parte do KVM. O
/proc/scsi/scsi
diz que você está em uma VM e que provavelmente é o KVM.dmesg
Usando os seguintes comandos
grep
através dodmesg
log.VMWare
QEmu ou KVM
Se a
"-cpu host"
opção não tiver sido usada, o QEmu e o KVM se identificarão como:caso contrário, as informações de CPU do host serão usadas em
dmesg
, ou em/proc/cpuinfo
. No entanto, você deve ver algo como:Nos kernels mais recentes, eles entendem que estão executando sob paravirtualização.
Microsoft VirtualPC
Xen
Virtuozzo
Referências
fonte
lshw -class system
edmidecode
é exatamente o que eu esperava encontrar.lshw
saída também para essas plataformas. Dê-me alguns minutos e eu atualizarei o A.O
virt-what
script parece cobrir bem a maioria dos casos ...I fazer , como a isenção de responsabilidade de seus autores:
Na maioria das vezes, usar este programa é a coisa errada a se fazer. Em vez disso, você deve detectar os recursos específicos que realmente deseja usar.
Ele apareceu nos meus sistemas EL5 e EL6 nos últimos anos, como parte das instalações padrão. O Ubuntu possui, e a fonte também está disponível.
Os fatos detectados pelo script estão listados aqui , mas podem ser facilmente estendidos para casos extremos.
fonte
Esses são os testes que usamos na minha empresa.
fonte
Se você receber a pessoa que está ajudando a instalar
facter
, poderá fazerNão é necessário acesso root.
Convidado Debian no host Debian:
Não posso garantir como isso funcionaria com o Xen / KVM / Qemu ...
fonte
hostnamectl
é seu amigo (requersystemd
).Alguns exemplos:
Laptop sem virtualização
Xen
OpenVZ
KVM
fonte
Virtualization: oracle
independentemente de eu não ter instalado nenhuma paravirtualização | Adições de convidados do VirtualboxNos kernels linux "recentes", o kernel detecta o hipervisor para você e imprime uma mensagem que está facilmente disponível
dmesg
. Isso lhe dirá simplesmente:Por exemplo:
Quanto ao que significa "recente", não sei em qual versão do kernel ele foi lançado oficialmente, mas o commit que introduziu esse recurso na base de código foi em 7 de maio de 2010. Veja aqui .
fonte
dmesg
preenche um buffer de anel de tamanho fixo com todos os tipos de coisas. É completamente inapropriado para esta tarefa. Veja unix.stackexchange.com/a/257207/106572Para o VirtualBox, você pode
lspci | grep -i virtualbox
:Como alternativa,
dmidecode -s system-product-name
(como sugere @Rahul Patil), é ainda mais direto ao ponto (mas precisa de raiz):Para QEMU que não seja KVM,
dmidecode -s system-product-name
retorna Bochs de maneira confusa, masdmesg | grep -i qemu
funciona (os dispositivos de armazenamento que o QEMU emula geralmente têm o nomeQEMU HARDDISK
,QEMU DVD-ROM
etc ...).fonte
Às vezes é complicado :)
fonte
systemd-detect-virt
Isso detectará o tipo de tecnologia de virtualização usada e a produzirá.
Distinguir entre virtualização de máquina e virtualização de contêiner
Use as opções
--container
e--vm
para limitar o tipo de virtualização detectada.Códigos de saída
Se você deseja apenas saber se a virtualização foi detectada ou não, sem os detalhes, é mais fácil verificar o código de saída. Ele retornará o código de saída 0 se a virtualização for detectada e diferente de zero.
fonte
Aparentemente, a virtualização vem em várias partes - no meu caso, QEMU, Bochs e KVM (então Ubuntu 14.04). Eu achei a maneira mais fácil de descobrir o hipervisor em uso era:
que no meu caso retornou simplesmente
kvm
qual era a informação básica que eu estava procurando (também acho o OP), porque me diz o que tenho permissão para fazer (por exemplo, executar o ipset para bloquear um ataque DDoS) e como os recursos são compartilhados entre as VMs .Além disso, tentei
e
nenhum dos quais menciona o KVM, mas ambos me informaram que minha emulação de hardware foi fornecida pela
Bochs
qual confesso que nem tinha ouvido falar, mas uma rápida pesquisa resultou em informações interessantes ( http://en.wikipedia.org/wiki/ Bochs ). O comando lshw é um pouco mais informativo que o dmidecode (por exemplo, me dizendo que é de 64 bits).As outras respostas não me disseram nada de útil -
facter virtual
apenas retornaramphysical
els -1 /dev/disk/by-id/
retornaram, oata-QEMU_DVD-ROM_QM00003
que mostra que o QEMU está envolvido, mas eu não tenho acesso ao DVD-ROM emulado.fonte
O Debian vem com este pequeno pacote para detectar o tipo de virtualização:
e um pouco maior por causa das dependências do Perl:
Como sempre:
fonte