Red (wifi) y SSH en Stage1 (boot - initrd) de NixOS - Parte 2

Ninguna IA ha estado involucrada en la creación de este articulo Contexto Esta es la Parte 2 del articulo "Red y SSH en Stage1 (boot - initrd) de NixOS". La Parte 1 puede ser encontrada aquí. Esta guiá forma parte de un compendio de clases/tutoriales para crear y gestionar un HomeLab usando NixOS. Introducción En esta segunda parte veremos como activar una interfaz inalámbrica (WiFi) durante la Stage1 del proceso de boot de NixOS. Exploraremos los desafíos de identificar e instalar drivers, de escanear redes wifi durante Stage1 y de automatizar el proceso de conexión durante el boot. En esta segunda parte estoy asumiendo que ustedes poseen acceso por SSH a Stage1 usando una interfaz Ethernet. Si aun no han logrado configurar esto, puede ver la primera parte del articulo. El Plan: Verificando el funcionamiento normal de WiFi en NixOS Activar drivers de interfaz inalámbrica en Stage1 Validar escaneo y conexión de redes WiFi en Stage1 Automatizar el proceso de conexión a WiFi en Stage1 y probar el acceso remoto usando SSH Si... si comparan con lo expuesto en la Parte 1, he cambiado un poco los puntos de "El Plan" de la Parte 2 >.< Vamos a ello! 1) Verificando el funcionamiento normal de WiFi en NixOS Lo primero sera validar que nuestro NixOS pueda usar el adaptador WiFi de forma normal. Con esto me refiero a poder: ir a su interfaz de NetworkManager, escanear las redes WiFi, seleccionar una y conectarnos correctamente luego de indicar la contraseña asociada. Si podemos hacer esto de forma normal, te invito a continuar con la siguiente sección de este artículo. En caso que tengas conectado un adaptador inalámbrico, pero no lo puedas usar en su NixOS, quiere decir que faltan los drivers. A continuación exploraremos como instalar un adaptador WiFi. 1.1) Instalando drivers de interfaz inalámbrica en NixOS He querido incluir este paso porque, en mis experimentaciones, he estado usando un dongle USB WiFi que, efectivamente, ha requerido una instalación de drivers manual... espero que este segmento le sea útil a alguien que este en una situación similar. Nuestro objetivo es buscar el nombre del dispositivo inalámbrico. Con esto me refiero al modelo del hardware. Para esto, lo mejor es usar las herramientas pciutils y/o usbutils. Si vienen de la Parte 1 del articulo, estas herramientas ya las deberían tener en: /etc/nixos/configuration.nix. Usando los comandos de lsusb -v y lspci -k podemos listar el hardware conectado por el bus USB y PCI a nuestro equipo. Una de estas dos opciones serán de utilidad para ustedes, ya que los adaptadores WiFi generalmente usan uno de estos dos bus de comunicación. En mi caso, como tengo un dongle USB, con lsusb -v he podido encontrar el nombre de mi dispositivo. Es: "Realtek RTL8188EUS". Si su adaptador inalámbrico usa el bus PCI (por ejemplo si es una tarjeta pci-express) pueden usar lspci -k para localizar el nombre. Usando este nombre debemos entregarnos a Google...y buscar... Nuestro objetivo ahora es encontrar el nombre del driver relacionado a este dispositivo. Luego de un poco de búsqueda, para mi dongle Realtek he encontrado que el driver correspondiente se llama "rtl8xxxu" y es parte de un paquete de drivers de llamado: "rtl8188eus-aircrack". Claramente en su caso esto sera distinto, lamentablemente no existe una manera sistemática para encontrar el driver correcto... pero no tengan duda que alguien en internet ya ha pasado por lo mismo que ustedes. Con algo de investigación encontraran el nombre del driver. Ahora nos toca incluir este driver en nuestro NixOS. Para esto en /etc/nixos/hardware-configuration.nix vamos a añadir: boot.extraModulePackages = with config.boot.kernelPackages; [ rtl8188eus-aircrack ]; Nota: Estoy usando extraModulePackages _ y no _availableKernelModules porque, en específico, este es un driver externo a los empaquetados con NixOS. Ahora nos toca crear una nueva generación de NixOS con sudo nixos-rebuild switch y luego reiniciar el sistema. Luego del reinicio ya deberían poder usar su adaptador WiFi de forma normal en nuestro NixOS. 2) Activar drivers de interfaz inalámbrica en Stage1 Primero partiremos identificando el nombre de la interfaz inalámbrica. Usando ip link podemos listar los adaptadores del sistema. En mi caso se llama "wlp0s11u1" (desde ahora los ejemplos usaran este nombre para el adaptador, no olviden usar el de su interfaz). Con esta información ahora veremos cual es el estado de la interfaz durante Stage1. Vamos a reiniciar nuestro sistema y conectarnos por SSH a Stage1 (de la forma expuesta en la Parte 1 del artículo). Una vez en Stage1 usaremos ip link para ver cuales adaptadores están siendo detectados en esta etapa del boot. Lo mas seguro es que no vean su interfaz inalámbrica... y esto es lo normal. En el extraño caso que si vean su interfaz inalámbrica listada, pueden continuar con la siguiente sección del

