:B~ Ejemplos

1~examples Ejemplos

Este capítulo ofrece ejemplos de creación de imágenes de sistemas en vivo
para casos de uso específicos. Si se es nuevo en la creación de una imagen
en vivo propia, se recomienda leer primero los tres tutoriales en secuencia,
ya que cada uno enseña nuevas técnicas que ayudan a utilizar y entender los
ejemplos restantes.

2~using-the-examples Uso de los ejemplos

Para poder seguir estos ejemplos es necesario un sistema donde crearlos que
cumpla con los requisitos enumerados en {Requisitos}#requirements y tener
live-build instalado tal y como se describe en {Instalación de
live-build}#installing-live-build.

Hay que tener en cuenta que, para abreviar, en estos ejemplos no se
especifica una réplica local para la creación de la imagen.  Es posible
acelerar las descargas considerablemente si se utiliza una réplica local. Se
puede especificar las opciones cuando se usa #{lb config}#, tal y como se
describe en {Réplicas de Distribution utilizadas durante la
creación}#distribution-mirrors-build-time,  o para más comodidad, establecer
el valor por defecto para la creación del sistema en
#{/etc/live/build.conf}#. Basta con crear este fichero y en el mismo,
establecer las variables #{LB_MIRROR_*}# correspondientes a la réplica
preferida. Todas las demás réplicas usadas en el proceso de creación usarán
estos valores por defecto. Por ejemplo:

code{

 LB_MIRROR_BOOTSTRAP="http://mirror/debian/"
 LB_MIRROR_CHROOT_SECURITY="http://mirror/debian-security/"
 LB_MIRROR_CHROOT_BACKPORTS="http://mirror/debian-updates/"

}code

2~tutorial-1 Tutorial 1: Una imagen predeterminada

*{Caso práctico:}* Crear una primera imagen sencilla, aprendiendo los fundamentos de live-build.

En este tutorial, vamos a construir una imagen ISO híbrida por defecto que
contenga únicamente los paquetes base (sin Xorg) y algunos paquetes de
soporte, como un primer ejercicio en el uso de live-build.

No puede ser más fácil que esto:

code{

 $ mkdir tutorial1 ; cd tutorial1 ; lb config

}code

Si se examina el contenido del directorio #{config/}# se verá almacenada
allí una configuración en esqueleto preparada para ser personalizada o en
este caso para ser usada inmediatamente para construir una imagen por
defecto.

Ahora, como superusuario, crear la imagen, guardando un log con #{tee}#
mientras se crea.

code{

 # lb build 2>&1 | tee build.log

}code

Suponiendo que todo va bien, después de un rato, el directorio actual
contendrá #{live-image-i386.hybrid.iso}#. Esta imagen ISO híbrida se puede
arrancar directamente en una máquina virtual como se describe en {Probar una
imagen ISO con Qemu}#testing-iso-with-qemu y en {Probar una imagen ISO con
VirtualBox}#testing-iso-with-virtualbox o bien ser copiada a un medio óptico
como un dispositivo USB tal y como se describe en {Grabar una imagen ISO en
un medio físico}#burning-iso-image y {Copiar una imagen ISO híbrida en un
dispositivo USB}#copying-iso-hybrid-to-usb, respectivamente.

2~tutorial-2 Tutorial 2: Una utilidad de navegador web

*{Caso práctico:}* Crear una utilidad de navegador web, aprendiendo a aplicar personalizaciones.

En este tutorial, se creará una imagen adecuada para su uso como utilidad de
navegador web, esto sirve como introducción a la personalización de las
imágenes de sistemas en vivo.

code{

 $ mkdir tutorial2
 $ cd tutorial2
 $ lb config
 $ echo "task-lxde-desktop iceweasel" >> config/package-lists/my.list.chroot

}code

La elección de LXDE para este ejemplo refleja el deseo de ofrecer un entorno
de escritorio mínimo, ya que el enfoque de la imagen es el uso individual
que se tiene en mente, el navegador web. Se podría ir aún más lejos y
ofrecer una configuración por defecto para el navegador web en
#{config/includes.chroot/etc/iceweasel/profile/}#, o paquetes adicionales de
soporte para la visualización de diversos tipos de contenido web, pero se
deja esto como un ejercicio para el lector.

Crear la imagen, de nuevo como superusuario, guardando un log como en el
{Tutorial 1}#tutorial-1:

