Esta pagina se ve mejor con JavaScript habilitado

KVMs en FreeBSD

 ·  🎃 kr0m

El acceso a los KVMs de los servidores suele ser problemático incluso en sistemas mas mainstream como Windows o Linux, en este artículo utilizaremos el binario de Linux mediante la compatibilidad Linux-FreeBSD de este modo seremos capaces de acceder sin problemas al 99% de KVMs del mercado.

Debemos tener en cuenta que el port linux-oracle-jdk18 precisa de acceso a ciertas partes del sistema, según nuestra configuración de seguridad es posible que un usuario regular no pueda acceder, tenemos dos opciones, deshabilitar la medida de seguridad o ejecutar javaws como root mediante sudo.

Para deshabilitarlo:

sysctl security.bsd.unprivileged_proc_debug=1

vi /etc/sysctl.conf
security.bsd.unprivileged_proc_debug=1

Si optamos por las solución mediante sudo:

vi /usr/local/etc/sudoers.d/kr0m

kr0m ALL=(ALL) NOPASSWD: /usr/local/linux-oracle-jdk1.8.0/bin/javaws
kr0m ALL=(ALL) NOPASSWD: /usr/local/linux-oracle-jdk1.8.0/bin/jcontrol

Yo personalmente utilizaré sudo.


Algunos de los errores que suelen presentar son:

no ikvm64 in java.library.path
No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
Disabling Java as it is too old and likely to be out of date. To reenable use jcontrol utility

El primero se debe a que el applet solo es compatible con Windows, MacOSX y Linux por lo tanto busca binarios que en FreeBSD no existen, para resolver el problema tendremos que utilizar el binario de Java de Linux mediante la compatibilidad de binarios de FreeBSD .

Cargamos el módulo de compatibilidad con Linux tanto para 32 como para 64 bits:

kldload linux
kldload linux64

Comprobamos que ambos módulos estén cargados:

kldstat|grep linux

13    2 0xffffffff8425f000    3df60 linux.ko
24    1 0xffffffff84319000    35b20 linux64.ko

Instalamos los binarios y librerías base de Linux:

pkg install emulators/linux_base-c7

Habilitamos la compatibilidad en el boot:

vi /etc/rc.conf

linux_enable="YES"

El único modo de instalar oracle-jdk de Linux es mediante ports ya que se trata de un software restringido por temas de licencias:

RESTRICTED: Redistribution of repackaged binaries not permitted
A package is not available for ports marked as: Forbidden / Broken / Ignore / Restricted

No hay problema en mezclar paquetes binarios y ports en este caso porque este software solo está disponible mediante ports, además no se instala en el sistema como tal si no que se instala en el directorio donde residen los binarios de Linux.

Instalamos los requisitos previos:

pkg install javavmwrapper linux-c7-xorg-libs

Antes de compilar el port hay que bajarse un fichero de la web de Oracle :

jdk-8u241-linux-x64.tar.gz

NOTA: La versión del fichero irá cambiando con el paso del tiempo, para averiguar que versión intentaremos compilar el port tal y como se indica unos pasos mas abajo y él mismo nos mostrará por pantalla la versión a descargar.

Lo descargamos en el directorio:

/usr/ports/distfiles

Compilamos e instalamos el port linux-oracle-jdk18

cd /usr/ports/java/linux-oracle-jdk18/
make install clean

Java intentará obtener cierta información del sistema accediendo al directorio proc de Linux, para que esta información esté disponible hay que cargar el módulo linprocfs y montar el directorio /compat/linux/proc.

Cargamos el módulo linprocfs

kldload linprocfs

Editamos el fstab:

vi /etc/fstab

linprocfs   /compat/linux/proc   linprocfs   rw   0  0

Montamos el directorio:

mount /compat/linux/proc

En teoria se puede configurar el navegador para que abra el fichero directamente con el binario de Linux pero yo prefiero guardar el fichero y abrirlo manualmente:

/usr/local/linux-oracle-jdk1.8.0/bin/javaws -verbose FILENAME.jnlp

Normalmente el acceso al KVM es necesario en algún tipo de emergencia donde necesitamos acceso rápido al servidor, para tal fin yo utilizo un script muy simple en bash:

vi javaApplet

#!/usr/bin/env bash

if [ $# -eq 0 ]; then
    echo "ERROR: No arguments supplied"
    exit
fi
sudo /usr/local/linux-oracle-jdk1.8.0/bin/javaws -verbose $1
chmod 700 javaApplet

Tan solo tendremos que pasarle el nombre del fichero:

./javaApplet FILENAME.jnlp


El segundo error sobre protocolos de cifrado se solventa permitiendo todos los protocolos, lo sé será inseguro pero mejor que no poder acceder cuando hay un apuro.

Editamos el fichero de configuración de Java y comentamos la sentencia que deshabilita algoritmos:

vi /usr/local/linux-oracle-jdk1.8.0/jre/lib/security/java.security

#jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL

El tercer error se puede solucionar whiletlisteando la URL de conexión:

sudo /usr/local/linux-oracle-jdk1.8.0/bin/jcontrol

Nos dirigimos a la pestaña Security y añadimos las URLs de los KVMs, es importante destacar que hay que añadir tanto http como https incluso si el acceso es https.


Otra opción interesante es habilitar la consola de Java ya que de este modo podremos ver los errores con mas detalle:

Si te ha gustado el artículo puedes invitarme a un RedBull aquí