Kitabı oku: «Raspberry Pi® a fondo para desarrolladores», sayfa 6

Yazı tipi:

Gestión de paquetes

Al principio de este capítulo destacamos que la presencia de un buen gestor de paquetes constituye un característica fundamental de toda distribución Linux aceptable. Un gestor de paquetes (packet manager) es un conjunto de herramientas de software que automatizan el proceso de instalación, configuración, actualización y eliminación de paquetes de software (grosso modo, los programas de aplicación) del sistema operativo Linux. Las diferentes distribuciones de Linux utilizan distintos gestores de paquetes. Ubuntu y Raspbian/Debian usan APT (Advanced Packaging Tool, herramienta avanzada de empaquetado) sobre DPKG (Debian Package Management System, sistema de gestión de paquetes Debian), mientras que Arch Linux emplea Pacman. Los comandos para manejar cada uno tienen su propia sintaxis, pero su forma de operar es prácticamente análoga. La tabla 2-7 lista algunos comandos básicos para la gestión de paquetes.

Tabla 2-7: Comandos habituales para gestión de paquetes (usando nano como paquete de ejemplo).


ComandoRaspbian/Debian/Ubuntu
Instalar un paquete.sudo apt install nano
Actualizar el índice del paquete.sudo apt update
Actualizar los paquetes en nuestro sistema.sudo apt upgrade
¿Está instalado Nano?dpkg-query -l | grep nano
¿Hay disponible un paquete con la cadena nano?apt-cache search nano
Obtener más información de un paquete.apt-cache show nanoapt-cache policy nano
Obtener ayuda.apt help
Descargar un paquete en el directorio actual.apt-get download nano
Eliminar un paquete.sudo apt remove nano
Limpiar paquetes antiguos.sudo apt-get autoremovesudo apt-get clean

NOTA Con el tiempo, el comando binario apt va integrando poco a poco las funcionalidades tanto de apt-get como de apt-cache. Este cambio debería reducir el número de herramientas necesario para la gestión de paquetes. Sin embargo, las distribuciones Linux más antiguas podrían exigir el uso del comando apt-get en lugar de apt.

Wavemon es una herramienta muy útil para configurar las conexiones WiFi (véase el capítulo 13). Si ejecutamos el comando siguiente, veremos que el paquete no se instala de manera predeterminada:

pi@erpi ~ $ wavemon

-bash: wavemon: command not found

Podemos utilizar el gestor de paquetes específico de la plataforma para instalarlo, una vez conozcamos su nombre de paquete:

pi@erpi ~ $ apt-cache search wavemon

wavemon - Wireless Device Monitoring Application

pi@erpi ~ $ sudo apt install wavemon

Reading package lists... Done

Building dependency tree ...

Setting up wavemon (0.7.6-2) ...

El comando wavemon se ejecutará ahora, pero desgraciadamente no hará nada en tanto no configuremos un adaptador inalámbrico (véase el capítulo 13).

pi@erpi ~ $ wavemon

wavemon: no supported wireless interfaces found

También merece la pena destacar que los paquetes se pueden descargar e instalar manualmente. Este método resulta útil cuando deseamos conservar una versión concreta o si necesitamos distribuir un paquete por múltiples dispositivos. Por ejmplo, el paquete Wavemon se puede eliminar, descargar manualmente como archivo .deb y, finalmente, instalarse:

pi@erpi ~ $ sudo apt remove wavemon

pi@erpi ~ $ wavemon

-bash: /usr/bin/wavemon: No such file or directory

pi@erpi ~ $ apt-get download wavemon

pi@erpi ~ $ ls -l wavemon*

-rw-r--r-- 1 pi pi 48248 Mar 28 2014 wavemon_0.7.6-2_armhf.deb

pi@erpi ~ $ sudo dpkg -i wavemon_0.7.6-2_armhf.deb

pi@erpi ~ $ wavemon

wavemon: no supported wireless interfaces found

NOTA Las instalaciones de los paquetes fallan a veces, tal vez porque no aparecen otros paquetes que son necesarios. Los comandos ponen a nuestra disposición opciones (force options) para obviar las comprobaciones. Por ejemplo, --force-yes del comando apt-get. Siempre que sea posible es mejor evitar estas opciones, porque vernos obligados a emplearlas es un síntoma de otros problemas. Cuando los paquetes no se instalan, puede resultar útil escribir: sudo apt-get autoremove.

Configuración del Raspberry Pi

