Fecha: 2019-12-10 Tiempo de lectura: 7 minutos Categoría: Sistemas Tags: linux / debian / buster / debootstrap / instalación
Todos sabemos que podemos construir jaulas enteras de Debian con una herramienta propia llamada debootstrap, pero pocos saben que es la misma con la que se instala la distribución si usamos el instalador oficial que viene en los CDs descargables. sin embargo la configuración posterior no es trivial.
Empujado por la curiosidad, y tras haber hecho live CDs con antelación intenté hacer una instalación simple si utilizar el instalador, y valiéndome de las herramientas que tenía a mano. El resultado es una distribución mínima y plenamente funcional (a falta de instalar los servicios que necesitemos); aquí expongo el resultado para futuras referencias.
NOTA: Todo el proceso se creó utilizando VirtualBox; eso me dio una gran libertad para “poner”, “quitar” y clonar los discos. Esa parte la tendréis que adaptar a vuestro sistema de virtualización o cloud habitual.
Partiremos de una distribución estándar de Debian sin pretensiones (yo parto de una instalación netinstall, con SSH y nada más); el único requisito es disponer del paquete debootstrap, que seguramente tendremos que instalar, puesto que no suele estar por defecto.
gerard@builder:~$ sudo apt install debootstrap
...
gerard@builder:~$
La idea inicial es la de crear un sistema de ficheros raíz en un disco secundario; este es el que luego servirá como disco primario para la máquina final. Por ello vamos a crear un disco nuevo y lo vamos a asignar a la máquina de construcción; no es necesaria mucha capacidad y dependerá de su función. He asignado uno de 4gb, pero en una de las pruebas puse uno de 1gb y me sobró espacio.
Necesitamos localizar el dispositivo del nuevo disco y hay varias maneras de hacerlo:
/dev/sdbLanzamos el comando lsblk, que nos permite comprobar los dos últimos métodos:
gerard@builder:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 2G 0 disk
└─sda1 8:1 0 2G 0 part /
sdb 8:16 0 4G 0 disk
sr0 11:0 1 1024M 0 rom
gerard@builder:~$
WARNING: En este caso, el disco es /dev/sdb, pero revisad esto 2 veces:
lanzar los siguientes comandos sobre el disco equivocado va a destruir todos
sus datos. Si utilizáis virtualización o cloud, es un buen momento para
hacer un snapshot.
Absolutamente todos los comandos que siguen se hacen con el usuario root y,
aunque va contra todas las buenas prácticas, me ahorro el comando sudo manteniendo
abierta una sesión de root.
gerard@builder:~$ sudo su -
root@builder:~#
Voy a utilizar una única partición para todo el sistema y, por lo tanto, voy a ocupar con ella todo el disco; cambiad esto a vuestro gusto. Vamos a crear la partición con la herramienta que más os guste o que tengáis a mano:
root@builder:~# echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb
...
root@builder:~#
TRUCO: Si optáis por el modo interactivo sería la secuencia “n p 1 <vacío> <vacío> w”.
El siguiente paso sería formatear la partición:
root@builder:~# mkfs.ext4 /dev/sdb1
...
root@builder:~#
Montamos la partición en /mnt para poder escribir los cambios en nuestro
nuevo disco. Si tenéis varias particiones, respetad la jerarquía final, pero
con el añadido /mnt; así pues, si tenéis una partición para /home, deberíais
montarla en /mnt/home. Alternativamente podéis trocear en particiones después
de realizar la imagen de disco completa, de forma manual.
root@builder:~# mount /dev/sdb1 /mnt/
root@builder:~#
Esta es la gran función de debootstrap; basta con indicar la distribución que queremos descargar y la carpeta destino en donde va a dejarlo todo. Adicionalmente, el comando también admite una serie de paquetes extra que queramos añadir. En nuestro caso, vamos a poner algunos más:
Sabiendo esto, lanzamos el comando:
root@builder:~# debootstrap --include=grub2,linux-image-amd64,openssh-server,locales,console-setup buster /mnt/
I: Target architecture can be executed
...
I: Base system installed successfully.
root@builder:~#
TRUCO: Una vez instalado, el sistema no podía hacer systemctl list-units
porque se quejaba de no tener DBUS. Con instalar el paquete dbus fue suficiente.
Aunque Debian tiene una configuración por defecto excelente, siempre es necesario hacer algunos cambios. Para ello vamos a ejecutar una serie de comandos dentro de la jaula, durante todo este paso.
root@builder:~# mount -t proc /proc /mnt/proc/
root@builder:~# mount -t sysfs /sys /mnt/sys/
root@builder:~# mount -o bind /dev /mnt/dev/
root@builder:~# chroot /mnt /bin/bash
root@builder:/#
Cuando el sistema operativo arranca, uno de los pasos es montar los discos.
Para ello, lee el fichero /etc/fstab y saca los puntos de montaje y las opciones.
Es crucial tener montado nuestro disco en la carpeta raíz, o no se podrá ejecutar
absolutamente nada, ni siquiera el proceso inicial.
Para ahorrarnos sorpresas, vamos a hacer el montaje en /etc/fstab usando el
identificador del disco, que podemos sacar con un simple blkid:
root@builder:/# blkid
/dev/sda1: UUID="4833cc78-a8b2-4e82-8ce6-f73e5e54c165" TYPE="ext4" PARTUUID="59ebc34d-01"
/dev/sdb1: UUID="4b7bea93-6137-4640-997e-bd8af70629f3" TYPE="ext4" PARTUUID="1e3f0298-01"
root@builder:/#
root@builder:/# cat /etc/fstab
UUID=4b7bea93-6137-4640-997e-bd8af70629f3 / ext4 defaults 1 1
root@builder:/#
TRUCO: Podemos liberar un poco de espacio en disco haciendo un apt clean.
Configuramos los ficheros /etc/hostname y /etc/hosts para darle a nuestro
nuevo sistema un nombre. Esto se puede cambiar en cualquier momento, pero lo
vamos haciendo para que sepa el hostname que le debe asignar a la máquina en
el primer boot.
root@builder:/# cat /etc/hostname
debian
root@builder:/#
root@builder:/# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 debian
root@builder:/#
También necesitamos una configuración de red, que incluye las interfaces y los
servidores DNS por defecto. Esto se configura en los ficheros /etc/network/interfaces
y /etc/resolv.conf. Pongo una configuración básica y la cambiaré en un futuro.
root@builder:/# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet dhcp
root@builder:/#
root@builder:/# cat /etc/resolv.conf
nameserver 8.8.8.8
root@builder:/#
NOTA: La configuración por DHCP va a sobreescribir el fichero /etc/resolv.conf
con los servidores DNS que indique la respuesta DHCP. Solo pongo uno por defecto
para el caso en el que ningún servidor DHCP responda.
Para poder entrar en el nuevo sistema, vamos a necesitar un usuario. Normalmente me gusta la aproximación que usa Ubuntu, con un usuario de root bloqueado y un segundo usuario con permisos de sudo. En este caso, para simplificar, simplemente voy a desbloquear el usuario root, y eso se consigue asignándole una password.
root@builder:/# passwd
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: contraseña actualizada correctamente
root@builder:/#
Este paso es opcional. La zona horaria por defecto es UTC, y eso nos puede servir. En caso de que queramos algo más personalizado, basta reconfigurar el paquete tzdata:
root@builder:/# dpkg-reconfigure tzdata
...
Current default time zone: 'Europe/Madrid'
Local time is now: Fri Nov 15 14:57:56 CET 2019.
Universal Time is now: Fri Nov 15 13:57:56 UTC 2019.
root@builder:/#
Si queremos cambiar el idioma del sistema, basta con reconfigurar el paquete locales:
root@builder:/# dpkg-reconfigure locales
...
Generating locales (this might take a while)...
es_ES.UTF-8... done
Generation complete.
root@builder:/#
Si vamos a entrar en el sistema solamente por SSH, este paso no hace falta; solamente sirve para los casos en los que hacemos un login en la máquina de forma física. En estos casos, tanto la codificación de caracteres de la pantalla física como la configuración del teclado se vuelven importantes. Solo por si acaso, prefiero dejarlos configurados:
root@builder:/# dpkg-reconfigure console-setup
root@builder:/#
root@builder:/# dpkg-reconfigure keyboard-configuration
root@builder:/#
Para poder inciar un sistema Linux, es necesaria una pieza llamada bootloader. El que viene por defecto en Debian se llama GRUB, y es el que vamos a utilizar en este caso. Solamente necesitamos generar una configuración básica e instalar el primer sector en el disco de arranque.
root@builder:/# grub-mkconfig -o /boot/grub/grub.cfg
Generando un fichero de configuración de grub...
Encontrada imagen de linux: /boot/vmlinuz-4.19.0-5-amd64
Encontrada imagen de memoria inicial: /boot/initrd.img-4.19.0-5-amd64
hecho
root@builder:/#
root@builder:/# grub-install /dev/sdb
Instalando para plataforma i386-pc.
Instalación terminada. No se notificó ningún error.
root@builder:/#
Como ya no hay nada más que hacer, podemos salir de la jaula chroot. Desmontamos
los sistemas de ficheros “del sistema” y desmontamos el disco que pusimos en /mnt.
root@builder:/# exit
exit
root@builder:~#
root@builder:~# umount /mnt/proc
root@builder:~# umount /mnt/sys
root@builder:~# umount /mnt/dev
root@builder:~#
root@builder:~# umount /mnt/
root@builder:~#
Este disco contiene ahora una instalación básica de Debian y puede arrancar cualquier máquina en el que lo instalemos. Como yo utilizé VirtualBox solo necesito crear una máquina nueva (sin disco) y añadirle un clon del disco recién instalado.