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.


Tal vez pueda interesarte


Compartí este artículo