¿Qué es la virtualización kvm? Tipos de virtualización: OVZ y KVM. Instalación y configuración de un servidor virtual

Hipervisores, virtualización y nube

Análisis del hipervisor KVM

Serie de contenido:

Acerca de esta serie de artículos

Este ciclo comienza con información general sobre los tipos de hipervisores y virtualización de sistemas, y luego analiza las características de los cinco hipervisores, sus procesos de instalación y los problemas de gestión que pueden surgir.

Puede utilizar esta serie de artículos como punto de partida para comprender el papel del hipervisor en la virtualización de la nube o para explorar artículos individuales que le ayudarán a determinar qué hipervisor de la mejor manera posible adecuado para tareas específicas, resuelto en la nube.

Lo que necesitas saber para empezar

Basado en kernel Máquina virtual(KVM) es solución completa Virtualización dependiente de la plataforma para Linux en procesadores x86 con extensiones de virtualización (Intel VT o AMD-V). También está disponible para los invitados soporte limitado de paravirtualización para Linux y Windows en forma de un controlador de red paravirtual.

Actualmente, KVM se comunica con el kernel a través de un módulo de kernel cargable. Se admite una variedad de sistemas operativos invitados, como Linux, BSD, Solaris, Windows, Haiku, ReactOS y AROS Research. Sistema operativo. Se puede ejecutar una versión modificada de KVM (qemu) en Mac OS X.

Nota: KVM no realiza ninguna autoemulación; en cambio, un programa que se ejecuta en el espacio del usuario utiliza la interfaz /dev/kvm para configurar el espacio de direcciones del invitado. servidor virtual, toma sus recursos de E/S simulados y asigna su imagen a la imagen del host.

La arquitectura KVM se muestra en la Figura 1.

Figura 1. Arquitectura KVM
Paravirtualización

La paravirtualización es un método de virtualización que proporciona máquinas virtuales. interfaz de software, similar pero no idéntico al hardware subyacente. El propósito de esta interfaz modificada es reducir el tiempo que dedica el sistema operativo invitado a realizar operaciones que son mucho más difíciles de realizar en un entorno virtual que en un entorno no virtualizado.

Hay "ganchos" especiales que permiten a los sistemas huésped y anfitrión solicitar y confirmar la solución de estas complejas tareas que podrían realizarse en un entorno virtual, pero a un ritmo mucho más lento.

En la arquitectura KVM, la máquina virtual se ejecuta como un proceso normal de Linux, programado por el programador estándar de Linux. De hecho, cada procesador virtual aparece como un proceso normal de Linux. Esto permite que KVM aproveche todas las funciones núcleos de Linux.

Controles de emulación de dispositivos versión modificada qemu, que proporciona emulación de BIOS, bus PCI, bus USB, así como conjunto estándar dispositivos como controladores de disco IDE y SCSI, tarjetas de red, etc.

Funcionalidad

Las características principales de KVM se enumeran a continuación.

Seguridad

Dado que la máquina virtual se implementa como un proceso de Linux, utiliza modelo estándar Seguridad de Linux para el aislamiento y la gestión de recursos. Con SELinux (Linux con seguridad mejorada), el kernel de Linux agrega controles de acceso obligatorios, seguridad en capas y multicapa y administra la política de seguridad. SELinux proporciona un estricto aislamiento de recursos y limita la movilidad de los procesos que se ejecutan en el kernel de Linux.

El proyecto SVirt es un esfuerzo comunitario para integrar funciones de seguridad y virtualización de control de acceso obligatorio (MAC) en Basado en Linux(KVM): se basa en SELinux para proporcionar una infraestructura que permite a un administrador definir políticas de aislamiento de máquinas virtuales. SVirt está diseñado para garantizar que los recursos de la máquina virtual no sean accesibles a ningún otro proceso (o máquina virtual); el administrador puede ampliar esta política definiendo permisos granulares; por ejemplo, para que un grupo de máquinas virtuales comparta los mismos recursos.

Gestión de la memoria

KVM hereda potentes funciones de gestión de memoria de Linux. La memoria de la máquina virtual se almacena como la memoria de cualquier otro proceso de Linux y se puede intercambiar, copiar en páginas grandes para mejorar el rendimiento, compartir o almacenar en un archivo en el disco. Soporte para tecnología NUMA (Acceso a memoria no uniforme, arquitectura de memoria para sistemas multiprocesador) permite que las máquinas virtuales accedan de manera eficiente a grandes cantidades de memoria.

KVM admite las últimas funciones de virtualización de memoria de los fabricantes de procesadores, como Intel Extended Page Table (EPT) y AMD Rapid Virtualization Indexing (RVI), para minimizar la carga del procesador y lograr un alto rendimiento.

El uso compartido de páginas de memoria se admite mediante la función del kernel Kernel Same-page Merging (KSM). KSM escanea la memoria de cada máquina virtual y, si algunas páginas de memoria de las máquinas virtuales son idénticas, las combina en una sola página, que se vuelve común para estas máquinas virtuales y se almacena en una sola copia. Si sistema de invitados tratando de cambiar esto pagina general, le dan su propia copia.

