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
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 .
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
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
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.
Comandi per verificare il corretto funzionamento del sistema, si proceda poi a settare il nome host.
Modificare:
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 .
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.
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
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.
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
Clonare il repo: git://git.drogon.net/wiringPi
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
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.
Gestione del server:
Killare una sessione:
tightvncserver -kill :1
Pulire eventuali residui:
rm /tmp/.X11-unix/X1 /tmp/.X1-lock
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 .
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
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.
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"
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
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 .
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
Installare / rimuovere i seguenti pacchetti:
apt-get install ncdu discus vim nmap rsync unzip unrar-free less
Alcune utilities per lavorare a riga di comando.
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.
Sotto Unix tutto e’ un file quindi gli editor di testo hanno un ruolo fondamentale.
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.
Installazione:
apt-get install wiringpi
Code:
#include <wiringPi.h>
int main (void)
{
wiringPiSetup () ;
pinMode (0, OUTPUT) ; // PIN 0 corrisponde al 17 del cobbler
// vedi gpio readall
while (1)
{
digitalWrite (0, HIGH) ; delay (500) ;
digitalWrite (0, LOW) ; delay (500) ;
}
return 0 ;
}
Per compilare il sorgente si lanci:
gcc -Wall -lwiringPi -o blink blink.c
Nota
Il binario va’ eseguito da utente root, il PIM pu’ fornire ~16ma quindi si usi una resistenza da almeno 86ohms.
Analogo all’esercizio precedente, questo viene pero’ eseguito direttamente dalla shell Bash:
# LED Pin - wiringPi pin 0 is BCM_GPIO 17.
PIN=0
gpio mode $PIN out
while true; do
gpio write $PIN 1
sleep 0.5
gpio write $PIN 0
sleep 0.5
done
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
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
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
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)
Per identificare l’indirizzo IP della propria RPi ci sono vari approcci a seconda di quale opzioni hardware / rete si hanno a disposizione.
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
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.
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.
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.
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
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
Per un corretto shutdown:
su
poweroff
shutdown -h orario:spegnimento
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.
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.
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/ .
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:
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:
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 .
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
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:
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
Checklist per il corso al CNA Modena: