En esta entrada vamos a analizar la instalación y configuración del sistema operativo Raspbian en una Raspberry pi 3. Consta de diferentes apartados que aplicaremos según el uso que le demos a nuestra Raspberry, desde un nodo de domótica o un IOT básico, hasta un completo centro multimedia.

Instalación

Las versiones disponibles de Raspbian están en https://www.raspberrypi.org/downloads/raspbian/. Podemos partir de un Raspbian básico (sin entorno gráfico) o versión Escritorio. La forma más simple de «quemar» nuestra imagen es mediante el programa Etcher.

Es recomendable una tarjeta clase 10:

Configuración básica

Activar el terminal serie

Aspecto de una conexión serie con nuestra Raspberry

Una vez la tarjeta contenga nuestra imagen, es muy importante que nuestra raspberry sea accesible a través del puerto serie. Esta comunicación estará activa cuando todo lo demás (lan, wifi) falle.

Editar config.txt (en windows está en la partición boot de la SD y en Linux en /boot) y añadir al final (importante la velocidad) lo siguiente. Este archivo es leído por el kernel en la primera fase de su ejecución, estableciendo una serie de opciones de partida como la configuración HDMI y los puestos serie.

/boot/config.txt
...
# Conexion serie
enable_uart=1
init_uart_baud=115200

Podemos ver todos los parámetros que se pueden configurar al boot en el archivo config.txt en: https://www.raspberrypi.org/documentation/configuration/device-tree.md. Importante no editar con el notepad de windows porque no reconoce los saltos de linea.

Conectar un conversor USB-TTL (FTDI) que funcione a una lógica de 3.3V a los pines de GND, RX y TX (gpios 14 y 15) de la Raspberry, cruzando estos dos últimos entre raspberry y el FTDI.

Los pines TX y RX de la UART de Raspberry

Para conectarnos a la raspberry por el terminal serie utilizaremos Putty:

Conexión serie Putty

Debemos seleccionar el puerto usb al que está conectado nuestro FTDI y estableces la velocidad correcta definida previamente.

Una vez abierta la conexión empezará a salir por nuestra pantalla todo lo que Raspberry haga.

Usuarios

El usuario por defecto es pi y la contraseña es raspberry. Una vez autentificados, podemos establecer una contraseña para root y a partir de ese momento entrar como root. También debemos cambiar la contraseña de pi:

sudo passwd root

passwd pi

Editar /boot/cmdline.txt para ver los mensajes boot

Este archivo contiene los argumentos pasados al kernel cuando el boot loader lo carga. El original es así:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=11609d48--02 
rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet 
splash plymoouth.ignore-serial-consoles

Borrar la última parte «quiet splash plymoouth.ignore-serial-consoles» para que se muestren todos los mensajes en el arranque y no se utilice un fondo gráfico, bonito pero absolutamente inútil.

Más opciones aquí.

Primera configuración: raspi-config

Hay ciertas tareas de configuración rápida que podemos hacer a través de la pequeña utilidad de Raspbian:

raspi-config

Expand filesystem

Expandir el sistema de archivos para que ocupe toda la tarjeta micro-sd. Esto ya lo deberían hacer automáticamente las últimas distribuciones de Raspbian.

advanced options -> Expand Filesystem

Modificar el hostname

Network -> Hostname

Activar demonio SSH

Interfacing Options -> SSH

Permitir usuario root en las conexiones SSH

vim /etc/ssh/sshd_config

   ...
   PermitRootLogin yes
   ...

systemctl restart ssh.service

En algunos casos esto no parece ser suficiente para permitir el acceso de root. En cualquier caso siempre se pueden ganar los permisos de root mediante:

sudo su

Configuración de la red wifi y la red cableada

La configuración básica se encuentra en el fichero /etc/network/interfaces:

...

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

...

Red wifi y contraseña

Archivo de configuración de wpa_supplicant. Tanto para las versiones de Raspberry con wifi integrado como las que tienen un USB dongle.

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
...
network={
    ssid="testing"
    psk="testingPassword"
}

Establecer una IP fija para wlan0 y eth0

