Cómo comprobar si el entorno es una máquina virtual en Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo determinar si tu entorno Linux se está ejecutando en una máquina virtual. Exploraremos tres métodos diferentes para lograr esto: utilizando el comando dmidecode para inspeccionar la información del sistema, empleando la herramienta virt-what diseñada específicamente para la detección de virtualización y examinando las banderas de la CPU en el archivo /proc/cpuinfo. Al final de este laboratorio, estarás equipado con técnicas prácticas para identificar entornos virtualizados en Linux.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) linux/BasicSystemCommandsGroup -.-> linux/man("Manual Access") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/UserandGroupManagementGroup -.-> linux/sudo("Privilege Granting") linux/PackagesandSoftwaresGroup -.-> linux/apt("Package Handling") subgraph Lab Skills linux/man -.-> lab-558808{{"Cómo comprobar si el entorno es una máquina virtual en Linux"}} linux/cat -.-> lab-558808{{"Cómo comprobar si el entorno es una máquina virtual en Linux"}} linux/grep -.-> lab-558808{{"Cómo comprobar si el entorno es una máquina virtual en Linux"}} linux/sudo -.-> lab-558808{{"Cómo comprobar si el entorno es una máquina virtual en Linux"}} linux/apt -.-> lab-558808{{"Cómo comprobar si el entorno es una máquina virtual en Linux"}} end

Verificar la información del sistema con dmidecode

En este paso, aprenderás cómo utilizar el comando dmidecode para obtener información detallada sobre el hardware de tu sistema. dmidecode lee datos de la tabla DMI/SMBIOS (Desktop Management Interface / System Management BIOS), que contiene descripciones de los componentes del sistema.

Este comando es increíblemente útil para entender los detalles del hardware en el que se está ejecutando tu sistema Linux, como la placa madre, la CPU, la memoria, etc.

Dado que acceder a la tabla DMI requiere privilegios de root, necesitarás usar sudo con dmidecode.

Abre tu terminal si no está abierta. Recuerda que puedes encontrar el icono de Xfce Terminal en el lado izquierdo de tu escritorio.

Ahora, escribe el siguiente comando y presiona Enter:

sudo dmidecode

Este comando mostrará una gran cantidad de información sobre el hardware de tu sistema. Desplázate por la salida para ver las diferentes secciones, como "BIOS Information", "System Information", "Base Board Information", "Processor Information", "Memory Device", etc.

La salida podría verse algo así (se omiten partes de la salida por brevedad):

## dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.3.0 present.

Handle 0x0000, DMI type 0, 26 bytes
BIOS Information
        Vendor: SeaBIOS
        Version: 1.16.0-1.fc36
        Release Date: 07/07/2022
        Address: 0xE0000
        Runtime Size: 128 kB
        ROM Size: 64 kB
        Characteristics:
                PCI is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                Boot from CD is supported
                Selectable boot is supported
                BIOS ROM is socketed
                EDD is supported
                5.25" / 1.2 MB floppy services are supported (int 13h)
                3.5" / 720 kB floppy services are supported (int 13h)
                3.5" / 1.44 MB floppy services are supported (int 13h)
                8042 keyboard services are supported (int 9h)
                CGA/mono video services are supported (int 10h)
                AT/XT compatible keyboard services are supported (int 16h)
                Printer services are supported (int 17h)
                CGA/mono video is supported (int 10h)
                ACPI is supported
                USB legacy is supported
                BIOS boot specification is supported
                Targeted content distribution is supported
                UEFI is supported
        BIOS Revision: 1.16

Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: QEMU
        ProductName: Standard PC (Q35 + ICH9, 2009)
        Version: pc-q35-7.0
        Serial Number: <filtered>
        UUID: <filtered>
        Wake-up Type: Power Switch
        SKU Number: <filtered>
        Family: Virtual Machine

Handle 0x0002, DMI type 2, 17 bytes
Base Board Information
        Manufacturer: QEMU
        ProductName: Standard PC (Q35 + ICH9, 2009)
        Version: pc-q35-7.0
        Serial Number: <filtered>
        Asset Tag: <filtered>
        Features:
                Board is a hosting board
                Board is replaceable
        Location In Chassis: <filtered>
        Chassis Handle: 0x0003
        Type: Motherboard
        Contained Object Handles: 0

... (output continues)

También puedes filtrar la salida para ver información sobre un tipo específico de hardware utilizando la opción -t seguida del número de tipo o la palabra clave. Por ejemplo, para ver solo la información de la CPU, puedes usar:

sudo dmidecode -t processor

O, para ver información sobre los dispositivos de memoria:

sudo dmidecode -t memory

Experimenta con diferentes tipos como bios, system, baseboard, chassis, etc., para ver los detalles específicos de cada componente.

Utilizar dmidecode es una habilidad fundamental para los administradores de sistemas y cualquier persona que necesite solucionar problemas de hardware o simplemente entender la configuración subyacente del sistema.

Haz clic en Continue para pasar al siguiente paso.

