Skip to main content

Creando nuestra propia mini distribución USB

Posted in

En este artículo aprenderemos a crear nuestra propia distribución basada en Debian instalada en un Pendrive USB. No será un sistema Live, como muchos, sino una instalación estándar, como si de un disco duro se tratase. Todo lo que hagamos en el SO de ese pendrive, quedará guardado. Con la peculiaridad de que lo prepararemos (o al menos lo intentaremos xD) para que arranque con cualquier máquina x86
En nuestro caso lo hemos utilizado para arrancar un thin-client. Realizaremos el proceso mediante la herramienta debootstrap y el bootloader syslinux (su variante extlinux). Este artículo también puede servir para instalar un sistema en otro tipo de dispositivo (sea SD, CF...) o incluso en un Disco duro.

Motivación

¿Por qué hacerlo? En primer lugar para aprender. Seguro que ya existen sistemas hechos para instalar en pendrive, ¿pero donde estaremos más cómodos que en el nuestro propio? Como instalaremos sólo lo que necesitemos, podemos reducirlo a un sistema minimalista que entre en un Pendrive de 500MB, o un sistema completo para Pendrives de mayor capacidad.
Además bastará con crear una imagen del pendrive (mediante 'cat' o 'dd') para clonarlo las veces que queramos y en en número de memorias USB que deseemos (sería un buen regalo para un amigo: "un pendrive con una mini distribución hecha por ti mismo" xD).
También vereis que el proceso es realmente sencillo, no necesitaremos estar una semana encerrados en la habitación para lograrlo (ni mucho menos xD), en unos 30 minutos estará hecho.

Requisitos

 

  • Un Pendrive de mínimo 500MB (puede hacerse con 256MB pero es muy justo)
  • Un ordenador con GNU/Linux instalado y conexión a internet
  • La herramienta debotstrap (Gentoo: emerge debootstrap) (Ubuntu/Debian: aptitude install debootstrap)
  • 30 minutos de vuestra vida
  •  

    El proceso

     

    Preparando el Pendrive

    Introducimos el Pendrive en la ranura USB (suponemos que esta en /dev/sdb1).
    Particionamos mediante fdisk (creamos 1 sola partición de tipo Linux (83), formateamos en ext2 y montamos en /mnt.

    fdisk /dev/sdb1
    mkfs.ext2 /dev/sdb1 
    mount /dev/sdb1 /mnt
    

     

     

    Instalando el sistema base

    Esto nos lo hará la genial herramienta debootstrap. Sólo necesitamos indicarle la arquitectura y la versión de Debian a usar.
    En nuestro caso sera 'i386' y 'etch', pero podeis variarlo según querais.

    debootstrap --arch i386 etch /mnt

    Este proceso tardará un poco, ya que descarga los paquetes del sistema base desde internet.

     

     

    Customizando el sistema

    Ahora ya tenemos un sistema mínimo en el Pendrive. Vamos a instalar las herramientas que encontremos necesarias, y a personalizarlo un poco a nuestro gusto.
    En primer lugar montamos /proc y /dev, copiamos resolv.conf (para las dns) y realizamos el cambio de sistema (chroot).

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    mount -t proc none /mnt/proc
    mount -o bind /dev /mnt/dev
    chroot /mnt
    

    Si todo va bién, ya estamos en nuestro nuevo sistema. Vamos a instalar las locales necesarias.

    aptitude install locales
    dpkg-reconfigure locales
    aptitude install localepurge
    localepurge
    

     

    Instalamos la imagen del kernel, las herramientas básicas y syslinux.
    También asignamos el password de root, y creamos un usuario que llamaremos 'user'

    aptitude install linux-image-2.6.18-5-686
    depmod 2.6.18-5-686
    aptitude install install joe screen ssh less openssl console-tools console-keymaps
    aptitude install syslinux
    user-setup
    

     

    Para poder usar el Pendrive en cualquier PC, necesitamos algun método que nos permita detectar en que unidad lo ha detectado la BIOS. Es decir sda,sdb,sdc... Para ello utilizaremos las etiquietas de disco (Label). Para asignar una etiqueta a un disco utilizaremos tune2fs. La etiqueta puede llamarse como queramos.

    tune2fs -L Debax /dev/sdb1

     

    Configuramos los archivos básicos. El contenido de estos depende de nuestro caso en particular. Para editarlos podemos usar nano por ejemplo.

    nano /etc/network/interfaces
    	auto lo
    	iface lo inet loopback
    
    	auto eth0
    	iface eth0 inet dhcp
    
    nano /etc/hostname
    	Debax
    
    nano /etc/hosts
    	127.0.0.1 localhost Debax
    
    nano /etc/fstab
    	proc            /proc   proc    defaults        0       0
    	LABEL=Debax     /       ext2    defaults,rw     0       1
    

     

    Creamos el archivo mtab, e instalamos extlinux en el disco y mbr. ¡Mucho cuidado con este último paso!

    grep -v rootfs /proc/mounts > /etc/mtab
    mkdir -p /boot/extlinux
    extlinux -zi /boot/extlinux
    cat /usr/lib/syslinux/mbr.bin > /dev/sdb
    

     

    Ahora creamos el archivo de configuración de extlinux.

    nano /boot/extlinux/extlinux.conf 
    	default Debax
    	prompt 1
    	timeout 5
    	display /boot/extlinux/hola.msg
    	label Debax
    	kernel /boot/vmlinuz-2.6.18-5-686 
    	append initrd=/boot/initrd.img-2.6.18-5-686 rw root=LABEL=Debax
    

     

    Creamos, si queremos, el archivo hola.msg que será el mensaje que expondrá extlinux en el arranque.

    nano /boot/extlinux/hola.msg
    	Bienvenido a Debax USB
    	Una mini distribucion basada en Debian
    	Visita dabax.net ;>)
    

     

    Ya podemos reiniciar el PC con el Pendrive insertado y arrancar desde él. Sería buena idea instalar el resto del software que creamos interesante.

    aptitude install xserver-xorg xfce4 firefox gaim
    

     

     

    Creando algunos scripts de arranque

    En este punto vamos a personalizar un poco más el sistema. Crearemos algunos scripts de arranque.
    startX: iniciará el entorno gráfico (es necesario modificar el script y cambiar user por el usuario que tengamos en el sistema)
    keymap: pondrá el teclado en español
    iniciar_dhcp: iniciará una búsqueda dhcp general
    xorg_conf: dará opción en el arranque de configurar las X

    nano /etc/init.d/startX
    	#!/bin/bash
    	case $1 in
    	start)
    	echo "Iniciando sistema grafico" 
    	echo "Puedes consultar el LOG en /var/log/arranque_x.log"
    	X :0 1>>/var/log/arranque_x.log 2>>/var/log/arranque_x.log & 
    	DISPLAY=:0 su user -c xfce4-session 1>/dev/null 2>/dev/null &
    	;;
    	stop) 
    	echo "Parando todos los procesos X"
    	killall -9 X
    	;;
    	*)
    	echo "Opcion invalida"
    	;;
    	esac
    
    nano /etc/init.d/keymap
    	#!/bin/bash
    	loadkyes es
    
    nano /etc/init.d/iniciar_dhcp
    	#!/bin/bash
    	case $1 in 
    	start)
    	echo "Iniciando dhcp inicial"
    	echo "Para desacivar el dhcp inicial: update-rc.d -f iniciar_dhcp remove"
    	dhclient 
    	;;
    	esac
    
    nano /etc/init.d/xorg_conf
    	#!/bin/bash
    	case $1 in
    	start)
    	echo -e "\033[0;36m Pulsa [ENTER] para configurar las X \
            o espera 5 segundos para mantener la configuracion actual\033[0m"
    	read -t 5 OP
    	if [ $? -eq 0 ]; then
    	cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup0
    	echo "Backup de la configuracion actual guardado como xorg.conf.backup0"
    	dpkg-reconfigure xserver-xorg 
    	fi 
    	;;
    	esac
    	
    chmod +x /etc/init.d/xorg_conf /etc/init.d/iniciar_dhcp /etc/init.d/keymap /etc/init.d/startX
    update-rc.d startX defaults 99
    update-rc.d xorg_conf defaults 98
    update-rc.d keymap defaults 98
    update-rc.d iniciar_dhcp defaults 98
    

     

    Y ya esta. ¡A disfrutar!

    Clonando el pendrive

    Ahora podemos guardar una copia del Pendrive para copiarla posteriormente en otro
    Podemos usar dd:
    - Para guardar la copia: dd if=/dev/sdb1 of=Debax.dd
    - Para clonar otro Pendrive: dd if=Debax.dd of=/dev/sdc1
    Este proceso requiere que el Pendrive clonado, sea igual o de mayor tamaño. Si es de mayor tamaño, el espacio que sobre quedará no utilizable.

    Otra forma menos "chapuzera" de clonarlo es guardar el mbr por un lado y copiar los archivos del sistema por otro:
    En el Pendrive de origen (sdb):

    dd if=/dev/sdb of=/tmp/mbr_Debax.dd count=512
    mount /dev/sdb1 /mnt 
    cd /mnt ; tar cvf /tmp/Debax.tar *
    

    En el Pendrive de destino (sdc):

    dd if=/tmp/mbr_Debax.dd of=/dev/sdc
    mount /dev/sdc1 /mnt
    tar xvf /tmp/Debax.tar -C /mnt/