He creado esta y otras guías para documentar mi experiencia instalando libreboot en diferentes equipos. Encontré buenas fuentes pero la información está dispersa (en algunos casos desfasada) y creo que puedo aportar cierta claridad al respecto. He creado esta versión extendida donde explico detalles que he ido aprendiendo y otra versión sintetizada para recurrir cuando ya se tiene cierta experiencia.
Básicamente existen dos formas de instalar libreboot en este equipo. Una es mediante flasheo interno (más complejo) y otra es mediante flasheo externo (el método que voy a explicar). Desde Libreboot se recomienda usar el flasheo externo ya que el proceso es más sencillo y menos arriesgado en este equipo. El flasheo interno requiere degradar a una versión de la bios concreta, cortocircuitar dos pines de un chip en específico y algunos pasos adicionales, si quieres investigar puedes empezar por aquí libreboot.org/docs/install/ivy_internal.html.
Para el flasheo externo necesitamos otro equipo con un sistema linux instalado (en mi caso un ordenador portátil con Pop!_OS) y un dispositivo "puente" (un programador flash SPI) que nos ayude a programar los chips en cuestión (dos en este equipo). En este caso he optado por una Raspberry Pico 1 (RP2040) con pines pre-soldados (suele costar menos de 10€ en este momento). Me gusta la Pico no solo por ser económica, sino porque además ofrece una tensión máxima acorde a este tipo de chips (3,3v) y eso evita posibles problemas de voltaje. Estas suelen venir con su cable usb pero también necesitaremos una pinza SOIC8 (para los ocho pines que tienen los chips que vamos a programar) y seis cables dupont de menos de 20cm (recomiendo de 10cm) de diferentes colores.
En resumen, para el flasheo externo necesitamos: Otro ordenador, programador flash SPI, pinza SOIC8 y 6 cables dupont (de menos de 20cm y diferentes colores).
Antes de seguir quiero dejar un par de apuntes sobre estos materiales. Por un lado es recomendable que la pinza sea de cierta calidad, yo escogí una de la marca Pomona (5250) pero es algo cara dependiendo de donde vivas debido a los costes de importación. No hay problema en usar cualquier otra pero es recomendable buscar referencias y opiniones antes. Sobre los cables dupont, es importante que tengan una longitud corta debido a la baja tensión que se va a manejar. Hay casos en los que ignorar esto ha provocado fallos de lectura del chip y aunque existen soluciones alternativas si se da el caso, es un dolor de cabeza más en un proceso que debería ser sencillo.
Otra cuestión a considerar es sobre el equipo desde el que vamos a trabajar. Si este no dispone de batería suficiente, es buena idea tener el equipo conectado a un SAI/UPS por si hubiese algún corte eléctrico general. Cuando escribamos el nuevo firmware en los chips no querremos que el proceso se interrumpa.
- Preparación y desmontaje del x230 -
Primero debemos verificar que la bios de fábrica de nuestro thinkpad x230 está actualizada a la última versión (pcsupport.lenovo.com/es/es/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x230/downloads/driver-list/component?name=BIOS).
Tener la bios actualizada asegura que el equipo sea lo más estable y seguro posible antes de realizar la instalación de libreboot.
Posteriormente lo que debemos hacer es desmontar el equipo para identificar los dos chips que vamos a flashear. Para ello, primero procedemos a retirar la batería y posteriormente desatornillamos los siguientes tornillos (libreboot.org/docs/install/x230_external.html).

Lo siguiente será retirar el teclado empujando levemente la parte inferior hacia adelante, teniendo cuidado con el conector al retirarlo.

Y finalmente desconectaremos el cable del panel táctil para poder levantar y retirar el reposamanos al completo.

Los chips se encuentran en la parte inferior izquierda, adheridos a una lámina protectora negra que debemos levantar.

En mi caso tuve que limpiar los chips para poder identificarlos (lo hice con bastoncillos humedecidos con alcohol) ya que quedaron partes del adhesivo cubriendo la superficie. Una vez limpios debemos apuntar el identificador de cada chip (hasta donde alcance la vista). En mi caso, el chip inferior es un MX25L6406E y el chip superior es un MX25L3206E.

