Instalar Debian usando debootstrap y chroot

Índice.

1. Introducción y preparativos.
1.1. Materiales.
1.2. Entorno.
1.3. Montando las particiones.
2. Uso de debootstrap.
3. Instalación del sistema base.
4. Instalar y configurar GRUB.

1. Introducción y preparativos.

Algunas veces, nos encontramos ante la imposibilidad de instalar Debian GNU/Linux desde el instalador oficial, bien porque estamos utilizando una tarjeta inalámbrica de difícil configuración durante el proceso de instalación o bien porque parte del hardware no está correctamente soportado y hagan falta módulos extras para hacerlo funcionar, módulos extras que en ocasiones son inviables de introducir mediante unidades extraíbles. Este pequeño artículo va dirigido a intentar dar solución a algunos de estos problemas, así como mostraros como funciona el instalador de Debian GNU/Linux por dentro (de modo simplificado). Todos los comandos mostrados hay que ejecutarlos con privilegios de administrador.


1.1. Materiales.

Utilizaremos para ello nuevamente entornos chroot, una utilidad muy buena llamada debootstrap (o en su defecto alternativas como cdebootstrap, rpmstrap, etc.) y un livecd (ubuntu, knoppix o cualquiera que esté basado en Debian y que sea medianamente completo). La primera parte de la instalación será prácticamente igual que lo que ya expliqué en el artículo para construirnos nuestro propio blog, solo que aquí daré algunos detalles extras ya que nuestro sistema se tendrá que comportar como un sistema físico principal.


1.2. Entorno.

Lo primero de todo es conocer nuestro entorno (que vamos a hacer y donde lo vamos a hacer). Yo voy a explicar como hacer la instalación en un sistema cuyo disco duro (hda) está totalmente vacío (el hacer sistemas duales no es complicado, pero requiere un poco de habilidad con GRUB y con el tema de particionamiento). Será un disco duro de 18Gb (útiles) que particionaré según la siguiente estructura:


+-------------+------------+-------------+---------------------+-------------------+
| Partición   | Tipo       | Tamaño (Gb) | Sistema de Ficheros | Punto de montaje  |
+-------------+------------+-------------+---------------------+-------------------+
| /dev/hda1   | Primaria   | 14,0        | ext3                | /media/hda1       |
| /dev/hda5   | Lógica     | 1 Gb        | swap                | none              |
| /dev/hda6   | Lógica     | 3 Gb        | ext3                | /media/hda2       |*
+-------------+------------+-------------+---------------------+-------------------+

* Esta última partición es opcional. Yo la utilizaré como un pequeño almacén para realizar salvados del sistema.

El tema de particionamiento es muy personal, usa la utilidad que te haga el trabajo más cómodo. Por sugerirte algunas herramientas buenas, gparted, cfdisk, fdisk, qtparted...

NOTA: Puedes hacer todas las particiones que quieras, pero asegúrate más tarde
de montarlas todas donde corresponda.


1.3. Montando las particiones.

Para poder continuar, deberemos montar las particiones que hemos creado en el apartado anterior. En este caso, vamos a necesitar montar sólo /dev/hda1 puesto que la swap no nos va a hacer falta. Aún así, tenemos la posibilidad de activarla para nuestro livecd si andamos algo escasos de memoria RAM, ejecutamos:
# swapon /dev/hda5

Para montar /dev/hda1, simplemente ejecutamos como root:
# mount /dev/hda1 /media/hda1

Si no falla nada, ya podemos pasar al siguiente paso.


2. Uso de debootstrap.

Lo primero que tenemos que hacer es asegurarnos de que tenemos instalado debootstrap. Ejecutamos debootstrap a secas:
debootstrap