code{

 # lb build 2>&1 | tee build.log

}code

De nuevo, verificar que la imagen está bien y probarla igual que en el
{Tutorial 1}#tutorial-1.

2~tutorial-3 Tutorial 3: Una imagen personalizada

*{Caso práctico:}* Crear un proyecto para conseguir una imagen personalizada, que contenga el software favorito para llevárselo en una memoria USB donde quiera que se vaya, y hacerlo evolucionar en revisiones sucesivas, tal y como vayan cambiando las necesidades y preferencias.

Como nuestra imagen personalizada irá cambiando durante un número de
revisiones, si se quiere ir siguiendo esos cambios, probar nuevas cosas de
forma experimental y posiblemente volver atrás si no salen bien, se guardará
la configuración en el popular sistema de control de versiones
#{git}#. También se utilizarán las mejores prácticas de configuración
automática a través de scripts #{auto}# como se describe en {Gestionar una
configuración}#managing-a-configuration.

3~ Primera revisión

code{

 $ mkdir -p tutorial3/auto
 $ cp /usr/share/doc/live-build/examples/auto/* tutorial3/auto/
 $ cd tutorial3

}code

Editar #{auto/config}# del siguiente modo:

code{

 #!/bin/sh

 lb config noauto \
     --architectures i386 \
     --linux-flavours 686-pae \
     "${@}"

}code

Ejecutar #{lb config}# para generar el árbol de configuración, utilizando el
script #{auto/config}# que justo se acaba de crear:

code{

 $ lb config

}code

Completar la lista de paquetes local:

code{

 $ echo "task-lxde-desktop iceweasel xchat" >> config/package-lists/my.list.chroot

}code

En primer lugar con #{--architectures i386}# se asegura de que en un sistema
de creación #{amd64}# se crea una versión de 32-bits adecuada para ser usada
en la mayoría de máquinas. En segundo lugar, se usa #{--linux-flavours
686-pae}# porque no se espera usar esta imagen en sistemas mucho más
viejos. En tercer lugar se elige el metapaquete /{lxde}/ para proporcionar
un escritorio mínimo. Y, por último, se añaden dos paquetes iniciales
favoritos: /{iceweasel}/ y /{xchat}/.

Ahora, crear la imagen:

code{

 # lb build

}code

Tener en cuenta que a diferencia de los dos primeros tutoriales, ya no se
tiene que escribir #{2>&1 | tee build.log}# ya que esto se incluye ahora en
#{auto/build}#.

Una vez que se ha probado la imagen (como en el {Tutorial 1}#tutorial-1) y
se ha asegurado de que funciona, es el momento de iniciar el repositorio
git, añadiendo sólo los scripts auto que se acaba de crear, y luego hacer el
primer commit:

code{

 $ git init
 $ cp /usr/share/doc/live-build/examples/gitignore .gitignore
 $ git add .
 $ git commit -m "Initial import."

}code

3~ Segunda revisión

En esta revisión, vamos a limpiar desde la primera creación, agregar el
paquete /{vlc}/ a nuestra configuración, crear de nuevo, probar y enviar los
cambios al git.

El comando #{lb clean}# limpiará todos los ficheros generados en las
primeras creaciones a excepción del caché, lo cual ahorra tener que volver a
descargar de nuevo los paquetes. Esto asegura que el siguiente #{lb build}#
vuelva a ejecutar todas las fases para regenerar los ficheros de nuestra
nueva configuración.

code{

 # lb clean

}code

Añadir ahora el paquete /{vlc}/ a nuestra lista de paquetes local en
#{config/package-lists/my.list.chroot}#:

code{

  $ echo vlc >> config/package-lists/my.list.chroot

}code

Crear de nuevo:

code{

# lb build

}code

Probar, y cuando se esté satisfecho, enviar la próxima revisión al git:

code{

 $ git commit -a -m "Adding vlc media player."

}code

Por supuesto, es posible hacer cambios más complicados en la configuración,
tal vez añadiendo ficheros en los subdirectorios de #{config/}#. Cuando se
envian nuevas revisiones, hay que tener cuidado de no editar a mano o enviar
los ficheros del nivel superior en #{config}# que contienen variables
#{LB_*}# ya que estos son productos de creación también y son siempre
limpiados por #{lb clean}# y recreados con #{lb config}# a través de sus
respectivos scripts #{auto}#.

Hemos llegado al final de nuestra serie de tutoriales. Si bien son posibles
muchos más tipos de personalización, aunque sólo sea con las pocas
características explicadas en estos sencillos ejemplos, se puede crear una
variedad casi infinita de imágenes diferentes. Los ejemplos que quedan en
esta sección abarcan varios casos de usos diferentes procedentes de las
experiencias recogidas de los usuarios de sistemas en vivo.

2~ Un cliente VNC kiosk

*{Caso Práctico:}* Crear una imagen con live-build para que se conecte directamente a un servidor VNC al arrancar.

Crear un directorio de construcción y lanzar una configuración de esqueleto
en su interior, desactivando «recommends» para conseguir un sistema
mínimo. Y a continuación, crear dos listas iniciales de paquetes: La primera
generada con un script proporcionado por live-build llamado #{Packages}#
(ver {Generar listas de paquetes}#generated-package-lists), y la segunda
lista una que incluya /{xorg}/, /{gdm3}/, /{metacity}/ y /{xvnc4viewer}/.

code{

 $ mkdir vnc-kiosk-client
 $ cd vnc-kiosk-client
 $ lb config -a i386 -k 686-pae --apt-recommends false
 $ echo '! Packages Priority standard' > config/package-lists/standard.list.chroot
 $ echo "xorg gdm3 metacity xvnc4viewer" > config/package-lists/my.list.chroot

}code

Como se explica en {Ajuste de APT para ahorrar
espacio}#tweaking-apt-to-save-space  puede ser necesario volver a agregar
algunos paquetes recomendados para que  la imagen funcione correctamente.

Una manera fácil de conocer todos los «recommends» es utilizar
/{apt-cache}/. Por ejemplo:

code{

 $ apt-cache depends live-config live-boot

}code

En este ejemplo, descubrimos que teníamos que volver a incluir varios
paquetes recomendados por live-config y live-boot: #{user-setup}# para hacer
funcionar el inicio automático de sesión y  #{sudo}# programa esencial para
apagar el sistema. Además, podría ser útil añadir #{live-tools}# para poder
copiar la imagen en la memoria RAM y #{eject}# para finalmente poder
expulsar el medio en vivo. Por eso:

code{

 $ echo "live-tools user-setup sudo eject" > config/package-lists/recommends.list.chroot

}code

Después, crear el directorio #{/etc/skel}# en #{config/includes.chroot}# y
poner dentro un fichero #{.xsession}# personalizado para el usuario que por
defecto ejecutará /{metacity}/ e iniciará el /{xvncviewer}/, conectándo al
puerto #{5901}# de un servidor en #{192.168.1.2}#:

code{

 $ mkdir -p config/includes.chroot/etc/skel
 $ cat > config/includes.chroot/etc/skel/.xsession << EOF
 #!/bin/sh

 /usr/bin/metacity &
 /usr/bin/xvncviewer 192.168.1.2:1

 exit
 EOF

}code

Crear la imagen:

code{

 # lb build

}code

Disfrutarlo.

2~ Una imagen básica para un pendrive USB de 128MB

*{Caso Práctico:}* Crear una imagen quitando algunos componentes para que quepa en un pendrive USB de 128MB dejándo un poco de espacio libre para poder usarlo para lo que se quiera.

Al optimizar una imagen para adaptarla al tamaño de algunos medios de
almacenamiento, es necesario comprender el equilibrio que se está haciendo
entre tamaño y funcionalidad. En este ejemplo, se recorta tanto sólo para
dar cabida a material adicional dentro de un tamaño de 128MB, pero sin hacer
nada para destruir la integridad de los paquetes que contiene, tales como la
depuración de las variantes locales a través del paquete /{localepurge}/ u
otro tipo de optimizaciones «intrusivas». Cabe destacar que se utiliza
#{--debootstrap-options}# para crear un sistema mínimo desde el principio.

code{

 $ lb config --apt-indices false --apt-recommends false --debootstrap-options "--variant=minbase" --firmware-chroot false --memtest none

}code

Para hacer que la imagen funcione correctamente, tenemos que volver a
añadir, al menos, dos paquetes recomendados, que son excluidos por la opción
#{--apt-recommends false}#. Ver {Ajuste de APT para ahorrar
espacio}#tweaking-apt-to-save-space

code{

 $ echo "user-setup sudo" > config/package-lists/recommends.list.chroot

}code

Ahora, crear la imagen de forma habitual:

code{

 # lb build 2>&1 | tee build.log

}code

En el sistema del autor, en el momento de escribir esto, la configuración
anterior produjo una imagen de 110MB. Esto se compara favorablemente en
tamaño con la imagen de 192MB producida por la configuración por defecto en
el {Tutorial 1}#tutorial-1.

Dejar fuera los índices de APT con #{--apt-indices false}# ahorra una
cantidad importante de espacio, la desventaja es que será necesario hacer un
#{apt-get update}# antes de usar apt en el sistema en vivo. Excluyendo los
paquetes recomendados con #{--apt-recommends false}# se ahorra un poco de
espacio adicional a costa de omitir algunos paquetes que de otro modo podría
esperarse que estuvieran alli. #{--debootstrap-options "--variant=minbase"}#
preinstala un sistema mínimo desde el principio. El hecho de no incluir
automáticamente paquetes de firmware con #{--firmware-chroot false}# también
ahorra un poco de espacio. Y por último, #{--memtest none}# evita la
instalación de un comprobador de memoria. 

*{Nota:}* También se puede conseguir un sistema mínimo utilizando scripts gancho como por ejemplo el script #{stripped.hook.chroot}# que se encuentra en #{/usr/share/doc/live-build/examples/hooks}#, que puede reducir aún más el tamaño de la imagen hasta 91MB. Sin embargo, el script elimina documentación y otros ficheros de los paquetes instalados en el sistema. Esto viola la integridad de los paquetes y como se comenta en el encabezado del script, puede tener consecuencias imprevistas. Es por eso por lo que el uso de /{debootstrap}/ es el método recomendado para conseguir este objetivo.

2~ Un escritorio GNOME con variante local e instalador

*{Caso práctico:}* Crear una imagen que contenga el escritorio gráfico GNOME, la variante local Suiza y un instalador.

Se desea crear una imagen iso-hybrid para la arquitectura i386 con un
escritorio preferido, en este caso el GNOME, que contiene todos los mismos
paquetes que serían instalados por el programa de instalación estándar de
Debian para GNOME.

El primer problema es descubrir los nombres de las tareas adecuadas. En la
actualidad, live-build no puede ayudar en esto. Aunque podríamos tener
suerte y encontrarlos a base de pruebas, hay una herramienta,
#{grep-dctrl}#, para extraerlos de las descripciones de tareas en
tasksel-data, para proceder, asegurarse de tener ambas cosas:

code{

  # apt-get install dctrl-tools tasksel-data

}code

Ahora podemos buscar las tareas apropiadas, primero con:

code{

 $ grep-dctrl -FTest-lang de /usr/share/tasksel/descs/debian-tasks.desc -sTask
 Task: german

}code

Con este comando, se descubre que la tarea se llama, sencillamente,
german. Ahora, para encontrar las tareas relacionas: 

code{

 $ grep-dctrl -FEnhances german /usr/share/tasksel/descs/debian-tasks.desc -sTask
 Task: german-desktop
 Task: german-kde-desktop

}code

En el momento del arranque se va a generar la variante local *{de_CH.UTF-8}*
y seleccionar la distribución del teclado *{ch}*. Ahora vamos a poner las
piezas juntas. Recordando de {Utilizar metapaquetes}#using-metapackages que
los metapaquetes tienen el prefijo #{task-}#, especificamos estos parámetros
del lenguaje en el arranque y a continuación añadimos  los paquetes de
prioridad estándar y los metapaquetes que hemos descubierto a la lista de
paquetes de la siguiente manera: 

code{

 $ mkdir live-gnome-ch
 $ cd live-gnome-ch
 $ lb config \
     -a i386 \
     --bootappend-live "boot=live components locales=de_CH.UTF-8 keyboard-layouts=ch" \
     --debian-installer live
 $ echo '! Packages Priority standard' > config/package-lists/standard.list.chroot
 $ echo task-gnome-desktop task-german task-german-desktop >> config/package-lists/desktop.list.chroot
 $ echo debian-installer-launcher >> config/package-lists/installer.list.chroot

}code

Tener en cuenta que se ha incluido el paquete /{debian-installer-launcher}/
para lanzar el instalador desde el escritorio en vivo. El kernel #{586}#,
necesario para que el lanzador funcione correctamente, se incluye por
defecto.
