La versión 2.2 del pfSense esta basada en un FreeBSD 10, el cual sí tiene un kernel que soporta la paravirtualización por XenServer. Las versiones anteriores de pfSense de la serie 2.1.x, estaban basadas en FreeBSD 8.3 con un kernel que solo era posible correr sobre XenServer con Full Virtualization.

La virtualización completa nos restringe varias características sobre el sistema operativo invitado no solo en cuanto a la performance de la VM, sino tambien a la propia usabilidad del sistema, como por ejemplo la posibilidad de apagar (de manera correcta) una máquina virtual, visualizar la información de su estado (versión del sistema operativo, IPs asignadas), compartición del portapapeles, migración en caliente entre equipos físicos, y alguna otra que en este momento no recuerdo.

Upgrade de 2.1.5 a 2.2

El kernel 10.1 de FreeBSD utilizado por la versión 2.2 del pfSense incluye drivers PVHVM para XenServer. Esto causa que se cambien automáticamente los nombres de disco y dispositivos de red durante el proceso de actualización.

El cambio de nombres en los dispositivos de disco ocasiona una falla en el booteo del sistema, esto se puede evitar mediante la ejecución del script /usr/local/sbin/ufslabels.sh que reemplaza los nombres de los dispositivos por etiquetas UFS en el fstab.

La única solución para el cambio de dispositivos de red es su reasignación manual.

Instalación de XenTools

Para instalar las Xentools nos apoyamos en este post que resumimos a continuación.

1.- Instalación de las tools

# pkg install xe-guest-utilities

2.- Habilitar las guest-utilities

# echo "xenguest_enable=\"YES\"" >> /etc/rc.conf.local
# ln -s /usr/local/etc/rc.d/xenguest /usr/local/etc/rc.d/xenguest.sh

3.- Arrancar el servicio manualmente o rebootear el sistema

# service xenguest start

Nota:
El upgrade de la versión 2.1.5 a la versión 2.2 generó un problema de velocidad de ruteo entre la LAN y la WAN que ralentiza todo el tráfico que sale a trevés del pfSense. La solución presentada en este post y aplicada por nosotros con total éxito se basa en deshabilitar las funciones de offload de la VIF en el XenServer.

1.- Identificar el uuid de la VIF de la LAN

# xe vm-vif-list vm=pfSense
uuid ( RO) : dfe2faad-a967-52c7-54f5-a4dba2da1e
vm-name-label ( RO): pfSense
device ( RO): 2
MAC ( RO): 32:5e:ae:f4:c6:35
network-uuid ( RO): c2c62fee-6d27-6064-f7bb-aafd624f5484
network-name-label ( RO): Network 2 - WAN-01
 
uuid ( RO) : 2bcb5dac-2a86-c7b7-cb59-4acd93eb95
vm-name-label ( RO): pfSense
device ( RO): 1
MAC ( RO): 22:4d:f5:81:c6:13
network-uuid ( RO): 6c5d7926-7f31-7c10-b4d2-e1e21f5a829d
network-name-label ( RO): Network 1 - WAN-02
 
uuid ( RO) : 5591ecfa-80a6-2322-5e1d-884c9c173f
vm-name-label ( RO): pfSense
device ( RO): 0
MAC ( RO): 46:dc:cb:87:71:5d
network-uuid ( RO): 19ff9ebf-427f-5363-4a67-28cc24c23710
network-name-label ( RO): Network 0 - LAN-01


2.- Desactivar los ajustes de offload

# xe vif-param-set uuid=5591ecfa-80a6-2322-5e1d-884c9c173f other-config:ethtool-tx="off"
# xe vif-param-set uuid=5591ecfa-80a6-2322-5e1d-884c9c173f other-config:ethtool-rx="off"

3.- Verificar los parámetros

# xe vif-param-list uuid=5591ecfa-80a6-2322-5e1d-884c9c173f
uuid ( RO)                        : 5591ecfa-80a6-2322-5e1d-884c9c173f
                     vm-uuid ( RO): 9ee66b31-3d45-5a07-efb6-66c5dd3cb7
               vm-name-label ( RO): pfSense
          allowed-operations (SRO): attach; unplug
          current-operations (SRO): 
                      device ( RO): 0
                         MAC ( RO): 46:dc:cb:87:71:5d
           MAC-autogenerated ( RO): true
                         MTU ( RO): 1500
          currently-attached ( RO): true
          qos_algorithm_type ( RW): 
        qos_algorithm_params (MRW): 
    qos_supported_algorithms (SRO): 
                other-config (MRW): ethtool-rx: off; ethtool-tx: off;
                network-uuid ( RO): 19ff9ebf-427f-5363-4a67-28cc24c23710
          network-name-label ( RO): Network 0 - LAN-01
                 io_read_kbs ( RO): 0.931
                io_write_kbs ( RO): 0.934
                locking-mode ( RW): network_default
                ipv4-allowed (SRW): 
                ipv6-allowed (SRW):

Luego de estos pasos pudimos aprovechar al máximo las posibilidades del pfSense 2.2 paravirtualizado sobre un XenServer 6.2.