Apr 7, 2025 - 00:15
 0
Red (wifi) y SSH en Stage1 (boot - initrd) de NixOS - Parte 2

Ninguna IA ha estado involucrada en la creación de este articulo

Contexto

Esta es la Parte 2 del articulo "Red y SSH en Stage1 (boot - initrd) de NixOS". La Parte 1 puede ser encontrada aquí.

Esta guiá forma parte de un compendio de clases/tutoriales para crear y gestionar un HomeLab usando NixOS.

Introducción

En esta segunda parte veremos como activar una interfaz inalámbrica (WiFi) durante la Stage1 del proceso de boot de NixOS. Exploraremos los desafíos de identificar e instalar drivers, de escanear redes wifi durante Stage1 y de automatizar el proceso de conexión durante el boot.

En esta segunda parte estoy asumiendo que ustedes poseen acceso por SSH a Stage1 usando una interfaz Ethernet. Si aun no han logrado configurar esto, puede ver la primera parte del articulo.

El Plan:

  1. Verificando el funcionamiento normal de WiFi en NixOS
  2. Activar drivers de interfaz inalámbrica en Stage1
  3. Validar escaneo y conexión de redes WiFi en Stage1
  4. Automatizar el proceso de conexión a WiFi en Stage1 y probar el acceso remoto usando SSH

Si... si comparan con lo expuesto en la Parte 1, he cambiado un poco los puntos de "El Plan" de la Parte 2 >.<

Vamos a ello!

1) Verificando el funcionamiento normal de WiFi en NixOS

Lo primero sera validar que nuestro NixOS pueda usar el adaptador WiFi de forma normal. Con esto me refiero a poder: ir a su interfaz de NetworkManager, escanear las redes WiFi, seleccionar una y conectarnos correctamente luego de indicar la contraseña asociada.

NetworkManager y selección de red WiFi

Si podemos hacer esto de forma normal, te invito a continuar con la siguiente sección de este artículo.

En caso que tengas conectado un adaptador inalámbrico, pero no lo puedas usar en su NixOS, quiere decir que faltan los drivers. A continuación exploraremos como instalar un adaptador WiFi.

1.1) Instalando drivers de interfaz inalámbrica en NixOS

He querido incluir este paso porque, en mis experimentaciones, he estado usando un dongle USB WiFi que, efectivamente, ha requerido una instalación de drivers manual... espero que este segmento le sea útil a alguien que este en una situación similar.

Nuestro objetivo es buscar el nombre del dispositivo inalámbrico. Con esto me refiero al modelo del hardware. Para esto, lo mejor es usar las herramientas pciutils y/o usbutils. Si vienen de la Parte 1 del articulo, estas herramientas ya las deberían tener en: /etc/nixos/configuration.nix.

Usando los comandos de lsusb -v y lspci -k podemos listar el hardware conectado por el bus USB y PCI a nuestro equipo. Una de estas dos opciones serán de utilidad para ustedes, ya que los adaptadores WiFi generalmente usan uno de estos dos bus de comunicación. En mi caso, como tengo un dongle USB, con lsusb -v he podido encontrar el nombre de mi dispositivo. Es: "Realtek RTL8188EUS".

Dispositivo dongle WiFi

Si su adaptador inalámbrico usa el bus PCI (por ejemplo si es una tarjeta pci-express) pueden usar lspci -k para localizar el nombre.

Usando este nombre debemos entregarnos a Google...y buscar... Nuestro objetivo ahora es encontrar el nombre del driver relacionado a este dispositivo. Luego de un poco de búsqueda, para mi dongle Realtek he encontrado que el driver correspondiente se llama "rtl8xxxu" y es parte de un paquete de drivers de llamado: "rtl8188eus-aircrack".

Claramente en su caso esto sera distinto, lamentablemente no existe una manera sistemática para encontrar el driver correcto... pero no tengan duda que alguien en internet ya ha pasado por lo mismo que ustedes. Con algo de investigación encontraran el nombre del driver.