Almacenamiento de datos

KVM puede utilizar cualquier medio compatible con Linux para almacenar imágenes de máquinas virtuales, incluido discos locales Con interfaces IDE, SCSI y SATA, almacenamiento conectado en red (NAS), incluidos NFS y SAMBA/CIFS, o SAN con soporte iSCSI y Fibre Channel. Se pueden utilizar E/S de subprocesos múltiples para mejorar el rendimiento y la redundancia del almacenamiento.

Nuevamente, dado que KVM es parte del kernel de Linux, se puede utilizar una infraestructura de almacenamiento probada y confiable, con el soporte de todos los proveedores líderes; Su variedad de funciones de almacenamiento ha sido probada en muchas instalaciones de producción.

KVM admite imágenes de máquinas virtuales en sistemas de archivos distribuidos, como Global File System (GFS2), para que puedan compartirse entre varios hosts o mediante volúmenes lógicos. Apoyo sintonia FINA (aprovisionamiento ligero) de imágenes de disco le permite optimizar el uso de los recursos de almacenamiento de datos, sin asignarlos todos a la vez por adelantado, sino solo cuando la máquina virtual lo requiera. El formato de disco propietario de KVM, QCOW2, admite instantáneas y proporciona múltiples niveles de instantáneas, compresión y cifrado.

Migración en vivo

KVM admite la migración en vivo, lo que permite que las máquinas virtuales en ejecución se muevan entre hosts físicos sin interrumpir el servicio. La migración en vivo es transparente para los usuarios: la máquina virtual permanece encendida, conexiones de red- activas y las aplicaciones de usuario continúan ejecutándose mientras la máquina virtual se traslada a un nuevo servidor físico.

Además de la migración en vivo, KVM admite guardar una copia del estado actual de la máquina virtual en el disco, lo que le permite almacenarla y restaurarla más tarde.

Controladores de dispositivos

KVM admite la virtualización híbrida cuando se instalan controladores paravirtualizados en el sistema operativo invitado, lo que permite que las máquinas virtuales utilicen una interfaz de E/S optimizada en lugar de dispositivos emulados, lo que proporciona rendimiento alto E/S para dispositivos de red y de bloque.

El hipervisor KVM utiliza el estándar VirtIO desarrollado por IBM y sombrero rojo en colaboración con la comunidad Linux para controladores paravirtualizados; Es una interfaz independiente del hipervisor para crear controladores de dispositivos, lo que permite que varios hipervisores compartan el mismo conjunto de controladores de dispositivos, mejorando la interoperabilidad entre invitados.

Los controladores VirtIO están incluidos en versiones modernas Los kernels de Linux (la última versión 2.6.25) se incluyen en Red Hat Enterprise Linux 4.8+ y 5.3+, y también están disponibles para Red Hat Enterprise Linux 3. Red Hat ha desarrollado controladores VirtIO para sistemas operativos invitados. Windows optimización de la red y operaciones de disco E/S; Estos controladores están certificados según el programa de certificación de Microsoft. Hardware de Windows Laboratorios de calidad (WHQL).

Rendimiento y escalabilidad

KVM hereda el rendimiento y la escalabilidad de Linux, soportando máquinas virtuales con 16 procesadores virtuales y 256 GB RAM, así como sistemas host con 256 núcleos y más de 1 TB de RAM. Puede proporcionar:

  • Rendimiento del 95 al 135 % en comparación con bare metal en aplicaciones empresariales reales como SAP, Oracle, LAMP y Microsoft Exchange;
  • más de un millón de mensajes por segundo y menos de 200 microsegundos de latencia en máquinas virtuales que se ejecutan en un servidor estándar;
  • niveles máximos de consolidación de más de 600 maquinas virtuales ejecutar aplicaciones empresariales en un único servidor.

Esto significa que KVM puede virtualizar las cargas de trabajo más exigentes.

Implementación de virtualización

Implementar KVM es un proceso bastante complejo, completo requisitos especiales a la configuración, así que consulte la sección para obtener más información.

Administrar máquinas virtuales

Hay varios administradores de máquinas virtuales. Entre ellos:

  • Gerente Virtual de la Univención;
  • qemu/KVM: se ejecuta directamente desde la línea de comando en la máquina KVM;
  • Virsh: un shell mínimo para gestionar máquinas virtuales;
  • Administrador de máquinas virtuales: de lo contrario, virt-manager, interfaz de usuario para gestionar máquinas virtuales.

Seleccionando KVM

Ventajas:

  • A pesar de que KVM es un hipervisor relativamente joven, módulo compacto, que cuando se combina con el kernel de Linux proporciona facilidad de implementación y al mismo tiempo mantiene el soporte para los pesos pesados ​​de Linux;
  • KVM es flexible; Debido a que los sistemas operativos invitados se comunican con un hipervisor integrado en el kernel de Linux, pueden acceder al hardware directamente en todos los casos sin necesidad de modificar el sistema operativo virtualizado. Esto hace que KVM sea más solución rápida para máquinas virtuales;
  • Los parches KVM son compatibles con el kernel de Linux. KVM está implementado en el propio kernel de Linux, lo que facilita la gestión de los procesos de virtualización.

Contras:

  • potentes herramientas para la gestión virtual y de servidores máquinas KVM no existe;
  • El soporte KVM necesita mejoras redes virtuales Y sistemas virtuales almacenamiento de datos, seguridad mejorada, confiabilidad y resiliencia mejoradas, administración de energía, soporte HPC/en tiempo real, escalabilidad de vCPU, compatibilidad entre proveedores, portabilidad de VM y la creación de un ecosistema de servicios en la nube.

En Ubuntu, se recomienda utilizar el hipervisor KVM (administrador de máquinas virtuales) y la biblioteca libvirt como herramientas de administración del mismo. Libvirt incluye un conjunto de API de software y aplicaciones de usuario para administrar máquinas virtuales (VM) virt-manager (interfaz gráfica, GUI) o virsh ( línea de comando,CLI). Como gerentes alternativos puede utilizar convirt (GUI) o convirt2 (interfaz WEB).

Actualmente, sólo el hipervisor KVM es oficialmente compatible con Ubuntu. Este hipervisor es parte del código del kernel operativo. sistemas linux. A diferencia de Xen, KVM no admite la paravirtualización, lo que significa que para poder utilizarlo, su CPU debe admitir tecnologías VT. Puedes comprobar si tu procesador soporta esta tecnología ejecutando el comando en la terminal:

Si recibe el siguiente mensaje como resultado:

INFORMACIÓN: /dev/kvm existe Se puede utilizar la aceleración KVM

Esto significa que KVM funcionará sin problemas.

Si recibió el siguiente mensaje a la salida:

Su CPU no admite extensiones KVM. NO se puede utilizar la aceleración KVM.

entonces aún podrás usar la máquina virtual, pero será mucho más lenta.

    Instalar sistemas de 64 bits como invitados

    Asigne más de 2 GB de RAM a sistemas invitados

Instalación

Sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

Se trata de una instalación en un servidor sin X, es decir, que no incluye interfaz gráfica. Puedes instalarlo con el comando.

Sudo apt-get install virt-manager

Después de eso, aparecerá el elemento "Administrador de máquina virtual" en el menú y, con un alto grado de probabilidad, todo funcionará. Si aún surge algún problema, deberá leer las instrucciones en la wiki en inglés.

Creando un sistema de invitados

El procedimiento para crear un sistema invitado utilizando la GUI es bastante sencillo.

Pero el modo texto se puede describir.

qcow2

Al crear un sistema utilizando una GUI como disco duro se propone seleccionar un archivo de imagen existente o bloquear un dispositivo, o crear nuevo archivo con datos sin procesar (RAW). Sin embargo, esto está lejos de ser el único formato disponible archivos. De todos los tipos de discos enumerados en man qemu-img, el más flexible y moderno es qcow2. Admite instantáneas, cifrado y compresión. Debe crearse antes de crear un nuevo invitado.

Qemu-img crear -o preallocation=metadatos -f qcow2 qcow2.img 20G

Según el mismo hombre qemu-img, la preasignación de metadatos (-o preallocation=metadata) hace que el disco inicialmente sea un poco más grande, pero proporciona mejor rendimiento en esos momentos en los que la imagen necesita crecer. De hecho, en en este caso Esta opción le permite evitar un error desagradable. Imagen creada Inicialmente ocupa menos de un megabyte de espacio y crece hasta el tamaño especificado según sea necesario. El sistema de invitados debería ver inmediatamente este final tamaño especificado, sin embargo, durante la fase de instalación puede ver el tamaño real del archivo. Naturalmente, instale en disco duro Rechazará un tamaño de 200 kB. El error no es específico de Ubuntu; aparece al menos en RHEL.

Además del tipo de imagen, posteriormente puede elegir el método para conectarla: IDE, SCSI o Virtio Disk. El rendimiento del subsistema de disco dependerá de esta elección. No existe una respuesta correcta definitiva; debe elegir según la tarea que se asignará al sistema de invitados. Si el sistema invitado se crea "para mirar", entonces cualquier método servirá. En general, la E/S suele ser el cuello de botella de una máquina virtual, por lo que al crear un sistema muy cargado, este problema debe tratarse de la manera más responsable posible.

En este artículo introductorio hablaré brevemente sobre todos software, utilizado en el proceso de desarrollo del servicio. Se discutirán con más detalle en los siguientes artículos.

Por qué ? Este Sistema operativo Es cercano y comprensible para mí, por eso a la hora de elegir una distribución, no hubo tormento, tormento ni vueltas. No tiene ninguna ventaja particular sobre Red Hat Enterprise Linux, pero se decidió trabajar con un sistema familiar.

Si planea implementar su propia infraestructura utilizando tecnologías similares, le recomendaría elegir RHEL: gracias a una buena documentación y bien escrita. programas de aplicacion Esto será, si no un orden de magnitud, ciertamente el doble de simple, y gracias al sistema de certificación desarrollado, será posible encontrar sin mucha dificultad varios especialistas que estén familiarizados con el nivel adecuado con este sistema operativo.