El resultado debería ser algo como:
I: usage: [OPTION]... [ []]
I: Try `debootstrap --help' for more information.
E: You must specify a suite and a target.

Si no te aparece un mensaje similar a éste, significa que te toca instalar debootstrap a mano. Este paso es relativamente sencillo en sistemas basados en Debian.
# apt-get update
# apt-get install debootstrap

Vamos a explicar de manera breve las principales opciones de debootstrap. La sintaxis de este comando es bastante intuitiva:
# debootstrap $DISTRO $MONTAJE $MIRROR

El parámetro $DISTRO se refiere a la versión de Debian o Ubuntu que deseas instalar. En este caso vamos a escoger Debian Lenny, pero siéntete libre de experimentar. La opción $MONTAJE hace referencia al punto de montaje o directorio donde queremos instalar nuestra distro, en este caso /media/hda1. $MIRROR es la última opción y se refiere al repositorio o espejo (mirror en inglés).

Algunas opciones extras (se colocan justo antes de $DISTRO) son:
--arch=ARCH (selecciona la arquitectura ARCH, se sustituye normalmente por i386 o amd64). Ver también la opción --foreign
--download-only (sólo descarga los paquetes, no los instala).
--keep-debootstrap-dir (no borra el directorio debootstrap generado durante la descarga de paquetes).
--unpack-tarball FILE (en vez de descargar los paquetes, los obtiene de un archivo tar, en este caso FILE).

En nuestro caso particular, vamos a instalar Debian lenny para una arquitectura i386, esto es:
# debootstrap --arch i386 lenny /media/hda1 http://ftp.fr.debian.org/debian

Empezará entonces la descarga e instalación de paquetes base, que puede llevar más o menos tiempo dependiendo de la máquina en cuestión y de la conexión disponible, por lo que tendremos que tener paciencia. Una vez que acabe, podemos pasar al siguiente paso.

Nota:
Si debootstrap dijera algo como:

/usr/lib/debootstrap/scripts <--- no encuentro el script "lenny"

Basta con ejecutar:
cp -a /usr/lib/debootstrap/scripts/sid /usr/lib/debootstrap/scripts/lenny
o
cp -a /usr/lib/debootstrap/scripts/etch /usr/lib/debootstrap/scripts/lenny


3. Instalación del sistema base.

Montamos el directorio /dev en /media/hda1/dev para que si algún programa intenta acceder a algún dispositivo físico del sistema no nos de problemas. Esto es:
# mount -o bind /dev /media/hda1/dev

Copiamos algunos ficheros importantes:
# cp -a /etc/resolv.conf /media/hda1/etc/
# cp -a /etc/adjtime /media/hda1/etc/
# cp -a /etc/apt/sources.list /media/hda1/etc/apt/ (esta última es opcional, la alternativa -recomendada- es editar ese sources.list de la jaula a mano, adaptándolo a nuestras necesidades).

Este es el momento de meternos en la jaula:
# chroot /media/hda1

También resulta muy recomendable montar proc y sys (este último tiene menor importancia, pero si lo montamos mejor):
# mount proc
# mount sys

Ahora que tenemos montados los directorios principales y estamos dentro de la jaula chroot, tenemos que configurar todo lo que ya tenemos instalado. Para ello, ejecutaremos:
# dpkg-reconfigure -a

Ello nos permitirá modificar aspectos básicos de la instalación, como decidir si queremos contraseñas shadow o no, etc.

Lo siguiente será poner una contraseña al usuario root y añadir un usuario.

# passwd
# adduser nombre_del_usuario

NOTA: Para aquellos no habituados a instalar con este método, la creación de un usuario mediante adduser implica que el usuario no tiene los permisos que un instalador normal asigna normalmente por lo que tendremos que añadir el usuario a los grupos correspondientes, por ejemplo para tener sonido necesitaríamos añadirlo al grupo audio:

# adduser nombre_del_usuario audio

Podría ocurrir que nos interesase tener dos sistemas operativos diferentes compartiendo el mismo home. En este caso, es recomendable que los usuarios se llamen de distinta manera (sobre todo para evitar problemas de configuraciones, más aún si en un sistema usamos Kde y en el otro queremos usar gnome, por ejemplo) Si lo hacemos de la manera que se explica antes, tenemos que crear la carpeta del usuario en /home (siguiendo la notación de la wiki):

# mkdir /media/hda1/home/nombre-usuario

Nos aseguramos de ser propietarios de la carpeta, dándole un identificador:

# chown 1000:1000 /media/hda1/home/nombre-usuario

porque es el primer usuario creado en la instalación y en el sistema operativo desde el cual estamos instalando no existe ese usuario nuevo. Luego, la montamos:

# mount -o bind /home/nombre-usuario /media/hda1/home/nombre-usuario

Por si acaso, podemos repetir el proceso de dar propietario, pero añadiendo el parámetro -R para que tambien cambie los contenidos de esa carpeta:
# chown -R 1000:1000 /media/hda1/home/nombre-usuario

Continuamos configurando algunas aspectos importantes, como el archivo /etc/hosts, el nombre del host (/etc/hostname).

# nano /etc/hosts
Un ejemplo muy básico sería

127.0.0.1       localhost
127.0.1.1       nombre_host

# nano /etc/hostname

nombre_host

Vamos ahora a configurar la interfaz "lo" (loopback) en nuestro archivo /etc/network/interfaces, para evitar posibles problemas que puedan surgir a posteriori.

# nano /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

NOTA: Éste archivo contiene lo mínimo recomendado. Si configuras tus dispositivos de red manualmente, deberías añadir la configuración correspondiente a ellos en este archivo. Si utilizas herramientas como Network Manager, puedes dejarlo tal y como aquí se propone.

A continuación, deberemos instalar un kernel, GRUB y algún sistema de reconocimiento de hardware. Esto es:
# aptitude update
# aptitude install grub linux-image-2.6-486 busybox udev discover1

Durante el proceso de instalacion del Kernel, es posible que salga un mensaje de error diciendonos que tenemos que añadir una linea al fichero /etc/kernel-img.conf. Lo que hacemos es editarlo:

# nano /etc/kernel-img.conf

y añadir la linea que falta

do_initrd=Yes

Comprueba si la carpeta /boot esta vacia. Si es así, tenemos que volver a ejecutar:
# aptitude install linux-image-2.6-486
(o el Kernel que se quiera instalar)

Este será el momento de añadir los usuarios que quieras o configurar cualquier aspecto que desees de tu distribución. Es importante prestar atención a los mensajes en pantalla ya que podrían surgir algunos errores, como por ejemplo que el directorio /boot/grub no existe, problemas fáciles de resolver pero a los que debemos estar atentos.

Pasamos entonces a configurar el fstab de nuestro flamante Debian Lenny, para que cuando arranquemos nuestra maquina, monte de forma adecuada cada partición en el sitio que corresponda. En nuestro caso, empezaremos con un fstab sencillito.


# /etc/fstab: static file system information.
#
# <filesystem> <mountpoint> <type> <options> <dump> <pass>
/dev/hda1       /               ext3      errors=remount-ro         0       1
/dev/hda6       /almacen        ext3      defaults                  0       2
/dev/hda5       none            swap      sw                        0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto             0       0
proc            /proc           proc      defaults                  0       0

Es posible que alguno de estos directorios no exista. Es el caso por ejemplo de /media/cdrom0, directorio que normalmente se suele enlazar a /media/cdrom y /cdrom (este último caso es de especial interés cuando vas a trabajar con apt-cdrom).

mkdir -p /media/cdrom0
ln -s /media/cdrom0 /media/cdrom
ln -s /media/cdrom0 /cdrom

Es ahora un momento ideal de ponernos a configurar el idioma/locales de nuestro Debian. Antes de nada, instalamos el paquete "locales" si no estuviera instalado ya.

# aptitude install locales
Es muy probable que no os pida configurar las mismas. En ese caso, basta con reconfigurar el paquete.

# dpkg-reconfigure locales
Lo ideal en este punto es elegir las locales correspondientes a tu idioma_país. Recomiendo elegir como mínimo las locales UTF-8, que son las más extendidas en la actualidad.

Con esto ya tendríamos un sistema Debian GNU/Linux mínimo pero funcional. Se nos abren en este momento tres alternativas:

A) Configurar GRUB y arrancar nuestro sistema para seguir instalando paquetes desde allí (Recomendado).
B) Seguir instalando paquetes y dejar la configuración de GRUB para el final.
C) No instalar GRUB ysar una ya instalada en otro sistema operativo.

Yo voy a proceder siguiendo el camino A por varias razones, entre las que destaco que de este modo nos resultará más cómodo instalar lo que queda a nuestra distribución sin tener que estar lidiando con sistemas chroot. Nuevamente, siéntete libre de tomar el camino B, que es igualmente válido. Para ello, instala en este momento los paquetes que desees y a continuación, ya estarás en condiciones de pasar al punto 4.

NOTA: Si estás utilizando una tarjeta inalámbrica que requiera módulos especiales (madwifi, ipw****, etc.) te recomiendo encarecidamente instalar dichos módulos (o compilarlos) junto con las herramientas necesarias (wireless-tools en particular) dentro de la jaula chroot antes de proseguir para que cuando reinicies la máquina con tu nuevo sistema tengas conexión a Internet y por tanto puedas continuar con la instalación de paquetes.


4. Instalar y configurar GRUB.

Lo primero de todo es generar el menu.lst, ejecutando:
# update-grub

NOTA: Edita manualmente el archivo /boot/grub/menu.lst si fuera necesario para arrancar tu sistema Debian (ejemplo, si necesitas desactivar desde GRUB el soporte para USB, PCI, ACPI, etc.).

A continuación, desmontamos proc sys y /dev de la jaula.
# umount proc
# umount sys

Salimos de la jaula
# exit

Y desmontamos /dev
# umount /media/hda1/dev

A partir de ahora trabajaremos desde fuera de la jaula.

NOTA: Es muy posible que falle el desmontado de proc, sys o dev, eso es porque durante el dpkg-reconfigure se han iniciado procesos dentro del chroot que están haciendo uso de esos sistemas de archivos, se puede forzar el desmontado agregando la opción -l o bien identificar qué procesos son los que se han iniciado y matarlos, mediante lsof +D /media/hda1 obtendremos la lista de procesos que están haciendo uso de nuestro directorio chroot.

La instalación y configuración de GRUB es casi el paso más importante del proceso de instalación. Tiene sus riesgos si no posees suficiente experiencia con sistemas GNU/Linux, por lo que ten cuidado y en todo momento asegúrate de saber y entender todo aquello que vas a ejecutar.

En el paso 3 ya instalamos el paquete GRUB en nuestro Debian GNU/Linux, por lo que ahora lo único que tenemos que hacer es instalar GRUB en el MBR.

# grub-install --root-directory=/media/hda1/ --recheck

(Esto nos generará un archivo devices.map, lo que nos ahorrará aprender como escribir el nombre de una partición en formato grub).

# grub-install /dev/hda --root-directory=/media/hda1

Si seguimos la opción C) y queremos usar una GRUB que ya tenemos instalada y funcionando en otro sistema operativo, tenemos que cambiar el /boot/grub/menu.lst y añadir las entradas de Debian. Un ejemplo de entrada tiene el siguiente formato:

title Debian
uuid   xxxxxxxxxxxxxxxxxxxxxxxxxxxx
kernel /boot/vmlinuz-xxxxxxxxx root=/dev/hda1 ro
initrd /boot/initrd.img-xxxxxxxx

donde las "xxxxxxx" deben ser especificadas dependiendo de la versión del Kernel que hayamos instalado.
El número de "uuid" se puede mirar usando el comando vol_id de esta manera:
# vol_id /dev/hda1
(hda1 porque es el disco ejemplo de la wiki)

Si todo ha ido bien, ya tendremos instalado Debian GNU/Linux (Lenny) en nuestro disco duro hda. Lo siguiente sería reiniciar nuestra maquina, arrancar con nuestro nuevo sistema y configurar todo a nuestro gusto, instalando un escritorio si así lo viésemos necesario. Por ejemplo:

# aptitude install x-window-system-core gdm gnome (para instalar Gnome)
# aptitude install x-window-system-core kdm kde (para instalar KDE)
# aptitude install x-window-system-core gdm xfce (para instalar Xfce).

Para iniciar las X en este momento, bastará con ejecutar:
# /etc/init.d/kdm start (kde)
# /etc/init.d/gdm start (gnome y xfce)