jueves, 4 de noviembre de 2021

Hace un tiempo que me instalé una Debian en mi portátil. Pero como este trasto HP Pavilion x360 es un poco especialito no me dejaba configurar la tarjeta de red inalámbrica. Y la verdad me ha costado que a pesar de que sí que aparecía al buscar con comandos como 

# dmesg

O

# lspci -vnn | grep -i 14e4

Al menos estos los tuve que lanzar unas cuantas veces.

También están los distintos drivers e historias que tiene Debian en su repositorio. Eso sí, hay que acordarse antes de poner en el fichero /etc/apt/sources.list el parámetro non-free a la ristra de los que ya tiene la url del repositorio.

deb http://url contrib ... non-free 

Y con 

# apt-cache search broadcom

Instalar los paquetes adecuados. Ahora mismo no los tengo a mano pero eran algunos como broadcom-sta-dkms, broadcom-sta-source, firmware-43-installer o similares. Al final el que te dirá qué módulos te pueden funcionar para tu tarjeta es el comando lspci en la sección Kernel driver in use (aunque realmente no es del todo cierto).

El driver que en mi caso me ocupaba era wl. Pero buscando tanto en los logs como en dmesg o incluso ejecutando 

# modprobe -vv wl

No había manera de que funcionara. Es más, en este último caso me devolvía un error. Por cierto, para el que no lo sepa, las "v" son para que devuelva más información. Un posible error que me salía (he tenido que buscar el ejemplo ya que  no lo documenté):

modprobe: ERROR: could not insert 'wl': Required key not availablemodprobe: ERROR:../libkmod/libkmod-module.c:977 command_do() Error running install command for wl
modprobe: ERROR: could not insert 'wl': Operation not permitted


No recuerdo si era con modprobe, pero sí buscando en resultados del dmesg o journal una línea muy interesante:

Kernel is locked down from Kernel configuration; see man kernel_lockdown.7

Esto viene a querer decir que si se tiene activado el arranque seguro y el driver no está firmado no se podrá instalar. ¿Solución? Los hay que tiran por la calle de en medio: "deshabilita el arranque seguro". Pero hay otra solución. Crear un certificado de firma, instalarlo en la máquina y después firmar el driver. 

¿Cómo creo que certificado de firma?

Me encontré un tutorial bastante interesante en la pregunta de un foro en ITecTec. Y la verdad es que funcionó mucho mejor de lo que esperaba. Pero antes de nada conecta la máquina con un cable de red, actualiza todo el sistema y asegúrate de que tienes instalado linux-headers. Al menos en algún punto me suena que los instalé. Repasando algunas rutas estoy viendo que es muy posible que instalara build-essential y linux-headers-generic. Ya contaré esto último más adelante. Antes de que empieces con lo siguiente: más adelante te tocará preparar un script porque el driver dejará de funcionar cada vez que se actualice el kernel.

Vete a una carpeta. En mi caso hice con el usuario root directamente.

  1. Situate en una carpeta fácil y créate una en la que vas a crear los certificados. Por seguir ele ejemplo: module-signing
    1. # mkdir module-signing
  2. Entra dentro de la carpeta:
    1. # cd module-signing
  3. Ahora crearemos nuestro certificado de firma:
    1. # openssl req -new -x509 -newkey rsa:2048 -keyout mok.priv -outform DER -out mok.der -nodes -days 36500 -subj "/CN=Nombre/"
  4. Le reasignamos los permisos para que sólo tenga lectura por parte del propietario:
    1. # chmod 600 mok.priv
  5. Con la herramienta mokutil nos pedirán asignar una contraseña que (parece ser) apenas se usará un par de veces y con esto se instalará el certificado en algún punto de la UEFI:
    1. # mokutil --import /rutaCompletaCertificados/mok.der
¿Cómo instalo certificado de firma en la UEFI?
  1. Una vez hayas introducido la contraseña apaga la máquina. ¿No te sale el grub por defecto? Tendrás que vigilarlo y hacer lo que siempre hagas para que te aparezca. De todas formas, en este paso debería de aparecerte en la pantalla un menú que nunca has visto. Había un pequeño paso adicional que no indican en el ejemplo y no me acuerdo cuál. Pero una selección por descarte. ¡Ah! Los teclados externos podrían no funcionar.
    1. Presionar cualquier tecla cuando te lo pidan si quieres acceder al MOK.
    2. Selecciona "Enroll MOK"
    3. Selecciona "Continuar" o "Continue"
    4. Me suena que en mi caso salió por aquí ese otro paso.
    5. Seleccionar "Yes" o "Sí".
    6. Introducir la contraseña del certificado.
    7. Aceptar para continuar el arranque. Recuerda: si no te suele salir el grub, es posible que te arranque el sistema por defecto y tengas que arrancar tu Linux como siempre lo hagas.
¿Cómo firmo el módulo?
  1. Ahora puedes firmar el módulo en cuestrión:
    1. /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /rutaCompletaCertificados/mok.priv /rutaCompletaCertificados/mok.der /rutaCompletaMódulo

Con estos pasos ahora si ejecutas modprobe tal y como hicimos al principio del artículo dejará de darte problemas.

Otros cambios realizados

La verdad es que entre medias hice otros cambios que se proponían y que a pesar de que no hacían lo que esperaba creo que también funcionaron bien para otras historias. 

En los parámetros del kernel en el grub puse dos parámetros adicionales:
  • pci=biosirq
  • acpi_osi= (tal cual. Así es como lo ponían en la página donde lo encontré)
La verdad, no he sido capaz de encontrar qué hacen pero sin estos alguna cosa no acaba de funcionar.

Una ruta interesante en la que se explican los distintos módulos de Broadcom está en Ubuntu

Sorpresa

En todo este proceso para instalar los drivers de la tarjeta inalámbrica Broadcom 43142 no sé cómo el se consiguió instalar el grub en el almacén de sistemas operativos accesibles por la UEFI. El problema está en que a pesar de que los ficheros necesarios para poder arrancar el sistema sí que se guardaban en /boot/efi/ el siguiente paso era que la UEFI lo identificara automáticamente y no había manera. Por lo tanto tocaba forzar a darle al F9 en el arranque, navegar por la ruta mencionada y seleccionar el fichero shimx64.efi. El comando que intentaba usar para crear en la entrada que necesitaba la UEFI era algo parecido a

# efibootmgr -c -d /dev/sda -p 3 -L "etiqueta" -l \EFI\"label"\grubx64.efi

Pero como digo, me decía algo así como "el directorio no existe". 

Pues bueno, para resumir, con todo el lío que he hecho para que se inicie la tarjeta de red inalámbrica, la entrada se ha puesto ella solita. Por lo que ahora en el menú de la UEFI puedo indicarle qué sistema quiero que arranque. En mi caso será el grub, que a su vez me permitirá lanzar Windows cuando quiera.