Sistemas operativos

Crear una imagen de instalación de OpenBSD con ESP FAT32 y firmware

Por David Uhden Collado - Actualizado

Construye una imagen de instalación de OpenBSD para amd64 con una ESP FAT32 de 260 MiB, 1.536 MiB para FFS y firmware opcional, sin recompilar el sistema base.

Descarga precreada

Como alternativa a reconstruir la imagen manualmente, está disponible install79-fat32.img. Es una modificación personalizada y no oficial de la imagen de instalación installNN.img de OpenBSD para amd64; no es una distribución ni una compilación independiente de OpenBSD. El nombre y la suma de la descarga deben actualizarse conjuntamente al publicar una nueva versión.

Datos de la imagen precreada
Nombre install79-fat32.img
Plataforma y arquitectura OpenBSD, amd64
Particionado MBR, siguiendo la imagen oficial de instalación
ESP FAT32 de 260 MiB
Contenido base Derivado de la imagen oficial installNN.img
Firmware adicional Ninguno
SHA256 8521010252d97d2d4fe3becc47c58363640c74bff5fcea4b5267fed10f9f6f7f

La imagen precreada no contiene firmware adicional. No se ha incluido firmware Wi-Fi propietario ni ningún otro firmware distribuido externamente, para evitar posibles restricciones de licencia o redistribución. Quien necesite firmware debe añadirlo por su cuenta con los mecanismos oficiales de OpenBSD, como fw_update.

Alcance y preparación

Todo el procedimiento se ejecuta como root. Parte de installNN.img oficial y copia su contenido a una imagen mayor; no recompila OpenBSD ni modifica el ramdisk bsd.rd. El resultado conserva el arranque Legacy BIOS y UEFI.

Antes de reutilizar los puntos de montaje, abandónalos y comprueba los montajes y dispositivos vnd activos:

cd /
mount | grep '/mnt/'
vnconfig -l

Desmonte únicamente los recursos de un intento anterior y desconecte solo sus dispositivos vnd:

umount /mnt/dst-efi 2>/dev/null || :
umount /mnt/dst 2>/dev/null || :
umount /mnt/src-efi 2>/dev/null || :
umount /mnt/src 2>/dev/null || :
vnconfig -u vnd1 2>/dev/null || :
vnconfig -u vnd0 2>/dev/null || :

Los dos últimos mandatos son solo un ejemplo: no desconecte otros dispositivos vnd. Cree el directorio de trabajo y los puntos de montaje, y compruebe que /home tiene varios GiB libres para la imagen oficial y la personalizada:

mkdir -p /home/openbsd-custom
cd /home/openbsd-custom
df -h /home
mkdir -p /mnt/src /mnt/src-efi /mnt/dst /mnt/dst-efi

La distribución propuesta usa 260 MiB para la ESP FAT32 y 1.536 MiB para FFS, un total de 1.796 MiB. Con sectores de 512 bytes son 532480 sectores para la ESP, 3145728 para FFS y 3678208 en total.

Descargar y montar la imagen oficial

Antes de ejecutar los mandatos, establezca la versión con su forma de publicación y su número sin punto. Al actualizar OpenBSD, cambie estos valores y mantenga el resto del procedimiento:

VERSION=7.9
VERSION_NUMBER=79
ARCH=amd64
IMAGE="install${VERSION_NUMBER}.img"
CUSTOM_IMAGE="install${VERSION_NUMBER}-fat32.img"

Descargue la imagen para amd64, su suma y su firma. Verifique primero la suma SHA-256 y después la firma:

ftp https://cdn.openbsd.org/pub/OpenBSD/${VERSION}/${ARCH}/${IMAGE}
ftp https://cdn.openbsd.org/pub/OpenBSD/${VERSION}/${ARCH}/SHA256
ftp https://cdn.openbsd.org/pub/OpenBSD/${VERSION}/${ARCH}/SHA256.sig
sha256 -C SHA256 "$IMAGE"
signify -Cp "/etc/signify/openbsd-${VERSION_NUMBER}-base.pub" \
    -x SHA256.sig "$IMAGE"

La comprobación debe informar de ${IMAGE}: OK y la verificación de firma debe incluir Signature Verified. Conecte la imagen; vnconfig selecciona un vnd libre y escribe su nombre por la salida estándar:

SRCVND=$(vnconfig "/home/openbsd-custom/${IMAGE}")
echo "$SRCVND"
fdisk "$SRCVND"
disklabel "$SRCVND"
mount -o ro "/dev/${SRCVND}a" /mnt/src
mount -t msdos -o ro "/dev/${SRCVND}i" /mnt/src-efi
df -h /mnt/src /mnt/src-efi
ls -la /mnt/src
ls -la /mnt/src-efi/efi/boot
du -sh /mnt/src

La ESP original debe incluir BOOTIA32.EFI y BOOTX64.EFI. La imagen oficial reserva aproximadamente 800 MiB para FFS y queda muy ajustada; la imagen de destino deja más espacio para los sets y el firmware.

Crear y formatear la imagen de destino

Elimine solamente una imagen personalizada fallida y cree la nueva imagen de 1.796 MiB. Conéctela y anote el dispositivo que se le haya asignado:

cd /home/openbsd-custom
rm -f "$CUSTOM_IMAGE"
dd if=/dev/zero of="$CUSTOM_IMAGE" bs=1m count=1796
ls -lh "$IMAGE" "$CUSTOM_IMAGE"
DSTVND=$(vnconfig "/home/openbsd-custom/${CUSTOM_IMAGE}")
echo "$DSTVND"
vnconfig -l