Algo que creo que no es necesario pero aún así prefiero hacer, es desconectar la pila del equipo (ver dos imágenes más arriba). No quiero ningún tipo de voltaje adicional más allá del que le vamos a dar con la Raspberry Pico.
Con los chips identificados podemos hacer una búsqueda rápida por internet para verificar la distribución de los pines, la capacidad de memoria que tienen y el voltaje (que debe ser 3,3v para poder flashearlos con la Pico).
En mi caso, el chip inferior tiene una capacidad de 8MB y el superior de 4MB (esto suele ser lo habitual).
- Preparación y construcción del nuevo firmware -
En este punto dejamos a un lado el thinkpad x230 y vamos a construir las herramientas necesarias para el flasheo en el otro equipo. Estos pasos pueden servir como referencia para instalar Libreboot en otros equipos:
- Instalar git
- Clonar lbmk
- Instalar dependencias
- Construir flashprog
- Compilar rom o descargar, verificar y construir una rom pre-compilada
Abrimos el terminal. Lo primero es instalar git en caso de no tenerlo instalado y configurar un usuario local (requisito obligatorio). Si no quieres crear una cuenta de usuario real puedes usar la siguiente o cualquier otra ficticia.
$ sudo apt update
$ sudo apt install git
$ git config --global user.name "Johnn Doe"
$ git config --global user.email "johnndoe@example.com"
Lo siguiente es clonar el repositorio del desarrollador principal de libreboot.
$ git clone https://codeberg.org/libreboot/lbmk
Una vez clonado, accedemos a la carpeta.
$ cd lbmk
E instalamos las dependencias necesarias según nuestro sistema operativo. Puedes encontrar los archivos de configuración en /lbmk/config/dependencies para elegir el que necesites. En el caso de Pop!_OS se deben instalar las dependencias aplicables a ubuntu. Para ubuntu aparecen dos archivos de configuración, uno general y otro para la versión 2404, puedes instalar las dependencias para ambas versiones si lo crees necesario. Dejo un comando previo para conocer que versión del sistema operativo tenemos instalada.
$ cat /etc/os-release
$ sudo ./mk dependencies ubuntu
$ sudo ./mk dependencies ubuntu2404
Es el momento de construir la herramienta de flasheo:
$ ./mk -b flashprog
Llegados a este punto tenemos dos opciones, compilar nosotros mismos la rom (A) o usar una rom pre-compilada (B, más rápido).
(A) Compilando puedes personalizar diferentes aspectos (por ejemplo, puedes cambiar la configuración de grub, como podría ser poner una imagen de fondo personalizada cuando inicie. /lbmk/config/data/grub/background), pero, por mi experiencia, al compilar también pueden aparecer algunos errores. Si te ocurre alguno, siempre puedes intentar solucionarlos manualmente, acudir al IRC de libreboot o usar una rom pre-compilada como se indica.
En cualquier caso el proceso tarda varios minutos (15-20 en mi caso) pero antes vamos a añadir un comando para acelerar el proceso de compilación.
Por defecto, el proceso de compilación utiliza un subproceso, pero dependiendo de la cantidad de núcleos que tenga nuestra cpu podemos incrementarlos . En mi caso:
$ export XBMK_THREADS=4
Un mejor comando para esto es el que me sugirió j4b4t0 (gracias por el apunte!), que hace que el proceso de compilación se adapte al número de unidades de procesamiento del equipo sin necesidad de determinarlas.
$ export XBMK_THREADS=$(nproc)
La compilación se ejecuta como sigue:
$ ./mk -b coreboot x230_12mb
Si todo ha ido bien tendrás diferentes versiones de la rom en /lbmk/bin/x230_12mb.
(B) Para usar una imagen pre-compilada podemos acudir a mirrors.mit.edu/libreboot/stable (hay otros mirrors en libreboot.org/download.html, el del MIT es solo uno de ellos). Allí podemos encontrar todas las roms de libreboot pre-compiladas, para todos los equipos, tanto las versiones más antiguas como las más recientes. A día de hoy la más actual es la 25.06 (mirrors.mit.edu/libreboot/stable/25.06/roms). Vamos a descargar los tres archivos que veremos para nuestro equipo (.xz, .xz.sha512, .xz.sig) ya que vamos a verificar las firmas y la integridad de la rom que vamos a usar. Es un paso adicional que por seguridad me gusta hacer aunque no sea estrictamente necesario.
Para ello primero descargaremos la firma del desarrollador principal de libreboot en libreboot.org/lbkey.asc y la importamos.
$ gpg --import lbkey.asc
Una vez importada verificamos la autenticidad de la rom pre-compilada mediante la firma digital.
$ gpg --verify libreboot-25.06_x230_12mb.tar.xz.sig libreboot-25.06_x230_12mb.tar.xz
Debe aparecer algo así.
gpg: Firmado el lun 30 jun 2025 20:01:12 CEST
gpg: usando RSA clave 8BB1F7D28CF7696DBF4F71925C654067D383B1FF
gpg: Firma correcta de "Leah Rowe <info@minifree.org>" [desconocido]
gpg: ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!
gpg: No hay indicios de que la firma pertenezca al propietario.
Huellas dactilares de la clave primaria: 8BB1 F7D2 8CF7 696D BF4F 7192 5C65 4067 D383 B1FF
Nos vamos a la web de descargas de libreboot (libreboot.org/download.html) y comprobamos que el fingerprint coincida.
Verificamos el checksum (integridad mediante sha512) de la rom pre-compilada.
$ sha512sum -c libreboot-25.06_x230_12mb.tar.xz.sha512
Debe aparecer que coinciden (libreboot-25.06_x230_12mb.tar.xz: La suma coincide).
Pasamos finalmente a la construcción del firmware, para eso hay que modificar la rom pre-compilada mediante el siguiente comando:
$ ./mk inject libreboot-25.06_x230_12mb.tar.xz
En este proceso ocurren muchas cosas interesantes. Por un lado, ocurre la extracción, modificación e inserción del software propietario necesario para que el equipo funcione correctamente, hablamos del software del fabricante exclusivamente necesario (los famosos blobs). En este proceso se ejecuta me_cleaner para reducir al mínimo el impacto del Intel Management Engine (ME, necesario para que estos equipos más modernos arranquen). Me_cleaner podrá eliminar por completo el ME en equipos más antiguos (X60, X200..) pero en equipos más modernos lo que hace es minimizar su función en el arranque, para desactivarlo posteriormente una vez que el equipo ha iniciado. Si te interesa esta parte puedes profundizar sobre me_cleaner y ver exactamente que es lo que deja hacer al ME dependiendo de la versión (funciones como ROMP, BUP, RBE, Kernel, Syslib..).
Otra cosa interesante que ocurre en este proceso es la aleatorización de la MAC de la tarjeta de red del equipo. Por defecto, en versiones actuales, se hace automáticamente pero se puede personalizar si se requiere (por ejemplo así, $ ./mk inject libreboot-25.06_x230_12mb.tar.xz setmac 1A:2B:3C:4D:5E:6F).
Una vez construido nuestro nuevo firmware solo queda extraerlo.
$ tar xvf libreboot-25.06_x230_12mb.tar.xz
Comprobamos que tenemos las diferentes versiones en la ruta /lbmk/bin/x230_12mb.
- Proceso de flasheo -
Elección y división de la rom
Antes de flashear, vamos a realizar un paso previo que es necesario para instalar libreboot en un thinkpad x230. Al tener dos chips, debemos dividir la rom en dos partes como sigue:
Primero debemos escoger que versión de la rom que hemos construido queremos instalar. Todas las versiones se encuentran localizadas en /lbmk/bin/x230_12mb. En mi caso he escogido una rom con arranque seagrub en modo gráfico y teclado español (seagrub combina un tipo de arranque en el que carga tanto seabios como grub, te recomiendo investigar las distintas opciones para escoger la que mejor se adapte a tus necesidades y sobre todo a los sistemas operativos que vayas a usar).
Una vez escogida, situándonos dentro de /lbmk/bin/x230_12mb, ejecutamos lo siguiente.
$ dd if=seagrub_x230_12mb_libgfxinit_corebootfb_esqwerty.rom of=top.rom bs=1M skip=8
$ dd if=seagrub_x230_12mb_libgfxinit_corebootfb_esqwerty.rom of=bottom.rom bs=1M count=8
Si todo ha ido bien, ya tendremos nuestra rom dividida y lista para instalar.
Preparación de la Raspberry Pico
Como se mencionó en la primera parte de esta guía, para el flasheo externo debemos usar un programador flash SPI, que será una Raspberry Pico RP2040 en mi caso. A partir de este momento vamos a preparar el firmware para la Raspberry Pico, para posteriormente flashearla y que nos sirva de “puente”. Este proceso lleva unos minutos ya que compila el firmware para todos los dispositivos compatibles, no solo para la pico.
$ cd lbmk
$ export XBMK_THREADS=$(nproc)
$ ./mk -b pico-serprog
Ahora debemos conectar la Pico al equipo mediante el cable usb pero antes de conectarla debemos tener pulsado el pequeño botón blanco que trae. Esto hará que arranque como una unidad de almacenamiento externa y el equipo al que la conectes la detecte como tal.
En la ruta /lbmk/bin/serprog encontraremos todos los firmwares que acabamos de construir. Allí tenemos que buscar (en nuestro caso serprog_pico.uf2), seleccionar, copiar y pegar este archivo en la unidad de almacenamiento creada por la Raspberry Pico. Al hacer esto el firmware se instala automáticamente y el dispositivo dejará de funcionar como unidad de almacenamiento externa.
En este punto desconectamos la pico físicamente.
Flasheo del chip inferior
Es el momento de conectar la pinza SOIC8 a la raspberry pico mediante los cables dupont. Lo haremos siguiendo el siguiente diagrama. Vale la pena verificar que la configuración de pines de nuestros chips coincidan con las del diagrama (a excepción de HOLD y WP que no se conectan). Sería muy extraño que no coincidiesen pero si fuese así solo debes adaptar tu propio esquema.

