Los sistemas embebidos gozan últimamente de un renovado éxito en su uso para monitorización de sensores y control de dispositivos electrónicos gracias al importante tirón que han dado al mercado los nuevos SBC que, liderados por las placas Raspberry Pi, definen un nuevo estilo de sistema de desarrollo para control y monitorización aportando prestaciones capaces de satisfacer tareas exigentes que le otorgan versatilidad para actuar tanto como de pequeños servidores como de terminales gráficos de alta resolución consiguiendo precios muy contenidos.
Además de la libertad que garantiza, el sistema operativo más flexible para trabajar con la amplia gama de recursos que aportan estos dispositivos es GNU/Linux que, gracias a las diferentes distribuciones disponibles, es además muy fácil de instalar y configurar en contextos muy diversos.

Contenidos
- Obtener una imagen con la distribución GNU/Linux
- Grabar la imagen de la distribución GNU/Linux en un soporte físico
- Definir los usuarios con acceso al sistema operativo
- Actualizar el sistema operativo
- Instalar el entorno gráfico en el sistema operativo
- Configurar el idioma del sistema operativo
- Preparar los drivers del núcleo
-
- Instalar herramientas auxiliares de gestión del hardware
- Buscar los drivers del núcleo disponibles en el sistema
- Cargar los drivers
- Configurar los drivers
- Asignar permisos para acceder al hardware usando los drivers del núcleo
-
- Identificar los dispositivos a los que afectan las reglas udev
- Asignar permisos en las reglas udev
- Operadores en las reglas udev
- Establecer el nombre del dispositivo
- Ejecutar programas al asignar dispositivos
- Probar el funcionamiento de las reglas
- Activar las nuevas reglas sin reiniciar el sistema
- Reglas udev habituales para acceder al hardware en un SBC
-
-
- Establecer una dirección IP fija
- Establecer el nombre del sistema
Obtener una imagen con la distribución GNU/Linux
Los SBC basados en CPU con arquitectura ARM, como Raspberry Pi, pueden ejecutar multitud de distribuciones Linux (la Embedded Linux Wiki tiene referencias a muchas de ellas). Algunas de estas distribuciones están específicamente diseñadas para un modelo, como Raspbian, otras son más genéricas y funcionan en multitud de placas, como Armbian. Muchas de las distribuciones incluyen un entorno de escritorio completo pero hay otras con un sistema mínimo, como ocurre con DietPi, que deberá completarse después con el software que la aplicación requiera.

