As máquinas virtuais se esforçam muito para convencer seus sistemas operacionais de que estão rodando em hardware físico. Então você pode dizer pela linha de comando do Linux se o computador é físico ou virtual?
Índice
Máquinas Virtuais e Hipervisores
Um computador tradicional é um objeto físico. É uma coleção de diferentes peças de hardware conectadas e parafusadas para que você possa carregar um sistema operacional, instalar aplicativos, iniciá-los e usá-los.
O hardware é caro. Estar restrito a um sistema operacional por computador físico significa que o custo de execução de vários sistemas operacionais logo se tornará proibitivo. Uma solução melhor seria permitir que um único computador físico executasse uma seleção de sistemas operacionais ao mesmo tempo, com cada um pensando que está rodando em seu próprio hardware exclusivo.
Um hipervisor torna isso possível. Um hipervisor – também chamado de gerenciador de máquina virtual ou monitor de máquina virtual – é um software que permite criar máquinas virtuais. Eles se comportam como se fossem computadores físicos individuais, embora sejam executados no mesmo host físico, compartilhando espaço no disco rígido, memória e núcleos de CPU .
É claro que o computador host precisa ser poderoso o suficiente para lidar com as demandas do conjunto de máquinas virtuais, mas, com RAM e poder de processamento suficientes no host, as máquinas virtuais podem funcionar em velocidades próximas do bare-metal.
Desde o lançamento do kernel 2.6.20 em 2007, o Linux tem suporte para máquina virtual baseada em kernel integrado . O Linux tem vários hipervisores disponíveis, como VirtualBox , GNOME Boxes e QEMU -KVM . Eles fazem uso do recurso KVM nativo do Linux, com base na funcionalidade nativa do kernel, adicionando interfaces de usuário e funcionalidades como a capacidade de tirar um instantâneo de uma máquina virtual.
As máquinas virtuais trazem economia de custos, eficiência, implantações simplificadas e benefícios de segurança – provisionados corretamente. Eles também facilitam a escalabilidade. Novos servidores podem ser ativados automaticamente à medida que a demanda por um serviço aumenta e desligados quando a demanda diminui. Isso os torna extremamente populares tanto na nuvem quanto na infraestrutura local.
Talvez você esteja administrando remotamente um servidor Linux e precise saber se é uma máquina virtual ou uma caixa física. Ou você tem um script que precisa saber em que tipo de plataforma está sendo executado. Aqui estão várias maneiras de detectar se o computador em que você está trabalhando é físico ou virtual.
O comando dmidecode
O dmidecode
comando oferece suporte a um grande número de opções e modificadores. Ele interroga as tabelas da Desktop Management Interface (DMI) e imprime as informações na janela do terminal.
Vamos usá-lo com o
-s
(exibir uma única string) e solicite o nome do produto do sistema. Observe que devemos usar sudo
.
Executaremos o comando em uma VM VirtualBox executando Ubuntu 22.04.
sudo dmidecode -s nome do produto do sistema
A plataforma está corretamente identificada como VirtualBox.
Em uma VM QEMU-KVM executando o Fedora 35 , obtemos esta saída.
sudo dmidecode -s nome do produto do sistema
Embora seja relatado como um PC padrão, é um PC virtual QEMU padrão, do tipo Q35. Assim a plataforma é corretamente reconhecida como uma máquina virtual.
Se executarmos o mesmo comando em um computador físico, obteremos algumas informações sobre o fabricante.
sudo dmidecode -s nome do produto do sistema
Este computador é uma construção personalizada baseada em uma placa-mãe Micro-Star International Company Limited, com o código de produto MS-7B86.
O comando lshw
O lshw
comando lista os detalhes de uma ampla variedade de hardware de computador. Podemos escolher lshw
sobre qual classe de hardware queremos reportar.
Vamos usar a -class
opção com o system
modificador. Usar sudo
com este comando garante que vejamos todos os detalhes.
Executaremos este comando em nossa VM Ubuntu VirtualBox.
sistema sudo lshw -class
- O campo “descrição” possui uma entrada genérica de “computador”.
- O campo “produto” nos informa que esta é uma máquina virtual rodando no VirtualBox.
- O campo “fornecedor” contém o nome da empresa alemã que criou o VirtualBox, Innotek GmbH. A Innotek foi adquirida pela Oracle Corporation em 2010 como parte da aquisição da Sun Microsystems, Inc.
Tivemos que instalar lshw
no Fedora.
sudo dnf instalar lshw
Vamos tentar esse comando em nossa VM Fedora rodando em GNOME Boxes.
sistema sudo lshw -class
- Novamente, o campo “descrição” possui uma entrada genérica de “computador”.
- O campo “produto” nos fornece as mesmas informações padrão do QEMU PC que vimos com o
dmidecode
comando. - O campo “vendor” contém “QEMU”, o que indica claramente que se trata de uma máquina virtual.
Este é o resultado da execução do mesmo comando em nosso computador físico.
sistema sudo lshw -class
Podemos ver que este é um computador hardware, com placa-mãe Micro-Star .
- O hardware é identificado como um computador desktop.
- O campo “produto” nos dá o tipo de placa-mãe, MS-7B86.
- O campo “fornecedor” contém o nome do fabricante.
O comando hostnamectl
Este comando tem a vantagem de não precisar ter sudo
privilégios para executá-lo. No entanto, está disponível apenas em systemd
distribuições habilitadas. A maioria das distribuições modernas usasystemd
.
Esta é a resposta da execução do comando em nossa VM Ubuntu VirtualBox.
hostnamectl
- O campo “icon-name” tem “-vm” anexado a ele.
- O campo “Chassis” contém “vm”.
- O campo “Virtualização” contém “oracle”.
- O campo “Fornecedor de hardware” contém “innotek GmbH”.
- O campo “Modelo de Hardware” contém “VirtualBox”.
A saída em nossa VM Fedora dentro do GNOME Boxes é muito semelhante.
hostnamectl
- O campo “icon-name” tem “-vm” anexado a ele.
- O campo “Chassis” contém “vm”.
- O campo “Virtualização” contém “kvm”.
- O campo “Fornecedor de hardware” contém “QEMU”
- O campo “Modelo de hardware” contém “PC padrão (Q35 + ICH9, 2009).”
Se usarmos o comando hostnamectl em nossa área de trabalho física, a saída não conterá uma linha “Virtualização”.
hostnamectl
Se não houver campo “Virtualização”, você deverá estar executando em bare metal.
O comando systemd-detect-virt
Se você deseja obter uma resposta o mais curta possível, systemd-detect-virt
provavelmente é isso que você está procurando. Novamente, isso requer uma systemd
distribuição equipada, mas não requer sudo
privilégios. Isso — e sua saída concisa — o tornam adequado para uso em scripts.
Este é o resultado da execução do comando em nossa VM Ubuntu VirtualBox.
systemd-detect-virt
Nossa cópia do Fedora rodando em GNOME Boxes é relatada como usando virtualização KVM.
systemd-detect-virt
A execução systemd-detect-virt
em nossa máquina de hardware resulta na impressão de “none” no terminal.
systemd-detect-virt
Um script sensível à plataforma
Para dar a um script a capacidade de detectar se ele está sendo executado em um ambiente virtualizado ou em hardware físico, podemos usar o systemd-detect-virt
comando e instruções Bashcase
para lidar com as opções.
Este é o script que usaremos. Copie este texto e salve-o em um arquivo chamado “platform.sh”.
#!/bin/bashcomprar -s nocasematch
caso $(systemd-detect-virt) em
nenhum)
echo "Hardware Físico"
*)
eco "Máquina Virtual"
esac
O script usashopt
para escolher a correspondência que não diferencia maiúsculas de minúsculas. O systemd-detect-virt
comando é usado na case
instrução. A saída deste comando é comparada com cada uma das case
cláusulas no corpo da case
instrução até que uma correspondência seja encontrada. Qualquer coisa que não corresponda é capturada pela cláusula padrão “*)”.
A maneira mais simples é testar se a resposta systemd-detect-virt
é “nenhuma”. Se estiver, o script está sendo executado em hardware físico. Para todos os outros casos, o script deve estar em execução em uma máquina virtual.
Antes de podermos executar o script, devemos torná-lo executável, usando chmod
.
chmod +x plataforma.sh
Ele identifica corretamente nossa VM Ubuntu VirtualBox como uma máquina virtual.
./plataforma.sh
Ele também detecta corretamente a VM GNOME Boxes executando o Fedora.
./plataforma.sh
O script também detecta corretamente quando está sendo executado em uma máquina física.
./plataforma.sh
As diferentes case
cláusulas podem definir variáveis que foram verificadas em outro lugar no script para executar diferentes tipos de processamento ou podem chamar funções específicas dentro do seu script.
Se o seu script precisasse detectar e acomodar diferentes tipos de ambientes virtuais, você poderia adicionar mais case
cláusulas, procurando as diferentes strings que systemd-detect-virt
podem retornar. Podemos ver a lista completa de respostas possíveis usando a --list
opção. Para facilitar a visualização de todos de uma vez, canalizaremos a saída por meio do column
comando.
systemd-detect-virt --lista | coluna
Tome a pílula vermelha
Essas técnicas permitem que seus scripts saibam quando estão sendo executados em hardware simples e quando estão dentro de uma máquina virtual.
Como Neo em Matrix , eles saberão o que é real e o que não é.