vim /etc/dhcpcd.conf 
...
       interface wlan0
       static ip_address=192.168.1.102/24
       static routers=192.168.1.1
       static domain_name_servers=8.8.8.8

       interface eth0
       static ip_address=192.168.1.103/24
       static routers=192.168.1.1
       static domain_name_servers=8.8.8.8

Actualización de los paquetes y la distribución

Actualizar la lista de paquetes, algo básico siempre que vayamos a instalar cualquier cosa.

apt-get update

Actualizar todos los paquetes a la última versión. Como acabamos de instalar la distribución, no lo creo necesario, especialmente porque seguramente sobreescribirá las configuraciones de red anteriores.

apt-get upgrade

Actualizar el kernel. Idem a lo anterior.

apt-get -y dist-upgrade

Instalación de Vim y configuración de colores

Es mi editor favorito, básico también para seguir configurando nuestra Raspberry.

apt-get update
apt-get install vim

Activar lo siguiente:

  1. Colores en Vim (syntax on)
  2. Contraste adecuado con el fondo negro de un terminal (set background=dark)
  3. Copy+paste con el ratón. En las versiones recientes de Vim el ratón funciona por defecto en un «modo visual» bastante inútil (set mouse-=a)
vim /etc/vim/vimrc

...
" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
syntax on
...
" Disable visual mode
set mouse-=a
...
" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark

El modo visual del ratón a veces no se desactiva en el archivo de configuración general anterior, así que conviene desactivarlo en el del usuario. Aprovechamos también para activar el teclado numérico cuando editamos en vim, algo muy útil porque por defecto viene mapeado como cursores (ojo, cuidar que al final de la linea no haya espacios o se mapearán).

~/.vimrc

:set mouse-=a
inoremap <Esc>Oq 1
inoremap <Esc>Or 2
inoremap <Esc>Os 3
inoremap <Esc>Ot 4
inoremap <Esc>Ou 5
inoremap <Esc>Ov 6
inoremap <Esc>Ow 7
inoremap <Esc>Ox 8
inoremap <Esc>Oy 9
inoremap <Esc>Op 0
inoremap <Esc>On .
inoremap <Esc>OQ /
inoremap <Esc>OR *
inoremap <Esc>Ol +
inoremap <Esc>OS -
inoremap <Esc>OM <Enter>

Color y personalización del prompt de Bash

Editar uno de los siguientes archivos:

vim /etc/bashrc (general)
vim ~/.bashrc (usuario)

… y descomentar las instrucciones que permiten colores con el comando ls. Añadir la variable PS1 con el prompt en color. Visitar http://ezprompt.net/ para personalizarlo facilmente.

# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
#prompt
#personalizaciones en http://ezprompt.net/
export PS1="\[\e[31m\]\u\[\e[m\][\[\e[33m\]\d\[\e[m\]]\[\e[44m\]\W\[\e[m\] "

Instalar Kodi

Si nuestra Raspberry va a ser un centro multimedia, Kodi es indispensable. Hay instrucciones detalladas en este link.

Instalamos kodi:

apt-get update
apt-get install kodi

Podemos instalar numerosos paquetes que extienden la funcionalidad de Kodi. Para echar un vistazo a los que hay:

apt-cache search kodi

En mi caso he instalado adicionalmente lo que pone la guía:

apt-get install kodi-peripheral-joystick kodi-pvr-iptvsimple kodi-inputstream-adaptive kodi-inputstream-rtmp

Con esto podremos ejecutar Kodi desde el escritorio de nuestro Raspbian, pero necesitaremos un ratón conectado al menos y siempre deberemos pasar por el escritorio.

Configuración de RAM para GPU

En Raspberry pi 2/3 al menos debemos dedicar 256 MB de RAM para nuestra tarjeta. Hay que recurrir de nuevo a raspi-config:

raspi-config
Advanced Options -> Memory Split -> 256

Autoarranque de Kodi

Hay que crear un servicio que arranque Kodi. Copiar y pegar esto en consola para crear el archivo del servicio:

sudo tee -a /lib/systemd/system/kodi.service <<_EOF_
[Unit]
Description = Kodi Media Center
After = remote-fs.target network-online.target
Wants = network-online.target