Ahora nos toca incluir este driver en nuestro NixOS. Para esto en /etc/nixos/hardware-configuration.nix vamos a añadir:

boot.extraModulePackages = with config.boot.kernelPackages; [
  rtl8188eus-aircrack
];

Nota: Estoy usando extraModulePackages _ y no _availableKernelModules porque, en específico, este es un driver externo a los empaquetados con NixOS.

Ahora nos toca crear una nueva generación de NixOS con sudo nixos-rebuild switch y luego reiniciar el sistema. Luego del reinicio ya deberían poder usar su adaptador WiFi de forma normal en nuestro NixOS.

2) Activar drivers de interfaz inalámbrica en Stage1

Primero partiremos identificando el nombre de la interfaz inalámbrica. Usando ip link podemos listar los adaptadores del sistema. En mi caso se llama "wlp0s11u1" (desde ahora los ejemplos usaran este nombre para el adaptador, no olviden usar el de su interfaz).

Con esta información ahora veremos cual es el estado de la interfaz durante Stage1. Vamos a reiniciar nuestro sistema y conectarnos por SSH a Stage1 (de la forma expuesta en la Parte 1 del artículo). Una vez en Stage1 usaremos ip link para ver cuales adaptadores están siendo detectados en esta etapa del boot. Lo mas seguro es que no vean su interfaz inalámbrica... y esto es lo normal. En el extraño caso que si vean su interfaz inalámbrica listada, pueden continuar con la siguiente sección del artículo.

Bien, entonces ahora lo que debemos lograr es habilitar en Stage1 los mismos drivers que en Stage2 se están usando para el WiFi. La mejor forma para lograr esto es realizar una comparativa entre los drivers cargados en Stage1 y Stage2. Y luego deducir (con ayuda de Google si es necesario) cual es exactamente el que "nos esta faltando" en Stage1 "pero que si esta" en Stage2.

Para esto primero vamos a ir a nuestra Stage2 (escritorio de toda la vida) y usaremos los comandos lsmod y modinfo para listar y ver el detalle de los driveres cargados. Estamos buscando uno que tenga relación con la interfaz inalámbrica.

Módulos cargados en Stage2 relacionados a rtl8xxxu

Dado el nombre de mi adaptador he logrado encontrar, usando lsmod, un modulo llamado "rtl8xxxu". Luego usando modinfo rtl8xxxu he podido ver que efectivamente se relaciona a la interfaz inalámbrica.

He aprovechado también de regresar por SSH a mi Stage1 para usar el mismo comando (lsmod) y confirmar que, efectivamente, "rtl8xxxu" no esta en Stage1.

Entonces, en teoría, si logramos cargar "rtl8xxxu" en Stage1 vamos a poder usar la interfaz inalámbrica.

Con esta información vamos a añadir "rtl8xxxu" al parámetro availableKernelModules en nuestro /etc/nixos/hardware-configuration.nix. Con esto habilitamos el uso del driver en Stage1:

boot.initrd.availableKernelModules = ["rtl8xxxu" … ];

En algunos casos puede ser necesario usar la opción enableRedistributableFirmware. Específicamente esto puede ser necesario si el driver que están cargando en availableKernelModules no es parte por defecto del sistema y ha sido instalado desde una fuente externa.

hardware.enableRedistributableFirmware = true;

Luego, creamos una nueva generación de NixOS y reiniciamos. De regreso a Stage1 por SSH he volvemos a usar ip link y ahora si veremos la interfaz listada! :)

Nota extra: En un momento use el driver "8188eu", el cual parecía ser el correspondiente a mi dongle WiFi. Pero, por alguna razón, eso solo funcionaba en Stage2 y no en Stage1. Por otro lado, el "rtl8xxxu" funciona en ambos contextos. La moraleja es que puede ser necesario un poco de prueba y error hasta lograr dar con el driver correcto.

3) Validar escaneo y conexión de redes WiFi en Stage1

Una vez que sabemos que en Stage1 la interfaz inalámbrica es detectada, toca usarla. En una primera instancia realizaremos algunas pruebas de conexión de forma manual. Y luego, en la siguiente sección del artículo, lo automatizaremos.

La primera prueba sera confirmar que la interfaz puede escanear redes en Stage1.

En primer lugar vamos a instalar unas herramientas que nos facilitaran el debugeo. En /etc/nixos/configuration.nix añadiéremos los paquetes:

También vamos a querer estas herramientas en Stage1, así que las añadiremos al parámetro initrdBin de nuestro /etc/nixos/hardware-configuration.nix:

boot.initrd.systemd.initrdBin = [ pkgs.iw pkgs.wirelesstools … ];

Aprovechando que estamos en hardware-configuration.nix también activaremos la interfaz inalámbrica de Stage1 en la sección network.networks:

...
wlp0s11u1 = {
  enable = true;
  name = "wlp0s11u1";
  DHCP = "yes";
}; 
...

Nota 1: Recuerda usar el nombre de tu interfaz.

Nota 2: Por ahora usaremos DHCP para que la IP, Gateway y DNS se configuren automáticamente desde nuestro router.

Bien, con esto listo vamos a crear una nueva generación de NixOS.

3.1) Probando el escaneo de redes

Primero realizaremos una prueba en Stage2 (escritorio típico). Usando los comandos:

  • ip link Deberíamos identificar la disponibilidad e la interfaz inalámbrica.
  • iw dev y/o iwconfig Deberíamos poder ver detalles de la interfaz inalámbrica.
  • iw scan y/o iwlist scan Deberíamos ver las redes WiFi disponibles.

Una vez comprobado que todo se ve "normal" en Stage2, vamos a repetir este proceso en Stage1. Si todo va bien, también deberíamos ser capaces de ver las señales WiFi disponibles.

Nos conectamos por SSH a Stage1 y usamos los mismos comandos: ip link, iw dev y iw scan.

Con esto podemos confirmar que la interfaz inalámbrica en Stage1 es capaz de escanear redes. Genial !

3.2) Creado un supplicant con las configuraciones de red inalámbrica

Ahora que sabemos que podemos escanear redes en Stage1, debemos prepararnos para conectarnos a una. Para esto deberemos crear un archivo de configuración (denominado "wpa_passphrase") que posee en su interior el nombre de la red WiFi (SSID) y contraseña asociada.

Para generar el archivo de configuración podemos usar el siguiente comando en Stage2:

wpa_passphrase "SSID" "CONTRASEÑA" | sudo tee /etc/nixos/wpa_supplicant.conf

Recuerda indicar correctamente el nombre de tu señal (SSID) y la contraseña.

El archivo generado sera guardado en /etc/nixos/wpa_supplicant.conf. Este archivo de configuración lo vamos a necesitar en Stage1. Así que usaremos secrets para crear una "copia" que si este disponible en el ram disk del boot (esto ya lo vimos en la Parte 1 de este articulo). Para esto, añadiremos el fichero /etc/nixos/wpa_supplicant.conf a la lista de secrets de /etc/nixos/hardware-configuration.nix:

...
secrets = {
  ...
  "/etc/nixos/wpa_supplicant.conf" = "/etc/nixos/wpa_supplicant.conf";
};
...

En hardware-configuration.nix aprovecharemos de añadir el wpa_supplicant paquete a initrdBin para que pueda ser usado en Stage1. Este paquete es el responsable de hacer que el archivo de configuración, que hemos generado, pueda ser usado como parte del proceso de selección y autorización de una red WiFi:

boot.initrd.systemd.initrdBin = [ pkgs.wpa_supplicant … ];

Por ultimo, también añadiremos en hardware-configuration.nix 4 módulos a availableKernelModules necesarios para que Stage1 puede ser capaz de manejar las redes WiFi y entender sus protocolos de seguridad:

boot.initrd.availableKernelModules = ["ccm" "ctr" "iwlmvm" "iwlwifi" … ];

Con todos los cambios guardados ahora nos toca crear la nueva generación de NixOS y reiniciar el sistema.

3.3) Conectándonos a una red inalámbrica usando supplicant en Stage1

Finalmente vamos a conectarnos! Entraremos por SSH al Stage1 de NixOS y luego vamos a ejecutar este comando:

wpa_supplicant -i wlp0s11u1 -c /etc/nixos/wpa_supplicant.conf -B

Recuerda usar el nombre de tu interfaz

Si todo va bien, esto iniciara un proceso en background que usara la interfaz inalámbrica indicada en -i para enlazarnos a la red WiFi especificada por el archivo wpa_supplicant.conf.

Luego de esperar unos segundos podemos comprobar la conexión usando estos comandos:

  • ip link Se debería ver la interfaz inalámbrica "UP".
  • iw dev Deberíamos ver una serie de información que indica el estado de la conexión WiFi.
  • iw dev NOMBRE_INTERFAZ_WIFI link Deberíamos ver un mensaje donde se confirma que existe conectividad WiFi.
  • ip addr Tendríamos que ver la IP que ha sido asignada a la interfaz gracias a DHCP.

