Instalando OpenBSD 6.7 multiboot UEFI

2020/07/17

TLDR

Al instalar OpenBSD junto a Debian (multiboot) en un disco con tablas de particiones GPT y un BIOS que utilize UEFI:

  1. Utilizar una única partición encriptada para OpenBSD.
  2. Que el tamaño de la partición para OpenBSD sea por lo menos de 150GB.

En estos días quise probar de instalar OpenBSD. Entre los motivos se encuentran:

  1. Probar un sistema que fué diseñado (cualquier sistema basado en BSD) como alternativa de uno cuyo crecimiento fué orgánico (cualquiera basado en GNU/Linux).

  2. Utilizar un sistema (OpenBSD) que tiene entre sus máximas la simplificación en lugar del agregado de funcionalidades. Recordando la famosa cita de Saint-Exupéry:

    La perfección no se alcanza cuando no hay nada más que añadir, sinó cuando no hay nada más que quitar.

Actualmente mi PC -laptop, en realidad- tiene el disco con una tabla de particiones GPT en el que está instalado Debian con grub e inicia mediante UEFI.

En el disco se deja una partición de 150GB para instalar OpenBSD. Para bootear el sistema se configurará grub desde Debian, por lo cual no es una instalación que dependa 100% de OpenBSD.

Antes de empezar conviente tener claro la diferencia entre las particiones de disco (MBR) y las filesystem partitions tal como se indica en las FAQ de OpenBSD:

The term “partition” can mean two different things in OpenBSD:

Soporte de hardware

Si bien no hay muchas indicaciones de que equipos están soportados por OpenBSD, lo que se lee en varias web’s es la mención:

si se instala y funciona va a funcionar bien

El hardware en que instalaré OpenBSD es una Lenovo Thinkpad T440s que se indica en varios foros y blogs que está dentro de los equipos mejor soportados.

Layout del disco

Como se mencionó anteriormente, el disco posee una tabla de particiones GPT, en lugar de una de tipo MSDOS recomendada en las FAQ de OpenBSD. El layout del disco es el siguiente:

  1. efi, EFI System (fat32). Necesaria por el bios para iniciar con UEFI
  2. boot, ext4. Utilizada por grub (es allí donde están instalados los archivos utilizados por grub) y además necesaria por el sistema Debian, ya que allí se encuentra el kernel y la imagen initrd necesarias para iniciarl dicho sistema.
  3. debian, crypo_LUKS + LVM. Sistema Debian en partición encriptada.
  4. openbsd, unformatted. Espacio en que se instalará OpenBSD.
  5. data, ntfs. Partición que se utilizará para compartir datos entre el sistema Debian y el OpenBSD.

NOTA 1: Hay que recalcar que el sistema Debian es imprescindible para configurar el inicio del sistema OpenBSD, ya que este no cuenta con herramientas para iniciar desde un sistema UEFI.

NOTA 2: Se utiliza la partición de tipo ntfs ya que en varios blogs y foros se indica que es la que mejor funciona con OpenBSD (¿quizás tenga que ver con que tanto las distribuciones GNU/Linux como OpenBSD utilicen el paquete ntfs-3g?).

Preparación de pendrive con instalador de OpenBSD

Para preparar el pendrive hacer (desde el sistema Debian):

$ wget 'https://cdn.openbsd.org/pub/OpenBSD/6.7/amd64/install67.fs'
$ wget 'https://cdn.openbsd.org/pub/OpenBSD/6.7/amd64/SHA256'
$ sha256sum -c --ignore-missing SHA256
$ sudo dd if=install67.fs of=/dev/sdb1 bs=1M

¿Porqué se utiliza sdb1?. Debido a que corresponde al pendrive conectado al sistema.

Pasos previos a la instalación

Se inicia el sistema desde el pendrive y se elige la opción Shell para preparar el disco para encriptación como es sugerido en la FAQ de OpenBSD.

Creación del archivo /dev/sd0

Se comienza creando el archivo especial de dispositivo sd0 utilizando el script MAKEDEV para referenciar posteriormente al disco duro:

$ cd /dev && sh MAKEDEV sd0

¿Porqué se utiliza sd0?. Porque corresponde al dispositivo de bloques detectado por el kernel. Esto se desprende de la salida del comando dmesg | grep ^sd.

Setup de partición para OpenBSD

Si bien hay varios programas en Debian que permiten establecer el tipo de la partición que utilizará OpenBSD, conviene para estar seguros realizar este paso utilizando el programa fdisk de OpenBSD:

  $ fdisk -e sd0
➊ print g         # se ven las particones
➋ setpid 2        # A6 (OpenBSD)
➌ write
  quit

En ➊ se listan las particiones del disco, más que nada para asegurarse en un sistema con varios discos que estamos modificando el indicado. En ➋ se cambia el identificador de la tercera partición -correspondiente a OpenBSD- al tipo A6 (OpenBSD); como se puede ver aquí la numeración de las particiones comienza en 0 y no en 1. En ➌ se escriben los cambios al disco, ya que por defecto al salir no se almacenan los cambios.

Nota: Inicialmente también se marcó la partición como booteable utilizando flag 2 previo al comando write, pero esto hace que si el bios está configurado para utilizar UEFI + legacy, el bios inicia en el sistema OpenBSD, salteandose grub por lo que no es una buena idea.

Escritura de datos aleatorios en la partición (opcional)

En las FAQ también se indica que es conveniente escribir datos aleatorios en la partición (siempre teniendo en cuenta el tipo de adversario que se tenga en mente).

A diferencia de las FAQ en las que se escriben datos aleatorios a todo el disco (rsd0c), en nuestro caso queremos escribir datos aleatorios solo en la partición destinada a OpenBSD.

Para ello primero hay que crear una partición (disklabel) de OpenBSD que ocupe todo el espacio destinado a OpenBSD para luego poder sobreescribir dicha partición con datos aleatorios:

  $ disklabel -E sd0
➊ p g
➋ a a
➌ w
  q

En ➊ se muestran las particiones utilizadas por OpenBSD. Hay que tener en cuenta que deben existir la partición c que indica todo el disco y las particiones i, j y k que corresponden a las particiones efi, debian y data respectivamente. En ➋ se crea una nueva partición (de filesystem). Siguiendo los defaults se crea una partición (de filesystem) para uso de OpenBSD de nombre a que ocupa todo el espacio asignado para OpenBSD. En ➌ se escriben los cambios a disco, ya que al salir por defecto no se realizan cambios.

Una vez que se tiene creada la partición (de filesystem) se puede escribir datos aleatorios utilizando

$ dd if=/dev/urandom of=/dev/rsd0a bs=1m

Lo anterior borra la información de la partición, por lo que es necesario volver a recrearla.

Creación de partición encriptada para OpenBSD

Siguiendo la indicación de las FAQ, se crea la partición (de filesystem) de tipo RAID (este paso es idéntico al de la FAQ):

  $ disklabel -E sd0
➊ p g
➋ a a
➌ w
  q

En ➊ listamos nuevamente las particiones (de filesystem) para asegurarnos que estamos haciendo correctamente los cambios. En ➋ creamos una nueva partición que debe ocupar todo el espacio asignado a la partición (de disco) para OpenBSD. Cuando se deba ingresar el tipo de filesystem hay que introducir RAID. Por último, en ➌ se guarda la información en disco antes de salir del programa.

➊ $ bioctl -c C -l sd0a softraid0
➋ $ cd /dev && sh MAKEDEV sd2
➌ $ dd if=/dev/zero of=/dev/rsd2c bs=1m count=1

En ➊ se utiliza bioctl para configurar el filesystem creado de tipo RAID e indicar que será un filesystem encriptado. Luego, en ➋ se crea el archivo especial del dispositivo.

¿Porqué se utiliza sd2?. Porque corresponde al dispositivo de bloques agregado al sistema al utilizar bioctl que es mostrado en la salida del comando.

