Coreboot

Recursos
Inicio

Coreboot es un firmware libre y de código abierto que pretende ser un reemplazo rápido, seguro y flexible de UEFI. Soporta múltiples payloads, que van desde una implementación de la BIOS (SeaBIOS), a una instalación de GRUB2, hasta un kernel linux completo.Esta guía mostrará cómo instalar coreboot con un payload SeaBIOS en los dispositivos soportados, el manejo de las herramientas del espacio de usuario y el uso de flashrom.

Hardware soportado

Hay diferentes tipos de arquitecturas y hardware soportado. La tabla totalmente actualizada está disponible en el siguiente enlace. En la tabla de abajo hay algunos dispositivos bien soportados que son más o menos recientes. Si se utiliza un dispositivo más antiguo, puede ser posible eliminar todos los blobs binarios propietarios. Para ello, utilice la guía de libreboot.

Hardware Soportado Blob Free Init de RAM nativa Init de gráficos nativos Flashable por hardware Flashable por software Se necesita desoldar
Lenovo Thinkpad T530 Sí / Actualmente roto No Parcial Parcial / no con BIOS OEM
Lenovo Thinkpad T430s Sí / Actualmente roto No Parcial Parcial / no con BIOS OEM
Lenovo Thinkpad X230 No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad T420s No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad T420 No / WIP No Parcial Parcial / no con OEM BIOS No
Lenovo Thinkpad T520 No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad X220 No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad X220 No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad T410 No / WIP No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad T510 No / WIP No Parcial Parcial / no con BIOS OEM No
Lenovo Thinkpad X201 Sí / Actualmente roto No Parcial Parcial / no con BIOS OEM No
Apple Macbook Air 4,2 No No Parcialmente / no con BIOS OEM No

Los fundamentos

En general, el chip flash debe encontrarse en la placa del hardware seleccionado. Esto es importante, ya que el proveedor suele bloquear el chip flash mediante un bloqueo suave. Las guías para localizar el chip generalmente estarán en el wiki de coreboot. Esta guía asume que el dispositivo contiene un chip flash SPI, que requiere un clip para conectarse al flasher.

Flasher

Como flasher, se puede utilizar fácilmente una Raspberry Pi. Cualquier modelo y revisión servirá, pero hay que advertir que las anteriores no tienen suficiente RAM para compilar coreboot por sí mismas. Si usas una de estas, asegúrate de copiar el volcado del chip flash en un ordenador más potente. Si el chip flash está basado en SPI, asegúrate de conseguir un testclip Pomona SOIC-8 por 15 libras. Pero también hay muchos otros programadores. Asegúrese de conseguir algunos cables de depuración, también.

SPI flash

Hay diferentes tipos de chips SPI (lista). El paquete más común para estos chips es SOIC-8 que puede ser flasheado a través de testclip. A veces estos chips están en un paquete WSON-8; en cuyo caso el chip WSON-8 necesita ser desoldado, y resuelto con un nuevo SOIC-8. Si necesitas ayuda con la soldadura pregunta en los hackerspaces cercanos a tu ubicación. Los chips SPI son comunes en tamaños de 2MB – 16MB. A menudo los vendedores sueldan dos chips para ahorrar dinero.

flashrom

Utiliza banderas para sys-apps/flashrom Utilidad para leer, escribir, borrar y verificar los chips flash ROM