La elección de la distribución Linux incluye un cierto componente subjetivo pero, para poder desarrollar aplicaciones de monitorización y control electrónico, especialmente si se trabaja a un nivel alto, utilizando librerías como WiringPi o Hardware I/O para Processing, la distribución Linux debe hacer posible la carga de los drivers para el núcleo del hardware que se va a controlar (I2C, SPI, GPIO…).
Puesto que una de las características más significativas de los nuevos SBC con respecto a los clásicos sistemas empotrados es la presencia de potentes sistemas gráficos, seguramente también será un factor importante, a la hora de elegir la distribución Linux, la posibilidad de instalar un sistema de ventanas (como X Window System o hasta puede que un entorno de escritorio completo.
La distribución que más utilizo, y que tomo como referencia para los ejemplos de esta guía, es Armbian, porque está basada en Debian (una de mis favoritas tanto para servidores como para escritorio) y porque está disponible para multitud de placas diferentes. Además, permite instalar solo lo necesario sobre un sistema mínimo bastante reducido sobre el que instalar posteriormente los componentes que procedan.
Grabar la imagen de la distribución GNU/Linux en un soporte físico
Una vez descargada la imagen del sistema que corresponda con la placa en la que se va a instalar, se debe grabar en una tarjeta MicroSD (lo más habitual) o en una eMMC (en general, más rápida). Para hacerlo, primero debe descomprimirse con 7-Zip el documento que se ha descargado y luego utilizar algún software específico Armbian, por ejemplo, recomienda Etcher.

Para saber el nombre que el sistema le ha dado al dispositivo destino se puede usar lsblk, que muestra una lista con los diferentes dispositivos de almacenamiento (de bloques) y sus particiones.
Desde el sistema operativo GNU/Linux puede grabarse la imagen usando la herramienta dd con el formato:
dd if="/ruta/imagen.iso" of="/dev/sdx" bs=16M && sync
El parámetro if espera el nombre de la imagen y su ubicación, el parámetro of el dispositivo destino y con la opción bs se establece el tamaño del bloque que se lee del origen y se graba en el destino. La orden sync se utiliza después de terminar dd para asegurar que el contenido se ha grabado, vaciando el buffer correspondiente si fuera necesario.
En la siguiente captura de pantalla se muestran los pasos seguidos para instalar Armbian en una placa Orange Pi Zero usando una tarjeta MicroSD.

Expandir el tamaño de la imagen para usar toda la capacidad del soporte
La mayoría de las distribuciones para SBC agrandarán en el primer arranque el tamaño de la partición que se crea al grabar la imagen sobre el soporte correspondiente (un tarjeta MicroSD, por ejemplo) o incluirán utilidades para hacerlo posteriormente. De ser así, lo más recomendable es utilizar el método implementado por la propia distribución, en caso contrario se puede utilizar alguna herramienta de gestión de particiones de disco (de dispositivos de almacenamiento) para hacerlo.
La distribución Raspbian, por ejemplo, aunque redimensiona en el primer arranque la partición principal del sistema, también incluye las utilidades raspi-config, para la consola, o rc_gui (a la que se llega con la entrada de configuración de Raspberry Pi en las preferencias del menú principal) para el entorno gráfico. En ellas, la primera opción permite redimensionar la partición principal.


Si la distribución para el SBC no gestiona automáticamente el tamaño de las particiones o no incluye utilidades para hacerlo, se puede resolver desde el propio sistema en el que se ha grabado la imagen en la tarjeta de memoria SD. Por ejemplo, en un sistema GNU/Linux basado en Debian se puede instalar GNOME Partition Editor (gparted) con la orden sudo apt-get install gparted y redimensionar la partición lanzando la herramienta y realizando las operaciones: ① seleccionar la tarjeta de memoria SD, ② elegir la partición, ③ usar la opción redimensionar o mover y ④ aplicar los cambios elegidos. Si la tarjeta estuviera montada (aparecerá el icono con la llave para indicarlo) antes de cambiar el tamaño de la partición será necesario desmontarla seleccionándola y pulsando sobre la opción correspondiente; como es lógico, no podrá estar en uso durante el proceso.




Definir los usuarios con acceso al sistema operativo
A diferencia de las diseñadas para escritorios convencionales, las distribuciones Linux para SBC basados en arquitectura ARM suelen optar, bien por crear usuarios por defecto o bien por crearlos al arrancar la primera sesión mostrando un diálogo que pregunta los datos necesarios.
Siguiendo el ejemplo de instalación de Armbian, la imagen incluye al superusuario (root) con una clave sencilla (1234) y al arrancar por primera vez, además de realizar algunos ajustes en el soporte (la MicroSD, por ejemplo) pide una nueva clave para el superusuario (el administrador del sistema) y los datos para crear el usuario principal.

Añadir nuevos usuarios al sistema
Para añadir nuevos usuarios al sistema se puede utilizar la orden useradd, que necesita privilegios administrativos, indicando el nombre del usuario. Aunque dependerá del tipo de acceso que vaya a tener el usuario, lo habitual es crear una carpeta para su uso personal con la opción -m y asignarle un intérprete de órdenes con la opción -s y la ruta hasta el intérprete.
useradd kirchhoff -m -s /bin/bash
Con la orden anterior se creará el usuario kirchhoff y una carpeta /home/kirchhoff como su carpeta personal. También se creará el grupo kirchhoff y se establecerá como su grupo principal. Para utilizar una carpeta diferente se puede indicar su ruta con la opción -d y para utilizar otro grupo como grupo principal se utiliza la opción -g seguida del nombre del grupo. Este grupo debe existir antes de utilizarlo en la orden useradd.
Suponiendo que ya se ha creado el grupo electronicos, la siguiente orden creará al usuario gustav, le asignará este grupo como el principal, creará la carpeta /home/electronica y la asignará como su ubicación de almacenamiento personal. Como en el ejemplo anterior, el intérprete de órdenes por defecto del usuario será /bin/bash
useradd gustav -s /bin/bash -m -d /home/electronica -g electronicos
La forma habitual de dar acceso al hardware a un usuario es haciéndole pertenecer a determinados grupos de tipo administrativo, y es a estos grupos a los que se les asigna los permisos de acceso al hardware del SBC. Para asignar estos grupos directamente al crear el usuario se puede utilizar la opción -G seguida de una lista de grupos que se define separándolos por comas y sin usar espacios. Como en el caso anterior, los grupos deben existir para poder asignarlos al usuario.
useradd kirchhoff -m -s /bin/bash -G dialout,gpio,plugdev,netdev,bluetooth
Asignar contraseñas a los usuarios
Una vez creado el usuario, es importante definir para él una clave de acceso al sistema, para asignar esta clave se puede utilizar la orden passwd seguida del nombre del usuario. Igual que ocurre con la creación del usuario, passwd necesita ejecutarse con privilegios administrativos. Por seguridad, la clave se pregunta dos veces y no se muestra en la consola.
passwd kirchhoff
Para cambiar la contraseña del usuario de la sesión actual se puede utilizar passwd sin argumentos. Salvo que la sesión actual fuera del superusuario, passwd pedirá primero la clave actual, por seguridad, y luego la nueva, que habrá que repetirla para garantizar que se ha escrito correctamente.
En los sistemas que utilizan un usuario predeterminado, como es el caso del usuario pi en Raspbian, especialmente cuando se habilita el acceso remoto, es crítico cambiar la contraseña para evitar que el SBC termine formando parte de una botnet. Además del método expuesto, es normal encontrar en esos casos alguna herramienta de configuración que permita, entre otras cosas, cambiar la clave. En el caso de Raspbian, las utilidades de configuración raspi-config, para la consola, o rc_gui para el entorno gráfico, sirven a este fin.

Modificar los datos de los usuarios
También es posible modificar posteriormente los datos de los usuarios con la orden usermod usando el formato usermod opciones usuario, que admite, entre otras, las opciones:
-
-lcambia el nombre del usuario sustituyéndolo por el que se indique en la opción-dsirve para cambiar la carpeta personal a la que se indique en la opción-mpermite mover los datos de la carpeta actual a la nueva-gestablece un nuevo grupo principal, cuyo nombre debe indicarse en la opción y debe existir-Gañade o elimina al usuario de los grupos que se indiquen, separados por comas si son varios-amodifica el comportamiento de la anterior para añadir solamente-sestablece un nuevo intérprete de órdenes cuya ruta debe indicarse con la opción
Eliminar usuarios del sistema
Para eliminar los usuarios se utiliza la orden userdel que permite, además, borrar automáticamente su carpeta personal si se añade la opción -r.
userdel -r kirchhoffborrará el usuario kirchhoff y su carpeta personal.
Crear grupos de usuarios
Para crear grupos de usuarios se utiliza la orden groupadd seguida del nombre del nuevo grupo. Los grupos que ya existan se pueden cambiar de nombre con groupmod y la opción -n seguida del nuevo nombre. También es posible borrarlos con la orden groupdel seguida del nombre del grupo que se quiere eliminar del sistema operativo.
groupadd i2ccrea un nuevo grupo con nombre i2cgroupmod -n i2c-admin i2ccambia de nombre el grupo i2c y lo llama i2c-admingroupdel i2c-adminborra el grupo i2c-admin
Asignar usuarios a los grupos
Además de asignar los grupos al crear el usuario con useradd o modificándolo con usermod, es posible hacerlo con la orden adduser que espera como argumentos el nombre del usuario y el nombre del grupo al que se añade el usuario.
adduser kirchhoff spiañade el usuario kirchhoff al grupo spi
Usuarios con privilegios administrativos
Como el usuario que está activo en esta sesión es root, se pueden realizar sin más todas estas operaciones, que necesitan permisos de administración. Posteriormente, en las siguientes sesiones, es conveniente acceder con el usuario que corresponda, no como root. Si fuera necesario realizar tareas administrativas, se puede trabajar con el usuario principal (el que se ha creado al modificar la clave del superusuario) y utilizar sudo delante de las órdenes; el sistema pedirá la clave de este usuario, que se ha definido con privilegios para poder realizar estas tareas. Para añadir un usuario al grupo de administradores (sudoers, los que pueden utilizar sudo) se puede utilizar la orden:
adduser kirchhoff sudo
Para saber los grupos a los que pertenece el usuario actual puede utilizarse la orden groups. Esta orden puede usarse con privilegios administrativos para conocer los grupos de cualquier usuario añadiendo el nombre como argumento.

Actualizar el sistema operativo
Una vez modificada la clave por defecto del usuario root y definido el usuario principal, lo recomendable es actualizar la instalación a la última versión usando la secuencia de órdenes:
apt-get updatepara actualizar la lista de componentes y de sus versionesapt-get upgradepara instalar las actualizaciones disponibles
Estas operaciones también requieren privilegios administrativos, si se ejecutan en la primera sesión, en la que el usuario es es root, pueden invocarse sin más pero, si se ha iniciado ya sesión con un usuario convencional, como se decía en el apartado anterior, será necesario anteponer sudo para lo que el usuario debe pertenecer al grupo correspondiente.
sudo apt-get updatesudo apt-get upgrade
Instalar el entorno gráfico en el sistema operativo
Aunque algunas distribuciones para Raspberry Pi, como ocurre, por ejemplo, con Raspbian, incluyen opcionalmente un entorno de escritorio completo, en instalaciones de distribuciones Linux ligeras, que suele ser lo habitual para SBC, suele omitirse incluso el sistema de ventanas.
Una forma muy económica, en lo que se refiere a recursos del SBC, y muy sencilla de instalar los componentes más básicos para obtener salida gráfica es por medio del metapaquete xorg, que añadirá las dependencias necesarias para instalar en distribuciones Linux basadas en Debian, como Armbian, el sistema de ventanas X.org (X Window System).
sudo apt-get install xorg
Utilizar este metapaquete tiene la ventaja de ser trivial en su instalación y, aunque no sea estrictamente la fórmula más ligera, permitirá trabajar con GUI en aplicaciones para control electrónico y presentación de datos monitorizados por el SBC.
Posteriormente se podrán ir instalando en el sistema las herramientas (gráficas) que vayan haciendo falta para usos específicos, de forma que el sistema contenga solo los complementos que sean necesarios y se mantenga ligero.
Los entornos de escritorio que suelen utilizarse en los SBC, parece lógico, suelen ser los que requieren pocos recursos, típicamente Xfce o, más frecuentemente, LXDE. Estos entornos de escritorio se pueden instalar sobre el sistema con las órdenes:
Igual que en el caso de xorg, xfce y lxde son metapaquetes que se encargan de aportar todos los componentes necesarios para que se instale el entorno de escritorio correspondiente vía dependencias.
Como alternativa a disponer de una versión (imagen) del sistema con un entorno gráfico pre-instalado, en algunas distribuciones se incluyen herramientas específicas para añadirlo posteriormente. El caso de DietPi es especialmente interesante: en su herramienta de instalación de software dietpi-software incluye un completo catálogo que permite instalar aplicaciones especialmente optimizadas para los recursos del SBC. Con esta aplicación de DietPi es posible instalar un entorno gráfico de una forma muy sencilla y con excelente rendimiento en el SBC.


Configurar el idioma del sistema operativo
En las instalaciones de las distribuciones GNU/Linux para sistemas de escritorio más convencionales suele estar incluida la configuración del idioma. Como la instalación para un SBC, como las placas Raspberry Pi, suele hacerse copiando en un soporte, como una tarjeta MicroSD, una imagen ya preparada, es probable que sea necesario realizar la configuración del idioma posteriormente, ya sea editando un documento de configuración genérica, con una aplicación específica o con los recursos habituales del sistema, como es el caso de Armbian, la distribución GNU/Linux que se está tomando como referencia en este texto.
En los sistemas basados en Debian, como Armbian, la configuración del idioma se puede establecer con un diálogo que se muestra en la consola con la orden:
sudo dpkg-reconfigure locales
En primer lugar se seleccionan los idiomas que se desean agregar. Para hacerlo, se desplaza la lista con las flechas del cursor y se marcan los que corresponda pulsando la barra espaciadora cuando estén seleccionados. En la captura de pantalla de la imagen de abajo se ha elegido el idioma español (es) de España (ES) con el formato UTF-8: es_ES.UTF8.

Con la tecla de tabulación se puede saltar de la lista de idiomas a las entradas OK o Cancel para aceptar o cancelar, respectivamente, la selección realizada.
Después de haber elegido los idiomas que se desea que estén disponibles en el sistema, se debe seleccionar el idioma por defecto, como se muestra en la captura de pantalla de la imagen de ejemplo de abajo.

Normalmente, sudo dpkg-reconfigure locales es suficiente para completar la asignación del idioma. Para confirmar que la configuración es correcta, se puede utilizar la orden locale, con la que se muestran las asignaciones. Si alguna no fuera correcta, siguiendo con Debian y Armbian como referencia, se puede editar el documento /etc/default/locale (con privilegios administrativos) y cambiar manualmente las asignaciones incorrectas.

Una vez corregida la asignación, suponiendo que haya sido necesario, se genera la localización con los idiomas correspondientes, que estará disponible en la próxima sesión, utilizando la orden:
sudo locale-gen "es_ES" "es_ES.UTF-8"
Configuración del idioma del teclado
En las distribuciones GNU/Linux basadas en Debian la configuración por defecto del teclado se almacena en el documento /etc/default/keyboard con un formato similar al siguiente ejemplo:
|
1 2 3 4 5 |
XKBMODEL="pc105" XKBLAYOUT="es" XKBVARIANT="" XKBOPTIONS="" BACKSPACE="guess" |
Los diferentes valores de cada variable y la explicación de su funcionamiento se pueden encontrar en el documento /usr/share/X11/xkb/rules/base.lst separados por secciones. El nombre de cada sección corresponde (más o menos) con el da la variable del documento de configuración sin el prefijo XKB, por ejemplo, los valores para XKBMODEL están en la sección model y los de XKBLAYOUT en la sección llamada layout. El valor de BACKSPACE se utiliza para determinar cómo se interpreta la tecla de borrar y suprimir. Usando BACKSPACE=»guess» se toma la información del sistema para establecer el comportamiento, lo más recomendable. Los otros valores posibles son del (suprimir) y bs (borrar o retroceder, por backspace).
Normalmente, en una distribución basada en Debian, para configurar, desde una consola local (no en una sesión remota con un cliente SSH), el teclado por defecto del sistema también se pueden seguir los distintos diálogos de sudo dpkg-reconfigure keyboard-configuration:






Configurar la consola del sistema
De forma similar, con la orden sudo dpkg-reconfigure console-setup se puede configurar la consola del sistema respondiendo a una cadena de menús en los que elegir ① la codificación de caracteres, ② el conjunto de caracteres, ③ el tipo de letra y ④ el tamaño de la tipografía.




Utilidades de configuración regional específicas de algunas distribuciones Linux
En algunas distribuciones para SBC, las tareas más habituales, la elección de idioma y el teclado, en este caso, cuentan con utilidades para simplificar el proceso. Por ejemplo, la distribución DietPi, también basada en Debian, como Armbian, además de una clara vocación por optimizar los recursos del SBC, incluye una completa aplicación de desarrollo propio, dietpi-config, para simplificar la configuración del sistema.


En el caso de Raspbian, sus utilidades raspi-config y rc_gui permiten cambiar el idioma y los otros aspectos regionales de configuración del sistema, incluyendo el teclado.


Preparar los drivers del núcleo
Para usar un SBC en monitorización y control de dispositivos es necesario disponer de acceso al hardware y el acceso al hardware en un sistema mínimamente complejo y especialmente cuando se desarrolla a alto nivel, se hace por medio de los drivers. Para poder utilizarlos, es necesario ① identificar los drivers del núcleo asociados al hardware que se va a controlar (I2C, SPI, GPIO…), ② cargar los módulos, para lo que puede ser necesario también sacarlos de la «lista negra» que impide que se produzca esta carga, ③ configurar los drivers con el funcionamiento deseado y ④ asignar permisos, a los usuarios que corresponda, para que tengan acceso a los drivers y por medio de ellos al hardware.
Instalar herramientas auxiliares de gestión del hardware
Existen herramientas para el sistema que están orientadas a la gestión de algunos de los recursos hardware y que pueden ayudar en los trabajos que muchas veces acompañan al desarrollo de aplicaciones de monitorización y control. Además, estas herramientas suelen resolver automáticamente algunas de las tareas de preparación de drivers descritas en el párrafo anterior, por lo que, opcionalmente, puede resultar útil instalarlas inicialmente.
Un ejemplo representativo de este tipo de programas, y una de las herramientas más usadas cuando se desarrollan aplicaciones de control de hardware, es el juego de utilidades para las comunicaciones I2C «I2C-Tools», originalmente parte del proyecto LM-Sensors (Linux Monitoring Sensors). Mientras que I2C-Tools se usa más en SBC que en sistemas de escritorio, las otras utilidades de LM-Sensors, que incluyen recursos para monitorizar y controlar el propio sistema, suelen utilizarse menos, en favor de herramientas específicas como vcgencmd en Raspbian o, en otras distribuciones para SBC, RPi-Monitor de Xavier Berger, por ejemplo.
Para instalar I2C-Tools en distribuciones Linux basadas en Debian como Raspbian, que se usa como ejemplo en este texto, se puede utilizar la orden:
sudo apt-get install i2c-tools
Además de instalar las utilidades i2cdetect, i2cget e i2cset, la orden anterior creará el grupo i2c y asignará acceso de lectura y escritura a los dispositivos I2C del sistema.
i2cdetect tiene varios usos, por un lado permite detectar los puertos I2C que hay disponibles utilizando la opción -l. También sirve para ver las características de un puerto con la opción -F y el nombre que identifica al puerto, que puede conocerse de la información anterior. Uno de los usos más frecuentes consiste escanear un puerto para averiguar (las direcciones de) los dispositivos conectados pasando a i2cdetect el nombre del puerto que se escanea.
Con i2cget se puede leer un registro de un puerto I2C pasándole como argumentos el nombre del puerto, la dirección del dispositivo en el bus I2C y la dirección del registro en el dispositivo.
De la misma forma, i2cset permite almacenar un valor en un registro. En este caso, a las opciones descritas arriba, hay que añadir el valor que se almacena en el registro del dispositivo I2C.
Todas estas utilidades funcionan en modo interactivo: avisan de las operaciones que van a realizarse, advierten de los riesgos y esperan confirmación para ejecutarlas. Para que funcionen sin esperar confirmación, en todas ellas se puede utilizar la opción -y que omite este modo interactivo.

En la captura de pantalla del ejemplo anterior se puede ver cómo se han escaneado los puertos I2C de una placa ODROID C1 y se han encontrado cuatro disponibles. Luego se han visualizado las características del primero y se han escaneado los dispositivos conectados para detectar uno en la dirección 0x27 (un PCF8574) y otro en la dirección 0x48 (un PCF8591). Para terminar, con la orden i2cget se ha leído el registro de la dirección 0x00 dispositivo de la dirección 0x48 del primer puerto I2C.
Buscar los drivers del núcleo disponibles en el sistema
Si el sistema y el hardware están bien documentados se sabrá por adelantado qué módulos para el núcleo es necesario cargar para usarlos al elaborar un programa que acceda al hardware. Por desgracia no suele ser así y muchas veces es necesario determinar «manualmente» los drivers para cargarlos.
Los drivers se almacenan en una carpeta llamada kernel dentro de una carpeta cuyo nombre corresponde a la versión del núcleo que está funcionando (puede haber varios instalados) y ésta a su vez se encuentra dentro de la ruta /lib/modules. Con la orden uname -r se puede conocer la versión y componer el nombre completo de la carpeta que contiene los drivers para «recorrerla» viendo su contenido con la orden ls de forma recursiva utilizando la opción -R. Seguramente esto mostrará un buen número de carpetas y documentos, por lo que conviene filtrarlos con grep usando una parte representativa del nombre del driver buscado. Por ejemplo, para buscar los drivers relacionados con las comunicaciones I2C podría usarse la orden:
ls /lib/modules/$(uname -r)/kernel -R | grep i2c
Ejecutando esta orden en una placa Orange Pi Zero corriendo Armbian, como se muestra en la captura de pantalla de abajo, es fácil darse cuenta de que el driver buscado es i2c-algo-bit, ya que el resto de alternativas parecen ser multiplexores.

En el ejemplo de la captura de pantalla de abajo, en el que se muestra la salida de consola de una placa ODROID C1 ejecutando Armbian, también resulta sencillo determinar que el driver adecuado es aml_i2c, ya que el resto son drivers para el decodificador de audio y vídeo CX25840.

Si el nombre no es lo bastante representativo para como para elegir el driver I2C, o para descartar los que no lo son, se puede utilizar modinfo, que necesita privilegios administrativos, para obtener más información de cada módulo. Para obtener solo la descripción se puede utilizar la opción -d.

Aunque lo más habitual será buscar información de unos pocos módulos, este proceso se puede extender a todos los que sea necesario (en principio los destinados a un tipo de hardware) utilizando la orden find y ejecutando con -exec la orden modinfo. Para identificar más fácilmente cada módulo, se puede incluir también una orden ls y un separador con printf "\n".
find /lib/modules/$(uname -r)/kernel -name "*i2c*.ko" \
-exec ls {} \; \
-exec sudo modinfo -d {} \; \
-exec printf "\n" \;

Si la información que muestra modinfo tampoco es suficiente, no queda más remedio que iniciar un proceso de ensayo y error con todos los drivers encontrados, comprobando si al cargarlos, como se explica en el siguiente apartado, se tiene acceso, o no, al hardware que se pretende controlar, las comunicaciones I2C en el ejemplo.
Cargar los drivers
En condiciones normales, el núcleo cargará en el arranque los driver del hardware detectado. En una distribución Linux basada en Debian, como es el caso de Armbian, para cargar expresamente un driver puede incluirse su nombre en la lista de /etc/modules-load.d/modules.conf pero antes es conveniente asegurarse de que funciona correctamente.
En primer lugar, puede ser que la distribución Linux haya incluido intencionadamente el driver en la lista negra para que no se cargue. En algunas ocasiones puede ser porque considere que no se va a utilizar y en otros por problemas de funcionamiento conocidos.
No existe un archivo de configuración específico con la lista negra sino que en la carpeta /etc/modprobe.d se pueden almacenar documentos (cuyo nombre suele incluir la palabra blacklist) en los que el se incluye el nombre del módulo, cuya carga se quiere impedir, precedido de la palabra clave blacklist, como puede verse en la captura de pantalla de ejemplo de abajo.

Como es lógico, este método para «desactivar» drivers no funciona con los que están incluidos (compilados) en el núcleo, solamente con los que se cargan por separado.
Para cargar los módulos al arranque basta con incluir su nombre en un documento dentro de la carpeta /etc/modules-load.d. El documento suele llamarse modules.conf y suele ser un enlace al documento /etc/modules para que sea compatible entre sistemas con SysV y sistemas con systemd.

Antes de optar por incluir un módulo en la lista de carga automática al inicio, ya sea en /etc/modules o en /etc/modules-load.d/modules.conf, es una buena idea comprobar que el driver funciona correctamente cargándolo con modprobe.
Aunque utilizando las opciones de información de la orden modprobe (como -v, -vv o -vvv) se puede tener una idea de si ha funcionado o se ha producido algún error, para obtener más datos se puede consultar el log del núcleo con dmesg y mostrar con lsmod los drivers cargados. En ambos casos, filtrar con grep, permitirá extraer solo la información relativa a cierto grupo de drivers.
En el ejemplo de la captura de pantalla de abajo se utiliza una placa ODROID C1 ejecutando una distribución Linux Armbian en la que se quiere utilizar un puerto SPI. En primer lugar se buscan los drivers usando el método explicado más arriba; una vez identificados se verifica que no se han cargado; posteriormente se cargan con modprobe (solo es necesario cargar expresamente spicc, que cargará spidev aunque no sería ningún problema cargar ambos) y por último se verifica, usando otra vez con lsmod, si ya se han cargado correctamente.

El siguiente documento de configuración (/etc/modules) muestra un ejemplo de configuración de los módulos que podrían cargarse en un SBC Orange Pi Zero para acceder al hardware desde aplicaciones de monitorización o control electrónico de dispositivos.
|
1 2 3 4 5 6 7 8 9 10 |
i2c-algo-bit spidev spicc gpio-sunxi w1-sunxi w1-gpio w1-therm sunxi-cir xradio-wlan xradio-wlan |
Configurar los drivers
Como se ha explicado antes, con la orden modinfo se puede obtener información sobre un driver del núcleo. Para que se muestren solamente las opciones de configuración que acepta el módulo se utiliza -p (parámetros del módulo). En el ejemplo del apartado anterior podrían consultarse los parámetros con la orden sudo modinfo spidev -p que informaría de que existe el parámetro bufsiz para establecer el tamaño máximo del mensaje en las comunicaciones SPI.
Al cargar con modprobe un driver se pueden incluir las opciones de configuración con el formato opción=valor. Con la orden sudo modprobe spidev bufsiz=128 se podría cargar el módulo spidev del ejemplo anterior con la opción bufsiz que se ha encontrado con modinfo.
Igual que ocurre con la lista negra de drivers, tampoco existe un documento especifico para almacenar la configuración, en su lugar, se crean documentos dentro de la carpeta /etc/modprobe.d en los que se configura un driver escribiendo la palabra clave options seguida del nombre del módulo y las diferentes opciones en el formato opción=valor y separadas por espacios si se utilizan varias.

Asignar permisos para acceder al hardware usando los drivers del núcleo
En principio, los dispositivos del sistema, tal como aparecen, por ejemplo, en /dev tienen como propietario y grupo al superusuario, root, y permisos de acceso (al menos, de escritura) solo para el propietario. Para que otros usuarios puedan acceder a un dispositivo, lo habitual es sustituir el grupo del dispositivo por uno específico, al que se le asignarán los permisos de acceso correspondientes, y hacer que los usuarios que deban tener acceso pertenezcan a ese mismo grupo.
Para que la asignación del grupo de los dispositivos se realice automáticamente, cada vez que el driver se cargue, dicha asignación se puede incluir en reglas de udev.
Las reglas de udev se definen en documentos en la carpeta /etc/udev/rules.d en los que se indica el evento a que atiende la regla, las características del dispositivo y las acciones que deben realizarse cuando se produce el evento.
Identificar los dispositivos a los que afectan las reglas udev
Para definir el evento se utilizan palabras clave que representan el tipo y el identificador al que se atiende. Por ejemplo, KERNEL=="ttyS0" se verifica cuando en el núcleo (kernel) se prepare el puerto serie ttyS0. Para hacer referencia a varios puertos serie en la misma regla, en general, identificadores que hagan referencia a varios valores (nombres), se pueden utilizar expresiones del tipo ttyS[01] para los puertos cero y uno (cualquier carácter entre los corchetes), ttyS* para cualquiera de cualquier longitud, ttyS? para cualquiera con un carácter de longitud, incluir %n para hacer referencia al número asignado por el kernel (núcleo) (como 1 en /dev/i2c-1) o %k para todo el nombre que le asigne (como i2c-1 en /dev/i2c-1).
Con SUBSYSTEM se puede definir una regla para un grupo de dispositivos de la misma rama, por ejemplo SUBSYSTEM=="usb" hace referencia a cualquier dispositivo USB.
DRIVER hace referencia al módulo (driver) que controla cierto dispositivo y tendrá efecto en su carga. Por ejemplo DRIVER=="spicc" atendería a la carga del driver para las comunicaciones SPI de los ejemplos del apartado anterior.
Con ATTRS se puede definir un dispositivo o un grupo de dispositivos en función de una serie de características (atributos) que los describen. Por ejemplo, ATTRS{idVendor}=="067B" hace referencia a los conocidos adaptadores USB UART de Prolific Technology
Para saber las características de un dispositivo y decidir qué reglas lo definen se puede utilizar la orden udevadm (con privilegios administrativos) con la opción info para que muestre los datos, --name (abreviada -n) para especificar el nombre del dispositivo tal como aparece en la carpeta /dev y --attribute-walk (abreviada -a) para recorrer toda la cadena de conexiones del dispositivo. Por ejemplo, para saber las características del puerto I2C /dev/i2c-0 se utilizaría la orden:
sudo udevadm info --attribute-walk --name=/dev/i2c-0

En el ejemplo de la captura de pantalla anterior puede verse que para identificar los puertos I2C lo más conveniente es hacer referencia usando SUBSYSTEM.
Asignar permisos en las reglas udev
Con respecto a las acciones que se llevan a cabo cuando se gestiona el evento (como cargar un driver), las más interesantes para asignar permisos de acceso al hardware son MODE, con la que definir el nivel de privilegios y GROUP, para establecer el grupo al que pertenecen los dispositivos. Por ejemplo, para que los miembros del grupo i2c tengan acceso a los puertos I2C referidos en el ejemplo anterior, podría utilizarse la regla SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660". Esta regla respeta al propietario original del dispositivo (root) y mantiene sus permisos de acceso de lectura y escritura en MODE (el primer 6) además de añadirlos al grupo (el segundo 6) sin otorgar ningún permiso al resto de usuarios del sistema (el último cero).
Aunque para la asignación de permisos a dispositivos no es habitual su uso, con OWNER también puede establecerse un propietario para el dispositivo diferente del inicial (root)
Operadores en las reglas udev
Como puede verse, los diferentes componentes de la regla se separan por comas y se distingue entre asignaciones = (un signo igual) y comparaciones positivas con == (dos signos igual) o negativas con !=. De la misma forma, cuando una asignación añade un elemento sin sustituirlo por los que pudieran existir anteriormente, se utiliza += en lugar del signo igual, al contrario, el código := permite asignar un valor impidiendo más cambios.
Establecer el nombre del dispositivo
También es posible asignar un nombre del dispositivo, usando NAME, o crear un enlace al dispositivo con SYMLINK. Esta segunda opción es más recomendable ya que respeta el nombre original, que puede ser utilizado por aplicaciones que esperen algo estándar, a la vez que permite hacer referencia también con nuevos nombres arbitrarios, más personalizados. Por ejemplo, para crear un enlace /dev/uno con permisos de lectura y escritura para el grupo arduino cuando se conectara un dispositivo USB del fabricante 2341 (Arduino) del tipo 0043 (Arduino Uno), podría añadirse la regla
SUBSYSTEM=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043",
SYMLINK+="uno", GROUP="arduino", MODE="0660"
Por cierto, como se explica en el artículo sobre la asignación de nombres fijos al puerto serie USB de Arduino, lo recomendable para estos casos es añadir también el número de serie de cada dispositivo con ATTRS{serial} y/o usar como referencia una identificación (el enlace simbólico) única.
Ejecutar programas al asignar dispositivos
Las reglas de udev permiten obtener valores como el resultado de la ejecución de un programa. El código %c se sustituirá por el valor devuelto por el programa o, si se trata de varios, puede indicarse entre llaves el número del valor (número de la palabra en el resultado) empezando desde la izquierda o entre llaves y con un signo más, para empezar a contar desde la derecha.
Para obtener el resultado de la ejecución de un programa se utiliza PROGRAM, la ruta del programa y los parámetros, que pueden usar modificadores (excepto el propio %c, ya que no se conoce al inicio). Por ejemplo, la regla SUBSYSTEM=="i2c", PROGRAM="cat /etc/hostname", SYMLINK+="%k-%c" crearía un enlace simbólico a los puertos I2C utilizando el nombre que le asigna el sistema y le añadiría un sufijo que correspondiera con el nombre del sistema (host).
Si el resultado de la ejecución de un programa no es lo importante sino la propia ejecución, puede utilizarse RUN en lugar de PROGRAM con el mismo formato pero sin obtener un valor para %c.
Probar el funcionamiento de las reglas
Una vez definidas las reglas en el documento correspondiente de la carpeta /etc/udev/rules.d se pueden probar, antes de reiniciar el sistema, utilizando udevadm test indicando el dispositivo afectado. Por ejemplo, sudo udevadm test /dev/spidev0.0 permitiría comprobar las reglas que afectan el primer puerto SPI del sistema.
Activar las nuevas reglas sin reiniciar el sistema
Una vez que se ha establecido que las reglas en /etc/udev/rules.d son correctas, se pueden utilizar sin necesidad de reiniciar el sistema, aunque la próxima vez que se reinicie funcionarán automáticamente.
La forma más drástica de recargar las reglas es reiniciar udev con sudo /etc/init.d/udev restart con lo que, lógicamente, se recargarán también todas las reglas. Para recargar todas las reglas sin necesidad de reiniciar udev se puede utilizar la orden sudo udevadm control --reload-rules.
Si solo hace falta cargar las reglas que corresponden con cierto evento, se puede forzar con sudo udevadm trigger y la definición del dispositivo. Para especificar el dispositivo se utiliza la opción --type (abreviada -t) indicando devices (un único dispositivo) o subsystems (toda la «familia» de dispositivos) y una opción que indique el valor:
--subsystem-matchlos dispositivos pertenecen al subsistema indicado--subsystem-nomatchlos dispositivos no pertenecen al subsistema indicado--attr-matchatributos de los dispositivos--attr-nomatchatributos no presentes en los dispositivos--property-matchlos dispositivos tienen la propiedad indicada--tag-matchlos dispositivos tienen la etiqueta endicada--sysname-matchdispositivos con el nombre de sistema indicado--parent-matchlos dispositivos que tengan el padre indicado
Por ejemplo, para hacer que se carguen las reglas relativas a las comunicaciones SPI de las que se ha hablado antes se podría utilizar la orden
Reglas udev habituales para acceder al hardware en un SBC
Cuando se utiliza un SBC para control de dispositivos o para monitorización de sensores se necesita disponer de acceso al hardware. Para habilitar este acceso, como se ha explicado, se asignan los permisos correspondientes a los usuarios operadores de cada recurso, normalmente organizándolos por grupos. Las reglas de udev pueden resolver el acceso al hardware asignando a los los dispositivos los grupos y el nivel de permisos necesario.
En el caso de los dispositivos más habituales, como audio o vídeo, la infraestructura de grupos y de asignación de dispositivos suele estar resuelta y lo recomendable será que el usuario que se autoriza a acceder a estos dispositivos se añada al grupo que permite su uso. Para hacerlo, puede utilizarse, por ejemplo, con la orden usermod, con el formato sudo usermod -a -G grupo usuario. Para el hardware menos común puede ser necesario crear los grupos además de asignarlos a los dispostivos con udev. Aunque no hay un estándar al respecto, para acceder al hardware suelen utilizarse los grupos:
- audio equipos de entrada y salida de sonido
- dialout dispositivos de comunicaciones serie UART y las equiparables, como los adaptadores USB
- gpio conexiones GPIO
- i2c dispositivos para comunicaciones I2C
- leds acceso a (algunos de) los indicadores LED del SBC
- spi comunicaciones SPI
- tty algunos dispositivos UART por su tipo de conexión o uso (como consolas de salida para depuración)
- video dispositivos de entrada (cámara), salida (monitor) y control (mando a distancia) de vídeo

El caso de las conexiones GPIO es un poco especial ya que cada entrada-salida se crea bajo demanda, no cuando se carga en el núcleo el driver para su gestión (gpio-sunxi, por ejemplo) así que no bastará con una regla que establezca el grupo y los permisos sino que será necesario ejecutar un programa para cambiarlo en la carpeta asociada a cada entrada-salida.
Normalmente, las carpetas del sistema utilizadas para acceder a los GPIO están en /sys/class/gpio y en /sys/devices/virtual/gpio, pero podrían variar entre sistemas y versiones. Por ejemplo, el módulo gpio-sunxi para los Allwinner utiliza carpetas en /sys/devices/platform/sunxi-pinctrl. Además de consultar la documentación correspondiente, para determinar las carpetas necesarias se pueden ir satisfaciendo los permisos que generen los intentos de usar de un recurso, comparando los de los usuarios del grupo gpio con los del superusuario, y añadiendo los datos de carpetas que resulten afectadas al documento hardware.rules.
Con los criterios anteriores, se podría grabar en la carpeta /etc/udev/rules.d un documento, por ejemplo, hardware.rules, con las siguientes reglas para acceder al hardware:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SUBSYSTEM=="i2c-dev", MODE="0660", GROUP="i2c" SUBSYSTEM=="spidev", MODE="0660", GROUP="spi" KERNEL=="ttyS*", MODE="0660", GROUP="dialout" #KERNEL=="ttySA*", MODE="0660", GROUP="dialout" KERNEL=="ttyA*", MODE="0660", GROUP="dialout" #KERNEL=="ttyAM*", MODE="0660", GROUP="dialout" #KERNEL=="ttyAMA*", MODE="0660", GROUP="dialout" #KERNEL=="ttyACM*", MODE="0660", GROUP="dialout" KERNEL=="ttyUSB*", MODE="0660", GROUP="dialout" SUBSYSTEM=="bcm2835-gpiomem", MODE="0660", GROUP="gpio" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown root:gpio /sys/class/gpio -R'" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/class/gpio -R'" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown root:gpio /sys/devices/virtual/gpio -R'" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/devices/virtual/gpio -R'" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown root:gpio /sys/devices/platform/sunxi-pinctrl -R'" SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/devices/platform/sunxi-pinctrl -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chown root:leds /sys/class/leds -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/class/leds -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chown root:leds /sys/devices/platform/soc/soc:leds/leds -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/devices/platform/soc/soc:leds/leds -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chown root:leds /sys/devices/platform/leds-gpio/leds -R'" SUBSYSTEM=="leds", PROGRAM="/bin/sh -c '/bin/chmod ug+rw /sys/devices/platform/leds-gpio/leds -R'" |
Aunque esta configuración funcionará en muchos sistemas, será necesario consultar la documentación ya que, dependiendo de las especificidades de cada SBC, a las anteriores reglas se pueden añadir otras. Al contrario, algunos drivers no necesitan reglas que establezcan los permisos, ya que pueden otorgarlos con seguridad; por ejemplo, w1-therm controla las comunicaciones 1-Wire para medir la temperatura y permite la lectura a cualquier usuario del sistema. De la misma forma, algunas no servirán en determinadas placas; por ejemplo, el subsistema bcm2835-gpiomem no está disponible en un SBC Orange Pi Zero, citada en algunos de los ejemplos anteriores.
En el caso de Raspbian, aunque inicialmente está inhabilitado el acceso a la mayoría del hadware, con las utilidades raspi-config o rc_gui se automatiza todo el proceso explicado en este apartado para activar su uso.

Establecer una dirección IP fija
Aunque lo más recomendable suele ser centralizar la asignación de las direcciones IP de los diferentes dispositivos de una red utilizando un servidor DHCP o incluso en vistas locales de un DNS, en determinadas circunstancias, como puede ser la ausencia de esta infraestructura en una pequeña instalación, es necesario configurar en el sistema una dirección IP fija.
En un sistema basado en Debian como Armbian, el usado aquí de referencia, la configuración de la dirección IP se almacena en /etc/network/interfaces y por defecto especificará que se asigne de forma dinámica la dirección IP más o menos así:
|
1 2 3 4 5 6 7 8 9 |
# loopback auto lo iface lo inet loopback # conexión de red cableada # hwaddress ether 00:00:00:00:00:00 allow-hotplug eth0 iface eth0 inet dhcp # no-auto-down eth0 |
La configuración que establece una dirección IP fija sustituye la especificación dhcp del final de la línea resaltada en el código de arriba (que espera la dirección IP de un servidor DHCP) por static para indicar que se usa una dirección IP estática.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# loopback auto lo iface lo inet loopback # ethernet eth0 auto eth0 iface eth0 inet static # hwaddress ether 00:00:00:00:00:00 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 address 192.168.1.123 gateway 192.168.1.1 dns-nameservers 87.98.175.85 5.9.49.12 |
En el ejemplo anterior, se supone que el SBC está en la red 192.168.1.0 (de clase C), que en la dirección 192.168.1.1 hay un router que conecta a otras redes (Internet, por ejemplo), que los servidores de nombre de dominio son los que recomienda OpenNIC en función de mi ubicación y que la dirección IP fija elegida para el SBC es 192.168.1.123. Al incluir auto eth0 en la configuración, el interfaz se iniciará automáticamente en el arranque.
Para utilizar inmediatamente los cambios de configuración, sin necesidad de reiniciar el sistema, se puede reiniciar el servicio de red utilizando las órdenes:
-
sudo ip addr flush dev eth0para eliminar la anterior configuraciónsudo service networking restartpara reiniciar el servicio con la nueva configuración
Opcionalmente, también es posible forzar la carga de la configuración desactivando el interfaz de red con ifdown y volviendo a activarlo inmediatamente después con ifup. Ambas órdenes pueden lanzarse en la misma línea separándolas por && como en el siguiente ejemplo:
sudo ifdown eth0 && sudo ifup eth0
El documento /etc/network/interfaces puede incluir información de varios interfaces de red (en realidad, ya se están definiendo dos: el loopback lo y eth0) lo cual incluye alias de dispositivos reales para crear otros virtuales y asignar varias direcciones de red al mismo dispositivo físico. Por ejemplo, añadiendo a la configuración el código de abajo, se crea un alias de eth0 en la red 192.168.2.0
|
16 17 18 19 20 21 22 |
# alias ethernet eth0 en la red 192.168.2.0 auto eth0:0 iface eth0:0 inet static network 192.168.2.0 netmask 255.255.255.0 broadcast 192.168.2.255 address 192.168.2.123 |
Si en el sistema dispone de varios dispositivos de red, sean físicos o virtuales, solo se incluye en la configuración la pasarela (con gateway) y los DNS (con dns-nameservers) en uno de ellos.
En el caso de que la conexión sea wifi, a los datos de los ejemplos anteriores se le añade, al menos:
wpa-ssidpara indicar el SSID al que se conectawpa-psksirve para indicar la clave al punto de acceso wifi
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# loopback auto lo iface lo inet loopback # wifi wlan0 auto wlan0 iface wlan0 inet static # hwaddress ether 00:00:00:00:00:00 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 address 192.168.1.223 gateway 192.168.1.1 dns-nameservers 87.98.175.85 5.9.49.12 wpa-ssid 'polaridad.es' wpa-psk ecac1cfa030b3915d4e8a1efe8d2c987a9fda8d9e0147fc84e0b40c9fb43cd1a # wireless-power off |
Para obtener el código de la clave que se escribe en la entrada wpa-psk de la configuración se puede utilizar la orden wpa_passphrase a la que se le pasa como argumentos ① el SSID y ② la clave como en el siguiente ejemplo:
wpa_passphrase polaridad.es "Hba2h662JaKc2vH8a3dOhs"
Añadiendo allow-hotplug eth0 o allow-hotplug wlan0 a las configuraciones propuestas antes, sería posible conectar a la red después de haberla configurado en el arranque sin necesidad de intervenir «manualmente» en el sistema.
Para establecer una dirección MAC diferente a la física se puede utilizar hwaddress en el formato que aparece comentado en los ejemplos. La dirección se sustituye por el valor cero que se usa como muestra. Es necesario verificar que no entra en conflicto con las que se establezca al configurar el driver de red; por ejemplo, el módulo xradio_wlan del SBC Orange Pi Zero utiliza una específica en su configuración de xradio_wlan.conf en /etc/modprobe.d.
En la distribución Debian, y en algunas de las que derivan de ella, puede darse un conflicto entre los DNS que se especifican en el documento /etc/network/interfaces y los que se almacenan en el documento /etc/resolv.conf. De entre las formas posibles para eludir este problema, si se produce, la que he encontrado más sencilla consiste en eliminar el segundo documento, instalar resolvconf, y dejar que sea esta aplicación la que lo gestione, para lo que creará un enlace simbólico y tomará correctamente los datos de /etc/network/interfaces
sudo rm /etc/resolv.confeliminar el documento con los DNS actualessudo apt-get updateactualizar la información de los repositoriossudo apt-get install resolvconfinstalar resolvconfsudo dpkg-reconfigure resolvconfreconfigurar los DNS
Igual que ocurre en otros aspectos, como el idioma, del que ya se ha hablado, diferentes distribuciones incluyen recursos propios para configurar las conexiones de red, incluyendo el establecimiento de una dirección IP estática o el SSID y la clave wifi. Por ejemplo, la distribución DietPi, también basada en Debian, como Armbian, utiliza el documento dietpi.txt ubicado en la partición dietpi.txt donde almacena los datos de la configuración inicial (para el primer arranque) además de la herramienta dietpi-config, que ya se ha mencionado, para configurar de manera interactiva, entre otros aspectos, la conexión de red.



Establecer el nombre del sistema
Cuando se administran varios sistemas, especialmente en remoto, puede ser útil identificar cada nodo (cada SBC) por un nombre de host. Como ocurre con otros parámetros, en una instalación convencional, el nombre del host suele establece en la fase inicial, frecuentemente con un diálogo; pero como las instalaciones de los SBC, como es el caso de Armbian, referencia de esta guía, se basan en una imagen preinstalada, el nombre ya está establecido, el del modelo del SBC, y debe cambiarse después.
En las instalaciones de distribuciones Linux basadas en Debian, como es el caso de Armbian, el nombre del host se almacena en varios archivos, para cambiarlo bastará con sustituir en ellos, editándolos con privilegios administrativos, el nombre original por el nuevo.
- /etc/hostname
- /etc/hosts
- /etc/ssh/ssh_host_dsa_key.pub
- /etc/ssh/ssh_host_rsa_key.pub
Aunque bastaría, para hacerlo manualmente, con usar un editor como nano, por ejemplo con la orden sudo nano /etc/hostname; se puede automatizar cada cambio usando sed. Suponiendo que el nombre original del SBC fuera orangepizero y el nuevo dospi, podría hacerse con la orden:
sudo sed -i "s/orangepizero/dospi/" /etc/hostname
Además de los anteriores archivos de configuración, algunas distribuciones y aplicaciones pueden añadir otros que sean necesarios para su funcionamiento. Un caso habitual son las aplicaciones de correo; por ejemplo SSMTP establece el nombre del host en /etc/ssmtp/ssmtp.conf. Armbian utiliza el fichero de configuración /etc/armbian-release en el que las variables BOARD y BOARD_NAME almacenan información relacionada con el nombre del sistema; cambiando la segunda, por ejemplo se puede obtener un MOTD personalizado usando, BOARD_NAME (el nombre de la placa).



paula
Hola!
Estoy empezando a programar con raspberry
Que linux me recomiendas?
Víctor Ventura
Hola, Paula.
Si estás empezando y si el SBC por el que has optado es Raspberry Pi, te recomiendo Raspbian.
Esta guía habla un poco de cómo instalarlo pero, como quiere ser más bien neutra, se dirige en general a las distros basadas en Debian y toma como referencia Armbian, que es la que funciona en más tipos de SBC y la que menos se aleja de un Debian «normal». De todas formas, no creo que tengas problema en configurar Raspbian tomando este texto como ejemplo.
Como empiezas a programar, es muy posible que más adelante, con el criterio que desarrolles por tu propia experiencia, decidas usar otra distribución Linux (a no ser que el proyecto te imponga otro sistema, claro). Si me hubieras preguntado por la que mejor funciona con pocos recursos, o mejor optimiza los disponibles, te habría recomendado DietPi o si pensaras hacer aplicaciones para placas muy diferentes (por ser necesarias para proyectos muy diferentes) te habría recomendado Armbian, que funciona en muchos tipos de SBC.
Como verás (ya lo he confesado más de una vez) soy un chico-Debian, pero si tienes preferencia por otro tipo de distribución GNU/Linux no vas a tener problema en encontrar una versión para la arquitectura ARM (tendrás que trabajar un poco para configurarla) o incluso pre-configurada para un SBC concreto.
Te lo vas a pasar muy bien programando con Raspberry Pi ¡No se te olvide volver por polaridad.es y contarnos qué tal te va!
paula
No he comprado ninguna raspberry por ahora estoy usando la que nos dan en el curso
Cual me recomiendas?
Muchas gracias.
Víctor Ventura
Hola, Paula.
No sé si te refieres a un modelo de Raspberry Pi o es que estás hablando del concepto de SBC usando el nombre de la marca (como se suele hacer con otras, como kleenex para decir pañuelo de papel, por ejemplo).
Si me preguntas por un modelo de Raspberry Pi, te recomendaría la Raspberry Pi 3 B a no ser que necesites usar algo muy específico en el curso que implique otro modelo (esto es realmente raro que ocurra). Al contrario, si es posible para el curso, porque no necesitas, por ejemplo, Bluetooth, y encuentras una oferta espectacular (pero realmente espectacular, si no, no) para empezar te podría servir un modelo inferior, entendiendo que más adelante comprarás la que se adapte mejor a un uso concreto (por los recursos que necesite, como memoria, velocidad de la CPU, prestaciones de la salida de vídeo, cámara, almacenamiento interno, cantidad de GPIO…)
Y si me preguntas qué SBC comprar, también te recomendaría la Raspberry Pi 3 B, ① porque ahora que empiezas querrás darle un uso genérico (tampoco me dices si vas a programar hardware a más bajo nivel, gráficos o hasta si se trata de un curso de introducción a la programación y se usa Raspberry Pi). ② Porque seguro que encuentras un distribuidor en tu ciudad (me encanta el comercio de cercanía) que además de ahorrarte los gastos de envío te atenderá la garantía y seguramente te pueda vender también accesorios y aconsejarte sobre ellos. ③ Porque es un SBC con muy buenas prestaciones, muy equilibrado y a un precio bastante razonable. ④ Porque tendrás para elegir muchísimas distribuciones GNU/Linux (en los otros SBC las alternativas son mucho más limitadas) que te permitirán aprender también un poco sobre sistemas, un conocimiento complementario muy importante en programación. Y ⑤ porque si decides que no vas a programar más (aunque esto es imposible que suceda) tendrás un equipo que te servirá para otros usos, como un centro multimedia para ver TV y escuchar música, por poner un ejemplo.
Cuando termines el curso y acometas proyectos basados en SBC elegirás el que mejor se adapte a las necesidades concretas de cada ocasión. Los criterios principales que yo suelo considerar, además del precio, que debería corresponder con las prestaciones, suelen ser:
Por supuesto, además de esas líneas generales, cada proyecto puede necesitar especificaciones propias (conexión wifi, varios puertos Ethernet, conectores serial ATA…) que condicionarían la elección del SBC.
Saludos y gracias por visitar en polaridad.es
Víctor Ventura
Me acabo de dar cuenta de cuál es tu curso 😀
Ya verás que, además de aprender un montón, te lo vas a pasar fenomenal. Y todo lo que te explico en el comentario anterior soobre los diferentes SBC (sistemas embebidos)) y las distintas distribuciones GNU/Linux te va a quedar clarísimo.
¡Hasta pronto!