Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

martes, 20 de octubre de 2015

Cómo crear un instalador de Debian personalizado

Hace relativamente poco ya mostré cómo podíamos crear nuestras propias isos de linux personalizadas; isos que podían tener el contenido que nosotros necesitásemos, pero hoy quiero darle una pequeña vuelta de tuerca a ese concepto y mostraros algo diferente pero realmente útil. Todo sistema operativo posee su propio instalador en el que debemos de seguir una serie de pasos previamente establecidos, pero... ¿Y si pudiésemos personalizar esos pasos y hacer que algunos valores sean establecidos de antemano sin tener que introducirlos a mano? El proceso es bastante elaborado, pero sin lugar a dudas merece la pena realizarlo si se van a realizar varias instalaciones "repetitivas", además de ser un concepto de lo más interesante. 

Portada_debian

En este caso me he centrado en realizar el proceso en Debian, si bien en sistemas derivados de éste el proceso es muy parecido... Parar lograr nuestro objetivo necesitamos cumplir únicamente de tres requisitos:

  • Un sistema operativo Linux; preferiblemente Debian con los siguientes paquetes instalados: rsync, y genisoimage. Cómo ambos paquetes pertenecen a los repositorios oficiales del sistema, puede instalarse fácilmente mediante el comando:
apt-get install rsync genisoimage
  • Todo lo que se vaya a ejecutar de aquí en adelante en el sistema, es altamente recomendable que se realice como root.
  • Dicho sistema debe de tener una iso de Debian almacenada en alguna carpeta. Dicha iso no importa que sea parte de un CD completo o una versión ligera (netinstall). Para descargarnos la iso podemos hacerlo desde la sección de descargas de la página oficial. Yo en este caso en particular he seleccionado descargarme Debian 8.2, netinstall para una arquitectura amd64.

Teniendo estos requisitos cumplidos, deberemos crear una carpeta que servirá cómo punto de montaje de nuestra iso. En este caso yo he creado una carpeta llamada montaje dentro del directorio /usr/src con el fin de que ésta sea lo más informativa posible; dicha creación se realiza mediante el comando mkdir de la siguiente forma:

mkdir /usr/src/montaje

Ahora faltaría montar la imagen (la iso) en dicho directorio para poder aprovechar el contenido de ésta, pero para ello es recomendable comprobar que tenemos el módulo loop activado. Dicho módulo no habilita acceder al contenido de una iso como si fuese una carpeta, si bien dicha carpeta solo tendría permisos de lectura; aún así es necesario tenerlo, pues sino no podremos asegurarnos de que podremos proseguir... Aunque la mayoría de los sistemas actuales poseen dicho módulo activado por defecto, en algunas ocasiones me he topado con éste módulo desactivado, con lo que para comprobar que efectivamente está en activo habría que verificar que se encuentra en el listado de módulos activos, para lo cual se recurriría al siguiente comando:

lsmod |grep loop

Lo más normal sería que nos mostrase una línea con el resultado... En caso contrario significaría que el módulo no está activo; afortunadamente este módulo puede ser activado fácilmente escribiendo el comando de a continuación:

modprobe loop

Ahora que tenemos la certeza de que vamos a poder la imagen sin problemas, procederíamos al montaje el cuestión. En mi caso en particular la iso se denomina debian-8.2.0-amd64-netinst.iso que también he almacenado en la carpeta /usr/src; y el comando de montaje de isos siempre posee esta estructura:

mount -o loop ${iso} ${punto_de_montaje}

Así que en este caso el comando quedaría así:

mount -o loop debian-8.2.0-amd64-netinst.iso /usr/src/montaje

Veremos que la iso se ha montado, si bien está en modo solo lectura (no podemos modificar su contenido), así que no nos quedará otra que copiar todo su contenido en otro lado. Para ello primero habría que crear una carpeta contenedora (por ejemplo CD), y luego volcar todo el contenido de la carpeta montaje en la nueva carpeta mediante el comando rsync.

  1. mkdir /usr/src/CD
  2. rsync -a -H --exclude=TRANS.TBL /usr/src/montaje/ /usr/src/CD

Gracias al comando rsync hemos logrado volcar el contenido de la iso en la carpeta CD, una carpeta que NO tiene las restricciones de la carpeta montaje.  Al no requerir del contenido de la iso original más, podríamos desmontar la iso mediante el comando umount y elimar la carpeta que hemos usado como punto de montaje:

  1. umount /usr/src/montaje
  2. rm /usr/src/montaje

Ahora que tenemos más libertad para manipular el contenido de la iso, hemos de buscar un fichero en particular en la carpeta CD; dicho archivo se denomina initrd.gz, el cual se halla dentro del directorio install.${arquitectura}. En este caso he descargado una iso preparada para una arquitectura amd64, con lo que la carpeta que habría que buscar sería install.amd64... Si hacemos un ls de dicha carpeta veremos el fichero deseado:

ls /usr/src/CD/install.amd64

El fichero initrd.gz se trata de un fichero comprimido con una gran cantidad de archivos y carpetas, con lo que es importante volcar su contenido dentro de una carpeta aislada. Como todo lo que hemos hecho hasta ahora se ha realizado dentro del directorio /usr/src, crearemos una nueva carpeta dentro de éste, una carpeta que llamaremos contenedor que crearemos y a la que luego accederemos.

  1. mkdir /usr/src/contenedor
  2. cd /usr/src/contenedor

