viernes, 19 de julio de 2013

Instalando Debian GNU/kFreeBSD en una Jaula de FreeBSD sobre ZFS

English version: Install Debian GNU/kFreeBSD on a FreeBSD Jail with ZFS


Una vez que tenemos instalado y actualizado FreeBSD 9 el siguiente paso es dotarlo de aplicaciones para convertirlo en un sistema útil.

En los últimos años, he estado trabajando con sistemas bajo Solaris 10, donde los servicios que tenía en producción estaban encapsulados en Solaris Containers. Dado mi reciente interés en FreeBSD resulta natural que intente reproducir un ambiente de ejecución similar, que tan buenos resultados me brindó en el pasado.

Por otra parte, me parece interesante la posibilidad de incluir la capacidad de ejecutar aplicaciones Linux y tener una jaula -jail- específicamente diseñada para tal fin.


En este caso, en vez de instalar en una Jaula el userland propio de FreeBSD, vamos a instalar Debian GNU/kFreeBSD, que proporciona un userland alternativo para el kernel de FreeBSD.

Creando nuestra Jaula

1.- Instalamos la herramienta Debootstrap, que instala Debian en subdirectorio dentro  de otro sistema.
root@morsa:/root # portsnap fetch update
root@morsa:/root # portmaster sysutils/debootstrap
2.- Definimos el sistema de ficheros  donde vamos a instalar la Jaula.
root@morsa:/root # zfs create -o mountpoint=/jailz fbsdzpool1/jailz
root@morsa:/root # zfs create fbsdzpool1/jailz/deb-master
root@morsa:/root # mkdir /jailz/etc
3.- Cargamos los módulos necesarios para la compatibilidad binaria con Linux.
root@morsa:/root # kldload fdescfs linprocfs linsysfs tmpfs
4.-Instalamos squeeze Debian en la ruta de la Jaula.
root@morsa:/root # debootstrap squeeze /jailz/deb-master http://cdn.debian.net/debian
I: Retrieving Release
W: Cannot check Release signature; keyring file not available /usr/share/keyring
s/debian-archive-keyring.gpg
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: insserv libbsd0 libbz2-1.0 libcam0 li
bdb4.8 libedit2 libexpat1 libgeom0 libkiconv4 libkvm0 libsbuf0 libslang2 ufsutils
I: Found additional base dependencies: libipx2 libmemstat3 libnetgraph4 libsqlite3-0
I: Checking component main on http://cdn.debian.net/debian...
I: Retrieving libacl1 2.2.49-4

.........

I: Configuring gnupg...
I: Configuring debian-archive-keyring...
I: Configuring apt...
I: Configuring libept1...
I: Configuring apt-utils...
I: Configuring aptitude...
I: Configuring tasksel-data...
I: Configuring tasksel...
I: Base system installed successfully.
5.- Creamos una tabla con los puntos de montaje para la Jaula, en /jailz/etc/fstab.deb-master:

//Comienza el Fichero /jailz/etc/fstab.deb-master
linsys   /jailz/deb-master/sys         linsysfs  rw          0 0
linproc  /jailz/deb-master/proc        linprocfs rw          0 0
tmpfs    /jailz/deb-master/lib/init/rw tmpfs     rw,mode=777 0 0
//fin del Fichero /jailz/etc/fstab.deb-master


6.- Habilitamos las Jaulas.
root@morsa:/root # echo 'jail_enable="YES"' >> /etc/rc.conf
7.- En el fichero de configuración /jailz/etc/jail.conf incluimos la entrada:

//Comienza fragmento
deb-master {
  path = /jailz/deb-master;
  allow.mount;
  mount.devfs;
  host.hostname = deb-master;
  mount.fstab="/jailz/etc/fstab.deb-master";
  ip4.addr = 127.0.0.10;
  interface = lo0;
  exec.start = "/etc/init.d/rc 3";
  exec.stop = "/etc/init.d/rc 0";
}
//Fin de fragmento

7.- Iniciamos la Jaula, comprobamos que está arrancada y nos conectamos a ella.
root@morsa:/root # jail -f /jailz/etc/jail.conf -c deb-master
deb-master: created
Using makefile-style concurrent boot in runlevel 3.
Starting enhanced syslogd: rsyslogdln: creating symbolic link `/dev/xconsole': Operation not permitted.
Starting periodic command scheduler: cron.
root@morsa:/root # jls
   JID  IP Address      Hostname                      Path
     1  127.0.0.10      deb-master                    /jailz/deb-master
root@morsa:/root #  jexec 1 /bin/bash
root@deb-master:/# uname -a
GNU/kFreeBSD deb-master 9.1-RELEASE-p4 FreeBSD 9.1-RELEASE-p4 #0: Mon Jun 17 11:
42:37 UTC 2013     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENER
IC x86_64 amd64 Intel(R) Pentium(R) CPU B960 @ 2.20GHz GNU/kFreeBSD
7.- Paramos la Jaula.
root@morsa:/root # jail -f /jailz/etc/jail.conf -r deb-master
Using makefile-style concurrent boot in runlevel 0.
Stopping device state change daemon: devd.
Asking all remaining processes to terminate...done.
All processes ended within 1 seconds....done.
Stopping enhanced syslogd: rsyslogd.
/etc/init.d/umountnfs.sh: 106: cannot open /etc/mtab: No such file
Deconfiguring network interfaces...done.
Cleaning up ifupdown....
done.
Deactivating swap...done.
mount: /: unknown special file or file system
Will now halt.
ifdown: shutdown usbus0: Operation not permitted
ifdown: shutdown ath0: Operation not permitted
ifdown: shutdown usbus1: Operation not permitted
ifdown: shutdown lo0: Operation not permitted
ifdown: shutdown wlan0: Operation not permitted
startpar: service(s) returned failure: umountnfs.sh ... failed!
deb-master: removed
 8.- Hacemos un snapshot de la Jaula recién instalada.
root@morsa:/root # zfs snapshot fbsdzpool1/jailz/deb-master@squeeze

Ahora, disponemos de una Jaula Master, desde la que podemos generar nuevas jaulas a partir de clones de ZFS, después añadimos una nueva entrada a /jailz/jail.conf con el correspondiente fichero /jailz/etc/fstab.newjail.
# zfs clone fbsdzpool1/jailz/deb-master@sequeeze fbsdzpool1/jailz/newjail

Sobre esas Jaulas clonadas, podemos comenzar a instalar aplicaciones suministradas por repositorios de debian pero su formato elf no es el de linux, sino el de freebsd.

 

Consideraciones Finales

En este entorno de pruebas hemos definido  el sistema de ficheros para la jaula en el Root Pool. En un entorno de producción lo recomendable sería tener un Pool diferente, en otro disco, o conjunto de discos, que sean distintos a los discos de sistema.

Otro aspecto que podemos mejorar es la configuración de la red, donde se puede utilizar dispositivos de red virtual, en vez de IP alias.

Falta  por implementar la gestión de  recursos mediante rctl.

He reservado la ruta /usr/jail como ruta para las Jaulas que se pueden crear a partir de un BE generado con beadm. Este tipo de jaulas se utilizan para testear actualizaciones de Sistema y, posteriormente, ponerlas en producción si las pruebas son satisfactorias.

No hay comentarios:

Publicar un comentario

Vuestros comentarios son bien recibidos, os animo a contribuir proponiendo temas que os interesen para desarrollar en este blog.