1   RaspberryPi

Author:Andrea Manni
Copyright:GFDL
Version:1.0

Rpi2: breve guida introduttiva per le prime regolazioni. Attualmente in sviluppo sui parametri di una classe C 192.168.0.0/24 (o sulla classe A del CNA eventualmente), la prima release e’ prevista per 8/2/2016 .

Indice degli argomenti

Generato il 2016-02-07 con: http://docutils.sourceforge.net/rst.html

1.1   Installazione sistema operativo base

Il sistema operativo Raspbian (un versione customizzata di Debian) puo’ essere scaricato da: https://www.raspberrypi.org/downloads/raspbian/ sia per l’ultima versione Jessie (Debian 8) che per la precedente Wheezy (Debian 7). Dato che molti tutorial prevedevano la versione 7 non e’ inusuale partire da questa e poi all’occorrenza procedere a un dist-upgrade verso Jessie.

Esempio di download e scrittura:

wget https://downloads.raspberrypi.org/raspbian/images/raspbian-2015-05-07/2015-05-05-raspbian-wheezy.zip
unzip 2015-05-05-raspbian-wheezy.zip
dd bs=4M if=2015-05-05-raspbian-wheezy.img of=/dev/sdd
    # la vostra scheda SD potrebbe essere vista in modo diverso da /dev/sdd:
    # controllare _bene_ prima di procedere a sparare dei dati
    # su un block device!
    # es con dmesg si puo' vedere quale sono stati gli ultimi device
    # visti dal kernel:

dmesg | tail
[83864.192333] sd 24:0:0:0: Attached scsi generic sg2 type 0
[83864.359105] sd 24:0:0:0: [sdd] 62816256 512-byte logical blocks: (32.1 GB/29.9 GiB)
[83864.360266] sd 24:0:0:0: [sdd] Write Protect is off
[83864.360267] sd 24:0:0:0: [sdd] Mode Sense: 21 00 00 00
[83864.361391] sd 24:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA

Questa guida non copre l’installazione del sistema operativo ampiamente trattata nella documentazione ufficiale: https://www.raspberrypi.org/documentation/installation/noobs.md .

1.1.1   Aggiornamento a Jessie

Per passare da una Raspbian Wheezy a Jessie non e’ necessario resinstallare il sistema, basta aggiornare le liste dei repository di apt e fare un dist-upgrade.

/etc/apt/sources.list , aggiornare a:

deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi

Procedere poi per l’aggiornamento:

su
apt-get update
apt-get dist-upgrade

    # probabilmente servira' qualche ulteriore:
apt-get install -f
    # fino all'installazione di tutti i pacchetti,
    # alla fine ripulire il sistema con:

apt-get clean
apt-get autoremove

1.1.2   Rsync dell’intero sistema

La scheda SD e’ molto delicata ed e’ relativamente facile incappare in errori a livello di block device talmente gravi da rendere necessaria una nuova installazione del sistema.

Posto che si abbia fatto un back-up o che ci si trovi in un laboratorio con altre schede simili e’ possibile “mettere in sync” un sistema nuovo con un’altro gia’ completamente configurato:

Da una RPi gia' configurata verso una nuova:
su
rsync --delete -avx /* rpi_nuova:/

    Eventualmente usare --exclude= per evitare di sincronizzare alcune parti:
rsync --delete -avx \
    --exclude=/tmp \
    --exclude=/sys \
    --exclude=/proc \
    --exclude=/home/utente \
    --exclude=/etc/hostname \
    --exclude=/etc/hosts \
    /* root@rpi_nuova:/

Nota: deve essere possibile collegarsi alla RPi nuova via SSH come root, /etc/ssh/sshd_config

PermitRootLogin yes

1.1.3   Consigli

  • Evitare Noobs per creare le immagini
  • fare il resize del filesystem root immediatamente dopo l’istallazione
  • se si monta la scheda SD su un PC fare sempre umount / sync prima di rimuoverla

1.2   Introduzione

Al primo login si dovra’ impostare l’ambiente a riga di comando:

suodo su
    Diventare root
passwd
    Abilitare la password per utente root: raspberry

vim /etc/bash.bashrc
    Abilitare l'autocompletamento, de commentare la stanza:

    # enable bash completion in interactive shells
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

# Per poter utililizzare il completamento bisognera' re-inizializzare bash:
bash

apt-get update
    Aggiornare le liste dei pacchetti

apt-get -d dist-upgrade
    Aggiornamento completo (vedere upgrade) in modalita' download only
    Valutare l'entita' degli aggiornamenti proposti,
    se qualche pacchetto importante e' destinato alla rimozione


apt-get -d dist-upgrade
    Aggiornamento completo

vim /etc/adduser.conf

    # Set this if you want the --add_extra_groups option to adduser to add
    # new users to other groups.
    # This is the list of groups that new non-system users will be added to
    # Default:
    EXTRA_GROUPS="adm dialout cdrom sudo audio video plugdev games users netdev input spi i2c gpio"

    # If ADD_EXTRA_GROUPS is set to something non-zero, the EXTRA_GROUPS
    # option above will be default behavior for adding new, non-system users
    ADD_EXTRA_GROUPS=1

    ...

adduser nome-utente
    creare un utente
su nome-utente

Confrontare con il comando groups i gruppi di appartenenza del proprio utente con quello di default pi. Si noti che senza audio video il Desktop Manager LXDE non funzionera’ correttamente.

Evitare sudo e visudo.

1.2.1   Tests e personalizzazione

Comandi per verificare il corretto funzionamento del sistema, si proceda poi a settare il nome host.

  • uname -a
  • free
  • cat /proc/cpuinfo
  • htop
  • vcgencmd measure_clock arm
  • vcgencmd measure_temp

Modificare:

  • /etc/hostname, aggiornare anche un /etc/hosts il record per 127.0.1.1 al nome attuale
  • /etc/motd con figlet

1.2.2   Ridimensionare il filesystem di root

L’immagina di default installata da Noobs probabilmente non usara’ tutto il block device (scheda SD) disponibile:

su
apt-get install discus
discus
df -h

    La scheda SD dovrebbe essere vista come
ls /dev/mmcblk0

    Verifichiamo le dimensioni di questa
fdisk -s /dev/mmcblk0 | awk '{$1=$1/(1024^2); print $1,"GB";}'
    oppure usando
cfdisk /dev/mmcblk0

Per poter espandere il rootfs su tutto lo spazio disponibile si puo’ utilizzare l’utility raspi-config da utente root, oppure procedere (dopo un backup nel caso si abbia gia’ prodotto dei materiali sulla scheda) a creare le nuove partizioni, ridimensionare i filesystem esistenti con resize2fs, crearne di nuovi con mkfs .

1.2.2.1   Filesystem: avvertenze

Date le caratteristiche fisiche delle schede SD (numero massimo di scritture, sync dei filesystem) si sconsiglia di usare su queste una partizione di swap. Data la fragilita’ del block device e la possibilita’ di interruzioni di corrente nel caso di alimentazione a batteria e’ meglio tenere i filesystem con un journal, quindi ext4. Oppure usare un microcontroller sul campo: i supporti di memorizzazioni sono pensati apposta a resistere a condizioni avverse e il sistema non deve passare da una procedura di boot (e shutdown) in caso di frequenti reset.

All’interno di una LAN si utilizzi uno share NFS per i dati importanti oppure si consideri un disco rigido esterno auto alimentato. Si tenga conto che tutto, compresa la rete, passa sul bus USB sulla RPi (ci sono pero’ altre schede es. OrangePi con la rete indipendente da USB).

In ogni caso e’ opportuna una strategia di backup adeguata alla fragilita’ dei supporti di storaggio e alimentazione.

1.4   SSH

Nota

CNA: assicurarsi che sia per RPi che laptop gli IP siano assegnati fissi a ogni utente.

Abilitare il login senza password via SSH, dall’host remoto:

ssh-keygen
ssh-copy-id user@host

    Advanced:
ssh-keygen -f nome-chiave
ssh-copy-id -i path/nome-chiave user@hosts
ssh -i path/nome-chiave user@hosts

-----
    Test:

ssh utente@host
cat ~/.ssh/authorized_keys

1.4.1   SCP

Esercitazioni con: file, directory, archivi. (dopo il backup):

cd /tmp/
tar -zcf rpi_home.tgz /home/nome_utente

    rsync
rsync -avx /home/pi utente@host:/home/utente/backups/

Per un backup completo essendo il supporto di storaggio principale removibile si consiglia di procedere al backup di questo montandolo direttamente sul sistema ospitante il supporto di backup di destinazione.

1.4.1.1   Esercizi

  • copiare un file - directory con scp con destinazione /tmp

1.4.2   Git

Clonare un archivio con Git: git://git.andreamanni.com/sketchbook_andrea

git clone git://git.andreamanni.com/nome_del_progetto
git clone git://git.andreamanni.com/sketchbook_andrea
    Per aggiornare successivamente la propria copia locale:

cd sketchbook_andrea/ ; git pull

1.4.2.1   Esercizio

Clonare il repo: git://git.drogon.net/wiringPi

1.4.3   Wget

Scaricare un archivio tramite wget: http://lab.piffa.net/sketchbook_andrea.zip:

wget http://lab.piffa.net/sketchbook_andrea.zip
unzip sketchbook_andrea.zip
tree sketchbook_andrea
  • Eventuale: ripasso su pipes e redirezioni output.

1.5   VNC

Installazione del software di VNC sulla scheda:

apt-get install tightvncserver
exit
    # tornare utente di sistema, non root!

tightvncserver
    # configurare la VNC:
    # password accesso:     entrarpi
    # password viewonly     guarda


tightvncserver -geometry 704x675  -depth 16  :1
tightvncserver -geometry 800x600 -depth 16 :1
    lanciare un client con geometria specifica
    come sessione :1
    lo schermo di default e' :0

I file di configurazione della VNC sono in ~/.vnc/ , si consideri in particolare:

raspberrypi:1.pid       PID della vnc, indicativo sessione grafica :1
passwd                  File contenente la password

Nota

Ci sono altri software per la VNC nel caso tightvncserver dovesse mostrare incompatibilita’ con le vostre applicazioni grafiche, widget. Ad es vnc4server che usa le stesse configurazioni. Oppure con KDE su puo’ usare il framework KRFB che puo’ condividere la sessione grafica corrente e non crearne una nuova.

1.5.1   Gestione

Gestione del server:

Killare una sessione:
    tightvncserver -kill :1

Pulire eventuali residui:
    rm /tmp/.X11-unix/X1 /tmp/.X1-lock

1.5.2   Client

Sulla workstation da cui accedere al server VNC sulla RPI:

su
apt-get install xtightvncviewer

La sintassi per lasciare il client VNC e’:

xtightvncviewer NomeHost:session_number
xtightvncviewer IP:sessione_number
xtightvncviewer 192.168.0.1:1

xtightvncviewer -viewonly -p /usr/share/vncpasswd time:1
    Sessione di guarda.sh: non interattiva

Avvertimento

Il nuovo utente deve far parte dei gruppi audio, video altrimenti LXDE avra’ un comportamento anomalo: la barra del menu’ flikering .

1.5.2.1   KRFB

Chi usa KDE puo’ esportare l’intera sessione desktop in corso direttamente da KDE con KRFB che per altro permette di utilizzare tutti gli shortcuts da tastiera:) . Avviare il programma e impostare una password come quella del file vncpasswd per i view-only, al momento dell’accettazione della connessione si puo’ negare la scrittura.

Il problema e’ che lo script di lancio e’ un po’ diverso: tightvncviewer -viewonly -p /usr/share/vncpasswd time . Non prende il suffisso del numero del desktop es. :1 . Quindi bisogna fare un altro script.

guarda.sh

xtightvncviewer -viewonly -p /usr/share/vncpasswd time:1
xtightvncviewer -viewonly -p /usr/share/vncpasswd time

1.5.3   Xorg screen size

Talvolta si ha la necessita’ di dover impostare manualmente la dimensione dello schermo della sessione di Xorg, magari per esportare uno schermo di dimensioni non standard con KRFB.

xrandr -q
visualizzare gli screen mode disponibili
xrandr -s 800×600
cambiare mode
xrandr -s 0
reset screen to original size

Per modificare al volo la risoluzione (mode) del server Xorg:

# La prima modeline si ottiene con cvt:  cvt 800 768

xrandr --newmode "800x768_60.00"   49.75  800 840 920 1040  768 771 781 798 -hsync +vsync
xrandr --addmode LVDS1 "800x768_60.00"
xrandr --output LVDS1 --mode "800x768_60.00"

1.5.4   Xorg

Per lanciare una shell grafica: xinit

xinit  : --
    Eventualmente installare gpm per il mouse

startx
    Per far partire una sessione grafica

lxdm
    Per far partire il login manger grafico,
    killarlo per terminare la sessione grafica.
    Se si usa un login manager come lxdm
    sara questo a gestire la sessione grafica,
    log compresi
    Alternative: kdm sddm gdm lightdm

1.5.5   SSH -X

Eventualmente dato che il server Xorg e’ costruito sul paradigma client-server su rete e’ possibile aprire una singola applicazione grafica remota via SSH, fin tanto che su RPi sia in esecuzione il server Xorg (startx):

Dal client:
ssh -X rpi2 galculator


Da una console remota su RPi:
(questo permette di lanciare da remoto un'applicazione grafica
sul server grafico collegato a un monitor in esecuzione su RPi)

export DISPLAY=:0.0
galculator &

Se si vuole avere una shell installare xterm .

1.6   APT sopravvivenza

Apt e’ il frontend di dpkg, il gestore dei pacchetti. Apt calcola le dipendenza e procura i pacchetti in base agli archivi disponibili in /etc/apt/sources.list. Comandi di base:

apt-cache search gpio
    cercare il termine gpio nella lista di tutti i pacchetti

apt-cache search gpio | grep rasp
    filtrare l'output per il termine rasp

apt-get install raspi-gpio
    installare il pacchetto raspi-gpio

apt-get remove raspi-gpio
    disinstallare il pacchetto

apt-get clean
    pulire la cache dei pacchettin in /var/cache/apt/archives/

apt-get update
    aggornare la lista dei pacchetti

apt-get upgrade
    aggiornare senza cambiamente radicali

apt-get dist-upgrade
    aggiornare tutto il sistema


dpkg -i nome_pacchetto.deb
    installazione manuale di un pacchetto deb senza passare da apt

apt-get install -f
    cercare di recuperare un'installazione non andata a buon fine

dpkg --configure -a
    cercare di recuperare un'installazione interotta

1.6.1   Esercizio: Utilities

Installare / rimuovere i seguenti pacchetti:

apt-get install ncdu discus vim nmap rsync unzip unrar-free less

1.7   CLI fondamentali

Alcune utilities per lavorare a riga di comando.

1.7.1   Tmux

Per lavorare in modalita’ headless (via CLI da remoto) puo’ essere utile utilizzare l’equivalente di un desktop manager per la riga di comando: tmux .

In alternativa si puo’ usare il vecchio screen che resta sempre utile per la funzione di terminale per seriale, es:

screen /dev/ttyAMA0 9600
    connettersi alla seriale di un Arduino a 9600bps

Usare Ctrl + A + k per terminare la sessione di screen, Ctrl + A + i per vedere l’attuale stato e configurazione del terminale.

1.7.2   Editor di testo

Sotto Unix tutto e’ un file quindi gli editor di testo hanno un ruolo fondamentale.

  • Per il primo giorno: nano
  • Per chi vuole un editor avanzato : vim. Per imparare ad usare vim si esegua periodicamente: vimtutor it

1.8   Power limits

The Raspberry Pi model B+ and 2B can supply 600mA/1.2A to downstream USB peripherals, switchable by a firmware setting. This allows the vast majority of USB devices to be connected directly to these models, assuming the upstream power supply has sufficient available current. Very high-current devices or devices can draw a surge current such as certain 3G modems and USB hard disks will still require an external powered USB hub.

The power requirements of the Raspberry Pi increase as you make use of the various interfaces on the Raspberry Pi. The GPIO pins can draw 50mA safely (that is 50mA distributed across all the pins! An individual GPIO pin can only safely draw 16mA), the HDMI port uses 50mA, the camera module requires 250mA, and keyboards and mice can take as little as 100mA or as much as 1000mA! Check the power rating of the devices you plan to connect to the Pi and purchase a power supply accordingly. If you’re not sure, we would advise you to buy a powered hub.

The Model 2B is approximately equivalent to an Athlon Thunderbird running at 1.1GHz: again, it has the much higher-quality graphics that come from using the same GPU as in previous models.

1.9   Wiring GPIO

Installazione:

apt-get install wiringpi

1.9.3   Gpio da shell

Come visto all’esercizio precedente possiamo utlizzare la libreria wiring direttamente a riga di comando o in shell script:

gpio mode 0 out
    Abilita il PIN 17 come output
gpio write 0 1
    Accende il LED
gpio write 0 0
    Spegne il LED

1.10   Python GPIO

Nella distribuzione RaspBian sono installati di default i pacchetti di python-rpi.gpio per Python versione 2 e 3:

root@raspberrypi:/home/pi# dpkg -l | grep gpio
ii  python-rpi.gpio                       0.5.11-1                                armhf        Python GPIO module for Raspberry Pi
ii  python3-rpi.gpio                      0.5.11-1                                armhf        Python 3 GPIO module for Raspberry Pi

Il pacchetto python-rpi.gpio proviene da un archivio esterno a Debian ( http://mirrordirector.raspbian.org/raspbian/ ) quindi per aggiornare la versione installata di default in RaspBian (0.5.11-1) dovrebbe bastare:

su
    password di feafault:   raspberry

apt-get update
apt-getd install python-rpi.gpio python3-rpi.gpio

Verificare la versione ora disponibile:

python
    # console debug
    import RPi.GPIO as GPIO
    print GPIO.VERSION
        python 2
    print(GPIO.VERSION)
        python 3

Installare:

su
apt-get install python3-pip python3-spidev
pip-3.2 install gpiozero


    Per python 2.7:
apt-get install python-spidev
pip install gpiozero

1.10.1   Virtualenv

Installare le RPi.GPIO in un virtualenv di python:

su
apt-get install python-virtualenv
exit
    # utente normale
virtualenv env
source env/bin/activate
    # attiviamo l'enviroment

pip install rpi.gpio
    # installiamo rpi.gpio per python 2.7

python
    # console debug
    import RPi.GPIO as GPIO
    print GPIO.VERSION

1.10.2   Virtualenv 3

Installare le RPi.GPIO in un virtualenv di python con PIP:

source env/bin/activate
    # attiviamo l'enviroment
virtualenv -p /usr/bin/python3 env3
    # instanziamo un virtualenv con una versione specifica di python

source env/bin/activate
    # attiviamo l'enviroment
python --version
    # Test della versione dell'interprete in uso
su
apt-get install python3-dev python3-smbus
    # dipendenza per python 3

pip install rpi.gpio
    # installiamo rpi.gpio per python 3.x

python
    # console debug
    import RPi.GPIO as GPIO
    print(GPIO.VERSION)

1.12   Rete

Per identificare l’indirizzo IP della propria RPi ci sono vari approcci a seconda di quale opzioni hardware / rete si hanno a disposizione.

1.12.1   Log del DHCP

La scheda dopo il boot attiva il client DHCP per richiedere un indirizzo IP a un possibile server presente in rete, se e’ possibile visionare i log di questo si potra’ vedere in tempo reale quale indirizzo IP viene associato alla scheda:

tail -f /var/log/syslog
...
Jan 27 01:27:03 chrome dnsmasq-dhcp[5857]: DHCPDISCOVER(lan) b8:27:eb:92:aa:1d
Jan 27 01:27:03 chrome dnsmasq-dhcp[5857]: DHCPOFFER(lan) 192.168.0.38 b8:27:eb:92:aa:1d
Jan 27 01:27:03 chrome dnsmasq-dhcp[5857]: DHCPREQUEST(lan) 192.168.0.38 b8:27:eb:92:aa:1d
Jan 27 01:27:03 chrome dnsmasq-dhcp[5857]: DHCPACK(lan) 192.168.0.38 b8:27:eb:92:aa:1d rpi2

1.12.2   Postazione desktop

Banale per chi ha a disposizione una postazione desktop: con un monitor HDMI / DVI e una tastiera si puo’ usare il comando /sbin/ifconfig per visualizzare l’attuale configurazione delle schede di rete.

1.12.3   Nmap

Per vedere quali IP sono online sul proprio segmento di rete, quale IP e’ stato assegnato alle schede:

 nmap -sP 192.168.0.0-254
...
Nmap scan report for rpi2.example.com (192.168.0.38)
Host is up (0.00091s latency).

Nel caso per visualizzarne il MAC address:

su
arp -a
...
rpi2 (192.168.0.38) at b8:27:eb:92:aa:1d [ether] on eth0

    oppure:
apt-get install arping
arping  -c 1 rpi2
ARPING 192.168.0.38
60 bytes from b8:27:eb:92:aa:1d (192.168.0.38): index=0 time=11.551 msec

    Si potrebbe provare anche l'inverso: pingare direttamente il MAC

Si tenga conto che utilizzare il MAC address ha senso solo all’interno dello stesso segmento di rete e fin tanto che non ci siano router tra i device. Ad esempio con una RPi collegata alla rete cablata e un portatile su una rete WiFi non sara’ possibile superare il bridge WiFi tra le due reti: dovete almeno collegare un portatile con un RJ45 alla rete cablata.

1.12.4   Seriale

La seriale funzione sempre ma dovete avere un adattatore (tipicamente un FTDI USB o simile) per dialogare con la seriale di RPi. Si tenga ben presente che questa e’ sempre a 3.3v , non ci si azzardi a collegare in qualche modo una seriale RS-232 che va da -15 a +15v, neanche anche una Arduino a 5v senza un logic level converterr o un divisore di voltaggio sul TX della Arduino - RX RPi.

Anche con un FTDI assicurarsi che sia regolato a 3.3v .

Collegati i cavi per lanciare una connessione seriale dal PC verso la RPi:

screen /dev/ttyUSB0 115200
    Per terminare la sessione: [CTR][a] + [k]

Se si connette la seriale e il terminale fin dall’avvio sara’ possibile visualizzare i messaggi di boot del sistema operativo della RPi. Caricato il sistema come di consueto sul TTY della RPi non ci sara’ attivita’: il processo Getty restera’ in attesa che l’operatore digiti nome utente e poi password. Quindi se attaccate la seriale dopo il boot non aspettatevi nessun prompt dalla seriale: getty avra’ gia’ mandato il prompt e sara’ in attesa di un input, non vedrete nulla e non succedera’ nulla a schermo.

Se inviate un [Return] per lo meno Getty vi chiedera’ di nuovo il nome utente e avrete un fedd back dalla seriale, l’importante e’ non farsi prendere dal panico e resettare senza shutdown la scheda perche’ non vedete nessun messaggio dalla scheda appena collegati i cavi.

1.12.4.1   Disabilitare la serial console

La console seriale con i messaggi di boot e il log-in e’ comoda ma se volete usare l’unica seriale disponibile per altri scopi dovrete liberarla dal processo getty che la lega al prompt di log-in.

Il file di configurazione responsabile e’ /etc/inittab, nell’ultima riga:

#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    getty e' viene attivato al boot e riattivato in caso di problemi


#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    Commentato: completamente disabilitato, per rileggere il file
    di configurazione e applicare i cambiamenti:
    telinit q

T0:23:once:/sbin/getty -L ttyAMA0 115200 vt100
    Once: il processo getty viene attivato una volta sola
    e non riattivato se killato::

    ps -aef | grep ttyAMA0
    root      2286     1  0 01:31 ttyAMA0  00:00:00 /sbin/getty -L ttyAMA0 115200 vt100

    kill 2286
        Ora la seriale e' libera ma al prossimo boot partira' nuovamente,
        sara' quindi disponibile in caso di bisogno

1.12.5   Indirizzo IP statico

Nella configurazione di default RPi prende l’indirizzo IP da un DHCP, il file di configurazione della rete e’: /etc/network/interfaces

auto eth0
allow-hotplug eth0
iface eth0 inet manual

Per un esempio di configurazione di un IP statico cambiare la stanza eth0 con:

# The primary network interface for a private IPv4 C class
auto eth0
allow-hotplug  eth0
iface lan inet static
        address 192.168.0.11
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.0.0.254
        dns-nameservers 192.0.0.254
        dns-domain example.com

1.13   Spunti

  • Classi di utenti, privilegi, rischi
  • Editor di testo: nano o vi
  • Repository, aggiornamento liste pacchetti, sistema operativo, upgrade e dist-upgrade, backup
  • History e redirezione output, reset ad ogni sessione
  • light markup languages: https://en.wikipedia.org/wiki/Lightweight_markup_language
  • Eventuale: RST: Sphinx e https://readthedocs.org/ (installazione locale + Apache)
  • advanced: tmux (o magari solo screen che lo usano per le seriali).

1.14   Architetture

1.15   GPIO

  • Blinks dei led di sistema via /proc , wiring , python GPIO
  • Input digitale (controllare alimentazione)
  • PIN limits
  • alimentazione: controllo in tempo reale, sourcing e drain
  • Alimentazione esterna: stepdown, lineare, alimentatori switching, pilotare in corrente e voltaggio

1.16   Arduino - RPi

  • Logic levels: implicazioni, LL converter, divisore di voltaggio: resistivita’ p rho e conduttanza sigma
  • Seriale in echo
  • Seriale per TTY da inittab

1.17   Spegnere il sistema

Per un corretto shutdown:

su
poweroff

shutdown -h orario:spegnimento

1.17.1   Powewr Up

Successivamente a uno shutdown fintanto che il cavo di alimentazione e’ connesso e il LED corrispondente e’ acceso si potra’ avviare la scheda facendo ponte tra i due contatti RUN posti tra i LED e il connettore del display.

1.18   Cross Compiling in C

On X86 Modify sources.list to have:

deb http://ftp.debian.org/debian/ sid main non-free contrib

As often mirrors don’t have Debian armhf port availabe. You need to pull the ftp archive.

Add the right architecture: for ARM we use:

dpkg --add-architecture armhf
apt-get update
dpkg --print-architecture # That's what your host is using
dpkg --print-foreign-architectures  # That's your target enviroments

Now install the cross compiler, Sid should have a pretty well updated version. You may wanna take a snapshot / backup of the system now:

lvcreate -s -L5g -n sid_bak /dev/main/sid
apt-get install crossbuild-essential-armhf

The cross compiler is meant to build code for a Linux system, something like a embedded RaspberryPy running Debian and not a Cortex ARM processor for any microcontroller.

1.18.1   Test the build chain

Take whathever c++ example file:

#include <iostream>                           // a PREPROCESSOR directive
using namespace std;                      // make definitions visible
int main()                                    // function header
{   // start of function body
    cout << "This is ARM code.";  // message
    cout << endl;                             // start a new line
    cout << "You won't regret it!" << endl;   // more output
    return 0;                                 // terminate main()
}                                             // end of function body

And compile it:

arm-linux-gnueabihf-g++ hello.cpp
file a.out

a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=0ecbdddcde90341984c81cddc027d9cb127503c9, not stripped

Questo dovrebbe girare su una OrangePC / RPi:

OrangePI:/tmp:$ dpkg --print-architecture
armhf

Ma possiamo testare il binario su x86 (AMD64) con Qemu:

apt-get install qemu-user-static
apt-get install libicu-dev:armhf

Libraries should go to: /usr/lib/arm-linux-gnueabihf/ .

1.19   Postgresql

1.19.1   Installazione

Vediamo i passi fondamentali per installare il server:

apt-get install postgresql

Ora dovremo creare utenti e database, ma per poter gestire gli utenti dobbiamo prima preoccuparci di come questi contino di accedere a PostgreSQL. Come gia’ accennato i metodi sono fondamentalmente due:

  1. Accesso tramite socket
  2. Accesso tramite TCP/IP via rete

Il primo tipo e’ sicuramente piu’ semplice e non viene appesantito da tutto quanto e’ richiesto per mantenere una connessione TCP/IP tra client (il nostro server web) e server (il server PostgreSQL). La socket e’ disponibile nel file system nel percorso: /var/run/postgresql. Se server web e DBMS sono sullo stesso host questo e’ il metodo piu’ efficiente per connetterli.

Il secondo approccio e’ utile se volete o meglio dovete accedere direttamente al database da remoto, si tenga conto che un client web come phppgadmin e’ in esecuzione sul server e vi permette di accedere al DB senza dover offrire il supporto alla rete. Necessario se DBMS e server web sono su host diversi.

Dopodiche’ dovremo considerare come autenticarci col server, tra le varie opzioni ( http://www.postgresql.org/docs/9.1/static/auth-methods.html ) considereremo:

  1. Thrust: nessuna credenziale richiesta: accesso sempre garantito.
  2. Password: accesso tramite un’accoppiata nome utente / password.
  3. Ident: autenticazione tramite le credenziali dell’utente sull’host in esecuzione. Abilitato di default.

Il file di configurazione in cui andremo ad operare sara’ su un sistema Debian Squeeze: ` /etc/postgresql/9.1/main/pg_hba.conf , vediamo come dovremo modificarlo per alcuni scenari tipici. Si ricorda che per rendere effettivi i cambiamenti apportati si dovra’ eseguire un reload del servizio: /etc/init.d/postgresql reload .

1.19.1.1   Workstation di sviluppo

Semplificando potremmo dire che sulla macchina su cui sviluppate puo’ risultare conveniente la possibilita’ di accedere a qualunque database senza fornire credenziali, ovviamente tramite socket. In questo modo i vostri script potranno connettersi al DBMS a prescindere dell’esistenza di utenti / password corrispondenti al server di produzione. Avremo quindi:

# TYPE          DATABASE    USER        CIDR-ADDRESS          METHOD
local           all         all                               trust

1.19.1.2   Hosting / server pubblico tramite socket

Sul server pubblico si puo’ optare per una accoppiata nome utente / password, per lo meno per evitare che altri utenti del server possano intervenire sul nostro DB. Se l’host ospita sia database che server web si utilizzera’ un socket:

# TYPE          DATABASE    USER        CIDR-ADDRESS          METHOD
local           all         all                               password

Si e’ scelto di usare una password in chiaro dato che la connessione non dovrebbe essere tracciabile da malintenzionati. Vediamo come generare la password per un utente generico (che non deve essere necessariamente esistente sul sistema operativo) myuser con password mypasswd , al quale assegneremo una database mydb.

su postgres
# creiamo un utente:     myuser
# con password:          mypasswd
# L'utente non sara' amministratore, non potra' creare ruoli o database
createuser -DRS -P myuser
...
# Creiamo un database 'phpdp' assegnato all'utente 'myuser'
createdb -O myuser mydb
# Per vedere una lista dei DB disponibili:
psql -l
# termiare la sessione dell'utente postgres
exit

# Per avere una shell sul database
# tornare all'utente di sistema myuser
psql mydb
psql -w mydb myuser

Per una prima introduzione all’uso della shell di PostgreSQL si veda:

1.19.1.3   Hosting / server pubblico tramite rete

Permettere l’accesso al DBMS da rete pone ovvi problemi di sicurezza: cercare di limitare gli accessi (ad esempio su base IP quando i client hanno IP fissi), garantire la confidenzialita’ del traffico.

Vediamo un esempio con un configurazione di rete con i seguenti parametri:

Host IP
Server 192.168.0.1
Client 192.168.0.2

IP statico, database e utente, password. Traffico in chiaro o in SSL se disponibile, autenticazione con hash MD5:

# TYPE          DATABASE    USER        CIDR-ADDRESS          METHOD
host            phpdb       myuser      192.168.0.2/32        md5

Consiglio

In un sistema Debian dovrebbe essere disponibile di default SSL sia per il server che per il client senza bisogno di particolari configurazioni. E’ comunque possibile generare i propri certificati.

Di default il server Postgres ascolta solo su localhost (l’interfaccia di loopback con IP 127.0.0.1), se volete rendere il server raggiungibile da un altro IP assegnato all’host del server dovrete aggiungere al file di configurazione del servizio postgres:

/etc/postgresql/9.1/main/postgresql.conf (riga 60):

listen_addresses = 'localhost , 192.168.0.1'

Si dovra’ riavviare (non basta un reload) Postgres per rendere effettivo il cambiamento:

/etc/init.d/postgresql restart

Possiamo testare la connessione dal client con:

psql -h 192.168.0.1 phpdb -U myuser -W

1.19.2   Utenti

Da root fare un su su postgres::
su postgres createuser -d andrea createdb -O andrea mydb

1.20   TODO @CNA

Checklist per il corso al CNA Modena:

  • Valutare la stabilita’ dell’assegnazone di indirizzi IP dal DHCP interno
  • Se possibile assegnare IP statici e hostname alle RPi
  • Procurare un numero adeguato di FTDI per connessioni seriali sulle RPi (e cavi USB mini USB!)
  • Istruire i ragazzi a recuperare gli IP via seriale

Tabella dei contenuti

Argomento precedente

1   Kit Arduino completo extra lusso

Argomento successivo

1   Testi consigliati

Questa pagina