Siguiendo las indicaciones de la página del manual de softraid, en ➌ se borra la información al principio del disco antes de usarlo.

Ahora puede instalarse el sistema en sd2. Hay que recordar que en este caso sd0 corresponde al disco duro (ssd) y sd1 al pendrive con el sistema.

Se utiliza exit para salir del shell y continuar con la instalación normal.

Pasos durante la instalación

Se continúa la instalación normalmente, pero al momento de instalar el sistema debe elegirse sd2 como disco a utilizar.

Pasos posteriores a la instalación

Extracción de bootloader UEFI

Luego de finalizada la instalación pero antes de reiniciar el equipo hay que guardar el bootloader UEFI de OpenBSD en la partición EFI System.

Para copiar los archivos hacer:

# mkdir -p /mnt2
# mount /dev/sd0i /mnt2
# mkdir /mnt2/EFI/OpenBSD
# cp /mnt/usr/mdec/BOOTX64.EFI /mnt2/EFI/OpenBSD

Y luego utilizar reboot para reiniciar el sistema. El sistema se reiniciara en Debian, ya que aún no se configuró el bootloader para cargar OpenBSD.

Configuración de grub en Debian

Luego de reiniciado el sistema y ya en el sistema Debian se debe configurar grub para que se agregue al menú la opción de iniciar OpenBSD.

Para ello se creará el archivo 40_openbsd y se agregará al directorio /etc/grub.d/40_openbsd:

$ sudo cp /etc/grub.d/40_custom /etc/grub.d/40_openbsd
$ cat <<'END' | sudo tee -a /etc/grub.d/40_openbsd
menuentry "OpenBSD" {
    insmod part_gpt
    insmod chain
    set root='(hd0,gpt1)'
    chainloader /EFI/OpenBSD/BOOTX64.EFI
}
END

NOTA: No se utiliza el archivo /etc/grub.d/40_custom para evitar que este sea sobreescrito en una actualización de grub.

Para hacer efectivos los cambios hay que actualizar la configuración de grub:

$ sudo update-grub

Configuración de entrada UEFI (opcional)

Si quiere agregarse una entrada para iniciar OpenBSD utilizando UEFI se puede, mediante efibootmgr agregar la siguiente linea:

$ sudo efibootmgr -c -d /dev/sda -p 1 -w -L openbsd -l '\EFI\OpenBSD\BOOTX64.EFI'

Para confirmar que esta fué agregada correctamente (y ver todas las entradas disponibles) utilizar:

$ sudo efibootmgr -v

Conclusiones

Bueno, debo admitirlo, hace AÑOS que no transpiraba tanto al realizar la instalación de un sistema operativo teniendo otro en el disco.

La instalación funcionó sin problemas como se mencionaba en las FAQ y en varios blogs, pero sin duda el uso de disklabel por parte de OpenBSD y la falta de conocimiento sobre este hizo la experiencia poco placentera. No por algo se indica en las FAQ

Otro punto a tener en cuenta es la cantidad de espacio en disco necesaria si se desea realizar un particionado por defecto (usando AUTOMATIC DISK ALLOCATION) y tener un buen espacio en la partición correspondiente a /usr/local, donde se almacenarán los paquetes en OpenBSD. 150GB para comenzar a probar quizás sea un poco bastante, por lo que sugiero que si no se está convencido se comience probando con una máquina virtual en linux y utilizando una partición única. Aunque con esto se pierden características de seguridad en el sistema, para comenzar a probar OpenBSD creo que es un buen compromiso.

Extras

Errores con defaults de disklabel al no utilizar particion encriptada

Inicialmente se intentó realizar la instalación sin utilizar una partición encriptada como se sugiere en el libro Absolute OpenBSD, 2nd Edition, pero se constató que el particionado automático realizado por disklabel automáticamente se confunde con las otras particiones utilizadas en el sistema (efi/boot/debian como se mencionó anteriormente) y solo crea cuatro particiones: /, swap, /usr y /home:

Error Automatic Allocation de disklabel