Nosotros, nuevamente, decidimos usar Expresión de Debian con un conjunto de paquetes de Sid/Experimental y algunos paquetes respaldados y compilados con nuestros parches.
Hay planes para publicar un repositorio con paquetes.

Al elegir la tecnología de virtualización, se consideraron dos opciones: Xen y KVM.

Además, se tuvo en cuenta el hecho de que había una gran cantidad de desarrolladores, proveedores de alojamiento y soluciones comerciales basadas en Xen: lo más interesante era implementar una solución basada en KVM.

La razón principal por la que decidimos utilizar KVM es la necesidad de ejecutar máquinas virtuales con FreeBSD y, en el futuro, MS Windows.

Para administrar máquinas virtuales resultó sumamente conveniente utilizar productos que utilicen su API: virsh, administrador-virtual, instalación virt, pr.

Este es un sistema que almacena la configuración de las máquinas virtuales, las administra, mantiene estadísticas sobre ellas, se asegura de que la interfaz de la máquina virtual esté activa al inicio, conecta dispositivos a la máquina; en general, hace un montón de cosas. trabajo útil y un poco más encima.

Por supuesto, la solución no es perfecta. Las desventajas incluyen:

  • Mensajes de error absolutamente locos.
  • Incapacidad para cambiar parte de la configuración de la máquina virtual sobre la marcha, aunque QMP (QEMU Monitor Protocol) lo permite.
  • A veces, por alguna razón desconocida, es imposible conectarse a libvirtd: deja de responder a eventos externos.

El principal problema al implementar el servicio desde el principio fue la limitación de recursos para las máquinas virtuales. En Xen, este problema se resolvió con la ayuda de un programador interno que distribuye recursos entre máquinas virtuales, y lo mejor es que también se implementó la capacidad de limitar las operaciones del disco.

No existía nada parecido en KVM hasta la llegada del mecanismo de asignación de recursos del kernel. Como es habitual en Linux, el acceso a estas funciones se implementó a través de un especial sistema de archivos grupo c, en el que, utilizando las llamadas normales al sistema write(), se podría agregar un proceso a un grupo, asignarle su peso de loro, especificar el núcleo en el que se ejecutará, especificar el ancho de banda del disco que puede usar el proceso o, nuevamente , asígnale un peso.

El beneficio es que todo esto se implementa dentro del kernel y se puede usar no solo para el servidor, sino también para el escritorio (que se usó en el famoso "El parche del kernel de Linux de ~200 líneas que hace maravillas"). Y en mi opinión, este es uno de los cambios más significativos en la rama 2.6, sin contar mi favorito #12309, ni el archivo de otro sistema de archivos. Bueno, tal vez, excepto POHMELFS (pero simplemente por el nombre).

Mi actitud hacia esta biblioteca de utilidades es muy ambigua.

Por un lado se parece a esto:

Y esto también es muy difícil de construir desde el código fuente, y mucho menos en un paquete: a veces me parece que Linux From Scratch es un poco más fácil de construir desde cero.

Por otro lado, es algo muy poderoso que te permite crear imágenes para máquinas virtuales, modificarlas, comprimirlas, instalar grub, modificar la tabla de particiones, administrar archivos de configuración, transferir máquinas de "hierro" a entorno virtual, transferir máquinas virtuales de una imagen a otra, transferir máquinas virtuales de una imagen al hardware y, francamente, aquí mi imaginación me decepciona un poco. Ah, sí: también puedes ejecutar un demonio dentro de un servidor virtual. máquinas linux y acceder a los datos de la máquina virtual en vivo, y hacer todo esto en shell, python, perl, java, ocaml. Esto es corto y está lejos de lista completa qué se puede hacer con.

Me pregunto que mayoría El código se genera en el momento del montaje, así como la documentación del proyecto. Ocaml y perl se utilizan ampliamente. El código en sí está escrito en C, que luego se empaqueta en OCaml, y las piezas repetidas de código se generan por sí mismas. El trabajo con imágenes se realiza lanzando una imagen de servicio especial (aparato supermin), a la que se envían comandos a través de un canal. Esta imagen de rescate contiene un determinado conjunto de utilidades, como parted, mkfs y otras útiles para un administrador del sistema.

Recientemente incluso comencé a usarlo en casa, cuando extraje los datos que necesitaba de la imagen de nandroid. Pero esto requiere un kernel habilitado para yaffs.

Otro

A continuación se muestran algunos más enlaces interesantes para obtener una descripción del software utilizado, léalo y estúdielo usted mismo, si está interesado. Por ejemplo,

Digamos que eres un estudiante joven, pero aún pobre, lo que significa que de todas las plataformas posibles solo tienes una PC con Windows y PS4. Un buen día decides entrar en razón y convertirte en programador, pero los sabios de Internet te dijeron que no puedes convertirte en un ingeniero normal sin Linux. No puede instalar Fedora como su sistema principal y único, porque Windows todavía es necesario para los juegos y VKontakte, y el miedo o la falta de experiencia le impide instalar Linux como un segundo sistema en su disco duro.