La comunidad RPi y la Raspberry Pi Foundation han desarrollado herramientas específicas para configurar nuestra placa. Estas herramientas simplifican algunas tareas que, de otro modo, resultarían complejas, como veremos en las secciones siguientes.

La herramienta de configuración del Raspberry Pi

La herramienta de configuración del Raspberry Pi, Raspberry Pi Configuration Tool o raspi-config, resulta muy útil para los primeros pasos con nuestro RPi. La figura 2-7 muestra la interfaz de la herramienta, que podemos iniciar con un sencillo comando:

pi@erpi:~$ sudo raspi-config


Figura 2-7: La herramienta de configuración raspi-config.

Las siguientes tareas se deberían llevar a cabo casi inmediatamente después de iniciar el RPi a partir de una imagen recién grabada en una tarjeta SD:

❏Expandir el sistema de archivos para que ocupe toda la tarjeta SD: esta es la primera opción en la figura 2-7. Cuando escribimos una imagen en una tarjeta SD, suele ser más pequeña que la capacidad total de la misma. Esta opción permite expandir el sistema de archivos para que utilice el espacio de la tarjeta en su totalidad. Después de usar esta opción podemos comprobar la capacidad total del siguiente modo:

pi@erpi ~ $ df -kh

Filesystem Size Used Avail Use% Mounted on

/dev/root 15G 7.7G 6.2G 56% /

...

pi@erpi ~ $ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

mmcblk0 179:0 0 14.9G 0 disk

├─mmcblk0p1 179:1 0 56M 0 part /boot

└─mmcblk0p2 179:2 0 14.8G 0 part /

Como puede verse, la tarjeta SD muestra ahora una capacidad de 15 GiB,1 consistente con el espacio de almacenamiento total de la misma.

❏Habilitar la cámara: si ha conectado una cámara al RPi mediante la interfaz CSI, puede habilitar su uso. Este tema se trata en profundidad en el capítulo 15.

❏Overclock: esta opción permite elevar la frecuencia de trabajo del procesador de la placa por encima de la prevista originalmente por el fabricante. Por ejemplo, el procesador del RPi 2 puede funcionar a 1 GHz en lugar de los 900 MHz que el fabricante indica como frecuencia máxima. Eso sí, acelerar el microprocesador puede acortar su vida útil así como hacer más inestable su funcionamiento. Sin embargo, muchos usuarios realizan overclocking en sus placas sin mayores problemas. Esta opción introduce cambios en el archivo /boot/config.txt.

❏Overscan (dentro de las opciones avanzadas, Advanced Options, véase la figura 2-8): nos permite ajustar la salida de vídeo a la pantalla completa de nuestra televisión. Esta opción introduce cambios en el archivo /boot/config.txt.


Figura 2-8: El menú de opciones avanzadas (Advanced Options) de la herramienta raspi-config.

❏Nombre de host (Host Name, Advanced Options): esta opción nos permite ajustar el nombre de host del RPi en la red. Asimismo, actualiza los archivos hostname y hosts y reinicia el servicio de red:

pi@erpi ~ $ cat /etc/hostname

erpi

pi@erpi ~ $ cat /etc/hosts

...

127.0.1.1 erpi

Esta entrada significa ahora que mi placa RPi se encuentra en la dirección Zeroconf erpi.local.

❏División de memoria (Memory Split, Advanced Options): la CPU y el procesador gráfico o GPU del RPi comparten la memoria DDR de la placa. Esta opción nos permite ajustar la asignación de memoria a la GPU. En general, 64 MG suele ser una cantidad correcta. Sin embargo, si vamos a utilizar la cámara CSI del RPi deberemos aumentarla, normalmente a 128 MB (véase el capítulo 15), o bien si vamos a usar la GPU para gráficos en 3D. Este valor queda establecido durante el arranque (cuando se lee del archivo /boot/config.txt) y no se puede modificar en tiempo de ejecución.

❏SSH (Advanced Options): esta opción nos permite habilitar o deshabilitar el servidor SSH en el RPi. Obviamente, nunca deberíamos desactivar el modo SSH cuando nuestro RPi esté en modo headless, sobre todo si carecemos de un modo alternativo de conectarnos a la placa. Esta opción deshabilita el servicio SSH:

pi@erpi ~ $ systemctl status sshd

• ssh.service - OpenBSD Secure Shell server

Loaded: loaded (/lib/systemd/system/ssh.service; enabled)

Active: active (running) since Thu 2015-12-17 21:53:47 GMT

Process: 628 ExecReload=/bin/kill -HUP $MAINPID