Cree la tabla MBR con una partición EFI EF y una partición OpenBSD A6. Este procedimiento sigue el formato de la imagen USB oficial, con los tamaños ampliados:

fdisk -yi \
    -l 3145728 \
    -b 532480 \
    -f /usr/mdec/mbr \
    "$DSTVND"
fdisk "$DSTVND"
echo '/ *' | disklabel -wAT- "$DSTVND"
disklabel "$DSTVND"

Antes de continuar, confirme que EF tiene 532480 sectores y A6 aproximadamente 3145728. El disklabel debe incluir a como 4.2BSD, c como unused e i como MSDOS.

Formatee explícitamente la ESP como FAT32 y cree el FFS1. La opción -c no se usa: controla fragmentos por cylinder group y no establece el tamaño del sistema de archivos; newfs toma ese tamaño de la partición a.

newfs_msdos -F 32 "/dev/r${DSTVND}i"
newfs -O 1 -m 0 -o space -i 524288 "/dev/r${DSTVND}a"
mount "/dev/${DSTVND}a" /mnt/dst
mount -t msdos "/dev/${DSTVND}i" /mnt/dst-efi
df -h /mnt/src /mnt/dst /mnt/dst-efi
df -i /mnt/src /mnt/dst

/mnt/dst debe mostrar aproximadamente 1,5 GiB. Si muestra unos 800 MiB, deténgase y revise la tabla de particiones antes de copiar datos.

Copiar el instalador, el arranque y el firmware

Copie el árbol del instalador conservando permisos y demás atributos. La copia ya no debe terminar con No space left on device:

cd /mnt/src
pax -rw -pe . /mnt/dst
cd /
df -h /mnt/dst
ls -lah /mnt/dst
ls -lh "/mnt/dst/${VERSION}/${ARCH}/"

El directorio de sets debe contener los sets correspondientes a la versión elegida, además de bsd, bsd.mp y bsd.rd. Copie también los cargadores EFI y reinstale el arranque BIOS; primero ejecútelo en modo que no escribe:

mkdir -p /mnt/dst-efi/efi/boot
cp -p /mnt/src-efi/efi/boot/* /mnt/dst-efi/efi/boot/
ls -lah /mnt/dst-efi/efi/boot/
installboot -nv -r /mnt/dst "$DSTVND" \
    /usr/mdec/biosboot /mnt/dst/boot
installboot -v -r /mnt/dst "$DSTVND" \
    /usr/mdec/biosboot /mnt/dst/boot

Añada, si lo necesita, firmware para el sistema instalado. El firmware no hace que el Wi-Fi funcione dentro de bsd.rd durante la instalación; para ello habría que modificar su ramdisk, que es otro procedimiento.

cd /mnt/dst
fw_update -Fv iwx
fw_update -Fv iwm
cd /
fw_update -Fln iwx
find /mnt/dst -maxdepth 2 -type f -name '*firmware*.tgz' -o \
    -name '*firmware*.tgz.sig'

fw_update -F descarga el firmware y sus firmas en el directorio actual. Use uno o varios controladores según el hardware de destino.

Desmontar y verificar la imagen

Sincronice los datos y desmonte primero la ESP y después FFS, tanto en el destino como en el origen. Desconecte también ambos vnd:

cd /
sync
umount /mnt/dst-efi
umount /mnt/dst
umount /mnt/src-efi
umount /mnt/src
mount | grep '/mnt/'
vnconfig -u "$DSTVND"
vnconfig -u "$SRCVND"
vnconfig -l

Vuelva a conectar la imagen final desde cero. Las comprobaciones de los sistemas de archivos no deben informar de errores que requieran reparación:

cd /home/openbsd-custom
VERIFYVND=$(vnconfig "$CUSTOM_IMAGE")
echo "$VERIFYVND"
fdisk "$VERIFYVND"
disklabel "$VERIFYVND"
fsck_msdos -n "/dev/r${VERIFYVND}i"
fsck_ffs -n "/dev/r${VERIFYVND}a"
mount -t msdos -o ro "/dev/${VERIFYVND}i" /mnt
df -h /mnt
ls -lah /mnt/efi/boot
umount /mnt
mount -o ro "/dev/${VERIFYVND}a" /mnt
ls -lah /mnt
ls -lh /mnt/bsd.rd
ls -lh "/mnt/${VERSION}/${ARCH}/"
umount /mnt
vnconfig -u "$VERIFYVND"
vnconfig -l
mount | grep '/mnt/'

La imagen terminada es /home/openbsd-custom/${CUSTOM_IMAGE}. Contiene MBR, una ESP FAT32 con EFI/BOOT/BOOTX64.EFI y BOOTIA32.EFI, y una partición FFS1 con el instalador, boot, bsd, bsd.rd, los sets y, si se añadieron, los archivos de firmware.

Grabarla en una memoria USB

Identifique sin ambigüedad la memoria USB antes de escribir. Por ejemplo, si sd2 es realmente el dispositivo correcto:

sysctl hw.disknames
disklabel sd2
dd if="/home/openbsd-custom/${CUSTOM_IMAGE}" \
    of=/dev/rsd2c bs=1m
sync

No use /dev/rsd2c sin comprobar el disco: dd sobrescribe directamente el dispositivo de destino.