Saltar a contenido

Raspberry Pi

Enlaces

Distribuciones

Software

  • Pi-Hole: DNS que filtra dominios marcados por la comunidad como "molestos" y conseguiremos una navegación mas limpia y rápida.
  • PiVPN

Hardware

Comandos útiles

Comprobar asignaciones de cliente No-IP

Las asignaciones dejan marca en el log syslog:

1
2
3
4
5
6
7
edumoreno@raspi-git /var/log $ sudo fgrep noip syslog
Oct 16 12:18:57 raspi-git noip2[2165]: v2.1.9 daemon ended.
Oct 16 12:19:19 raspi-git noip2[2186]: v2.1.9 daemon started with NAT enabled
Oct 16 12:19:35 raspi-git noip2[2186]: eduardofilo.no-ip.biz set to 88.19.216.95
Oct 16 12:53:06 raspi-git noip2[2186]: v2.1.9 daemon ended.
Oct 16 13:15:23 raspi-git noip2[2217]: v2.1.9 daemon started with NAT enabled
Oct 16 13:15:25 raspi-git noip2[2217]: eduardofilo.no-ip.biz was already set to 88.19.216.95.

Utilidad de configuración

1
$ sudo raspi-config

Backup de la SD (comprimiendo al vuelo)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ #Backup:
$ sudo dd if=/dev/mmcblk0 bs=2M | pv | gzip -9 - > Rpi_8gb_backup.img.gz
$ #Backup sólo de 4GB (si por ejemplo la tarjeta es más grande pero no aprovecha toda la superficie)
$ sudo dd if=/dev/mmcblk0 bs=2M count=2048 | pv -s 4g | gzip -9 - > Rpi_4gb_backup.img.gz
$ #Restauración (comprimido con gzip):
$ gunzip Rpi_8gb_backup.img.gz -c | pv | sudo dd of=/dev/mmcblk0 bs=2M
$ #Restauración (comprimido con xz):
$ xzcat Rpi_8gb_backup.img.xz | pv | sudo dd of=/dev/mmcblk0 bs=2M
$ #Restauración (comprimido con zip):
$ unzip -p Rpi_8gb_backup.zip | pv | sudo dd of=/dev/mmcblk0 bs=2M

Para hacer un backup parcial los cálculos se harían así. Primero sacamos los datos de la estructura de la tarjeta con fdisk:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo fdisk -l /dev/mmcblk0
Disco /dev/mmcblk0: 14,4 GiB, 15502147584 bytes, 30277632 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: dos
Identificador del disco: 0xa125a0dc

Dispositivo    Inicio Comienzo    Final Sectores Tamaño Id Tipo
/dev/mmcblk0p1            8192    96663    88472  43,2M  c W95 FAT32 (LBA)
/dev/mmcblk0p2           98304 15550463 15452160   7,4G 83 Linux

Aquí vemos que cada sector ocupa 512 bytes. Nos fijamos en el último sector utilizado que en este caso es 15550463. Multiplicando este sector por el tamaño del sector (y sumando 1 al número de sectores por si empiezan a contar en 0) obtendremos el número de bytes que tendremos que copiar. Como el block size que vamos a utilizar es 2MB tendremos que truncar por lo alto (también servirá de medida de seguidad). Los cálculos en este caso resultarían:

1
(15550463 + 1) (sector) * 512 (Byte/sector) / 1024 (Byte/KB) / 1024 (KB/MB) / 2 (MB/bloque) = 3796,5 bloques

Por tanto en este caso copiaremos 3797 bloques para cubrir esos 15550464 sectores.

Backup de la SD (comprimiendo al vuelo y diviendo en trozos el fichero resultante)

1
2
3
4
$ #Backup:
$ sudo dd if=/dev/mmcblk0 bs=2M | pv | gzip -9 - | split --bytes=2G - Rpi_8gb_backup.img.gz.part_
$ #Restauración:
$ cat Rpi_8gb_backup.img.gz.part_* | gunzip -c | pv | sudo dd of=/dev/mmcblk0 bs=2M

Control de progreso durante flasheo

1
$ sudo pkill -USR1 -n -x dd

Como alternativa se puede instalar el comando dcfldd para sustituir a dd, con lo que obtendremos una indicación del progreso de la copia. dcfldd informa cada 256 bloques escritos por defecto. Para que lo haga con más frecuencia hay que pasarle la opción statusinterval de esta forma:

1
2
$ #Backup:
$ sudo dcfldd statusinterval=10 if=/dev/mmcblk0 bs=2M | gzip -9 - > Rpi_8gb_backup.img.gz

Gestión de la SWAP

Para redimensionar la Swap predeterminada (fichero de 100MB en /var/swap):

1
2
3
$ sudo nano /etc/dphys-swapfile
$ sudo dphys-swapfile setup
$ sudo dphys-swapfile swapon

Para consultar el estado de la swap:

1
$ swapon -s

Para dejar de usar swap:

1
$ sudo swapoff -a

Para activar la swap tal y como está definida en ''/etc/fstab'':

1
$ sudo swapon -a

Para activar swap con un fichero en concreto:

1
$ sudo swapon /var/swap

Escaneo de Raspberry Pi's en red

1
2
$ arp -a | grep b8:27:eb
$ sudo nmap -PR -sP 192.168.1.0/24 | fgrep -B 2 "Raspberry"

Pulsador encendido/apagado

