SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 14 de febrero de 2011

Instalar OpenIndiana Paso a Paso en VirtualBox

Introducción
En esta ocasión vamos a hablar de una instalación de OpenIndiana desde cero, sin tener que pasar por OpenSolaris, aunque como veréis es muy parecida a Cómo Instalar OpenSolaris Paso a Paso

Al igual que sucede con al Instalación de Solaris Paso a Paso, utilizaremos el instalador de Texto, y por lo tanto, deberemos utilizar las teclas F2, F3 y F5 para <avanzar, retroceder y salir> según nos indique el instalador.

Como ya hemos hablado muchas veces de cómo crear una máquina Virtual en VirtualBox para Solaris/OpenSolaris, no voy a entrar en muchos detalles sobre ello, sólo a modo de recordatorio, es mejor utilizar una única CPU durante el proceso de Instalación y la memoria mínima debe ser de 780Mb.

Aquí os dejo un video de Cómo Instalar OpenSolaris Paso a Paso para los despistados :D

Descargar la Imagen
Como hemos comentado antes, vamos a Instalar OpenIndiana utilizando el instalador de Texto, ya que queremos tener una configuración de servidor, y por lo tanto, no necesitamos los paquetes de escritorio y/o interface gráfico. Esto hará que nuestra instalación requiera unos 2.5Gb de espacio, así que se instalará muy rápido.

Podemos descargar la imagen desde http://openindiana.org/download/ y seleccionaremos la Imagen Text Install CD http://dlc.openindiana.org/isos/148/oi-dev-148-text-x86.iso

Una vez descargada, deberemos darla de alta en nuestra máquina virtual para poder utilizarla como Disco CD de Arranque.

Proceso de Instalación
Una vez tengamos nuestra máquina virtual creada, comenzaremos con la instalación de OpenIndiana

1.- Configuración del Teclado. 
Seleccionaremos el tipo de teclado que tenemos, en mi caso seleccionaremos: Spanish(39), Spanish (21)




2.- Inicio del proceso de Instalación.
Seleccionaremos la opción 1 y pulsaremos INTRO para iniciar la instalación


3.- Pantalla de Ayuda
En esta pantalla se nos muestran las indicaciones de cómo funciona el instalador de texto. Se nos recuerda que debemos utilizar las teclas F2 para continuar <si estais en una VT podéis utilizar ESC+Número>

4.- Selección del Disco
En esta pantalla seleccionaremos el disco sobre el cual queremos instalar Solaris, y, como es nuestro caso nos indica que no tenemos ninguna partición Solaris creada -ya que está vacío-


5.- Tamaño de la Partición
En esta pantalla podemos seleccionar cómo queremos particionar el disco para Solaris, si lo queremos entero o sólo una parte.

Nosotros vamos a utilizar el disco íntegramente para Solaris, así que seleccionamos <Use the whole disk>

6.- Configuración de la Red
En esta pantalla podemos seleccionar la configuración Automática de la Red, o por el contrario no hacer la configuración ahora.

Yo, por costumbre muy antigua, nunca activo la Red de los sistemas mientras los estoy configurando, es una manía que tengo desde hace mucho tiempo para evitar que "alguien" me toque el sistema en su estado "más inseguro" y, por eso, hasta que no lo tengo configurado no levanto la Red.

Todo esto viene de Solaris 8, cuando la instalación activaba un montón de servicios, y por lo tanto, había más problemas, pero ... nunca está de más.

Así que, yo he seleccionado <none> para la configuración de Red, pero podéis utilizar la opción <Automatically> si disponéis de un servidor DHCP, este levantará el interface.


7.- Configuración de la Región
En mi caso he seleccionado <Europe>


8.- Selección del País
En mi caso he seleccionado <Spain>


9.- Franja Horaria
Como disponemos varias franjas horarias, me pide que selecciona una. Si no es vuestro caso, no aparecera.

10.- Ajuste de Fecha y Hora
Lo cierto es que nunca me preocupa mucho este paso, principalmente porque siempre Sincronizo el reloj mediante NTP en Solaris y OpenIndiana


11.- Creación de la Contraseña de <root> y usuario <privilegiado>
Este paso es importante, ya que a diferencia de Solaris, <root> pasa a ser un <role> y el usuario que creemos pertenecerá al role <root> y tendrá como autorizaciones <solaris.system.power>, solaris.network.autoconf,  es decir, puede ejecutar comandos para encender y apagar el sistema, y activar el sistema de configuración automática de red.

Si no sabéis como funcionan, os recomiendo leer RBAC Roles y Privilegios en Solaris.


12.- Resumen de la Configuración
En esta pantalla nos muestra un resumen de la configuración del instalador, el siguiente paso dará comienzo a la instalación de OpenIndiana, así que si queremos cambiar algo, podemos hacerlo pulsando <F3> o <ESC-3>