O, digamos, ya has crecido, ahora eres el jefe de servidores en gran empresa, y un buen día te das cuenta de que la mayoría de los servidores ni siquiera están medio cargados. Correo más aplicaciones y no se pueden almacenar datos en los servidores por razones de seguridad, y los costos de soporte y mantenimiento de una granja de servidores en crecimiento están aumentando rápidamente.

O digamos que ya tienes barba y gafas, director técnico y no está satisfecho con lo que obtienen los desarrolladores al implementar una nueva aplicación nuevo servidor hay que esperar dos meses. ¿Cómo avanzar rápidamente en tales condiciones?

O tal vez sea un arquitecto que diseñó un nuevo sistema complejo para procesar análisis de negocios. Su sistema incluye cosas como ElasticSearch, Kafka, Spark y mucho más, y cada componente debe vivir por separado, configurarse de manera inteligente y comunicarse con otros componentes. Como buen ingeniero, comprende que no basta con instalar todo este zoológico directamente en su sistema. Debe intentar implementar un entorno lo más cercano posible al futuro entorno de producción y, preferiblemente, para que sus desarrollos funcionen sin problemas en los servidores de producción.

¿Y qué hacer en todas estas situaciones difíciles? Correcto: use la virtualización.

La virtualización le permite instalar muchos sistemas operativos completamente aislados entre sí y ejecutándose uno al lado del otro en el mismo hardware.

Un poco de historia. Las primeras tecnologías de virtualización aparecieron ya en los años 60, pero su verdadera necesidad apareció recién en los años 90, a medida que el número de servidores crecía cada vez más. Fue entonces cuando surgió el problema de reciclar eficazmente todo el hardware, así como optimizar los procesos de actualización, implementación de aplicaciones, garantizar la seguridad y restaurar los sistemas en caso de desastre.

Dejemos detrás de escena la larga y dolorosa historia del desarrollo de diversas tecnologías y métodos de virtualización; para el lector curioso, al final del artículo habrá materiales adicionales sobre este tema. Lo importante es el resultado final: tres enfoques principales de la virtualización.

Enfoques de la virtualización

Independientemente del enfoque y la tecnología, cuando se utiliza la virtualización siempre hay una máquina host y un hipervisor instalado que controla las máquinas invitadas.

Dependiendo de la tecnología utilizada, un hipervisor puede ser un software independiente instalado directamente en el hardware o parte del sistema operativo.

Un lector atento al que le gusten las palabras de moda empezará a murmurar después de un par de párrafos que sus contenedores Docker favoritos también se consideran virtualización. Hablaremos de tecnologías de contenedores en otro momento, pero sí, tienes razón, atento lector, los contenedores también son una especie de virtualización, solo que a nivel de recursos del mismo sistema operativo.

Hay tres formas en que las máquinas virtuales interactúan con el hardware:

Transmisión dinámica

En este caso, las máquinas virtuales no tienen idea de que son virtuales. El hipervisor intercepta todos los comandos de la máquina virtual sobre la marcha y los procesa, los reemplaza por otros seguros y luego los devuelve a la máquina virtual. Este enfoque obviamente sufre algunos problemas de rendimiento, pero le permite virtualizar cualquier sistema operativo, ya que no es necesario modificar el sistema operativo invitado. La traducción dinámica se utiliza en los productos VMWare, el líder en software de virtualización comercial.

Paravirtualización

En el caso de la paravirtualización código fuente El sistema operativo invitado se modifica especialmente para que todas las instrucciones se ejecuten de la manera más eficiente y segura posible. Al mismo tiempo, la mujer virtual siempre es consciente de que es una mujer virtual. Uno de los beneficios es un mejor rendimiento. La desventaja es que de esta forma no se pueden virtualizar, por ejemplo, MacOS o Windows, ni ningún otro SO cuyo código fuente no sea accesible. La paravirtualización de una forma u otra se utiliza, por ejemplo, en Xen y KVM.

Virtualización de hardware

Los desarrolladores de procesadores se dieron cuenta a tiempo de que la arquitectura x86 no es adecuada para la virtualización, ya que inicialmente fue diseñada para un sistema operativo a la vez. Por lo tanto, después de que apareciera la traducción dinámica de VMWare y la paravirtualización de Xen, Intel y AMD comenzaron a lanzar procesadores con soporte de hardware para virtualización.

Al principio, esto no supuso un gran aumento en el rendimiento, ya que el objetivo principal de los primeros lanzamientos era mejorar la arquitectura del procesador. Sin embargo, ahora, más de 10 años después el surgimiento de intel VT-x y AMD-V, la virtualización de hardware no es de ninguna manera inferior e incluso superior en algunos aspectos a otras soluciones.

La virtualización de hardware utiliza y requiere KVM (máquina virtual basada en kernel), que utilizaremos en el futuro.

Máquina virtual basada en kernel

KVM es una solución de virtualización integrada en el kernel de Linux que es tan funcional como otras soluciones y superior en usabilidad. Además, KVM es fuente abierta una tecnología que, sin embargo, avanza a toda velocidad (tanto en términos de codificación como de marketing) y que está siendo implementada en sus productos de la mano de Red Hat.

