¿Quieres dar formación sobre rendimiento en Solaris/OpenSolaris a tus técnicos?

A raíz del interés mostrado en las últimas charlas he decidido ofrecer mis servicios para consultoría y formación a empresas.

Ponte en contacto conmigo para pedir información.

OpenSolaris: Brandz y Linux

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:

  1. El proceso Linux ejecuta la interrupción 80.
  2. La macro BRAND_CALLBACK() comprueba si la interrupción tiene origen en un Brandz.
  3. Opensolaris pasa el control del thread al módulo específico para brandz.
  4. El módulo lx lanza la librería de emulación.
  5. Dicha librería modifica la llamada al sistema para que sea compatible con OpenSolaris.
  6. El kernel de OpenSolaris procesa la llamada y devuelve la salida a la librería.
  7. Otra vez se realizan las operaciones oportunas, ahora para adaptar la salida a lo que espera el proceso Linux.
  8. La librería devuelve el resultado al proceso.
Puesto que los servicios del kernel tienen pequeñas variaciones dependiendo de la versión y de que las librerías glibc usadas, ha día de hoy (febrero del 2008) está probado y funciona de forma estable RHEL 3, se está trabajando para que funcione RHEL 4 pero aun quedan algunos flecos.

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]
Creative Commons License
Esta obra está bajo una licencia de Creative Commons.