[Service]
User = pi
Group = pi
Type = simple
ExecStart = /usr/bin/kodi-standalone
Restart = on-abort
RestartSec = 5

[Install]
WantedBy = multi-user.target
_EOF_

Luego  hay que activar el servicio:

systemctl enable kodi.service

Al reiniciar tendremos Kodi en la pantalla. Si salimos de Kodi (opción exit, no pwoeroff) aterrizaremos en el escritorio (que entiendo que lo ejecuta en ese momento), aunque en mi caso no se renderiza del todo bien.

Si queremos que detrás de Kodi esté el escritorio ejecutándose para luego salir del primero y aterrizar en un escritorio correctamente renderizado, deberemos editar el autoarranque de nuestro escritorio y simplemente añadir en la primera linea a Kodi:

vim /etc/xdg/lxsession/LXDE-pi/autostart
@kodi
....

Apagar el sistema desde Kodi

Por defecto desde Kodi no se puede apagar el sistema ni montar unidades, hay que darle permisos. Hay que crear un archivo y guardarlo con esta configuración. Propietario y grupo: root.

vim /var/lib/polkit-1/localauthority/50-local.d/50-kodi.pkla

[Actions for kodi user]
Identity=unix-user:kodi
Action=Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.f?reedesktop.udisks.*
ResultActive=yes
ResultAny=yes
ResultInactive=no
chown root:root /var/lib/polkit-1/localauthority/50-local.d/50-kodi.pkla
chmod 0644 /var/lib/polkit-1/localauthority/50-local.d/50-kodi.pkla

Systemas de compartición de ficheros

Algo indiscutiblemente interesante de nuestra Raspberry es su enorme capacidad para compartir ficheros 24/7, tanto dentro de nuestra red doméstica (protocolo SMB) como con el resto de Internet (Torrent, eDonkey, etc).

Instalar MLDonkey

Instalar el servicio de compartición de ficheros mldonkey (eDonkey, BitTorrent…) es relativamente sencillo. Cuando nos pregunte si queremos que mlnet se inicie en el arraque le diremos que NO:

apt-get update
apt-get install mldonkey-server

La instalación crea el usuario mldonkey (que es quien ejecutará el servicio y al que hay que garantizar acceso a los directorios) y el directorio /var/lib/mldonkey, home de este usuario que además contiene todos los archivos compartidos y los ficheros de configuración.

Desde esta home del usuario mldonkey hay que eliminar los directorios de descarga y crear accesos directos a los directorios en el disco duro que contengan dichos archivos:

  • Directorio ./temp (los downloading en progreso)
  • Directorio ./files (los archivos ya bajados)

El servicio se arranca con:

/etc/init.d/mldonkey-server force-start

Yo lo pongo en /etc/rc.local pero siempre DESPUÉS de montar el disco duro que contenga los archivos del media center y tras un sleep de un par de segundos. Si no no iniciará.

El demonio se llama mlnet. Si hay cualquier problema en el arranque revisar los logs:

/var/log/mldonkey/mlnet.log (en mi caso es éste)
/var/lib/mldonkey/mlnet.log (viene también en la documentación)

Instalar Transmission

Para bajar archivos de la red Torrent. El propio Raspbian se baja desde esta red. Para instalarlo simplemente:

apt-get update
apt-get install transmission-daemon

Nada más inatalarlo lo arranca y permanece activo. Lo controlamos con:

service transmission-daemon status | start | stop | restart

Hay que editar el fichero de configuración y cambiar ciertos parámetros para adaptarlos a nuestro sistema. Importante: parar antes el servicio. Debemos asignar un nombre de usuario (no del sistema) y una contraseña para que nos autentifique por HTTP. También es conveniente asignar unos rangos de IPs desde nos conectaremos al servicio. Seguridad ante todo.

