{"id":38018,"date":"2013-06-26T14:27:57","date_gmt":"2013-06-26T12:27:57","guid":{"rendered":"https:\/\/www.mugaict.com\/synetosviluppo\/kvm-on-storage-os\/"},"modified":"2013-06-26T14:27:57","modified_gmt":"2013-06-26T12:27:57","slug":"kvm-on-storage-os","status":"publish","type":"post","link":"https:\/\/syneto.eu\/es\/kvm-on-storage-os\/","title":{"rendered":"KVM en Storage OS"},"content":{"rendered":"

Supongo que ha llegado el momento de compartir con el mundo algunas de nuestras experiencias t\u00e9cnicas mientras sacamos nuevas funcionalidades en Storage OS. Me detendr\u00e9 en nuestra \u00faltima incorporaci\u00f3n a Storage OS: la virtualizaci\u00f3n local.<\/p>\n

\u00bfQu\u00e9 significa esto realmente?<\/h3>\n

Pues bien, ahora puede ejecutar m\u00e1quinas virtuales en el propio dispositivo de almacenamiento sin ninguna infraestructura adicional. Esta era una necesidad real que ten\u00edan la mayor\u00eda de nuestros clientes peque\u00f1os y medianos. Deshacerse de los 2-3 servidores que proporcionan compartici\u00f3n de archivos, directorio activo o algunos otros servicios y virtualizarlos. Pero, \u00bfc\u00f3mo podemos llevar esto a nuestro sistema operativo de almacenamiento?<\/p>\n

Obviamente, este concepto no es nuevo. Oracle tiene Virtual Box y es bastante bueno. Tuvimos algunos intentos con \u00e9l, pero no est\u00e1bamos realmente satisfechos con el rendimiento general y sus capacidades de gesti\u00f3n. As\u00ed que buscamos en otras direcciones. La opci\u00f3n mejor y m\u00e1s estable era KVM (kernel virtual machine). KVM es una tecnolog\u00eda que funciona en Linux desde hace mucho tiempo y es uno de los hipervisores m\u00e1s estables y eficaces que existen. Realmente tenemos que dar cr\u00e9dito a Joyent por hacer la portabilidad inicial de KVM a Illumos, hicieron un trabajo incre\u00edble, me quito el sombrero. Tambi\u00e9n lo utilizan para sus m\u00e1quinas inteligentes. Lo que realmente me sorprendi\u00f3 fue que durante la portabilidad los chicos mencionaron que no encontraron ni un solo error o problema en todo el KVM. Eso es algo, teniendo en cuenta que durante una portabilidad se toca cada l\u00ednea de c\u00f3digo.<\/p>\n


\n

La cuesti\u00f3n del almacenamiento<\/h3>\n

Una vez portado el n\u00facleo, tuvimos que crear la infraestructura para gestionar m\u00e1quinas virtuales en Storage OS. Nuestro primer dilema fue: \u00bfcu\u00e1l ser\u00eda el almac\u00e9n de respaldo de una m\u00e1quina virtual? Inicialmente decidimos utilizar un Vdisk (un volumen ZFS) como almac\u00e9n de respaldo. Al principio parec\u00eda una buena idea. Puedes configurarlo como thick o thin provisioning, lo que te apetezca. \u00bfQu\u00e9 pasar\u00eda si necesitas m\u00e1s tama\u00f1o? Bueno, puedes ampliar f\u00e1cilmente un Vdisk y luego asignar el nuevo espacio dentro del propio sistema operativo invitado. Usamos \/dev\/zvol\/rdsk como la ruta del dispositivo raw para la imagen de disco.<\/p>\n


\n

Control y configuraci\u00f3n de m\u00e1quinas virtuales locales<\/h3>\n

Nuestra siguiente pregunta era: ahora que tenemos el almac\u00e9n de respaldo en su lugar, \u00bfc\u00f3mo podemos controlar el estado y la configuraci\u00f3n de una m\u00e1quina virtual? Trabajando con Illumos (ya que Storage OS utiliza el kernel de Illumos) desde hace unos a\u00f1os, entiendo que s\u00f3lo hay una forma real de manejar los procesos de larga ejecuci\u00f3n y que es el uso de SMF (Service Management Facility).\u00a0SMF<\/a> es una de las mejores cosas que hay en cuanto a gesti\u00f3n de servicios en distribuciones basadas en Solaris. Para cada m\u00e1quina virtual creamos un servicio SMF. Mantuvimos la configuraci\u00f3n en un grupo de propiedades config. La RAM configurada, las im\u00e1genes ISO montadas, el orden de arranque, la configuraci\u00f3n de red eran todas propiedades del servicio. El m\u00e9todo de inicio del servicio analizaba la configuraci\u00f3n y generaba el comando para iniciar qemu-kvm para esa m\u00e1quina virtual. Una cosa a notar es que ninguna de las herramientas para crear, desplegar o gestionar m\u00e1quinas virtuales, desde distribuciones Linux KVM, est\u00e1n presentes en Illumos ya que libvirt no est\u00e1 portado. Esta fue otra raz\u00f3n por la que tuvimos que construir nuestras propias herramientas.<\/p>\n


\n

El reto de la comunicaci\u00f3n<\/h3>\n

Nuestro siguiente gran reto era c\u00f3mo comunicarnos con la m\u00e1quina virtual mientras se ejecuta. La elecci\u00f3n obvia era utilizar Qemu QMP<\/a>. Se trata de un protocolo basado en JSON que permitir\u00eda a las aplicaciones comunicarse con instancias de Qemu (m\u00e1quinas virtuales). Escribimos un nuevo m\u00f3dulo que usa sockets UNIX para comunicarse con las m\u00e1quinas virtuales usando QMP. Tuvimos muchos desaf\u00edos aqu\u00ed ya que QMP no est\u00e1 terminado, hay algunos comandos que faltan en el propio protocolo, pero nos las arreglamos para superarlos. Usando comandos generados por JSON pudimos controlar las m\u00e1quinas virtuales: a\u00f1adiendo nuevos dispositivos, emitiendo comandos ACPI y dem\u00e1s. Un problema interesante al que nos enfrentamos aqu\u00ed fue cuando varios procesos diferentes se conectaban al mismo socket para operar cosas en la misma m\u00e1quina virtual. Tuvimos que tener cuidado en c\u00f3mo controlar el acceso de los procesos para que fueran exclusivos.<\/p>\n


\n

El dilema de la gesti\u00f3n de la memoria<\/h3>\n

Bien, ahora que tenemos todas estas hermosas m\u00e1quinas virtuales en funcionamiento, \u00bfc\u00f3mo gestionar\u00edamos la memoria del almacenamiento host? \u00bfQu\u00e9 pasa cuando un usuario se pone fren\u00e9tico y empieza a encender suficientes m\u00e1quinas virtuales para consumir toda la memoria del host? Otro problema interesante en un almacenamiento que utilice ZFS ser\u00eda la gesti\u00f3n de la memoria utilizada por ZFS ARC. ZFS es muy agresivo en el uso de la RAM. Normalmente no limitar\u00edas el tama\u00f1o del ARC en un almacenamiento normal ya que ZFS liberar\u00eda la memoria a medida que otras aplicaciones la demanden. Pero cuando sabes de antemano que necesitas esa memoria, es normal dar instrucciones a ZFS para que no la use m\u00e1s. Lo que hicimos fue construir un provisionador de memoria din\u00e1mico para las m\u00e1quinas virtuales. Tan pronto como se enciende una m\u00e1quina virtual el provisionador de memoria comprobar\u00e1 si tiene suficiente memoria reservada para el propio sistema operativo y al menos 0,2 de la memoria total disponible para el ARC despu\u00e9s de encender la m\u00e1quina virtual. Si cumple las condiciones limitar\u00e1 autom\u00e1ticamente la CRA al valor m\u00e1s cercano posible de la memoria total menos la RAM utilizada por la m\u00e1quina virtual.<\/p>\n

A medida que enciendes m\u00e1quinas virtuales el ARC ser\u00e1 como un globo y se encoger\u00e1 para liberar memoria para las m\u00e1quinas virtuales en ejecuci\u00f3n. Escribimos una herramienta que utiliza Kstat y MDB (el depurador modular) para ajustar din\u00e1micamente el tama\u00f1o del ZFS ARC. Gesti\u00f3n de memoria: hecho.<\/p>\n


\n

Recuperaci\u00f3n ante desastres para m\u00e1quinas virtuales locales<\/h3>\n

A continuaci\u00f3n pensamos en lo que significar\u00eda la recuperaci\u00f3n ante desastres para una m\u00e1quina virtual. Una de las funciones m\u00e1s utilizadas en Storage OS es la replicaci\u00f3n de copias de seguridad de conjuntos de datos. Supongamos que replicas in situ o remotamente el Vdisk (volumen ZFS) que representa tu m\u00e1quina virtual, \u00bfc\u00f3mo podr\u00edas recrear f\u00e1cilmente la m\u00e1quina virtual que ten\u00edas antes sobre esto? No es tan f\u00e1cil porque la configuraci\u00f3n del servicio SMF que ten\u00edas antes no est\u00e1 replicada y ser\u00eda un verdadero suplicio hacerlo. Se me ocurri\u00f3 adjuntar la configuraci\u00f3n como una propiedad ZFS del volumen. Pero entonces tuvimos una demostraci\u00f3n con uno de nuestros clientes y realmente insisti\u00f3 en tener dos discos separados para la m\u00e1quina virtual. Entonces tuvimos claro que utilizar un disco virtual como almac\u00e9n de respaldo ya no era suficiente. No ten\u00edamos ninguna flexibilidad. \u00bfQu\u00e9 hacer? Comprar una nueva pizarra grande de al menos 2 metros de ancho, un mont\u00f3n de rotuladores, y que comience el proceso de dise\u00f1o y volcado de ideas :).<\/p>\n

Lo que acabamos haciendo fue utilizar un sistema de ficheros ZFS para representar una m\u00e1quina virtual, una especie de bundle. Dentro del punto de montaje del sistema de ficheros guardamos la configuraci\u00f3n de la m\u00e1quina virtual en formato JSON (hoy en d\u00eda es bastante f\u00e1cil transformar cualquier objeto en una representaci\u00f3n JSON en cualquier lenguaje de programaci\u00f3n). Tal vez alguien que quiera convertir la configuraci\u00f3n de la m\u00e1quina en una m\u00e1quina inteligente Joyent, o transformar esto en un xml para libvirt en Linux podr\u00eda hacerlo muy f\u00e1cilmente. Adem\u00e1s de la configuraci\u00f3n creamos las im\u00e1genes de disco. Esta vez usamos el formato nativo de Qemu - qcow2, y cambiamos el tama\u00f1o usando qemu-img. Este tipo de representaci\u00f3n de m\u00e1quina virtual nos permiti\u00f3 enviar\/recibir f\u00e1cilmente un sistema de ficheros que encapsula un bundle de m\u00e1quina virtual. Dentro del servicio SMF adjunto a la m\u00e1quina virtual ya no guardamos ninguna configuraci\u00f3n, s\u00f3lo un enlace a la ruta del sistema de archivos ZFS que contiene el paquete. Al importar una m\u00e1quina virtual, tu almacenamiento de copia de seguridad simplemente analizar\u00eda la configuraci\u00f3n y generar\u00eda todos los servicios SMF adjuntos para controlarla. Esto result\u00f3 ser una soluci\u00f3n estupenda y natural que nos permiti\u00f3 una gran flexibilidad.<\/p>\n


\n

La empresa de la conectividad<\/h3>\n

Decidimos ofrecer una forma de conectarse directamente a la consola de una m\u00e1quina virtual desde el navegador, como alternativa a un cliente VNC tradicional. Creamos proxies websocket que reenviar\u00edan cada pantalla VNC a un websocket. Las pantallas VNC se generar\u00e1n autom\u00e1ticamente al arrancar las m\u00e1quinas virtuales. Lo necesit\u00e1bamos para asegurarnos de tener pantallas \u00fanicas para cada m\u00e1quina virtual que se est\u00e9 ejecutando. Al tener las pantallas VNC reenviadas a websockets, utilizamos un cliente VNC Javascript en el navegador que portamos, modificamos y redise\u00f1amos completamente para poder utilizarlo en nuestra aplicaci\u00f3n de gesti\u00f3n web. Nos comunicamos con la m\u00e1quina virtual, tomamos una captura de pantalla del estado actual de la pantalla y tan pronto como se hace clic en esa imagen abrimos un cliente VNC en el navegador a la m\u00e1quina virtual. Bastante limpio para ser honesto.<\/p>\n


\n

Esa es m\u00e1s o menos la historia de nuestra \u00faltima iteraci\u00f3n. Mucha diversi\u00f3n, mucha tecnolog\u00eda nueva. Esperamos que la gente disfrute con lo que hemos hecho. Siempre estamos abiertos a preguntas sobre cualquier tema, as\u00ed que no dud\u00e9is en preguntar :). Gracias.<\/p>\n

