¿Cómo hacer una metadistro USB?

Domingo, 19 Febrero 2006

Este artículo trata sobre la construcción de nuestra propia distro (basada en debian/ubuntu) para que funcione desde una memoria USB (pendrive).

Metadistros es la arquitectura para facilitar la creación de distros NO ES UNA DISTRO en particular. Al igual que existe la metaprogramación (programas que hacen programas) metadistros son herramientas que hacen distros...

Antes de empezar a soltar comandos o paquetes a instalar debo aclarar los siguientes puntos:

(Siento ser tan brusco pero hay gente que se mete a hacer cosas sin saber realmente lo que está haciendo: «zapatero a tus zapatos»)


El artículo es válido para ubuntu, PERO:
Se que existen cosas hechas como DamnSmall o Feather Linux pero esto es más bien hacer algo a medida de cada uno... no usar algo que ya existe. Es como hacerse un traje a medida o comprarse uno hecho...

Xarnoppix tiene algo parecido a esto.

ACTUALIZADO 20 feb 17:30

Parace ser que en la vanguardia digital hablan del invento presentado en Málaga con el nombre clave «USEBIX». Gracias a Ramón de Iniciativa focus, y a Hispalinux con Roberto como comandante, y eso que me dijo que sólo lo habían visto algunos frikis...



Ingredientes

Necesitamos un debian (testing/unstable)

a partir de ahora el equipo HOST, con las siguientes cosas instaladas:

* linux-image-2.6.15-1-486
* crypsetup
* initramfs-tools
* grub
* squashfs-tools

Y mis paquetes:

* initramfs-tools-metadistros
* genusblive

Que se pueden descargar desde: http://soleup.eup.uva.es/usb/

Módulos del kernel necesarios:

* unionfs-modules-2.6.15-1-486
* squashfs-modules-2.6.15-1-486

Los módulos del kernel unionfs y squashfs: http://soleup.eup.uva.es/usb/

Si no vas a usar el kernel propuesto COMPILA tú mismo los módulos y procura tenerles instalados en el sistema HOST.

IMPORTANTE: Las versiones más recientes de los programas las podrás encontrar en el servidor SVN de soleupix, soleupix --> initramfs-tools-metadistros.

Un pendrive

de tamaño por lo menos 256 megas (es posible hacerlo en 128 pero queda bastante justo), si es USB 2.0 perfecto, si es USB 1.0 tendremos problemas de rendimiento. Puede valer un reproductor MP3, pero aviso que una vez instalado grub el mío no reproduce música hasta formatearlo. Mis pruebas se han hecho con un pendrive Toshiva de 1Gb y mi reproductor mp3 Supratech. Es útil tener a mano software de formateo total. Aunque se puede hacer con gparted/cfdisk o similares el que nunca falla es el del fabricante (desgraciadamente sólo corre en windows). Hay uno que funciona con todos que es el de HP: Format Utility for HP Drive Key. (necesitas un windows para usarlo)

¿Qué vamos a hacer?


La idea es muy sencilla, la velocidad de lectura de una memoria USB es muy mayor a la de un dvd/cdrom, del órden de 10 veces. Vamos a usar un pendrive como cdrom en el que tendremos la metadistro. El funcionamiento es parecido al uso desde cdrom pero vamos a aprovechar que en el pendrive podemos escribir.

Mi idea de escritura es la siguiente, vamos a crear un archivo que formatearemos con el sistema de archivos ext3 y que se montará mediante cryptsetup de forma segura en la home del usuario. Así si perdemos el pendrive (algo no muy dificil ya que cada vez son más pequeños) no ponemos en peligro nuestros datos ya que sin saber la contraseña no se puede leer ese archivo.

Tenemos otras ventajas frente a cdrom pero también hay que recalcar algunos inconvenientes, el más importante es que no todas las BIOS permiten el arranque desde un dispositivo USB, este gran inconveniente lo he resuelto creando una pequeña imagen iso (6 megas) con el mismo kernel que la META, incluso podiendo grabarla en una tarjeta-cdrom o un mini-cdrom. Más adelante explicaré como crear esta imagen.

Vamos a usar como sistema de archivos FAT32, así podremos seguir guardando datos desde cualquier sistema operativo. Esto acarrea algún inconveniente como que el nombre de carpetas sólo puede ser en minúsculas (no el nombre de archivos).

Preparación y creación de la distro META

Despues de tener nuestro HOST con todos los requerimientos instalados vamos a crear nuestro sistema que copiaremos al pendrive, lo llamaremos META.