atahpt Soporte del controlador ATA/RAID Highpoint (HPT)
atapromise Soporte para Promise PDC2026x (FastTrak/Ultra)
atavia Soporte para controladores VIA VT6421A SATA
buspirate-spi Habilitar Bus Pirate SPI programador
ch341a-spi Habilitar programador SPI WCH CH341A
dediprog Soporte Dediprog SF100
developerbox-spi Habilitar el soporte de recuperación SPI de Devloperbox
digilent-spi Habilitar el soporte de la placa de desarrollo Digilent iCEblink40
drkaiser Habilitar el programador Dr. Kaiser programador
dummy Habilitar trazado ficticio
ene-lpc Habilitar controlador de teclado interfaz ENE LPC
ft2232-spi Habilitar programador ftdi, parpadeo a través de la interfaz FTDI/SPI USB
gfxnvidia Habilitar programador NVIDIA
internal Habilitar soporte interno/en placa
internal-dmi Habilitar decodificación DMI interna en lugar de utilizar sys-apps/dmidecode
it8212 Soporte para controladores ITE IT8212F ATA/RAID
jlink-spi Soporte para SEGGER J-Link y dispositivos compatibles
linux-mtd Habilitar el soporte para dispositivos flash SPI mtd de Linux
linux-spi Habilitar el soporte para la interfaz spidev del espacio de usuario de Linux
lspcon-i2c-spi Habilitar el soporte para lspcon USB-C a HDMI
mec1308 Habilitar el soporte para el controlador embebido Microchip MEC1308
mstarddc-spi Soporte para flash ROMs SPI accesibles a través de DDC en pantallas equipadas con MSTAR-pantallas equipadas
nic3com Habilitación del programador de NIC de 3Com
nicintel Soporte para NIC de Intel
nicintel-eeprom Soporte para EEPROMs en tarjetas de red Intel Gigabit
nicintel-spi Soporte para SPI en NICs Intel
nicnatsemi Soporte para NICs de National Semiconductor
nicrealtek Soporte para NICs de Realtek
ogp-spi Habilitar soporte para OGP (Open Graphics Project) SPI flashing
pickit2-spi Soporte para flash ROMs SPI accesibles a través de Microchip PICkit2
pony-spi Habilitar soporte para SI-Prog like hardware by Lancos
raiden-debug-spi Habilitar placa de depuración ChromiumOS Servo DUT
rayer-spi Soporte de hardware RayeR SPIPGM
realtek-mst-i2c-spi Habilitar soporte para Realtek MultiStream Transport (MST)
satamv Habilitar programador para controladores SATA de Marvell
satasii Habilitar programador ¡para controladores SATA SiI
serprog Habilitar programador Serial Flasher
static !no lo configure durante el arranque. Hace que los binarios sean enlazados estáticamente en lugar de dinámicamente
stlinkv3-spi Habilitar el programador SPI usando STLINK-V3
tools Instalar ich_descriptor_tool, una herramienta para leer imágenes SPI-flash en modo descriptor para los conjuntos de chips de Intel
usbblaster-spi Habilitar el soporte para los dongles USB-Blaster de Altera
wiki Habilitar la información de la wiki, como los dispositivos soportados, etc.
Datos proporcionados por la Base de Datos de Paquetes de Gentoo – Última actualización: 2021-01-27 17:12 Más información sobre las banderas USE

flashrom es la más utilizada para volcar y escribir en los chips flash. Esto debe ser instalado en el flasher, o en la máquina a la que el flasher está conectado.

Es útil instalar flashrom en el sistema al que se va a flashear, ya que una vez que coreboot es flasheado inicialmente, se puede reflashear internamente, sin desmontar o usar un flasher.

root #emerge --ask sys-apps/flashrom

Ahora, la máquina necesita ser desmontada. Siga el manual, o una guía en línea hasta que el chip de flash es accesible, y luego adjuntar el clip y el cable a la intermitente.

Advertencia
Asegúrese de que TODAS las fuentes de energía están desconectados de la máquina, aparte de la batería CMOS. Es posible freír las placas base si están conectadas mientras se está flasheando.

Una vez que el chip de flash está conectado a un flasher, utilice flashrom para volcar el contenido del chip de flash.

root #flashrom -p linux_spi:dev=/dev/spidev0.0 -r flash.bin
root #flashrom -p linux_spi:dev=/dev/spidev0.0 -r flash2.bin
root #diff flash.bin flash2.bin

Es importante hacer varios volcados, por si hay un error de conexión. Una vez que se obtiene un volcado adecuado, es seguro desconectar el flasher por ahora si así se desea. Recuerde, si se ejecuta en una Raspberry Pi v1, no tendrá suficiente RAM para compilar, por lo que en este punto el volcado debe ser transferido a una máquina diferente. Es posible utilizar el equipo desde el que se volcó el chip flash, aunque esto requerirá volver a montarlo y otro desmontaje más tarde.

Herramientas de volcado y compilación

Ahora, es necesario clonar el repositorio git de coreboot a un directorio de trabajo, ya que contiene las herramientas necesarias para continuar. También hay que crear directorios para el fabricante y el modelo específicos.

user $git clone --recursive https://review.coreboot.org/coreboot.git
user $cd coreboot
user $mkdir -p 3rdparty/blobs/mainboard/<manufacturer>/<model>

Sustituir <manufacturer> y <model> por su fabricante y modelo respectivamente (por ejemplog. lenovo/x220).

El siguiente paso es extraer regiones del volcado de la flash. Las regiones son similares a las particiones, y son un chip flash contiene un descriptor flash que puede ser visto como una tabla de particiones para la flash SPI con algunas propiedades adicionales. Este descriptor es leído por un programa llamado ifdtool, que se utilizará para obtener las particiones individuales.

Primero, ifdtool debe ser compilado. Su fuente está contenida bajo la de coreboot, así que cd en el directorio donde se clonó coreboot.

user $cd util/ifdtool
user $make

Es una buena idea instalar globalmente, pero no es necesario.

root #make install

Luego, cd de vuelta a donde esté flash.bin.

user $ifdtool -x flash.bin

Esto imprimirá una tabla de particiones, y extraerá algunos blobs. Una tabla de particiones estándar puede tener este aspecto:

Región Descripción Región de inicio Región de fin
0 Descriptor Flash 0x00000000 0x00000fff
1 BIOS (Firmware) 0x00500000 0x00bfffff
2 ME 0x00003000 0x004fffff
3 GbE 0x00001000 0x00002fff
4 Datos de plataforma sin usar sin usar

Datos de configuración de Intel ME y Gigabit Ethernet

Nota cómo la tabla anterior contiene ME y GbE. Estos son blobs binarios que inicializan partes del equipo (En este caso, Intel Management Engine y Gigabit Ethernet). En los dispositivos más antiguos, estos pueden ser eliminados con seguridad con libreboot, pero en Sandy Bridge y más nuevos, son necesarios para que el ordenador funcione correctamente. Dado que Intel ME es necesario en estas placas, debe ser extraído. Sin embargo, coreboot puede reducir drásticamente su tamaño, eliminando su acceso a la red y a los recursos del sistema. Esto es recomendable, ya que no sólo mejora la seguridad, sino que también deja más espacio en el chip flash para otras cargas útiles. Los datos de configuración de Gigabit Ethernet son específicos de cada máquina, y como tal, también deben ser extraídos del chip flash.

En este punto, el directorio de trabajo debe contener cuatro nuevos archivos, que siguen el formato flashregion_*.bin. Estos deberían asignarse a la tabla que se imprimió. Como se mencionó anteriormente, el descriptor, Intel ME y los blobs GbE son necesarios. Renómbralos como descriptor.bin, me.bin y gbe.bin respectivamente, y cópialos en coreboot/3rdparty/blobs/mainboard/<manufacturer>/<model>/; el directorio que fue creado anteriormente.

Configuración y compilación de Coreboot

Ahora, coreboot debe ser configurado para la máquina específica. Lo mejor es comprobar la página wiki de coreboot para el dispositivo dado, en caso de que haya algún requisito determinado. Como tal, esta página tratará de detallar sólo los ajustes que deben establecerse en la mayoría de las instalaciones. Esto no se puede garantizar, y algunos ajustes pueden causar conflictos con la máquina.

Primero, debe introducir la configuración. Esto se realiza de manera similar a la configuración de un kernel.

user $make nconfig

Alternativamente, uno podría usar menuconfig, o incluso editar el archivo de configuración manualmente (una vez que ha sido generado por nconfig/menuconfig).

Configuración general

Recomiendo activar lo siguiente:

  • Utilizar CMOS para los valores de configuración
  • Comprimir ramstage con LZMA
  • Incluir el archivo coreboot .config en la imagen ROM
  • Crear una tabla de marcas de tiempo recogidas durante el arranque
  • Construir el ramstage para que sea reubicable en el espacio de direcciones de 32 bits.

Para un dispositivo Sandy Bridge o posterior:

  • Permitir el uso del repositorio de sólo binarios

Y si has compilado previamente coreboot, puedes reducir aún más los tiempos de compilación habilitando:

  • Actualizar imagen coreboot.rom existente

Placa base

Aquí, el proveedor y el modelo deben ser seleccionados. Asegúrese de introducir el modelo exacto, si hay derivados disponibles (por ejemplo, X220/X220t). También debe seleccionarse el tamaño del chip de la ROM. Esto debería haber sido emitido por flashrom, pero si no se puede determinar comprobando el tamaño de los archivos de flash.bin.

Chipset

Este menú contiene opciones específicas del chipset, y también las ubicaciones de los blobs binarios extraídos anteriormente. Recomiendo habilitar:

  • Habilitar VMX para la virtualización
  • Ajustar el bit de bloqueo después de configurar VMX
  • Pitar en caso de error fatal
  • LEDs de flash en caso de error fatal

Estos permitirán una depuración más fácil si tienes un flash malo. Pueden deshabilitarse una vez que se haya creado una configuración de trabajo conocida.

A continuación, se deben proporcionar rutas en Intel Firmware. Habilite estas opciones:

  • Agregar archivo Intel descriptor.bin
  • Agregar firmware Intel ME/TXE
  • Descomponer el firmware Intel ME/TXE
  • Agregar firmware gigabit ethernet

Ahora deberían aparecer las opciones para las rutas. Deberían coincidir con los nombres utilizados anteriormente, pero si no es así, corríjalos para que lo hagan.

Dispositivos

Esta área se refiere en gran medida a los gráficos, especialmente en el contexto de los portátiles. Personalmente, tengo la Inicialización de los gráficos establecida en ‘Usar init de gráficos nativos’, y el Modo de pantalla/tambor de trama establecido en ‘Tampón de trama lineal de «alta resolución»‘. El resto de estas opciones deberían estar ya configuradas para la máquina. Si el dispositivo específico requiere una imagen de BIOS VGA, siga el wiki de coreboot.

Controladores genéricos

A menudo los habilito:

  • PS/2 keyboard init