Detectar virtualización con virt-what

En este paso, aprenderás cómo determinar si tu sistema Linux se está ejecutando dentro de una máquina virtual o en hardware físico (bare metal). Esto suele ser importante para la configuración del sistema, la optimización del rendimiento o la licencia.

Utilizaremos el comando virt-what, que está diseñado específicamente para este propósito. Comprueba los signos de virtualización e imprime los nombres de los hipervisores que detecta.

Primero, necesitas instalar el paquete virt-what. Utiliza apt como lo hiciste con htop en el laboratorio anterior.

Abre tu terminal y ejecuta el siguiente comando para instalar virt-what:

sudo apt update
sudo apt install virt-what -y

La bandera -y responde automáticamente "sí" a cualquier pregunta durante la instalación, lo que hace que el proceso sea no interactivo.

Una vez que se complete la instalación, puedes ejecutar el comando virt-what:

virt-what

La salida de este comando te dirá si el sistema está virtualizado y, en caso afirmativo, qué tecnología de virtualización se está utilizando.

En el entorno LabEx, que se ejecuta en un entorno virtualizado, deberías ver una salida similar a esta:

qemu
kvm

Esto indica que el sistema se está ejecutando dentro de una máquina virtual QEMU/KVM. Si el sistema estuviera ejecutándose en hardware físico, virt-what normalmente no produciría ninguna salida.

Comprender si tu sistema está virtualizado es una información crucial para muchas tareas de administración de sistemas. virt-what proporciona una forma sencilla y confiable de obtener esta información.

Haz clic en Continue para pasar al siguiente paso.

Inspeccionar las banderas de la CPU en /proc/cpuinfo

En este paso, explorarás el archivo /proc/cpuinfo, que es un archivo virtual proporcionado por el kernel de Linux que contiene información sobre la(s) CPU(s) de tu sistema. Este archivo es una gran fuente de detalles sobre tu procesador, incluyendo su modelo, velocidad, tamaño de caché y características admitidas (banderas).

El sistema de archivos /proc es un pseudo-sistema de archivos que proporciona una interfaz a las estructuras de datos del kernel. Los archivos dentro de /proc no se almacenan en el disco, sino que son generados sobre la marcha por el kernel cuando los accedes.

Para ver el contenido de /proc/cpuinfo, puedes usar una utilidad de línea de comandos como cat o less. cat imprimirá todo el contenido en la terminal, mientras que less te permite desplazarte por el contenido página por página. Dado que /proc/cpuinfo puede ser bastante largo, less suele ser más conveniente.

Abre tu terminal y escribe el siguiente comando para ver la información de la CPU usando cat:

cat /proc/cpuinfo

Verás información detallada para cada núcleo de CPU en tu sistema. La salida incluirá líneas como processor, vendor_id, model name, cpu MHz, cache size y flags.

A continuación, un ejemplo de lo que podrías ver (se omiten partes de la salida por brevedad):

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
stepping        : 13
microcode       : 0xffffffff
cpu MHz         : 2904.000
cache size      : 16384 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves arch_capabilities
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_stale_data retbleed
bogomips        : 5808.00
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
stepping        : 13
microcode       : 0xffffffff
cpu MHz         : 2904.000
cache size      : 16384 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves arch_capabilities
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_stale_data retbleed
bogomips        : 5808.00
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management:

La línea flags es especialmente interesante, ya que enumera las diversas características y extensiones admitidas por tu CPU. Estas banderas indican capacidades como soporte de virtualización (vmx o svm), conjuntos de instrucciones específicos (como sse, avx) y características de seguridad.

También puedes usar grep para buscar información específica dentro de /proc/cpuinfo. Por ejemplo, para encontrar el nombre del modelo:

grep "model name" /proc/cpuinfo

Esto mostrará el nombre del modelo para cada núcleo de CPU:

model name      : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
model name      : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz

O, para comprobar la presencia de una bandera específica, como vmx (soporte de virtualización Intel VT-x):

grep "vmx" /proc/cpuinfo

Si vmx está presente en la salida, tu CPU admite la virtualización Intel VT-x.

Explorar /proc/cpuinfo es una forma fundamental de entender las capacidades del procesador de tu sistema directamente desde la perspectiva del kernel.

Haz clic en Continue para completar este laboratorio.

Resumen

En este laboratorio, aprendiste cómo comprobar si un entorno Linux es una máquina virtual utilizando varios métodos. Comenzaste utilizando el comando dmidecode con sudo para acceder a la tabla DMI/SMBIOS y recuperar información detallada del hardware del sistema, como detalles de la BIOS, del sistema y del procesador. Este comando proporciona una visión general completa de los componentes de hardware subyacentes.

A continuación, explorarás técnicas adicionales para detectar la virtualización, incluyendo el uso del comando virt-what y la inspección de las banderas de la CPU en el archivo /proc/cpuinfo. Estos métodos ofrecen formas alternativas de identificar la presencia de un entorno virtualizado examinando características y configuraciones específicas del sistema.