Esta, por cierto, es una de las muchas razones por las que insistimos en las distribuciones de Red Hat.

Los creadores de KVM se centraron inicialmente en soportar la virtualización de hardware y no reinventaron muchas cosas. Un hipervisor, en esencia, es un pequeño sistema operativo que debe poder funcionar con memoria, redes, etc. linux ya sabe cómo hacer todo esto perfectamente, por lo que usar el kernel de Linux como hipervisor es lógico y hermoso solución técnica. cada virtual máquina KVM-está simplemente separado proceso de linux, la seguridad se proporciona mediante SELinux/sVirt, los recursos se gestionan mediante CGroups.

Hablaremos más sobre SELinux y CGroups en otro artículo, no te alarmes si no conoces estas palabras.

KVM no sólo funciona como parte del kernel de Linux: desde la versión 2.6.20 del kernel, KVM ha sido un componente central de Linux. En otras palabras, si tienes Linux, entonces ya tienes KVM. Conveniente, ¿verdad?

Vale la pena decir que en el campo de las plataformas de nube pública, Xen domina un poco más que por completo. Por ejemplo, AWS EC2 y Rackspace usan Xen. Esto se debe al hecho de que Xen apareció antes que los demás y fue el primero en alcanzar un nivel suficiente de rendimiento. Pero hay buenas noticias: en noviembre de 2017, Xen sustituirá gradualmente al mayor proveedor de nube.

Aunque KVM usa virtualización de hardware, para algunos controladores de dispositivos de E/S, KVM puede usar paravirtualización, lo que proporciona ganancias de rendimiento para ciertos casos de uso.

libvirt

Ya casi hemos llegado a la parte práctica del artículo, solo queda considerar otra herramienta de código abierto: libvirt.

libvirt es un conjunto de herramientas que proporciona una única API para muchas tecnologías de virtualización diferentes. Al usar libvirt, en principio, no importa cuál sea el "backend": Xen, KVM, VirtualBox o cualquier otra cosa. Además, puede utilizar libvirt dentro de programas Ruby (y también Python, C++ y muchos más). También puede conectarse a máquinas virtuales de forma remota a través de canales seguros.

Por cierto, libvirt está siendo desarrollado por Red Hat. ¿Ya instaló Fedora Workstation como su sistema principal?

Creemos una máquina virtual.

libvirt es sólo una API, pero depende del usuario cómo interactuar con ella. Hay muchas opciones. Usaremos varios utilidades estándar. Le recordamos: insistimos en utilizar distribuciones de Red Hat (CentOS, Fedora, RHEL) y los siguientes comandos fueron probados en uno de estos sistemas. Para otros Distribuciones de Linux pueden ocurrir ligeras diferencias.

Primero, verifiquemos si se admite la virtualización de hardware. De hecho, funcionará sin su soporte, sólo que mucho más lento.

egrep --color = auto "vmx|svm|0xc0f" /proc/cpuinfo # si no se muestra nada, entonces no hay soporte :(

Dado que KVM es un módulo del kernel de Linux, debe verificar si ya está cargado y, si no, cargarlo.

lsmod | grepkvm # kvm, kvm_intel, kvm_amd. Si no aparece nada, entonces necesitas descargar módulos requeridos # Si el módulo no está cargado modprobe kvm modprobe kvm_intel # o modprobe kvm_amd

Es posible que la virtualización de hardware esté deshabilitada en el BIOS. Por lo tanto, si los módulos kvm_intel/kvm_amd no están cargados, verifique la configuración del BIOS.

Ahora instalemos paquetes requeridos. La forma más sencilla de hacerlo es instalar un grupo de paquetes a la vez:

lista de grupos yum "Virtual*"

La lista de grupos depende del sistema operativo utilizado. mi grupo fue llamado Virtualización. Para administrar máquinas virtuales desde la línea de comando, use la utilidad virsh. Compruebe si tiene al menos una máquina virtual usando el comando virsh list. Lo más probable es que no.

Si no le gusta la línea de comandos, también existe virt-manager, una GUI muy conveniente para máquinas virtuales.

virsh puede crear máquinas virtuales sólo desde archivo XML s, cuyo formato se puede estudiar en la documentación de libvirt. Afortunadamente, también existe virt-manager y el comando virt-install. Puede descubrir la GUI usted mismo, pero aquí hay un ejemplo del uso de virt-install:

sudo virt-install --name mkdev-vm-0 \ --location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \ --memory = 1024 --vcpus = 1 \ --disk size = 8

En lugar de especificar el tamaño del disco, puede crearlo de antemano mediante virt-manager o mediante virsh y un archivo XML. Utilicé la imagen de arriba de Centos 7 minimal, que es fácil de encontrar en el sitio web de Centos.

Ahora queda una pregunta importante: ¿cómo conectarse a la máquina creada? La forma más sencilla de hacerlo es a través de virt-manager: simplemente haga doble clic en la máquina creada y se abrirá una ventana con una conexión SPICE. La pantalla de instalación del sistema operativo te espera allí.