<\/center><\/p>","protected":false},"excerpt":{"rendered":"

Supongo que ha llegado el momento de compartir con el mundo algunas de nuestras experiencias t\u00e9cnicas mientras sacamos nuevas funciones en Storage OS. Voy a [...]<\/span><\/p>","protected":false},"author":2,"featured_media":38019,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[459,439,460],"yoast_head":"\nKVM on Storage OS - Syneto<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/syneto.eu\/es\/kvm-on-storage-os\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"KVM on Storage OS\" \/>\n<meta property=\"og:description\" content=\"I guess the time has come to share with the world some of our technical experiences while bringing new features out on Storage OS. I will [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/syneto.eu\/es\/kvm-on-storage-os\/\" \/>\n<meta property=\"og:site_name\" content=\"Syneto\" \/>\n<meta property=\"article:published_time\" content=\"2013-06-26T12:27:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/syneto.eu\/wp-content\/uploads\/2021\/08\/dev-diary-kvm-cover-photo-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"842\" \/>\n\t<meta property=\"og:image:height\" content=\"281\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Robert\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Robert\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/syneto.eu\/kvm-on-storage-os\/\",\"url\":\"https:\/\/syneto.eu\/kvm-on-storage-os\/\",\"name\":\"KVM on Storage OS - Syneto\",\"isPartOf\":{\"@id\":\"https:\/\/syneto.eu\/#website\"},\"datePublished\":\"2013-06-26T12:27:57+00:00\",\"dateModified\":\"2013-06-26T12:27:57+00:00\",\"author\":{\"@id\":\"https:\/\/syneto.eu\/#\/schema\/person\/1fda92fbd57f39eee18aafbaca15a13b\"},\"breadcrumb\":{\"@id\":\"https:\/\/syneto.eu\/kvm-on-storage-os\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/syneto.eu\/kvm-on-storage-os\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/syneto.eu\/kvm-on-storage-os\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/syneto.eu\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"KVM on Storage OS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/syneto.eu\/#website\",\"url\":\"https:\/\/syneto.eu\/\",\"name\":\"Syneto\",\"description\":\"Data Management, Resiliency and Security\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/syneto.eu\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/syneto.eu\/#\/schema\/person\/1fda92fbd57f39eee18aafbaca15a13b\",\"name\":\"Robert\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/syneto.eu\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4ed058ca6d31d79c590e0eba15876004?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4ed058ca6d31d79c590e0eba15876004?s=96&d=mm&r=g\",\"caption\":\"Robert\"},\"url\":\"https:\/\/syneto.eu\/es\/author\/syneto\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"KVM on Storage OS - Syneto","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/syneto.eu\/es\/kvm-on-storage-os\/","og_locale":"es_ES","og_type":"article","og_title":"KVM on Storage OS","og_description":"I guess the time has come to share with the world some of our technical experiences while bringing new features out on Storage OS. I will [\u2026]","og_url":"https:\/\/syneto.eu\/es\/kvm-on-storage-os\/","og_site_name":"Syneto","article_published_time":"2013-06-26T12:27:57+00:00","og_image":[{"width":842,"height":281,"url":"https:\/\/syneto.eu\/wp-content\/uploads\/2021\/08\/dev-diary-kvm-cover-photo-3.png","type":"image\/png"}],"author":"Robert","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Robert","Tiempo de lectura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/syneto.eu\/kvm-on-storage-os\/","url":"https:\/\/syneto.eu\/kvm-on-storage-os\/","name":"KVM on Storage OS - Syneto","isPartOf":{"@id":"https:\/\/syneto.eu\/#website"},"datePublished":"2013-06-26T12:27:57+00:00","dateModified":"2013-06-26T12:27:57+00:00","author":{"@id":"https:\/\/syneto.eu\/#\/schema\/person\/1fda92fbd57f39eee18aafbaca15a13b"},"breadcrumb":{"@id":"https:\/\/syneto.eu\/kvm-on-storage-os\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/syneto.eu\/kvm-on-storage-os\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/syneto.eu\/kvm-on-storage-os\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/syneto.eu\/"},{"@type":"ListItem","position":2,"name":"KVM on Storage OS"}]},{"@type":"WebSite","@id":"https:\/\/syneto.eu\/#website","url":"https:\/\/syneto.eu\/","name":"Syneto","description":"Data Management, Resiliency and Security","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/syneto.eu\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/syneto.eu\/#\/schema\/person\/1fda92fbd57f39eee18aafbaca15a13b","name":"Robert","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/syneto.eu\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4ed058ca6d31d79c590e0eba15876004?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4ed058ca6d31d79c590e0eba15876004?s=96&d=mm&r=g","caption":"Robert"},"url":"https:\/\/syneto.eu\/es\/author\/syneto\/"}]}},"_links":{"self":[{"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/posts\/38018"}],"collection":[{"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/comments?post=38018"}],"version-history":[{"count":0,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/posts\/38018\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/media\/38019"}],"wp:attachment":[{"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/media?parent=38018"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/categories?post=38018"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/syneto.eu\/es\/wp-json\/wp\/v2\/tags?post=38018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}