El paquete genusblive nos ha creado el siguiente árbol de directorios:

media
| `-- distro
| |-- usb-master
| | |-- boot
| | | `-- grub
| | | |-- menu.lst
| | | `-- splash.xpm.gz
| | `-- meta
| | |-- create_secret.img.sh
| | `-- settings.conf
| `-- usb-sources

En usb-master tendremos lo que luego se copia al pendrive, en usb-sources (directorio vacío) instalaremos mediante debootstrap nuestro sistema.

Paso 1: debootstrap

# cd /media/distro
# deboostrap etch /media/distro/usb-sources http://idefix.eup.uva.es/debian

Después de descargar el sistema base nos dejará la distro aún sin configurar.

Montaremos algunas cosas dentro de la jaula:

# mount -o bind /dev /media/distro/usb-sources/dev
# mount -o bind /proc /media/distro/usb-sources/proc
# mount -o bind /sys /media/distro/usb-sources/sys

Copiamos algunas cosas....

# cp -ra /etc/apt/* /media/distro/usb-sources/etc/apt/
# cp -ra /etc/network/interfaces /media/distro/usb-sources/etc/network/interfaces
# cp -ra /etc/fstab /media/distro/usb-sources/etc/fstab
# cp -ra /etc/hostname /media/distro/usb-sources/etc/hostname
# cp -ra /etc/hosts /media/distro/usb-sources/etc/hosts

Entramos a la jaula:

# chroot /media/distro/usb-sources

Editar el sources.list para quitar lo que sobra, con una línea como esta sirve:

deb http://tumirrorfavorito/debian etch main contrib non-free

# nano /etc/apt/sources.list

Configuraremos lo que ya hay instalado...

# dpkg-reconfigure -a

IMPORTANTE: NO crear usuario normal y usar una contraseña de root genérica (debemos exponerla en las intrucciones de nuestra distro, yo he puesto root, el pendrive no tiene ssh así que creo que si alguien la sabe tampoco puede usarla desde fuera de la máquina)

Editamos algunas opciones:

# nano /etc/default/rcS

Poner UTC=no (horario no utc) y si se quiere VERBOSE=no

Ajustar la zona horaria:

# tzconfig

Elegir Europa (8) y escribir «Madrid» para el caso de distros españolas.

Actualizar e instalar cosas...

# apt-get update && apt-get upgrade

Por ejemplo voy a preparar una mini distro con un navegador un un lector de correo. La distro que han usado de pruebas en la Conferencia Internacional de Software Libre de Málaga estos días.

# apt-get install udev discover hal x-window-system-core gdm gnome-core

Navegador y gestor de correo:

# apt-get install firefox mozilla-thunderbird

Borramos la cache de paquetes deb descargados:

# apt-get clean