13.- Proceso de Instalación
Esto nos llevará unos 30min -más o menos- así que podéis tomaros un descanso ...



14.- Finalización Proceso
Una vez el proceso ha finalizado se muestra la pantalla para que reiniciemos el equipo y ya tendremos instalado -que no configurado- nuestro OpenIndiana


14.1.- Si algo falla
Lo cierto es que puede que el sistema de instalación falle -normalmente por una incompatibilidad de configuración-


Después de la Instalación
Una vez instalado OpenIndiana, vamos a configurar nuestro sistema para finalizar la instalación.

Finalizar la Instalación
Vamos a configurar  algunos parámetros del kernel, para ello, deberemos iniciar la sesión con el usuario que hemos creado -en nuestro caso itily- y después nos cambiaremos a <root> para asumir su rol.


Editaremos el número máximo de descriptores, los asignaremos a 8192 -en vez de 256- y algunos cambios menores.

 Pondremos un <Banner> en el acceso mediante ssh -puedes ver Cómo crear un Banner para SSH en Solaris 10-




 Activaremos la opción <Banner /etc/issue> en el archivo de configuración de SSH </etc/ssh/sshd_config>


Crearemos el archivo </reconfigure> para que nos reconfigure los dispositivos (no es realmente necesario, pero ... es una constumbre que tengo)


Configurar la Red y Actualizar la Distribución
Por último, vamos a levantar el interface y lanzaremos el comando <pkg image-update> para actualizar la imagen a su última versión.

Para ello, utilizaremos la tarjeta <e1000g0> con una configuración mediante DHCP para actualizar la imagen mediante el comando <pkg image-update>





Sincronizar el Reloj
Para finalizar, sincronizaremos el reloj del sistema utilizando un servidor NTP, en mi caso vamos a utilizar <hora.rediris.es>



Conclusiones
Bueno, hemos visto que OpenIndiana no difiere mucho de OpenSolaris o Solaris 11. Con este formato Paso a Paso, he querido mostrar que OpenIndiana no es tan fiero como lo pintan ...

Espero que os sirva, y como siempre, espero vuestras opiniones.

viernes, 4 de febrero de 2011

Cómo montar un CHROOT en tiempos de Virtualización

Intdoducción
Con la llegada de Solaris 10 y sus containers, muchos de nosotros comenzamos a "migrar" nuestros servicios a contenedores y, por ello, dejamos de utilizar -y hablar- de los chroot. Es cierto que un "container" o "LDOM" nos proporciona una gestión mucho más fina, y por lo tanto, podemos definir los recursos, usuarios, etc. y sobre todo, aislar totalmente un entorno de otro.

Sin embargo, cuando nuestros recursos físicos están muy limitados -pensemos en un appliance, por ejemplo-, y debemos tratar de tener nuestro "servicio" lo más aislado posible podemos seguir utilizando esta "reliquia del pasado", que, funciona a la perfección.

Nota: Este post es una adaptación a la respuesta que hice en StackOverFlow sobre Cómo crear un SandBox en Unix

Qué es un ChRoot
Bueno, técnicamente es ejecutar un proceso con un "/" diferente a nuestro sistema principal, es decir, por ejemplo "/chroot_example/", por lo tanto, para nuestro "proceso" su "/" será "/chroot_example" y no podrá acceder a aquellas partes que necesitamos asegurar

Para Qué un ChRoot en Tiempos de Containers
Bueno, como os decía en la introducción, depende sobre todo de los recursos que dispongamos, así que si no tenemos muchos, deberemos utilizar técnicas como esta para tratar de aislar -en la medida de lo posible- nuestro proceso

ChRoot o Container
Bueno, esta es una pregunta un poco "compleja de responder", aunque intentaré salir "airoso" diciendo: depende. ¿De qué depende? Principalmente de recursos, tipos de servicios y administración. Mi recomendación es, si es posible utilizar Solaris Containers -o LDOMs- para servicios complejos -PostgreSQL, Hadoop, etc.- pero si necesitáis tener un "mini proceso" -o varios- no vais a crear un montón de Containers para cada uno de ellos. Es ahí donde entra nuestro ChRoot, además siempre podemos unir las dos opciones: ChRoot dentro de Containers

Un Ejemplo Completo
Después de todo este "lío", vamos a verlo claro con un ejemplo. Para ello, necesitamos ejecutar un comando -en nuestro caso ls- que nos devuelva el listado de nuestro "directorio /etc" -no el de sistema- donde tenemos la licencia de nuestro aplicativo.

La estructura de nuestro "chroot" sería la siguiente:
    /
    /etc
     + license
    /bin
     + ls
    /lib
     + ...