Vale la pena repasar varias veces el diagrama y las conexiones antes de conectar la pinza al chip. Si mandamos tensión a un pin que no debemos podríamos dañarlo.
Conectamos la pinza al chip inferior. Para ello, fijándonos muy bien, ajustamos primero un lado y luego el otro de modo que quede bien fija. Se moverá un poco si lo fuerzas pero no debe saltar.

Con mucho cuidado de no mover la pinza, conectamos la Pico al equipo mediante el cable usb. Una vez conectada, para localizar e identificar la Pico en nuestro sistema, debemos ejecutar
$ sudo dmesg
En la parte final de lo que nos muestra, debe aparecer un identificador tipo ttyACM*, donde el asterisco es un número (en mi caso ttyACM0). Debemos recordar este identificador para apuntar a él en los siguientes pasos.
Lo siguiente que vamos a hacer es utilizar la herramienta flashprog, primero para hacer una copia de seguridad de la rom instalada y posteriormente para flashear el chip. Pero antes debemos posicionamos en la ruta correspondiente.
$ cd lbmk/elf/flashprog
Escribimos lo siguiente para leer el chip y hacer una copia de seguridad de la bios instalada (si no se concreta ninguna ruta se va a guardar por defecto en la carpeta desde donde estamos trabajando).
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -r bottom1.rom
Aquí pueden surgir un par de problemas. Por un lado, que la pinza no esté bien conectada al chip y no pueda leerlo correctamente. Por otro, que no identifique correctamente el chip y tengas que indicar el correcto.
Si ocurre lo primero, debemos desconectar el cable usb de la Pico y verificar las conexiones de nuevo.
Si ocurre lo segundo, debemos elegir el identificador de chip más similar al nuestro (por eso era importante apuntar el identificador de nuestro chip) y añadirlo al final de la instrucción. Por ejemplo, si nos da la opción de varios identificadores como "ejemploA", "ejemploB" o "ejemploC" y el más parecido al nuestro es "ejemploB", deberíamos añadirlo de la siguiente forma (incluye las comillas).
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "ejemploB" -r bottom1.rom
En mi caso, el mensaje reportado por flashprog se mostró de la siguiente forma:

Como mi chip inferior tiene el identificador MX25L6406E, escogeré la tercera opción y la instrucción quedará como sigue.
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L6406E/MX25L6408E" -r bottom1.rom

Una vez leído el chip y realizada la copia de seguridad, hacemos otra.
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L6406E/MX25L6408E" -r bottom2.rom
Y las comparamos
$ diff bottom1.rom bottom2.rom
(también se puede usar $ sha512sum bottom*.rom para comparar los hashes de ambos archivos y ver si coinciden).
Si no obtienes ningún resultado es indicativo de que ambas copias son iguales y todo fue correctamente. Si no es así, simplemente crea más copias y compáralas hasta que coincidan.
Más adelante puedes guardarlas en un lugar seguro (una unidad externa, por ejemplo) para tenerlas disponibles por si en algún momento quieres revertir este proceso e instalar la rom original.
Llega el momento de la verdad, vamos a flashear el chip inferior e instalar la parte de la rom correspondiente que tenemos preparada (el Intel Management Enigne se encuentra instalado en este chip junto a otras funcionalidades de la bios).
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L6406E/MX25L6408E" -w ../../bin/x230_12mb/bottom.rom

Como se explicó anteriormente, en mi caso tuve que especificar el identificador del chip pero siempre puede no ser el caso. Si no fuese necesario especificarlo porque flashprog nos detectara correctamente el chip, el comando para la escritura sería más simple $ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -w ../../bin/x230_12mb/bottom.rom.
Después de todo el proceso de lectura, borrado, escritura, verificación... debe aparecerte VERIFIED. Si no es así puedes intentarlo de nuevo.
Una vez terminado, desconectamos la raspberry pico del equipo y posteriormente, con cuidado, desconectamos la pinza del chip.
Flasheo del chip superior
Repetimos el mismo proceso para el chip superior.
Lo primero es conectar la pinza al chip. Fijándonos muy bien, ajustamos primero un lado y luego el otro de modo que quede bien fija. Se moverá un poco si lo fuerzas pero no debe saltar.