Conexión manual a WiFi en Stage1

Si todo va bien ya tenemos WiFi en nuestra Stage1.

Por ultimo, si deseamos, podemos desactivar DHCP y asignar de manera estática los parámetros de IP (address), Gateway y DNS a nuestra interfaz. Esto se puede realizar de la misma manera en la cual lo logramos en la Parte 1 de este articulo con la interfaz Ethernet. Para esto modificamos en /etc/nixos/hardware-configuration.nix algunas cosas:

...
wlp0s11u1 = {
  enable = true;
  name = "wlp0s11u1";
  #DHCP = "yes"; #Comentamos para desactivar DHCP
  #Añadimos los parámetros de forma manual
  address = [ "192.168.4.151/24" ];
  gateway = [ "192.168.4.1" ];
  dns = [ "8.8.8.8" ]; 
};
...

Para saber que address y gateway digitar, podemos usar los comandos ip route y ip link para averiguar cual IP y Gateway son los que usa nuestro sistema de forma automática. Luego copiamos esos valores. Recuerda usar el nombre de tu interfaz inalámbrica.

Con esto sera mas fácil usar SSH, ya que nos aseguramos de tener siempre la misma IP.

4) Automatizar el proceso de conexión a WiFi en Stage1 y probar el acceso remoto usando SSH

En esta etapa final buscamos crear un script que realice el proceso de conexión a la red WiFi durante Stage1 de manera automática.

Para esto añadiremos el siguiente script a /etc/nixos/hardware-configuration.nix:

...
services = {
  ...
  ConnectWifi = {
    enable = true;
    wants = [ "systemd-udev-settle.service" "network.target" "initrd-nixos-copy-secrets.service" ];
    after = [ "systemd-udev-settle.service" "network.target" "initrd-nixos-copy-secrets.service" ];
    before = [ "systemd-ask-password-console.service" ];
    wantedBy = [ "systemd-ask-password-console.service" ];
    unitConfig = {
      Description = "ConnectWifi";
      DefaultDependencies = false;
   };
   serviceConfig = {
     Type = "forking";
     ExecStart="${pkgs.bash}/bin/sh -c 'wpa_supplicant -i wlp0s11u1 -c /etc/nixos/wpa_supplicant.conf -B || true'";
   };
 };
...
};
...

Recuerda cambiar en -i el nombre de la interfaz inalámbrica a la tuya.

Nota 1: Este script se va a ejecutar luego que el hardware (systemd-udev-settle.service), secretos (initrd-nixos-copy-secrets.service) y base de sistema de red (network.target) estén disponibles. Y antes de que LUKS pida la clave (systemd-ask-password-console.service). O sea, antes de Stage2.

Nota 1.1: En caso que tu sistema no use LUKS, seguramente deberás cambiar systemd-ask-password-console.service por sysroot.mount (o otra definición de systemd que se ajuste a tu necesidad).

Nota 2: El script corre en modo forking y con wpa_supplicant en background (-B) para no interrumpir otros procesos de Stage1. El || true se usa para evitar que systemd piense que wpa_supplicant "falló" mientras realiza re-intentos para lograr conectividad WiFi (algo normal en el protocolo de conexión WiFi).

Luego que generemos la nueva generación de NixOS y reiniciemos el sistema, podemos volver a confirmar que la conexión WiFi está bien usando SSH. De hecho, podemos conectarnos por SSH directamente usando la IP que hemos fijado al adaptador inalámbrico.

SSH por WiFi en Stage1 !!!

Conexión automática a WiFi en Stage1

Si deseamos, podemos desactivar la interfaz Ethernet y solo usar WiFi. También puede ser buen momento para remover herramientas que solo utilizamos durante el proceso de configuración tales como: iw, wirelesstools, pciutils y usbutils. Un sudo nix-collect-garbage -d también puede ser útil para limpiar nuestro cache.

Finalmente un recordatorio: Solo usar SSH en Stage1 a modo de debugger... no es muy recomendado tener SSH en dicha etapa del boot.

Conclusión

Espero que este articulo de dos partes fuera de su utilidad para lograr tener Red y SSH en Stage1 de NixOS

Nuevamente quiero agradecer al blog de Spencer Balogh por su guiá indispensable en comprender como funciona el networking de Stage1.

Otras fuentes de información que he usado:

Como comente en un inicio, esta guiá nace como un pre-requisito para la implementación de un sistema de desbloquear remoto y seguro de particiones LUKS durante el proceso de boot.

Salu2 :)