Si el dispositivo tiene una tarjeta Intel PCIe WiFi, habilite la opción

  • Support Intel PCI-e WiFi adapters

Security

A menudo dejo esto solo, ya que actualmente sólo contiene opciones de Verified Boot, pero si se requiere soporte para esto, habilítelo.

Consola

Esta sección contiene opciones sobre la depuración de consolas. Puede ser útil habilitar ciertas opciones, especialmente si están ocurriendo problemas. He habilitado:

  • Secretar CPUs AP desde la consola temprana.
  • Enviar la salida de la consola a un buffer CBMEM
  • Mostrar códigos POST en la consola de depuración

Tablas del sistema

Habilitar Generar tablas SMBIOS, la única opción aquí.

Cargas útiles

En esta sección se puede elegir la carga útil. Esta página detallará cómo configurar SeaBIOS, ya que tiene la mayor compatibilidad con los sistemas operativos, pero también es posible utilizar GRUB2 para un arranque más rápido, o incluso colocar un kernel en el chip flash (si hay suficiente espacio).

Seleccione lo siguiente para una configuración adecuada de SeaBIOS:

  • Añadir una carga útil > SeaBIOS
  • Versión de SeaBIOS > master
  • Hardware init durante la ejecución de la ROM de opciones
  • Utilizar la compresión LZMA para las cargas útiles

También puede desear habilitar algunas cargas útiles secundarias. Estos pueden ser utilizados para la depuración, y el cambio de opciones. Una opción recomendada es nvramcui, que actúa de manera similar a un menú de opciones estándar de la BIOS.

Debugging

Estas opciones son en gran medida para el desarrollo. Los usuarios normales no necesitan activar nada en este submenú.

Compilación

Ahora que la configuración está hecha, coreboot debe ser compilado. Primero hay que construir el compilador cruzado:

user $make crossgcc-i386 CPUS=${nproc}

Esto requiere que dev-lang/gnat-gpl esté instalado, de lo contrario muchas funciones no funcionarán correctamente.

Una vez hecho esto, compila IASL:

user $make iasl

Y por último, compila coreboot

user $make

Flashea coreboot.rom

Esto debería producir un archivo en el directorio build/ llamado coreboot.rom. Esta es la imagen final que necesita ser flasheada. Copie esto en el flasher, si no está ya en él, desmonte el dispositivo de destino y conecte el flasher al chip de flasheo.

En el flasher, utilice flashrom para flashear:

root #flashrom -p linux_spi:dev=/dev/spidev0.0 -w coreboot.rom
root #flashrom -p linux_spi:dev=/dev/spidev0.0 -v coreboot.rom

El segundo comando debería devolver VERIFIED. Si es así, coreboot ha sido flasheado con éxito en el dispositivo.

Flasheo vía interna

Una vez que coreboot ha sido flasheado inicialmente, puede ser posteriormente flasheado internamente, sin necesidad de un dispositivo de flasheo externo. Para ello, una vez compilado un nuevo coreboot.rom, simplemente haga lo siguiente:

root #flashrom -p internal:laptop=force_I_want_a_brick -w coreboot.rom
Advertencia
Aunque esto ha sido probado en varios portátiles, puede que no funcione en el dispositivo utilizado. Asegúrese de comprobar si otros han tenido éxito o fracasos con el flasher interno para el modelo específico.

Solución de problemas

Coreboot no está arrancando (Broken build)

Si coreboot no está arrancando, entonces por lo general significa que o bien no está configurado correctamente, o le falta una carga útil. Asegúrese de que se ha seleccionado un payload adecuado que se ha compilado correctamente, y se ha configurado correctamente.

También es posible que coreboot esté funcionando correctamente, pero el componente gráfico no. Esto puede ser causado por el uso de gfx init nativo. Prueba a volcar una BIOS VGA y usarla en su lugar. También podría ser al revés; intente cambiar de una BIOS VGA a una gfx init nativa. Como último recurso, intente usar el modo de texto VGA Legacy para el modo framebuffer bajo Dispositivos/Pantalla.

Ya no arranca nada (aka SPI chip bricked)

Esto suele ser causado por dejar la máquina encendida mientras se hace el dumping o el flasheo con un flasher externo. Si la máquina no se enciende en absoluto (no se encienden las luces, los ventiladores o la pantalla en el arranque), esto puede significar que la máquina está brickeada. Puede ser posible reparar comprando un nuevo chip flash (asegúrese de que es compatible – trate de usar el mismo fabricante y modelo para obtener los mejores resultados) y flashearlo con la BIOS original o la ROM coreboot. Esto a menudo requiere una soldadura muy delicada, y no es para los débiles de corazón. Puede significar que hay que comprar una nueva máquina, o al menos una nueva placa base.

Nota
¡Asegúrese siempre de comprobar que la causa no es un coreboot mal configurado!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.