Underc0de - Hacking y seguridad informática

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: DtxdF en Febrero 10, 2020, 11:46:18 pm

Título: QEMU: Una alternativa a VirtualBox y VMWare con una interfaz intuitiva
Publicado por: DtxdF en Febrero 10, 2020, 11:46:18 pm
La idea de la virtualización en software se refiere al acto de poder ejecutar y/o manipular sistemas invitados en un mismo alfiltrión. Algo sencillo si se piensa, pero no tan efectivo en la practica y mucho menos las primeras veces que se toca un programa de esta embergadura.

Siempre que escogemos un entorno para poder realizar la virtualización tendemos a tener una lista muy reducida de dos items en nuestra cabeza. VirtualBox y VMWare.

Tenemos que tener en cuenta que la virtualización es un proceso que lleva su tiempo y es necesario comprender para entender los limites de nuestra necesidad, por eso repasaremos o aprenderemos los conceptos bases de este tema tan magnifico.

Una ayuda perfecta para comenzar es saber los tipos de virtualización y cómo funcionan de forma abstracta.

Emulación o simulación del hardware a nivel de aplicación:

Es básico, consiste en poder ejecutar un software que fue programado para un mismo CPU o uno diferente, aunque resumiendo, básicamente lo que hace este tipo de virtualizadores es actuar cómo un traductor entre el código binario del programa virtualizado a una instrucción del CPU real.

El inconveniente de este producto es su lentitud, ya que una instrucción del programa puede contener 100 y cuando se pasá a ejecutar esas instrucciones al CPU pueden llegar a ser 1000, en teoría.

Ejemplos:


Virtualización completa o nativa sin apoyo hardware:

En este tipo de sistemas el hipervisor se encarga de emular un sistema completo y analiza dinámicamente el código que quiere ejecutar el sistema invitado, reemplazando las instrucciones críticas (las que hace falta virtualizar) por nuevas secuencias de instrucciones que tienen el efecto deseado en el hardware virtual, mientras que las instrucciones no críticas se ejecutan tal cual en la CPU real.

Ejemplos:


Virtualización completa o nativa con apoyo hardware:

Este tipo de sistemas funcionan de manera similar a los sistemas de virtualización completa sin apoyo hardware, pero aprovechan tecnologías incorporadas a las nuevas generaciones de microprocesadores como las de Intel (Intel-VT, VT-x para 32 bit y VT-y para 64 bit) y AMD (AMD-V), de forma que es posible ejecutar el código del sistema operativo invitado sin modificarlo.

En estos sistemas lo que se hace es ejecutar el hipervisor o VMM con el máximo nivel de acceso a la CPU (Anillo -1 en procesadores AMD e Intel) y los sistemas invitados se ejecutan a un nivel inferior (Anillo 0 en procesadores AMD e Intel, que era el máximo nivel de ejecución cuando los procesadores no incorporaban apoyo para la virtualización).

Con la introducción de un nivel superior al que ya usaban los sistemas reales conseguimos que no sea necesario hacer ningún cambio a los sistemas invitados, pero ahora esos sistemas no tienen acceso a los dispositivos reales y es la CPU quién avisa al VMM cuando se quieren ejecutar instrucciones para acceder a los dispositivos desde los sistemas invitados y es el hipervisor quién se encarga de dar el acceso a los dispositivos virtuales o reales que correspondan.

Ejemplo:


Paravirtualización:

Son sistemas similares a los de virtualización completa, que ejecutan el sistema invitado con un hipervisor que se ejecuta sobre el sistema real.

La diferencia con el modelo anterior es que en este tipo de virtualización se modifica el sistema operativo invitado para incluir instrucciones relacionadas con la virtualización, de forma que en lugar que el hipervisor capture las instrucciones problemáticas, es el sistema invitado quién llama directamente al hipervisor cuando es necesario.

Evidentemente, con independencia de las modificaciones del núcleo del sistema invitado, los programas de usuario se pueden ejecutar sin ningún cambio.

Un caso extremo de este modelo de virtualización es el del UML (User-mode Linux), en el cual el núcleo del sistema invitado se transforma en una aplicación a nivel de usuario que hace la función de hipervisor y se encarga de emular el hardware, a pesar de que lo hace a nivel de la interfaz del sistema operativo y no a nivel de interfaz física (como el acceso a los dispositivos dentro del sistema invitado siempre se hace a través del núcleo no hace falta emular el hardware, sólo la visión que tienen de él los programas de usuario).

El gran problema de este modelo es que hace falta modificar el sistema operativo invitado, cosa que no es posible en algunos casos (por ejemplo, ¿cómo modificamos el código de Windows para que funcione con para-virtualización?).


Virtualización a nivel de sistema operativo:

En este tipo de sistemas sólo ejecutamos un núcleo (el del anfitrión) y este núcleo crea entornos de ejecución que las aplicaciones ven como máquinas virtuales.