Dentro de la carpeta volcaríamos el contenido descomprimido del fichero initrd.gz que hemos hallado antes... Al ser un fichero comprimido mediante gzip, usaremos este comando para el volcado:

gzip -d < ../CD/install.amd/initrd.gz | cpio --extract --verbose --make-directories --no-absolute-filenames

La carpeta se ha llenado de todo tipo de ficheros y carpetas, pero no nos interesa nada de lo que hay allí presente sino que lo que queremos es añadir un fichero a todo lo que hay allí presente...  La instalación personalizada de un sistema debian se especifica dentro del archivo comprimido initrd.gz, pero el fichero de su interior que se encarga de personalizar la instalación se llama preseed.cfg; fichero que por defecto NO está incluido dentro de dicho fichero comprimido. Ese fichero es creado y usado con el único propósito de personalizar la instalación del sistema operativo, y la iso no ofrece pista alguna sobre su estructura...

Aún así, la página oficial de Debian sí que ofrece una plantilla muy completa; plantilla cuyo enlace dejo aquí. Si os fijais bien, esta plantilla contiene multitud de líneas, si bien todas tienen esta estructura:

d-i parámetros...

Aquí cada uno puede personalizar esta plantilla a su gusto (siempre y cuando mantenga use siempre el mismo nombre de fichero); yo por ejemplo he creado le siguiente preseed.cfg:

  1. d-i debian-installer/language string es
  2. d-i debian-installer/country string ES
  3. d-i debian-installer/locale string es_ES.UTF-8
  4. d-i netcfg/choose_interface select eth0
  5. d-i netcfg/disable_autoconfig boolean true
  6. d-i netcfg/hostname string PRESEEDED
  7. d-i mirror/country string manual
  8. d-i mirror/http/hostname string http://ftp.es.debian.org
  9. d-i mirror/http/directory string /debian
  10. d-i mirror/http/proxy string
  11. d-i clock-setup/utc boolean true
  12. d-i time/zone string Europe/Madrid
  13. d-i partman-auto/method string lvm
  14. d-i partman-lvm/device_remove_lvm boolean true
  15. d-i partman-md/device_remove_md boolean true
  16. d-i partman-lvm/confirm boolean true
  17. d-i partman-lvm/confirm_nooverwrite boolean true
  18. d-i partman-auto/choose_recipe select atomic
  19. d-i partman-partitioning/confirm_write_new_label boolean true
  20. d-i partman/choose_partition select finish
  21. d-i partman/confirm boolean true
  22. d-i partman/confirm_nooverwrite boolean true
  23. d-i partman-md/confirm boolean true
  24. d-i partman-partitioning/confirm_write_new_label boolean true
  25. d-i partman/choose_partition select finish
  26. d-i partman/confirm boolean true
  27. d-i partman/confirm_nooverwrite boolean true
  28. d-i grub-installer/only_debian boolean true
  29. d-i grub-installer/with_other_os boolean true
  30. d-i finish-install/reboot_in_progress note

Este fichero tan "pequeño" que tengo aquí, lo tengo almacenado en la carpeta /home/ivan, pero tendría que moverlo dentro de la carpeta contenedor, carpeta que representa el contenido de initrd.gz.

cp /home/ivan/preseed.cfg /usr/src/contenedor/preseed.cfg

El contenido del contenedor ha sido cambiado, pero éste debe de volver a convertirse en el fichero comprimido que era antes para poder ser "usable" por la iso; es decir que habría que volver a comprimirlo y dejarlo donde estaba antes; en la carpeta CD. Esto esta tan sencillo como escribir (dentro de la carpeta contenedor):

find . | cpio -H newc --create --verbose | gzip -9 > ../CD/install.amd/initrd.gz

El fichero initrd.gz ha ya tiene nuestro pequeño preseed.cfg en su interior, pero el fichero md5sum.txt de la carpeta /usr/src/CD no tiene una información realista, ya que el la suma md5 del fichero que hemos modificado es diferente a la suma que tenía establecida antes en el txt... Para evitar problemas, nos moveremos a la carpeta CD y pondremos la suma correcta, cosa que lograremos mediante:

  1. cd /usr/src/CD
  2. md5sum `find -follow -type f` > md5sum.txt

Ahora que nuestra carpeta tiene la información correcta, solamente quedaría volver a convertir dicha carpeta en una iso que podamos convertir en liveusb o en CD más adelante... Esto lo lograremos gracias a la utilidad que hemos instalado al principio: genisoimage. Para convertir la carpeta en una iso, que en mi caso llamaré NUEVO_DEBIAN, mediante dicha utilidad habría que escribir:

genisoimage -o NUEVO_DEBIAN.iso -r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat/usr/src/CD

El proceso tardará cierto, pero al finalizar podremos disfrutar de nuestra iso un instalador hecho a nuestra medida.

Espero que os haya resultado útil e interesante.

Saludos.

2 comentarios :

  1. Excelente aporte, algo laborioso, hay que buscar como hacerlo mas sencillo. Lástima que no debian no tenga un nLite

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tu comentario. Tienes toda la razón en que el proceso es algo laborioso pero el resultado final es muy satisfactorio y me parece un concepto muy interesante a nivel técnico. Aún así, es totalmente cierto que para un usuario sin conocimientos, el proceso puede resultarle algo abrumador; proceso que con este aporte espero que sea un poco más ameno.

      De nuevo, muchas gracias por tus palabras.

      Saludos.

      Eliminar