Volvemos a utilizar la herramienta flashprog, primero para hacer una copia de seguridad de las rom instalada y posteriormente para flashea el chip.
Estando posicionados en /lbmk/elf/flashprog escribimos lo siguiente:
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -r top1.rom
Al igual que me ocurrió con el chip inferior, flashprog no es capaz de reconocer el identificador exacto de este chip, mostrando el siguiente mensaje:

Como mi chip superior tiene el identificador MX25L3206E, escogeré la tercera opción y la instrucción quedará como sigue.
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L3206E/MX25L3208E" -r top1.rom

Una vez leído el chip y realizada la copia de seguridad, hacemos otra.
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L3206E/MX25L3208E" -r top2.rom
Y las comparamos.
$ diff top1.rom top2.rom
(también se puede usar $ sha512sum top*.rom para comparar los hashes de ambos archivos y ver si coinciden).
Si no obtienes ningún resultado es indicativo de que ambas copias son iguales y todo fue correctamente. Si no es así, simplemente crea más copias y compáralas hasta que coincidan.
Más adelante puedes guardarlas en un lugar seguro (una unidad externa, por ejemplo) para tenerlas disponibles por si en algún momento quieres revertir este proceso e instalar la rom original.
Es hora de flashear el chip superior e instalar la parte correspondiente de la rom que tenemos preparada.
$ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c "MX25L3206E/MX25L3208E" -w ../../bin/x230_12mb/top.rom

Como se explicó anteriormente, en mi caso tuve que especificar el identificador del chip pero siempre puede no ser el caso. Si no fuese necesario especificarlo porque flashprog nos detectara correctamente el chip, el comando para la escritura sería más simple $ sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -w ../../bin/x230_12mb/top.rom.
Después de todo el proceso de lectura, borrado, escritura, verificación... debe aparecerte VERIFIED. Si no es así puedes intentarlo de nuevo.
Una vez terminado, desconectamos la Raspberry Pico del equipo y posteriormente, con cuidado, desconectamos la pinza del chip.
Es hora de volver a montar el equipo (es importante no olvidar conectar la pila). Cuando iniciemos, el equipo arrancará con la nueva bios y el trabajo habrá terminado.

- Errores, Upgrade y Referencias -
Error libpci3.8
La primera vez, me surgió un pequeño error de fácil solución.
Al ejecutar la última instrucción para escribir en el chip, me apareció un extraño error relacionado con mi versión de libpci.
`LIBPCI_3.8' not found
./flashprog: /lib/x86_64-linux-gnu/libpci.so.3: version `LIBPCI_3.8' not found (required by ./flashprog)
Me pedía, como mínimo, tener instalada la versión 3.8 y yo tenía instalada la 3.7. Intenté actualizar desde los repositorios de ubuntu pero no fue posible, así que tuve que hacer la instalación manualmente buscando la web del código fuente y compilándolo (mj.ucw.cz/sw/pciutils).
Error al compilar
Una de las primeras veces, tuve un error al compilar que no voy a mostrar porque ya está solucionado. Solo quería dejar este apunte para agradecer, una vez más, a la gente del chat IRC de Libreboot, que amablemente me ayudaron a identificar la línea de código concreta para solucionarlo.
Upgrade Lenovo Thinkpad X230
Con Libreboot instalado, a este equipo se le pueden instalar algunos componentes que, al no estar en la lista blanca de la bios propietaria, no eran compatibles. Por ejemplo, algunas tarjetas wlan de la marca atheros pasan a ser compatibles.
Referencias
libreboot.org/docs/install/spi.html
blog.yuuta.moe/2025/09/29/x230-libreboot
p2502.net/posts/libreboot-x230
www.youtube.com/watch?v=V9-zq4AgsvA
estudiobitcoin.com/flash-it-mejorando-la-seguridad-de-nuestro-setup-con-el-coreboot-de-skulls
#libreboot #linux #seagrub #seabios #flashprog #spyware #me_cleaner #thinkpad #x230 #tutorial #freesoftware #bitcoinnode