Main PID: 492 (sshd)

CGroup: /system.slice/ssh.service

└─492 /usr/sbin/sshd -D

Las restantes opciones de la figura 2-8 modifican también el archivo /boot/config.txt y se analizan en los capítulos 6 y 8. Muchas de estas opciones exigen el reinicio del RPi para que las acciones surtan efecto, puesto que se trata de ajustes de inicialización que pasan al núcleo durante el inicio.

Actualización del software del RPi

La distribución Raspbian se puede actualizar en el RPi siguiendo unos cuantos pasos sencillos. No obstante, tenga en cuenta que algunos de ellos, la actualización en particular, pueden tardar bastante en completarse, hasta varias horas, dependiendo de lo actualizada que esté la imagen y de la velocidad de nuestra red.

Una llamada a apt update descargará las listas de paquetes desde las ubicaciones de Internet identificadas en el archivo /etc/apt/sources.list. Esta acción no instala nuevas versiones del software, sino que actualiza las listas de paquetes y sus interdependencias:

pi@erpi ~ $ sudo apt update

Get:1 http://archive.raspbian.org jessie InRelease [15.0 kB]

Hit http://archive.raspberrypi.org jessie InRelease ...

Building dependency tree Reading state information... Done

Cuando se complete esta actualización, podremos descargar e instalar automáticamente las últimas versiones del software disponible usando el comando apt upgrade. Como es lógico, deberemos siempre realizar un apt update antes de un apt upgrade:

pi@erpi ~ $ sudo apt upgrade

Reading package lists... Done Building dependency tree

Reading state information... Done Calculating upgrade... Done ...

After this operation, XXXXX B of additional disk space will be used.

Do you want to continue? [Y/n]

Existe una herramienta adicional específica para el RPi que nos permite actualizar el núcleo de Linux, los controladores y las librerías del RPi. La herramienta rpi-update puede recibir llamadas directas, sin argumentos, pero también cuenta con determinados ajustes avanzados, que se describen en github.com/Hexxeh/rpi-update. Por ejemplo, estos ajustes permiten actualizar el firmware sin tener que sustituir el núcleo:

pi@erpi ~ $ sudo apt install rpi-update

pi@erpi ~ $ sudo rpi-update

*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom

This update bumps to rpi-4.1.y linux tree ...

*** Updating firmware

*** Updating kernel modules

*** depmod 4.1.15-v7+

*** Updating VideoCore libraries

*** Using HardFP libraries ...

*** A reboot is needed to activate the new firmware

pi@erpi ~ $ sudo reboot

Después de reiniciar la placa, la versión actual del núcleo debería quedar alineada con el núcleo y el firmware recién instalado:

molloyd@desktop:~$ ssh pi@erpi.local

pi@erpi ~ $ uname -a

Linux erpi 4.1.15-v7+ #830 SMP Tue Dec 15 17:02:45 GMT 2015 armv7l GNU/Linux

Salida de vídeo

La salida de vídeo del RPi se puede reconfigurar mediante la aplicación tvservice

(/opt/vc/bin/tvservice). Deberíamos conectar el cable del monitor HDMI en el RPi y utilizar la aplicación tvservice para listar los modos de conexión de la pantalla CEA (típicamente televisiones) o DMT (típicamente monitores de ordenador) conectada:

pi@erpi ~ $ tvservice --modes CEA

Group CEA has 0 modes:

pi@erpi ~ $ tvservice --modes DMT

Group DMT has 13 modes:

mode 51: 1600x1200 @ 60Hz 4:3, clock:162MHz progressive

mode 58: 1680x1050 @ 60Hz 16:10, clock:146MHz progressive

(prefer) mode 82: 1920x1080 @ 60Hz 16:9, clock:148MHz progressive

pi@erpi ~ $ tvservice --status

state 0x120006 [DVI DMT(82) RGB full 16:9], 1920x1080 @ 60.00Hz, progressive

Podemos fijar explícitamente la resolución del RPi con la misma herramienta. Por ejemplo, podemos actualizar la resolución de salida a un modo DVI 1600 × 1200, disponible en la lista de más arriba:

pi@erpi ~ $ tvservice --explicit="DMT 51"

Powering on HDMI with explicit settings (DMT mode 51)

pi@erpi ~ $ tvservice --status

state 0x120006 [DVI DMT (51) RGB full 4:3], 1600x1200 @ 60.00Hz, progressive

pi@erpi ~ $ fbset -depth 8 && fbset -depth 16

