En mi actividad profesional afortunadamente tengo la responsabilidad de administrar servidores GNU/Linux en su mayoría, lo cual me permite especializarme y hacer una gran experiencia utilizando tecnologías libres. Aunque también tengo que aprender, trabajar, y especializarme en tecnologías propietarias (o "privativas" como dice RMS), principalmente VMware (ya que es la plataforma de virtualización elegida por la empresa en la que trabajo). Uno de los factores que más me molestan de VMware, es verme forzado a utilizar clientes Windows para administrar servidores vCenter o hosts ESX. Esta situación me obliga a tener una máquina virtual con Windows, sólo para correr el cliente vSphere, lo cual es una molestia.
Pero para mi beneplácito, esta semana descubrí que es posible administrar servidores VMware vCenter e hipervisores VMware ESX desde GNU/Linux utilizando la herramienta virsh
de libvirt, gracias a que cuenta con el driver VMware ESX.
El driver VMware ESX de libvirt permite conectarse a y gestionar hipervisores VMware ESX/ESXi 3.5/4.x/5.x y VMware GSX 2.0, también conocido como VMware Server 2.0, y posiblemente versiones posteriores. Desde la versión 0.8.3 el driver también puede conectarse a servidores VMware vCenter 2.5/4.x/5.x (VPX). Cualquier instalación típica de VPX/ESX(i)/GSX debe funcionar sin inconvenientes y no se requiere ninguna configuración específica, ni instalar ningún componente de libvirtd en el servidor ESX. Este driver utiliza la versión 2.5 de la API VMware Virtual Infrastructure (VI API) basada en SOAP, de la misma forma en que lo hace VMware Virtual Infrastructure Client (VI client). Desde la versión 4.0 esta API se llama VMware vSphere API.
A diferencia de otros, el driver ESX es un driver sólo del lado cliente (client-side-only). Se conecta al servidor ESX utilizando HTTP/HTTPS. Algunos ejemplos de URIs de conexión a servidores remotos para el driver son:
vpx://ejemplo-vcenter.com/dc1/srv1 (VPX sobre HTTPS, seleccionar el host ESX 'srv1' del datacenter 'dc1') esx://ejemplo-esx.com (ESX sobre HTTPS) gsx://ejemplo-gsx.com (GSX sobre HTTPS) esx://ejemplo-esx.com/?transport=http (ESX sobre HTTP) esx://ejemplo-esx.com/?no_verify=1 (ESX sobre HTTPS, no verificar la validez del certificado SSL del servidor)
Requisitos
Por supuesto, para poder gestionar servidores VMware vCenter e hipervisores ESX es necesario que libvirt haya sido compilado con el driver ESX, de lo contrario al tratar de iniciar la conexión virsh
retorna error:
$ virsh -c esx://192.168.1.150?no_verify=1 error: failed to connect to the hypervisor error: unsupported configuration: libvirt was built without the 'vpx' driver
Compilar e instalar libvirt con soporte para ESX
Para compilar libvirt con soporte para ESX descargar los últimos fuentes disponibles desde http://libvirt.org/sources/. Actualmente (12/2012) se encuentra disponible la versión 1.2.0: libvirt-1.2.0.tar.gz.
Descomprimir el tarball y configurar con soporte para esx, vpx y gsx:
./configure --with-vpx=yes --with-esx=yes --with-gsx=yes
# tar -xvf libvirt-1.1.2.tar.gz # cd libvirt-1.1.2/ # ./configure --with-vpx=yes --with-esx=yes --with-gsx=yes configure: error: Curl is required for the ESX driver
Para compilar requiere Curl, en Red Hat/Fedora/CentOS instalar mediante yum install curl libcurl libcurl-devel
:
# yum install curl libcurl libcurl-devel # ./configure --with-vpx=yes --with-esx=yes --with-gsx=yes
Finalmente compilar e instalar:
# make # make install
Se observa la versión 0.10.2 de virsh
compilado con soporte para los hipervisores ESX:
# virsh --version 0.10.2 # virsh -V Virsh command line tool of libvirt 0.10.2 See web site at http://libvirt.org/ Compiled with support for: Hypervisors: QEMU/KVM LXC ESX Test Networking: Remote Network Bridging Interface netcf Nwfilter VirtualPort Storage: Dir Disk Filesystem SCSI Multipath iSCSI LVM Miscellaneous: Daemon Nodedev SELinux Secrets Debug DTrace Readline
Conexión a un hipervisor VMware ESX
Para conectarse a un hipervisor ESX se debe utilizar el protocolo "esx" especificando la dirección IP o nombre de host del mismo (en el ejemplo 192.168.1.150
). Si el certificado SSL del servidor no se encuentra firmado por una entidad certificante de confianza, la conexión falla. Para lograr conectarse exitosamente en esta situación es necesario no verificar la validez del mismo, utilizando el parámetro no_verify=1
:
virsh -c esx://[ESX]?no_verify=1
$ virsh -c esx://192.168.1.150?no_verify=1 Enter username for 192.168.1.150 [root]: Enter root's password for 192.168.1.150: Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh #
Una vez que la conexión sucede de forma exitosa se obtiene el prompt de virsh. A partir de ese momento es posible utilizar los comandos disponibles para gestionar el hipervisor ESX (de la misma forma que si se tratase de un hipervisor QEMU/KVM o Xen). Por ejemplo es posible listar las máquinas virtuales con el comando list
, y listar los pools de almacenamiento con pool-list
:
virsh # list Id Name State ---------------------------------------------------- 2 routeros-x86-6.0 running virsh # list --all Id Name State ---------------------------------------------------- 2 routeros-x86-6.0 running - Mikrotik shut off virsh # pool-list Name State Autostart ----------------------------------------- datastore1 active yes virsh # pool-list --details Name State Autostart Persistent Capacity Allocation Available ------------------------------------------------------------------------------ datastore1 running yes yes 924.00 GiB 8.96 GiB 915.04 GiB
Con el comando help
se puede obtener ayuda de todos los comandos disponibles:
virsh # help Grouped commands: Domain Management (help keyword 'domain'): attach-device attach device from an XML file attach-disk attach disk device attach-interface attach network interface autostart autostart a domain blkdeviotune Set or query a block device I/O tuning parameters. blkiotune Get or set blkio parameters blockcommit Start a block commit operation. blockcopy Start a block copy operation. blockjob Manage active block operations blockpull Populate a disk from its backing image. blockresize Resize block device of domain. change-media Change media of CD or floppy drive console connect to the guest console cpu-baseline compute baseline CPU cpu-compare compare host CPU with a CPU described by an XML file cpu-stats show domain cpu statistics create create a domain from an XML file define define (but don't start) a domain from an XML file desc show or set domain's description or title destroy destroy (stop) a domain detach-device detach device from an XML file detach-disk detach disk device detach-interface detach network interface domdisplay domain display connection URI domfstrim Invoke fstrim on domain's mounted filesystems. domhostname print the domain's hostname domid convert a domain name or UUID to domain id domif-setlink set link state of a virtual interface domiftune get/set parameters of a virtual interface domjobabort abort active domain job domjobinfo domain job information domname convert a domain id or UUID to domain name dompmsuspend suspend a domain gracefully using power management functions dompmwakeup wakeup a domain from pmsuspended state domuuid convert a domain name or id to domain UUID domxml-from-native Convert native config to domain XML domxml-to-native Convert domain XML to native config dump dump the core of a domain to a file for analysis dumpxml domain information in XML edit edit XML configuration for a domain inject-nmi Inject NMI to the guest send-key Send keycodes to the guest send-process-signal Send signals to processes lxc-enter-namespace LXC Guest Enter Namespace managedsave managed save of a domain state managedsave-remove Remove managed save of a domain maxvcpus connection vcpu maximum memtune Get or set memory parameters migrate migrate domain to another host migrate-setmaxdowntime set maximum tolerable downtime migrate-compcache get/set compression cache size migrate-setspeed Set the maximum migration bandwidth migrate-getspeed Get the maximum migration bandwidth numatune Get or set numa parameters qemu-attach QEMU Attach qemu-monitor-command QEMU Monitor Command qemu-agent-command QEMU Guest Agent Command reboot reboot a domain reset reset a domain restore restore a domain from a saved state in a file resume resume a domain save save a domain state to a file save-image-define redefine the XML for a domain's saved state file save-image-dumpxml saved state domain information in XML save-image-edit edit XML for a domain's saved state file schedinfo show/set scheduler parameters screenshot take a screenshot of a current domain console and store it into a file setmaxmem change maximum memory limit setmem change memory allocation setvcpus change number of virtual CPUs shutdown gracefully shutdown a domain start start a (previously defined) inactive domain suspend suspend a domain ttyconsole tty console undefine undefine a domain update-device update device from an XML file vcpucount domain vcpu counts vcpuinfo detailed domain vcpu information vcpupin control or query domain vcpu affinity emulatorpin control or query domain emulator affinity vncdisplay vnc display Domain Monitoring (help keyword 'monitor'): domblkerror Show errors on block devices domblkinfo domain block device size information domblklist list all domain blocks domblkstat get device block stats for a domain domcontrol domain control interface state domif-getlink get link state of a virtual interface domiflist list all domain virtual interfaces domifstat get network interface stats for a domain dominfo domain information dommemstat get memory statistics for a domain domstate domain state list list domains Host and Hypervisor (help keyword 'host'): capabilities capabilities freecell NUMA free memory hostname print the hypervisor hostname node-memory-tune Get or set node memory parameters nodecpumap node cpu map nodecpustats Prints cpu stats of the node. nodeinfo node information nodememstats Prints memory stats of the node. nodesuspend suspend the host node for a given time duration sysinfo print the hypervisor sysinfo uri print the hypervisor canonical URI version show version Interface (help keyword 'interface'): iface-begin create a snapshot of current interfaces settings, which can be later committed (iface-commit) or restored (iface-rollback) iface-bridge create a bridge device and attach an existing network device to it iface-commit commit changes made since iface-begin and free restore point iface-define define (but don't start) a physical host interface from an XML file iface-destroy destroy a physical host interface (disable it / "if-down") iface-dumpxml interface information in XML iface-edit edit XML configuration for a physical host interface iface-list list physical host interfaces iface-mac convert an interface name to interface MAC address iface-name convert an interface MAC address to interface name iface-rollback rollback to previous saved configuration created via iface-begin iface-start start a physical host interface (enable it / "if-up") iface-unbridge undefine a bridge device after detaching its slave device iface-undefine undefine a physical host interface (remove it from configuration) Network Filter (help keyword 'filter'): nwfilter-define define or update a network filter from an XML file nwfilter-dumpxml network filter information in XML nwfilter-edit edit XML configuration for a network filter nwfilter-list list network filters nwfilter-undefine undefine a network filter Networking (help keyword 'network'): net-autostart autostart a network net-create create a network from an XML file net-define define (but don't start) a network from an XML file net-destroy destroy (stop) a network net-dumpxml network information in XML net-edit edit XML configuration for a network net-info network information net-list list networks net-name convert a network UUID to network name net-start start a (previously defined) inactive network net-undefine undefine an inactive network net-update update parts of an existing network's configuration net-uuid convert a network name to network UUID Node Device (help keyword 'nodedev'): nodedev-create create a device defined by an XML file on the node nodedev-destroy destroy (stop) a device on the node nodedev-detach detach node device from its device driver nodedev-dumpxml node device details in XML nodedev-list enumerate devices on this host nodedev-reattach reattach node device to its device driver nodedev-reset reset node device Secret (help keyword 'secret'): secret-define define or modify a secret from an XML file secret-dumpxml secret attributes in XML secret-get-value Output a secret value secret-list list secrets secret-set-value set a secret value secret-undefine undefine a secret Snapshot (help keyword 'snapshot'): snapshot-create Create a snapshot from XML snapshot-create-as Create a snapshot from a set of args snapshot-current Get or set the current snapshot snapshot-delete Delete a domain snapshot snapshot-dumpxml Dump XML for a domain snapshot snapshot-edit edit XML for a snapshot snapshot-info snapshot information snapshot-list List snapshots for a domain snapshot-parent Get the name of the parent of a snapshot snapshot-revert Revert a domain to a snapshot Storage Pool (help keyword 'pool'): find-storage-pool-sources-as find potential storage pool sources find-storage-pool-sources discover potential storage pool sources pool-autostart autostart a pool pool-build build a pool pool-create-as create a pool from a set of args pool-create create a pool from an XML file pool-define-as define a pool from a set of args pool-define define (but don't start) a pool from an XML file pool-delete delete a pool pool-destroy destroy (stop) a pool pool-dumpxml pool information in XML pool-edit edit XML configuration for a storage pool pool-info storage pool information pool-list list pools pool-name convert a pool UUID to pool name pool-refresh refresh a pool pool-start start a (previously defined) inactive pool pool-undefine undefine an inactive pool pool-uuid convert a pool name to pool UUID Storage Volume (help keyword 'volume'): vol-clone clone a volume. vol-create-as create a volume from a set of args vol-create create a vol from an XML file vol-create-from create a vol, using another volume as input vol-delete delete a vol vol-download download volume contents to a file vol-dumpxml vol information in XML vol-info storage vol information vol-key returns the volume key for a given volume name or path vol-list list vols vol-name returns the volume name for a given volume key or path vol-path returns the volume path for a given volume name or key vol-pool returns the storage pool for a given volume key or path vol-resize resize a vol vol-upload upload file contents to a volume vol-wipe wipe a vol Virsh itself (help keyword 'virsh'): cd change the current directory connect (re)connect to hypervisor echo echo arguments exit quit this interactive terminal help print help pwd print the current directory quit quit this interactive terminal
Es posible filtrar temas de ayuda de acuerdo a diferentes keywords:
virsh # help volume Storage Volume (help keyword 'volume'): vol-clone clone a volume. vol-create-as create a volume from a set of args vol-create create a vol from an XML file vol-create-from create a vol, using another volume as input vol-delete delete a vol vol-download download volume contents to a file vol-dumpxml vol information in XML vol-info storage vol information vol-key returns the volume key for a given volume name or path vol-list list vols vol-name returns the volume name for a given volume key or path vol-path returns the volume path for a given volume name or key vol-pool returns the storage pool for a given volume key or path vol-resize resize a vol vol-upload upload file contents to a volume vol-wipe wipe a vol
Y obtener ayuda de un comando en particular:
virsh # help vol-clone NAME vol-clone - clone a volume. SYNOPSIS vol-clone <vol> <newname> [--pool <string>] [--prealloc-metadata] DESCRIPTION Clone an existing volume. OPTIONS [--vol] <string> orig vol name or key [--newname] <string> clone name --pool <string> pool name or uuid --prealloc-metadata preallocate metadata (for qcow2 instead of full allocation) virsh # help pool-list NAME pool-list - list pools SYNOPSIS pool-list [--inactive] [--all] [--transient] [--persistent] [--autostart] [--no-autostart] [--type <string>] [--details] DESCRIPTION Returns list of pools. OPTIONS --inactive list inactive pools --all list inactive & active pools --transient list transient pools --persistent list persistent pools --autostart list pools with autostart enabled --no-autostart list pools with autostart disabled --type <string> only list pool of specified type(s) (if supported) --details display extended details for pools
Para terminar la conexión utilizar el comando quit
:
virsh # quit
Alternativamente virsh
permite especificar el comando en la línea de conexión al hipervisor, aunque de todas formas es necesario autenticar el acceso, por ejemplo:
$ virsh -c esx://root@192.168.1.150?no_verify=1 list --all Enter root's password for 192.168.1.150: Id Name State ---------------------------------------------------- 2 routeros-x86-6.0 running - Mikrotik shut off
Conexión a un servidor VMware vCenter
Para conectarse a un servidor VMware vCenter se debe utilizar el protocolo "vpx" especificando la dirección IP o nombre de host del mismo (en el ejemplo 192.168.200.135
) y la ruta al recurso computacional (host ESX) de la forma "[datacenter]/[cluster]/[host]" (en el ejemplo el datacenter se llama DATACENTER2
, el cluster CLUSTER0
y el host ESX tiene la dirección IP 192.168.200.136
). Actualmente las conexiones vpx://
están restringidas a un único host ESX perteneciente al cluster administrado por el servidor vCenter. En el futuro esta limitación puede que sea superada.
Si el certificado SSL del servidor no se encuentra firmado por una entidad certificante de confianza, la conexión falla. Para lograr conectarse exitosamente en esta situación es necesario no verificar la validez del mismo, utilizando el parámetro no_verify=1
.
Aunque la conexión se restringe a un único host ESX del cluster, la conexión se hace hacia el servidor vCenter, por lo que se autentica contra el mismo (no contra el host ESX):
virsh -c vpx://[vCenter]/[datacenter]/[cluster]/[ESX]?no_verify=1
$ virsh -c vpx://192.168.200.135/DATACENTER2/CLUSTER0/192.168.200.136?no_verify=1 Enter username for 192.168.200.135 [administrator]: Enter administrator's password for 192.168.200.135: Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # list Id Name State ---------------------------------------------------- 43 vCenter5 running 65 pepe running 67 pepe2 running 68 pepe3 running 69 test running 70 pepe4 running 121 desa-app1 running 122 Desa-x running 133 desa5 running 136 servidor-PEPE running 138 web-PEPE running 139 mail-PEPE running 171 desa-vp2 running 205 desa-vp3 running 243 desa-pepe4 running virsh # quit
Para trabajar con otro host ESX del cluster es necesario desconectarse y modificar el string de conexión (por ejemplo ahora hacia 192.168.200.137
):
[emi@hal9000 ~]$ virsh -c vpx://192.168.200.135/DATACENTER2/CLUSTER0/192.168.200.137?no_verify=1 Enter username for 192.168.200.135 [administrator]: Enter administrator's password for 192.168.200.135: Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # list Id Name State ---------------------------------------------------- 132 desa-www running 162 joomla-dev running 209 centos6 running 245 pruebas running virsh # quit
Por el momento no es posible administrar servidores VMware vCenter ni hosts VMware ESX utilizando la herramienta gráfica virt-manager
, pero el hecho de poder administrar servidores VMware vCenter y hosts VMware ESX desde GNU/Linux es muy meritorio por parte del equipo de desarrollo de libvirt. Para mayor información acceder a la documentación oficial: http://libvirt.org/drvesx.html.