Creación de la Estructura de ChRoot
Hemos comentado que un "ChRoot" es definir un nuevo "root" para el sistema de archivos de un proceso, y por lo tanto, deberemos "reproducir" el sistema principal con, al menos los directorios básicos: /etc, /bin, /lib

    itily@openzooey:~$ mkdir chroot_example
    itily@openzooey:~$ cd chroot_example/
    itily@openzooey:~/chroot_example$ mkdir -p usr/lib lib bin etc
    itily@openzooey:~/chroot_example$ cd bin/
    itily@openzooey:~/chroot_example/bin$ cp /bin/ls .
Ahora vamos a copiar las "shared lib" que nuestro binario necesita -en nuestro caso ls-, para ello, utilizaremos el comando: <ldd>
itily@openzooey:~/chroot_example/bin$ ldd ls
            libsec.so.1 =>       /lib/libsec.so.1
            libnvpair.so.1 =>    /lib/libnvpair.so.1
            libcmdutils.so.1 =>  /lib/libcmdutils.so.1
            libcurses.so.1 =>    /lib/libcurses.so.1
            libc.so.1 =>         /lib/libc.so.1
            libavl.so.1 =>       /lib/libavl.so.1
            libidmap.so.1 =>     /usr/lib/libidmap.so.1
            libnsl.so.1 =>       /lib/libnsl.so.1
            libuutil.so.1 =>     /lib/libuutil.so.1
            libmp.so.2 =>        /lib/libmp.so.2
            libmd.so.1 =>        /lib/libmd.so.1
            libm.so.2 =>         /lib/libm.so.2

Vamos a copiar las bibliotecas utilizando un pequeño script. Desde el directorio <bin> de nuestro <chroot> hacemos:
itily@openzooey:~/chroot_example/bin$ ldd ls |awk '{print "cp "$3" .."$3}'
cp /lib/libsec.so.1 ../lib/libsec.so.1
cp /lib/libnvpair.so.1 ../lib/libnvpair.so.1
cp /lib/libcmdutils.so.1 ../lib/libcmdutils.so.1
cp /lib/libcurses.so.1 ../lib/libcurses.so.1
cp /lib/libc.so.1 ../lib/libc.so.1
cp /lib/libavl.so.1 ../lib/libavl.so.1
cp /usr/lib/libidmap.so.1 ../usr/lib/libidmap.so.1
cp /lib/libnsl.so.1 ../lib/libnsl.so.1
cp /lib/libuutil.so.1 ../lib/libuutil.so.1
cp /lib/libmp.so.2 ../lib/libmp.so.2
cp /lib/libmd.so.1 ../lib/libmd.so.1
cp /lib/libm.so.2 ../lib/libm.so.2
Una vez verificado, ya podemos copiar las bibliotecas
itily@openzooey:~/chroot_example/bin$ ldd /bin/ls |awk '{print "cp "$3" .."$3}'|bash
itily@openzooey:~/chroot_example/bin$ 
Ahora tenemos nuestra  estructura completa, y tiene la siguiente forma:
itily@openzooey:~/chroot_example$ ls -l
total 12
drwxr-xr-x   2 itily  staff          3 dic 22 14:37 bin
drwxr-xr-x   2 itily  staff          5 ene 10 20:43 etc
drwxr-xr-x   2 itily  staff         14 ene 10 20:48 lib
drwxr-xr-x   3 itily  staff          3 ene 10 20:40 usr
Añadimos los archivos de <group> y <passwd> con el usuario que será el encargado de ejecutar el proceso -en mi caso itily- y creamos nuestra "licencia"
itily@openzooey:~/chroot_example$ echo "this is a test" > etc/license
itily@openzooey:~/chroot_example$ cd etc/
itily@openzooey:~/chroot_example/etc$ cat /etc/group |grep staff > group
itily@openzooey:~/chroot_example/etc$ cat /etc/passwd |grep itily > passwd
Ejecutar el comando <chroot>
Por último, ya sólo nos queda ejecutar el comando < que tiene el siguiente formato:
chroot rootdir command [arg ...]
Debemos tener en cuenta que si ejecutamos el comando <chroot> con un usuario sin privilegios de "root", tendremos el siguiente mensaje
itily@openzooey:~$ chroot chroot_example bin/ls /etcchroot: cannot change root directory to chroot_example: Not owner
Así que utilizaremos <pfexec> -si tenemos asignado el rol de root, o nos cambiaremos a root- para ejecutarlo:
itily@openzooey:~$ pfexec chroot chroot_example /bin/ls -l /etc    total 6
    -rw-r--r--   1 101  10         11 Jan 10 19:43 group
    -rw-r--r--   1 101  10         18 Jan 10 19:42 license
    -rw-r--r--   1 101  10         49 Jan 10 19:43 passwd

Ya está! Hemos conseguido que nuestro comando <ls> nos muestre nuestro directorio </chroot_example/etc> como </etc>

Conclusiones
Aunque a veces parezca que las tecnologías antiguas ya no sirven, puede que en circunstancias nos ayuden, además, <chroot> nos permite montar sin "muchas" complicaciones algunas tareas sencillas sin tener que estar creando cientos de Containers para ello.


Referencias