Por cierto, KVM puede anidar virtualización: máquinas virtuales dentro de una máquina virtual. ¡Necesitamos profundizar más!

Después de instalar el sistema operativo manualmente, inmediatamente se preguntará cómo se puede automatizar este proceso. Para hacer esto necesitamos una utilidad llamada Kickstart, diseñada para automáticamente configuración inicial SO. Este es un archivo de texto simple en el que puede especificar la configuración del sistema operativo, hasta varios guiones, realizado después de la instalación.

Pero, ¿dónde puedo conseguir ese archivo? ¿Por qué no escribirlo desde cero? Por supuesto que no: dado que ya hemos instalado Centos 7 dentro de nuestra máquina virtual, solo necesitamos conectarnos a ella y buscar el archivo /root/anaconda-ks.cfg; esta es la configuración de Kickstart para poder crear una copia de lo que ya hemos instalado. SO creado. Sólo necesitas copiarlo y editar el contenido.

Pero simplemente copiar un archivo es aburrido, así que le agregaremos algo más. El caso es que por defecto no podremos conectarnos a la consola de la máquina virtual creada desde la línea de comando de la máquina host. Para hacer esto, necesita editar la configuración. gestor de arranque GRUB. Por lo tanto, al final del archivo Kickstart agregaremos la siguiente sección:

%post --log = /root/grubby.log /sbin/grubby --update-kernel = ALL --args = "console=ttyS0" %end

%post , como puedes imaginar, se ejecutará después de instalar el sistema operativo. El comando grubby actualizará la configuración de GRUB para agregar la capacidad de conectarse a la consola.

Por cierto, también puede especificar la posibilidad de conectarse a través de la consola directamente durante la creación de la máquina virtual. Para hacer esto, necesita pasar un argumento más al comando virt-install: --extra-args="console=ttyS0" . Después de esto, puede instalar el sistema operativo en el interactivo modo texto desde la terminal de su máquina host, conectándose a la máquina virtual a través de la consola virsh inmediatamente después de su creación. Esto es especialmente útil cuando crea máquinas virtuales en un servidor de hardware remoto.

¡Ahora puedes aplicar la configuración creada! virt-install le permite pasar argumentos adicionales al crear una máquina virtual, incluida la ruta al archivo Kickstart.

sudo virt-install --name mkdev-vm-1 \ --location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \ --initrd-inject /path/to/ks.cfg \ --extra- args ks = archivo:/ks.cfg \ --memory = 1024 --vcpus = 1 --tamaño del disco = 8

Una vez creada la segunda máquina virtual (de forma totalmente automática), puede conectarse a ella desde la línea de comando utilizando el comando virsh console vm_id. vm_id Puede averiguarlo en la lista de todas las máquinas virtuales utilizando el comando virsh list.

Uno de los beneficios de usar KVM/libvirt es la increíble documentación, incluida la producida por Red Hat. Se invita al querido lector a estudiarlo con la debida curiosidad.

Por supuesto, crear máquinas virtuales como esta manualmente en la consola y luego configurarlas solo usando Kickstart no es el proceso más conveniente. En artículos futuros, veremos muchas herramientas interesantes que hacen que la configuración del sistema sea más fácil y completamente automatizada.

¿Qué sigue?

Es imposible reunir en un solo artículo todo lo que vale la pena saber sobre la virtualización. Analizamos varias opciones para usar la virtualización y sus ventajas, profundizamos un poco más en los detalles de su funcionamiento y nos familiarizamos con la mejor, en nuestra opinión, solución para estas tareas (KVM), e incluso creamos y configuramos una máquina virtual.

Es importante comprender que las máquinas virtuales son los componentes básicos de las arquitecturas de nube modernas. Permiten que las aplicaciones crezcan automáticamente a tamaños ilimitados, maximizando de una manera rapida y con la máxima utilización de todos los recursos.

No importa cuán poderoso y rico en servicios sea AWS, su base son las máquinas virtuales sobre Xen. Cada vez que crea una nueva gota en DigitalOcean, está creando una máquina virtual. Casi todos los sitios que utiliza están alojados en máquinas virtuales. La simplicidad y flexibilidad de las máquinas virtuales permite no sólo construir sistemas de producción, sino que también facilita diez veces el desarrollo y las pruebas locales, especialmente cuando el sistema involucra muchos componentes.

Aprendimos cómo crear una sola máquina, lo que no está mal para probar una aplicación. ¿Pero qué pasa si necesitamos varias máquinas virtuales a la vez? ¿Cómo se comunicarán entre sí? ¿Cómo se encontrarán? Para hacer esto, necesitaremos comprender cómo funcionan las redes en general, cómo funcionan en el contexto de la virtualización y qué componentes están involucrados en este trabajo y deben configurarse, en el siguiente artículo de la serie.

En este artículo introductorio, presentaré brevemente todas las herramientas de software utilizadas en el proceso de desarrollo del servicio. Se discutirán con más detalle en los siguientes artículos.

Por qué ? Este sistema operativo me resulta cercano y comprensible, por lo que no hubo tormento, tormento ni sacudidas a la hora de elegir una distribución. No tiene ninguna ventaja particular sobre Red Hat Enterprise Linux, pero se decidió trabajar con un sistema familiar.