En ubuntu a fecha de hoy parece haber paquetes de traducción a español de ámbos en debian no :(

No vamos a instalar un kernel ya que sólo necesitamos los módulos así nos ahorramos el initramfs y/o yaird además de otros paquetes...

Llega la hora de la limpieza... vamos a borrar todo aquello que se puede sobrar:

Con el siguiente comando (copia y pega) vemos los paquetes instalados ordenados por el que más ocupa:

# dpkg-query -W --showformat '${Installed-Size} ${Package} ${Section}n' | sort -n -r | more

En mi distro he desinstalado las fuentes de 100dpi, los drivers dri y gl de las X (vamos a usar sólo vesa), libsigc++ nvi mandb tasksel logrotate y base-config.

He instalado localepurge y he seleccionado que no borre las locales en inglés «en» y todas las de español «es, es_ES*» Se pueden ver también en /etc/locale.nopurge. Esto borrará todos los archivos de traducción en idiomas que no vamos a usar... Ejecutar después localepurge

Salirmos del chroot, el resto de la limpieza la hacemos desde fuera...

# exit

He montado un script que borra /usr/share/doc /usr/share/man y alguna cosa más....

EJECUTAMOS COMO USUARIO NO ROOT primero para ver que borramos.

$ /usr/sbin/clean-usb-sources /media/distro/usb-sources

Nos saldrán un montón de errores de permiso denegado así podemos saber que se va a borrar.

Si estamos de acuerdo lo ejecutamos cono root:

# clean-usb-sources /media/distro/clean-usb-sources

Como veis el parámetro es el directorio a limpiar. NOTA: Borrar /usr/share/doc puede atentar contra la licencia de debian ya que estamos eliminando las notas de copyright de cada paquete, pero es una forma de ganar sitio. Sino quieres no lo hagas.

Desmontaremos lo que montamos antes:

# umount /media/distro/usb-sources/dev
# umount /media/distro/usb-sources/proc
# umount /media/distro/usb-sources/sys

Si alguno da error porque está ocupado usar la opción de umount: -l

Vemos el tamaño sin comprimir:

# du -sh /media/distro/usb-sources

A mí me da unos 300 megas lo que comprimido ocupará poquísimo...

Tenemos que copiar los módulos del kernel:

# cp -ra /lib/modules/2.6.15-1-486 /media/distro/usb-sources/lib/modules/

Si vemos que sobra alguno o que no queremos dar soporte a algo podemos borrar lo que no necesitemos ( yo no he borrado nada ) así de paso no tengo que rehacer el modules.dep (dependencias de módulos)

Preparación de las imágenes

Ahora vamos a generar las imágenes de arranque:

Editar la configuración de initramfs

# nano /etc/mkinitramfs/initramfs.conf

Cambiar la variable BOOT para que valga BOOT=usb y añadir la variable USERNAME=liveuser

Ejecutar:

# genusblive

La primera vez esto genera tanto el initramfs como el META.squash con -x ó -y generamos sólo la primera o sólo la última.

Copia de los archivos al pendrive


Ahora vamos a proceder a copiarlo a nuestro pendrive:

# livecopy2usb

Nos pedirá la partición sdX donde lo vamos a instalar.

CONSEJO: Si tienes el pendrive sin formatear desde que lo compraste es el momento de guardar todo lo que tienes y formatearlo a ser posible en FAT32 (creando una partición). Para esta labor puedes usar cfdisk (en consola) gparted (grafico) o el programa que comentaba antes de HP desde un windows.

En mi caso la partición es /dev/sdb1 a partir de ahora yo trabajaré con este dispositivo si en tu caso no coincide usa el que necesites.

# livecopy2usb

List of avalaible devices to install USB metadistro:
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sda4
/dev/sda5
/dev/sda6
/dev/sdb1 <=====

Please specify device/partition: /dev/sdb1

Umounting and mounting /dev/sdb1 in /media/distro/pendrive
Copy system files? [Y/n] Y
Copying META image ...
Wait for "sync" ...

Install grub in /dev/sdb [Y/n] Y

Installing grub in root=(hd2.0) grub-device=(hd2)

Your device /dev/sdb is now capable to start EducaTICC

Reboot and boot from usbdisk.
=====================================

Una vez hecho esto en el pendrive tendremos unos cuantos archivos, el que más importa por ahora es settings.conf dentro del directorio meta que es donde indicaremos algunos parámetros para tener una distro un poco más personalizada.

El archivo tiene comentarios (en inglés) sobre para que es cada variable:

#################
# Username #
#################

# username (empty if use liveuser)
conf_username=usuario

# hostname
conf_hostname=EducaTICC

# language (es, en, etc...)
lang=es

#################
# Local hardisk #
#################

# readonly (ro) or read&write (rw)
conf_local_hd=ro



#################
# network stuff #
#################

# network device to configure (eth0 eth1 wlan0) ONLY ONE empty for dhcp on all interfaces
conf_net_device=eth0

# ip address (empty for dhcp)
conf_net_ip=192.168.0.3

# netmask
conf_net_netmask=255.255.155.0

# gateway
conf_net_gateway=192.168.0.1


# DNS servers (space separated and between "" )
conf_net_dns="157.88.18.189 157.88.18.190"

# domain nameserver
conf_net_dnsname="dominio.com"

#################
# xorg settings #
#################

# grafic card xorg driver (vesa use xorg.conf file, skip autoconf)
conf_xorg_driver=vesa

# keyboard (pc105 for example)
conf_xorg_keys=pc105
conf_xorg_lang=es

# touchpad (for notebooks) 0 or 1 (not works yet)
conf_xorg_touchpad=0


Una vez editado a nuestro gusto ( ACEPTO SUGERENCIAS DE MÁS COSAS QUE SE PUEDEN CONFIGURAR DESDE AQUÍ ) vamos con el siguiente paso.


Creación de la home encriptada

ESTE PASO ES OPTATIVO

Puede asustar un poco el tema de encriptación y demás pero símplemente es un archivo del tamaño que nosotros indiquemos el cual pide contraseña para montarlo y una vez montado es como una partición ext3 cualquiera ( he formateado esto en ext3 pero se puede usar cualquier otro formato *nix)

Para facilitar la labor he programado un pequeño script que se guarda en el pendrive y se instala en el sistema: create_secret.img[.sh]

Forma de uso:

# ./create_secret.img.sh
Usage:

./create_secret.img.sh --help [this help]

./create_secret.img.sh --create --secret.img=/dir/to/secret.img --size=XXX [in Kb]
create secret.img crypt filesystem with XXX Kb

./create_secret.img.sh --mount --secret.img=/dir/to/secret.img
mount crypt filesystem in /mnt/secret

./create_secret.img.sh --umount --secret.img=/dir/to/secret.img
umount crypt filesystem in /mnt/secret

Please edit ./create_secret.img.sh to change mountpoint or loopback device.

debemos ejecutarlo como root y desde el directorio meta del pendrive montado... Para crear la meta yo he ejecutado:

# ./create_secret.img.sh --create --secret.img=./secret.img --size=200000

Esto crea un archivo de 200 megas (el tamaño va en Kb) en el directorio donde estamos (meta) y nos pedirá la frase de paso dos veces montandolo en /mnt/secret.

Las opciones de montar y desmontar son bastante útiles para no tener que aprenderse todo lo que hay que hacer (recomiendo mirar el contenido del script)

No quedan muchas cosas más... por último si queremos que nuestro escritorio luzca de una manera especial, en vez de arrancarlo copiarlo en /etc/skel de la distro y volver a ahcer todo podemos hacer lo siguiente.

Arrancamos el pendrive y una vez dentro de la sesión configuramos todo a nuestro gusto (fondo, splash, tema, fuentes, iconos....) abrimos un terminal y como usuario ejecutamos lo siguiente:

$ cd
$ sudo -czf /.dirs/dev/meta/home.tar.gz .

Esto lo que hace es guardar nuestra home comprimida en un tar.gz a modo de plantilla y si no existe el archivo de texto en nuestra home llamado .restored descomprimirá este tar.gz durante el arranque (modo kiosko....) Como muchos habréis imaginado /.dirs/dev es el punto de montaje original de nuestro pendrive.

Por último me dejo por explicar el truco de arrancar desde el pendrive en equipos que no poseen de la opción en la BIOS. Es muy sencillo.

Ejecutar:

# genusbliveCD

Esto generará un archivo iso en /media/distro/isos de aproximadamente 6 megas, arrancando desde el cd y con el pendrive conectado a los pocos segundos de espera de dispositivos empezará el resto del arranque desde USB, el cdrom puede quitarse sin problemas ya que el kernel (vmlinuz) queda en memoria. Si a alguien se le ocurre como detectar desde el initramfs si hemos arrancado desde USB o pendrive sin tener que cambiar o parchear grub mejor que mejor, se me ocurre que en el script genusbliveCD que genera la iso y que modifica algunas cosas del menu.lst añadir algo como fromcd o algo así en el cmdline para que se expulse el cdrom tan pronto como no se necesite.



Forma rápida, probar algo hecho

http://soleup.eup.uva.es/usb/

Descargamos y descomprimimos educatic.tar.gz de la siguiente manera:

# mkdir /media/distro
# cd /media/distro
# tar -zxf /donde/hayamos/guardado/educatic.tar.gz

Hay que descragar tambien initramfs y sobreescribir el que hay en boot ( el que hay en el tar.gz tiene algunos fallos)

===================================================================

Si se quiere probar una distro mucho más completa (xfce4 openoffice, java JClic, etc... descargar el archivo META-700.squashfs y sustituirlo por el META.squashfs original)

Enchufamos el pendrive de 256 como mínimo.

No es necesario formatearlo pero si se quiere partir desde cero es lo mejor:

dmesg|tail => vemos el dispositivo creado (por ejemplo sda con sda1 como particion)

mkfs.vfat -F 32 -n USeBix /dev/sda1

ahora ejecutamos:

# livecopy2usb (está en el paquete genusblive)

nos pedira el dispositivo, respondemos /dev/sda1

pregunta si copiar archivos del sistema, dar intro (tarda un ratejo...)
pregunta si instalar grub, dar intro (sólo hacerlo la primera vez)

===========================================================

Probar

Con qemu:

qemu -hda /dev/sda (seleccionar la opcion de grub que pone qemu)

De modo normal:

Reiniciar con el pendrive enchufado y entrar a la BIOS (F2 o Supr)

Mirar el órden de arranque y seleccionar como primera opción o bien USB-HDD
si existe la opción o en los discos duros seleccionar primero la marca de
nuestro pendrive.

Arrancar con cualquier opción menos con la de qemu.