La última línea fuerza un refresco del buffer de cuadro o frame buffer (una área de la memoria de vídeo) para actualizar la pantalla. Después de comprobar la nueva resolución, podemos establecer de forma explícita el valor en el archivo /boot/config.txt, donde hdmi_group=1 establece un modo CEA, y hdmi_group=2 un modo DMT:

pi@erpi /boot $ more config.txt | grep ^hdmi

hdmi_group=2

hdmi_mode=51

Si no estamos usando la salida HDMI, podemos desconectarla completamente. Ello nos permitiría ahorrar una corriente de entre 25 y 30 mA.

pi@erpi ~ $ tvservice --off

Powering off HDMI

Existen herramientas adicionales también diseñadas para el RPi que permiten capturar datos de imagen y vídeo, que describiremos con detalle en el capítulo 15.

Interacción con los LED de la placa

Esta sección describe cómo podemos alterar el comportamiento de los LED incorporados a la placa del RPi. Estos LED están en la esquina superior izquierda de la placa del RPi 2 y en la parte inferior izquierda de la del RPi 3. Ambas placas incorporan dos LED que sirven para dar información del estado de las mismas.

❏El ACT LED (llamado OK en los modelos antiguos) parpadea de forma predeterminada durante la actividad de la tarjeta micro-SD. Desde Linux nos referimos a ese LED como led0.

❏El PWR LED se ilumina cuando el RPi está encendido. Desde Linux, este LED se conoce como led1 en algunos modelos, como el RPi 2, pero en modelos más antiguos está soldado directamente a la entrada de alimentación.


Figura 2-9: Los LED de actividad y alimentación de los RPi.

Podemos cambiar el comportamiento de estos LED para que se ajusten a nuestras necesidades, pero durante ese tiempo perderemos estas útiles informaciones de estado y alimentación del dispositivo.

NOTA Observe que el RPi Zero carece de PWR LED físico (led1), a pesar de que existan entradas en archivos de Linux que indiquen lo contrario. Podemos programar el disparador del ACT LED (led0) como se describe más adelante. Observe que la polaridad del LED está invertida. En modo disparador (trigger mode) "none" (ninguno), un valor de "0" para el brillo enciende el LED, mientras que un valor de "1" lo apaga. Este comportamiento se puede ajustar a lo largo del tiempo.

Sysfs es un sistema de archivos virtual disponible en las versiones más recientes del núcleo de Linux. Nos proporciona acceso a dispositivos y controladores que de otro modo solo serían accesibles en un espacio restringido del núcleo. Este tema se trata en profundidad en el capítulo 6. Sin embargo, en este punto, resultaría útil explorar brevemente la manera de usar sysfs para modificar el comportamiento de los LED de la placa.

Usando el cliente SSH, nos conectamos al RPi y navegamos hasta el directorio /sys/class/leds/. La salida que mostramos a continuación es para el RPi 2:

pi@erpi ~ $ cd /sys/class/leds/

pi@erpi /sys/class/leds $ ls

led0 led1

NOTA Las ubicaciones del directorio de sysfs varían ligeramente entre las distintas versiones del núcleo de Linux, así como entre las diferentes versiones.

Puede observar el mapeo de ambos LED en sysfs: led0 and led1. Es posible cambiar el directorio para modificar las propiedades de uno de los LED. Por ejemplo, para modificar el comportamiento del ACT LED (led0):

pi@erpi /sys/class/leds $ cd led0

pi@erpi /sys/class/leds/led0 $ ls

brightness device max_brightness subsystem trigger uevent

Aquí vemos varias entradas de archivo diferentes que nos aportan más información y acceso a los ajustes. Observe que esta sección utiliza algunos comandos que veremos detalladamente en el capítulo siguiente.

Para determinar el estado de un LED escribiremos lo siguiente:

pi@erpi /sys/class/leds/led0 $ cat trigger

none [mmc0] timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2

cpu3 default-on input

donde se observa que el ACT LED está configurado para mostrar actividad en el dispositivo mmc0, la tarjeta micro-SD. Para anular este disparador, escribimos:

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo none > trigger"

pi@erpi /sys/class/leds/led0 $ cat trigger

[none] mmc0 timer oneshot heartbeat backlight gpio cpu0 cpu1 ...

Veremos que el LED deja de parpadear por completo. Utilizaremos cat trigger para ver el nuevo estado. Ahora que el disparador del LED está apagado, podemos conectar o desconectar completamente el ACT LED mediante:

NOTA sudo sh -c sirve para ejecutar un comando del shell desde un comando de cadena de caracteres que requiera acceso de superusuario. No es posible ejecutar el comando utilizando la instrucción "sudo" únicamente, puesto que también se hace uso de la redirección (>)

del comando echo hacia un archivo (por ejemplo, brightness). Este tema se trata en el capítulo 3.

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo 1 > brightness"

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo 0 > brightness"

Incluso podemos establecer el intervalo que nos convenga para que el LED parpadee. Si observamos cuidadosamente, observaremos la naturaleza dinámica de sysfs. Si ejecutamos el comando ls en este punto, el directorio aparecerá como sigue, pero cambiará en breve:

pi@erpi /sys/class/leds/led0 $ ls

brightness device max_brightness subsystem trigger uevent

Para que el LED parpadee, debemos configurar el disparador en modo temporizador con el comando echo timer > trigger. Verá cómo el LED ACT parpadea a intervalos de 1 segundo. Observe las nuevas entradas delay_on y delay_off en el directorio led0:

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo timer > trigger"

pi@erpi /sys/class/leds/led0 $ ls

brightness delay_off delay_on device max_brightness subsystem

trigger uevent

El temporizador del LED emplea los tiempos definidos en ambas entradas. Puede encontrar más información sobre estos valores empleando el comando concatenate (concatenar). Por ejemplo, las líneas siguientes informan del retardo en milisegundos:

pi@erpi /sys/class/leds/led0 $ cat delay_on

500

pi@erpi /sys/class/leds/led0 $ cat delay_off

500

Para que el ACT LED parpadee con una frecuencia de 5 Hz (100 milisegundos encendido y 100 apagado), escribiremos:

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo 100 > delay_on"

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo 100 > delay_off"

El comando echo mmc0 > trigger devuelve el LED a su estado predeterminado, lo que provoca la desaparición de las entradas delay_on y delay_off:

pi@erpi /sys/class/leds/led0 $ sudo sh -c "echo mmc0 > trigger"

pi@erpi /sys/class/leds/led0 $ ls

brightness device max_brightness subsystem trigger uevent


Apagado y reinicio

ADVERTENCIA Desconectar el cable de alimentación sin que el núcleo de Linux pueda desmontar la tarjeta micro-SD puede corromper el sistema de archivos.

Por último, vamos a analizar el procedimiento correcto para apagar el RPi. Una desconexión inapropiada puede corromper el sistema de archivos ext4 o, como poco, prolongar los tiempos de inicio a causa de las comprobaciones del mismo. Veamos algunos puntos importantes a la hora de encender, apagar o reiniciar el RPi:

❏Escribir sudo shutdown -h now apaga la placa de forma correcta. Si escribimos sudo shutdown -h +5 retrasaremos el apagado cinco minutos.

❏Escribir sudo reboot reiniciará correctamente la placa.

Si el diseño de nuestro proyecto contempla una carcasa para el RPi y necesitamos un medio para apagarlo correctamente desde el exterior, es posible cablear un botón externo a la cabecera GPIO y escribir un script que se ejecute durante el inicio y que solicite una entrada a la GPIO. Si se detecta esa entrada, se podrá llamar directamente a /sbin/shutdown -h now.

Resumen

Después de leer este capítulo debería ser capaz de hacer lo siguiente:

❏Comunicarse con el RPi desde su ordenador mediante una conexión de red.

❏Comunicarse con el RPi usando una conexión de respaldo serie mediante un cable USB a TTL de 3,3 V.

❏Interaccionar con el RPi y controlarlo mediante sencillos comandos de Linux.

❏Realizar la edición básica de archivos desde una ventana de terminal del intérprete de comandos de Linux.

❏Gestionar los paquetes de software de Linux y establecer la fecha y la hora del sistema.

❏Emplear utilidades específicas para la configuración avanzada del RPi.

❏Utilizar el sysfs de Linux para modificar el estado de los LED de la placa del RPi.

❏Iniciar y apagar el RPi con seguridad.

1 Las tarjetas SD y los discos duros se comercializan generalmente con un valor ajustado de 1 gigabyte (GB) a 1.000.000.000 de bytes (es decir, 1.0003 bytes). Linux utiliza el gigabyte con potencias de dos (técnicamente GiB, o Gibibyte), es decir, 1.0243 bytes. Así pues, se produce una discrepancia cuando formateamos una tarjeta SD; por ejemplo, una tarjeta de 16 GB mostrará un espacio máximo de 14,901 GiB, es decir, 16 × 109/1.0243, una vez formateada.