Si planea implementar de forma independiente una infraestructura utilizando tecnologías similares, le recomendaría que elija RHEL: gracias a una buena documentación y programas de aplicación bien escritos, será, si no en un orden de magnitud, ciertamente dos veces más simple, y Gracias al sistema de certificación desarrollado, puede encontrar fácilmente varios especialistas que estén familiarizados con este sistema operativo en el nivel adecuado.

Nosotros, nuevamente, decidimos usar Expresión de Debian con un conjunto de paquetes de Sid/Experimental y algunos paquetes respaldados y compilados con nuestros parches.
Hay planes para publicar un repositorio con paquetes.

Al elegir la tecnología de virtualización, se consideraron dos opciones: Xen y KVM.

Además, se tuvo en cuenta el hecho de que había una gran cantidad de desarrolladores, proveedores de alojamiento y soluciones comerciales basadas en Xen: lo más interesante era implementar una solución basada en KVM.

La razón principal por la que decidimos utilizar KVM es la necesidad de ejecutar máquinas virtuales con FreeBSD y, en el futuro, MS Windows.

Para administrar máquinas virtuales resultó sumamente conveniente utilizar productos que utilicen su API: virsh, administrador-virtual, instalación virt, pr.

Este es un sistema que almacena la configuración de las máquinas virtuales, las administra, mantiene estadísticas sobre ellas, se asegura de que la interfaz de la máquina virtual esté activa al iniciarse, conecta dispositivos a la máquina; en general, hace un gran trabajo útil. y un poco más encima.

Por supuesto, la solución no es perfecta. Las desventajas incluyen:

  • Mensajes de error absolutamente locos.
  • Incapacidad para cambiar parte de la configuración de la máquina virtual sobre la marcha, aunque QMP (QEMU Monitor Protocol) lo permite.
  • A veces, por alguna razón desconocida, es imposible conectarse a libvirtd: deja de responder a eventos externos.

El principal problema al implementar el servicio desde el principio fue la limitación de recursos para las máquinas virtuales. En Xen, este problema se resolvió con la ayuda de un programador interno que distribuye recursos entre máquinas virtuales, y lo mejor es que también se implementó la capacidad de limitar las operaciones del disco.

No existía nada parecido en KVM hasta la llegada del mecanismo de asignación de recursos del kernel. Como es habitual en Linux, el acceso a estas funciones se implementó a través de un sistema de archivos especial. grupo c, en el que, utilizando las llamadas normales al sistema write(), se podría agregar un proceso a un grupo, asignarle su peso de loro, especificar el núcleo en el que se ejecutará, especificar el ancho de banda del disco que puede usar el proceso o, nuevamente , asígnale un peso.

El beneficio es que todo esto se implementa dentro del kernel y se puede usar no solo para el servidor, sino también para el escritorio (que se usó en el famoso "El parche del kernel de Linux de ~200 líneas que hace maravillas"). Y en mi opinión, este es uno de los cambios más significativos en la rama 2.6, sin contar mi favorito #12309, ni el archivo de otro sistema de archivos. Bueno, tal vez, excepto POHMELFS (pero simplemente por el nombre).

Mi actitud hacia esta biblioteca de utilidades es muy ambigua.

Por un lado se parece a esto:

Y esto también es muy difícil de construir desde el código fuente, y mucho menos en un paquete: a veces me parece que Linux From Scratch es un poco más fácil de construir desde cero.

Por otro lado, es algo muy poderoso que le permite crear imágenes para máquinas virtuales, modificarlas, comprimirlas, instalar grub, modificar la tabla de particiones, administrar archivos de configuración, transferir máquinas de hardware a un entorno virtual, transferir máquinas virtuales. de una imagen a otra, transferir máquinas virtuales de la imagen al hardware y, para ser honesto, aquí mi imaginación me decepciona un poco. Ah, sí: también puedes ejecutar un demonio dentro de una máquina virtual Linux y acceder a los datos de la máquina virtual en vivo, y hacer todo esto en shell, python, perl, java, ocaml. Esta es una lista breve y de ninguna manera exhaustiva de lo que puede hacer con .

Curiosamente, la mayor parte del código se genera en el momento del ensamblaje, así como la documentación del proyecto. Ocaml y perl se utilizan ampliamente. El código en sí está escrito en C, que luego se empaqueta en OCaml, y las piezas repetidas de código se generan por sí mismas. El trabajo con imágenes se realiza lanzando una imagen de servicio especial (aparato supermin), a la que se envían comandos a través de un canal. Esta imagen de rescate contiene un determinado conjunto de utilidades, como parted, mkfs y otras útiles para un administrador del sistema.

Recientemente incluso comencé a usarlo en casa, cuando extraje los datos que necesitaba de la imagen de nandroid. Pero esto requiere un kernel habilitado para yaffs.

Otro

A continuación se muestran algunos enlaces más interesantes a una descripción del software utilizado; léalo y estúdielo usted mismo si está interesado. Por ejemplo,




Arriba