Introducción
Brandz es un tipo específico de zona que permite la ejecución de binarios no nativos dentro de ella. Esta tecnología se está desarrollando dentro de el proyecto OpenSolaris, puesto que aun no está finalizado puede que este documento quede obsoleto tras pasar algunos meses, sin embargo es difiícil que se produzca un cambio radical de diseño por lo que en su mayoría debería ser aplicable.Linux dentro de un Brandz
Aunque con la tecnología de los brandz podríamos ejecutar binarios de múltiples S.O. lo cierto es que actualmente solo está probados versiones anteriores de Solaris y Linux. En este artículo nos centraremos en este último. Dado que el formato de los ejecutables de Linux y OpenSolaris es el mismo (ELF) idealmente deberíamos poder procesarlos sin más, sin embargo estos esperan unos servicios por parte del kernel, a los que suelen acceder mediante llamadas al sistema que, lógicamente, son distintas en ambos S.O.. En el caso de Linux el problema va incluso un paso más allá, ya que existen diferencias entre las distintas distribuciones dependiendo del nivel de kernel y de la versión de glibc.Técnica de interposición
En Linux un proceso para usar una llamada al sistema ejecuta la interrupción 80, este método no existe en OpenSolaris, para emularlo se ha diseñado una macro BRAND_CALLBACK() que captura ese punto de entrada. Una vez capturado, en lugar de seguir el flujo normal dentro del kernel, esos hilos son procesados por un módulo específico para tareas dentro de un brandz. Existen otros puntos de interposición situados en el flujo de vida de un proceso para asegurar que el kernel presta todos los servicios necesarios, como por ejemplo en la creación/salida de hilos, tratamiento de señales, etc. Dicho módulo hace de traductor, es decir modifica el formato de la llamada al sistema de Linux a su equivalente a OpenSolaris. El ciclo de vida sería el siguiente:Peculiaridades
A pesar que lo expuesto parece sencillo, su implementación práctica es compleja, ya que son numerosas las peculiaridades con las que topamos, teneís una lista detallada en la web de la comunidad. A continuación explico un par de ejemplos: Algunas llamadas al sistema son muy diferentes entre OpenSolaris y Linux, algunas ni siquiera tienen equivalente. Quizás el caso más llamativo es la llamada clone (), que Linux usa para crear un hijo y que no existe en OpenSolaris. En su lugar se utiliza fork (2), sin embargo alguno de los flags no tienen ninguna equivalencia, afortunadamente su uso es marginal. Otro caso curioso es que el número de señales existentes en Linux y OpenSolaris para procesos en Real Time es distinto, 32 vs 7, afortunadamente esas señales extras no tienen uso en la actualidad, por lo que directamente se ignoran.Caso Práctico
Crear un Brandz es sencillo, el procedimiento es identico a como crear una zona, solo que al ejecutar el create debemos espcificar que use el módulo lx, por otro lado, cuando hacemos el install debemos especificar la fuente de donde se deben copiar los binarios. Para ir rápido podeís descargar un tar de Centos 3.5 directamente de la web de la comidad OpenSolaris, os dejo una captura de la shell de todo el proceso:
# zonecfg -z linux
linux: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:linux> create -t SUNWlx
zonecfg:linux> set zonepath=/linux-zone
zonecfg:linux> commit
zonecfg:linux> exit
# mkdir /linux-zone
# chmod 700 /linux-zone
bash-3.2# zoneadm -z linux install -d /centos_fs_image.tar
Installing zone 'linux' at root directory '/linux-zone'
from archive '/centos_fs_image.tar'
This process may take several minutes.
Setting up the initial lx brand environment.
System configuration modifications complete.
Setting up the initial lx brand environment.
System configuration modifications complete.
Installation of zone 'linux' completed successfully.
Details saved to log file:
"/linux-zone/root/var/log/linux.install.7598.log"
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- linux installed /linux-zone lx shared
bash-3.2# zomadm -z linux boot
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
1 linux running /linux-zone lx shared
bash-3.2# zlogin -C linux
[Connected to zone 'linux' console]
CentOS release 3.7 (Final)
Kernel 2.4.21 on an i686
linux login: ~.
[Connection to zone 'linux' console closed]