Existe una configuración accesible mediante un Device Tree overlay que permite arrancar y parar el sistema controladamente con un pulsador entre los pines #5 (GPIO03 o SCL) y GND. Para que funcione hay que añadir lo siguiente al fichero /boot/config.txt:

1
dtoverlay=gpio-shutdown

Aquí se documenta en profundidad.

Pi-top

Enlaces

  • pi-top-install: Scripts para controlar el hardware del Pi-top (teclas brillo pantalla, power off, etc.) sobre Raspbian oficial.
  • pi-top-battery-status: Muestra el estado de la batería del Pi-top en Raspbian.

Artículos interesantes de TheMagPi

  • Librería Python para controlar un puerto USB: Página 14 de #3 de TheMagPi
  • Buffer de dispositivos controlados con el GPIO de RPi: Página 19 de #4 de TheMagPi
  • Librería wiringPi: Sirve para comandar y leer el GPIO desde bash. Página 14 de #6 de TheMagPi
  • Comunicación entre RaspPi y Arduino: Página 4 de #7 de TheMagPi
  • Uso de interrupciones para chequear GPIO sin bucles: Página 12 de #7 de TheMagPi
  • Librería Nanpy para comunicar RaspPi y Arduino por USB: Página 10 de #8 de TheMagPi
  • WebIOPi - Framework REST para controlar el GPIO: Página 8 de #9 de TheMagPi

Seguridad

SSH

Editar el fichero /etc/ssh/sshd_config y modificar/añadir las siguientes líneas (fuente):

1
2
3
4
PermitRootLogin no
MaxAuthTries 3
MaxStartups 5
AllowUsers edumoreno

Medidas de protección:

Varios

  • Cambiar contraseña predeterminada de usuario pi o mejor eliminar la cuenta.
  • Instalar paquete fail2ban.
  • Desinstalar paquete wolfram-engine que ocupa mucho y no se suele usar:
  • sudo apt-get remove wolfram-engine

Configuración headless

Activación de SSH

Crear un fichero vacío con nombre ssh en partición boot.

Conexión a punto de acceso Wifi

Crear un fichero con nombre wpa_supplicant.conf en partición boot con el siguiente contenido:

1
2
3
4
5
6
7
8
9
country=ES
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="<el_ssid>"
    psk="<el_pwd>"
    key_mgmt=WPA-PSK
}

IP estática

Primero averiguamos el nombre del interfaz al que queremos poner la IP estática consultando ifconfig. Luego editamos /etc/dhcpcd.conf y al final añadimos:

1
2
3
4
interface <nombre_interfaz>
static ip_address=<ip>/24
static routers=<gateway>
static domain_name_servers=<dns>

Raspad

Enlaces

Configuración

Sistema base

Raspbian

Digitalizador de pantalla

El equipo recién instalado lleva un firmware bastante deficiente en el digitalizador táctil de la pantalla. Hay que actualizarlo siguiendo los pasos del siguiente artículo del wiki de SunFounder: The touch screen does not work properly FAQ

Teclado en pantalla

Instalar el paquete: matchbox-keyboard

Clic secundario

Para conseguir emular el clic derecho del ratón procedemos como sigue (fuentes: 1 y 2):

  1. Instalamos los siguientes paquetes:
    1
    $ sudo apt-get update && sudo apt-get install build-essential libx11-dev libxtst-dev libxi-dev x11proto-randr-dev libxrandr-dev xserver-xorg-input-evdev xinput-calibrator
    
  2. Descargamos el código de twofing y lo extraemos:
    1
    2
    3
    $ wget http://plippo.de/dwl/twofing/twofing-0.1.2.tar.gz
    $ tar -xvzf twofing-0.1.2.tar.gz
    $ cd twofing-0.1.2
    
  3. Compilamos:
    1
    $ make && sudo make install
    
  4. Creamos el fichero /etc/udev/rules.d/70-touchscreen-ilitek.rules con el siguiente contenido:
    1
    2
    SUBSYSTEMS=="usb",ACTION=="add",KERNEL=="event*",ATTRS{idVendor}=="222a",ATTRS{idProduct}=="0001",SYMLINK+="twofingtouch",RUN+="/bin/chmod a+r /dev/twofingtouch"
    KERNEL=="event*",ATTRS{name}=="ILITEK Multi-Touch-V3000",SYMLINK+="twofingtouch",RUN+="/bin/chmod a+r /dev/twofingtouch"
    
  5. Creamos el fichero /usr/share/X11/xorg.conf.d/90-touchinput.conf con el siguiente contenido:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    Section "InputClass"
    Identifier "calibration"
    Driver "evdev"
    MatchProduct "ILITEK ILITEK-TP"
    MatchDevicePath "/dev/input/event*"
    Option "Emulate3Buttons" "True"
    Option "EmulateThirdButton" "1"
    Option "EmulateThirdButtonTimeout" "750"
    Option "EmulateThirdButtonMoveThreshold" "30"
    EndSection
    
  6. Creamos el fichero /etc/udev/rules.d/ 99-input-tagging.rules con el siguiente contenido:
    1
    ACTION=="add", KERNEL=="event*", SUBSYSTEM=="input", TAG+="systemd", , ENV{SYSTEMD_ALIAS}+="/sys/subsystem/input/devices/$env{ID_SERIAL}"
    
  7. Creamos el fichero ~/.config/autostart/twofing.desktop con el siguiente contenido:
    1
    2
    3
    4
    5
    [Desktop Entry]
    Type=Application
    Name=Twofing
    Exec=twofing
    StartupNotify=false