service transmission-daemon stop
...
vim /etc/transmission-daemon/settings.json
...
"download-dir": "/mnt/1.4T/torrents",
...
"incomplete-dir": "/mnt/1.4T/torrents/temp",
"incomplete-dir-enabled": true,
...
"rpc-authentication-required": true,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-host-whitelist": "127.0.0.*,192.168.1.*",
"rpc-host-whitelist-enabled": true,
"rpc-password": "LA CONTRASEÑA",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "EL USUARIO",
"rpc-whitelist": "127.0.0.*,192.168.1.*",
"rpc-whitelist-enabled": true,0

Los directorios de bajada de archivos deben tener los permisos máximos:

chmod 777 -R /mnt/1.4T/torrents

Finalmente el servicio está configurado en:

http://IP_LOCAL_RASPBERRY:9091/transmission/web/

Instalar Samba (SMB)

SMB es el protocolo nativo de los equipos Microsoft para la compartición de archivos. Nos servirá para meter en la red de casa a nuestra Raspberry. Por defecto no me venía instalado, así que:

apt-get install samba samba-common-bin

Samba tiene su propia gestión de contraseñas que no comparte con el resto del sistema Linux. Sin embargo mapea los usuarios del sistema y utiliza sus permisos para acceder al sistema de archivos. Por lo tanto para asignar una contraseña (sólo SMB) a un USUARIO existente del sistema Linux:

smbpasswd -a USUARIO (pi)

Es buena idea asignar al usuario «pi» una contraseña para Samba y después dar permisos a «pi» para que acceda correctamente a los directorios que se compartirán. Yo suelo compartir el disco del media center y la propia home de pi con scripts y programas personalizados.

Recordemos un par de comandos Linux para gestión de grupos de usuarios:

id pi -> muestra grupo usuario pi
groupadd samba -> añade el grupo samba
usermod -g samba pi -> añade a pi al grupo samba

Yo suelo añadir al usuario mldnkey en el grupo de pi para que accedan a los mismos directorios sin problemas:

usermod -g pi mldonkey

Finalmente, para compartir un recurso y permitir el acceso sólo al usuario «pi», con máscaras:

  • Archivos:  r+w, r+w, –
  • Directorios:  r+w+x, r+w+x, –
/etc/samba/smb.conf
...
workgroup = RASPUTIN2
...
[share]
   comment = Share Directory
   path = /mnt/media_center
   browseable = Yes
   writeable = Yes
   valid users = pi
   create mask = 0660
   directory mask = 0770
   public = no

Y para gestionar el servicio (start, stop, restart):

systemctl restart smbd

Instalar librerías para display oled SSH116

Mis Raspberrys suelen llevar una pequeña pantalla oled para mostrar información. Son baratas, pequeñas y nítidas. Se comunican por SPI o por I2C, aunque es más que recomendable que éstas sean de la versión I2C, con mejor soporte y menos cableado.

El cableado es sencillisimo, tanto que no merece la pena un pinout. Se alimentan por 3.3V o 5V y los pines SCL y SDA a sus iguales en Raspberry.

raspi-config
Interfacing options -> I2C -> Enable

Debe estar ya instalado, pero en caso de ser necesario hay que instalar el soporte python para poder programar y acceder a este LCD:

apt-get install -y python-dev python3-dev

Averiguamos la dirección i2c de nuestro dispositivo, en mi caso es la 0x3c, la esperable para este tipo de dispositivo en concreto. Buscamos en el bus 1 (en Raspberrys antiguas era el cero):

i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Las librerías propiamente dichas corresponden a Adafruit y debemos bajarlas así:

git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

Una vez bajadas entramos en su directorio e instalamos las librerías para poder usarlas en nuestros proyectos.

cd Adafruit_Python_SSD1306
python setup.py install
python3 setup.py install

La carpeta de ejemplos tiene lo esencial para aprender a manejar esta pantalla.

cd examples

En mi caso la definición del display es 128×64, por lo que hay que cambiarlo en cada ejemplo, si no la visualización será un poco peor. Los ejemplos están preparados para pantalla de 32 lineas, así que tendremos espacio libre.  En esta misma linea habría que cambiar la dirección I2C si fuera distinta de la 0x3c:

# 128x32 display with hardware I2C:
#disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Note you can change the I2C address by passing an i2c_address parameter like:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)