En principio en este tipo de sistemas no hace falta emular el hardware a bajo nivel, puesto que en realidad es el mismo sistema operativo quién controla los dispositivos físicos. Lo que sí se suele hacer es incluir apoyo para tener dispositivos virtuales como discos o tarjetas de red dentro de cada entorno de ejecución.

La idea es que los programas se ejecutan en un entorno que hace creer a las aplicaciones que se encuentran en un sistema independiente cuando en realidad comparten recursos con otras máquinas virtuales, a pesar de que el sistema organiza las cosas para evitar que los entornos se interfieran entre ellos.

Este es uno de los modelos de virtualización más económico, puesto que no necesita apoyo del hardware ni hace falta supervisar el código abajo nivel, pero tiene el inconveniente que sólo permite ejecutar entornos virtuales para la misma CPU y sistema operativo y en realidad sólo hay un núcleo, de forma que si ese núcleo tiene un problema todas las máquinas virtuales se ven afectadas.

Ejemplos:


Probando el virtualizador QEMU

QEMU es un emulador de procesadores basado en la traducción dinámica de binarios (conversión del código binario de la arquitectura fuente en código entendible por la arquitectura huésped). QEMU también tiene capacidades de virtualización dentro de un sistema operativo, ya sea GNU/Linux, Windows, o cualquiera de los sistemas operativos admitidos; de hecho es la forma más común de uso. Esta máquina virtual puede ejecutarse en cualquier tipo de Microprocesador o arquitectura (x86, x86-64, PowerPC, MIPS, SPARC, etc.). Está licenciado en parte con la LGPL y la GPL de GNU.

Ahora vayamos con la instalación, pero primero lo primero, QEMU se maneja por la interfaz de la linea de comandos, pero no hay que preocuparse instalaremos una interfaz gráfica para facilitar las cosas.

Código: Bash
  1. sudo apt-get install qemu qemu-kvm virt-manager virt-viewer libvirt-clients

La instalación puede durar un tiempo considerable, así que lo mejor será esperar...

Una vez finalizada, tenemos un lindo icono en el menú de aplicaciones (Ya depende de su escritorio):

(https://imgur.com/drBZqJb.png)

Ejecutamos y tenemos una linda interfaz muy bien organizada y clara:

(https://i.imgur.com/8joTIUx.png)

Pueden ver que tengo Debian 10 (Buster) ya ejecutandose, pero tranquilos, lo haremos desde cero

Tenemos que presionar el botón que señalo en la imagen para crear una máquina virtual.

(https://i.imgur.com/ic2qyZg.png)

Al pinchar se nos mostrará otra ventana dónde tenemos que seleccionar el método de instalación:

(https://i.imgur.com/gnJn0Yp.png)

En nuestro caso elegiremos "Medio de instalación local".

(https://imgur.com/8wQSjT1.png)

Ajustamos la dirección de nuestra ISO y la distribución en que está basada. En mi caso deseo que haga una detección automática, pero en algunos casos necesitamos especificarla explicitamente, pero hay veces en que no sabemos o no está basada en ninguna distribución de la lista, por lo que tenemos la posibilidad de colocarlo en "Generic" cómo en la siguiente imagen.

(https://imgur.com/i0VEiWn.png)

Ahora debemos configurar el máximo de Memoria RAM y la cantidad de CPUs a utilizar:

(https://imgur.com/ACMHBKf.png)

Configuramos el máximo del almacenamiento:

(https://imgur.com/3Rn9yJE.png)

Ahora debemos confirmar el resumen, pero antes les aconsejo que pinchen adónde dice "Personalizar antes de instalar" para confirmar algunas cosas y evitar un error que les dará en caso de no hagamos lo que mostraré acontinuación.

(https://imgur.com/MUmxkG7.png)

Cómo ven es muy sencillo, deben configurar deacuerdo a lo que desean, pero si no saben *Inicien la instalación de una vez*, pero antes hagan el siguiente paso para evitar un error al bootear la distro:

(https://imgur.com/LjMM5xs.png)

Tildamos "Habilite menú de arranque" y lo demás, posteriormente aplicamos los cambios en el botón que dice "Aplicar" en la esquina inferior-derecha.

(https://imgur.com/tz8w1yd.png)

Listo, ya tenemos nuestro sistema instalado y listo para ejecutarse.

QEMU, no es el único programa para este fin, hay una gran variedad para diversos o los mismo propositos, pero esa desigualdad se ajusta a nosotros  ;)

Les dejo unos enlaces para que aprendan más sobre la virtualización y QEMU:

Wikipedia: https://es.wikipedia.org/wiki/QEMU (Mucho sobre QEMU)
Universitat de Valencia: https://www.uv.es/~sto/charlas/2010_CIM/hvl-cim-2010.html/index.html (Qué es virtualización, sus tipos y mucho software para este fin)

~ DtxdF