Mi plataforma preferida para usar Linux es la portátil Thinkpad, antes IBM y ahora Lenovo. En particular, prefiero las portátiles series T o X. Además que su hardware no es «genérico barato», y está soportado perfectamente, Lenovo hace un esfuerzo bastante bueno por mantener el UEFI/BIOS al día (excepto cuando no, pero esa es otra historia). Es más, Lenovo provee las imágenes para que sean actualizadas desde Linux. Pero como «Nunca es Fácil», me toca descargar imágenes ISO.

Todos los portátiles Lenovo desde 2016 en adelante permiten actualizar el BIOS/UEFI desde Linux. Basta tener instalado fwupd y reiniciar cuando el sistema te lo indique. Esto funciona con cualquier portátil que tenga «Secure Boot» activado. Para cualquier Thinkpad T o X de rango bajo o medio es una solución completa y cómoda para el usuario. Esa es una de las razones por las que recomiendo estas portátiles si quieres correr Linux, en particular Debian GNU/Linux.

Como «Nunca es Fácil», esa solución no aplica para mis máquinas. Prefiero usar portátiles de rango alto que incluyan sistema de video dual Intel-nVidia, para poder usar CUDA y OpenGL de alto desempeño. El controlador no-libre provisto por nVidia no está firmado digitalmente, de modo que la instalación Linux no puede usar «Secure Boot». Entonces, cuando necesito actualizar el UEFI/BIOS me veo obligado a visitar la página de Lenovo y descargar las imágenes de arranque para mis máquinas particulares.

Para mi máquina principal, un modelo de finales de 2018, el proceso fue directo: descargar un archivo con extensión .iso, copiarlo en un disco USB usando dd, iniciar la máquina desde ese disco USB, seguir las instrucciones, reiniciar. Nada especial.

Para mi máquina histórica, un modelo de 2014, fue una aventura. Descargué el archivo con extensión .iso, y lo copié en un disco USB usando dd. Sin embargo, la máquina era incapaz de iniciar desde el disco USB, y encima sin emitir mensaje de error.

Sólo los borrachos y los usuarios Windows confían en las extensiones de los archivos ciegamente. Según file, el archivo aparentaba ser una imagen ISO 9660

$ file g4uj41us.iso
g4uj41us.iso: ISO 9660 CD-ROM filesystem data 'G4ETB7US' (bootable)

y si eres borracho, usuario Windows, o tienes poca experiencia con Linux, eso sería satisfactorio e insistirías probablemente con otros discos USB, sin éxito. Porque, aunque tenga la extensión .iso y file diga que eso es ISO 9660, «todos mienten».

Nunca salgo sin mi imagen de instalación Debian que funciona en USB o en CD. Si comparamos el resultado de file

$ file debian-10.5.0-amd64-netinst.iso 
debian-10.5.0-amd64-netinst.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 3840, 5664 sectors

por demás correcto, es evidente que Lenovo está haciendo algo mal.

Una imagen de arranque que pueda funcionar como disco USB y como CDROM debe tener una estructura particular: un sector de arranque DOS/MBR para cuando se use como disco USB; y una imagen ISO-9660 «El Torito» para cuando se use desde una unidad de CD. La imagen provista por Lenovo, quizás es una imagen ISO 9660, pero definitivamente no sirve para un disco USB.

El siguiente paso en la investigación fue usar hexdump sobre la imagen provista por Lenovo, buscando pistas sobre su verdadera estructura. Por supuesto que era una mentira:

$ hd -x g4uj41us.iso | less
(...)
00008230  20 20 20 20 20 20 20 20  20 20 20 20 20 20 4e 45  |              NE|
00008240  52 4f 20 42 55 52 4e 49  4e 47 20 52 4f 4d 20 20  |RO BURNING ROM  |
00008250  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
(...)

Lo distribuido por Lenovo no es ni un disco de arranque dual USB/CD, ni tampoco una imagen ISO9660: es una imagen de trabajo del software «Nero», que se usa para crear CDs en plataforma Windows. Es decir, a pesar que la página de Lenovo dice que esa imagen sirve en «cualquier sistema operativo», en realidad sólo sirve si tienes Windows, Nero, y vas a preparar un CD.

No todo está perdido. Ese «archivo .iso» (comillas en el aire, gesticuladas con sorna), no es más que un envoltorio sobre la verdadera imágen ISO9660 que está más adentro; sólo hace falta extraerla, y no necesito «Nero».

Cualquier distribución Linux moderna incluye la familia de herramientas genisoimage que permite manipular imágenes de CD/DVD, para arranque o no. Entre esas herramientas está geteltorito que fue escrita precisamente para lidiar con el escenario en el que una imagen ISO9660 está «escondida» dentro de un archivo que un proveedor ofrece como ISO pero que no lo es.

$ geteltorito -o imagen.iso g4uj41us.iso 
Booting catalog starts at sector: 20 
Manufacturer of CD: NERO BURNING ROM
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 65536 sector(s) of 512 Bytes

Image has been written to file "imagen.iso".
$ file imagen.iso 
imagen.iso: DOS/MBR boot sector; partition 1 : ID=0x4, active, start-CHS (0x0,1,1), end-CHS (0x1f,63,32), startsector 32, 65504 sectors

Una vez copiada imagen.iso en el disco USB usando dd, el portátil pudo arrancar sin problemas, se actualizó el UEFI/BIOS, y la máquina está al día.