=================================== 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 . .. sectnum:: .. contents:: Indice degli argomenti .. |date| date:: Generato il |date| con: http://docutils.sourceforge.net/rst.html 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 . 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 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 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 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. 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 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`` . 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. Hardware: raspi-config ======================= * Tutorial: https://learn.adafruit.com/adafruits-raspberry-pi-lesson-2-first-time-configuration * Settare la timezone, installare ntp-debian SSH ==== .. NOTE:: 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 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. Esercizi ~~~~~~~~~~~~~~ * copiare un file - directory con scp con destinazione /tmp 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 * Guida ufficiale: http://git-scm.com/documentation * Vuoi il tuo archivio git personale? Usa GitHub: https://github.com/ Esercizio ~~~~~~~~~~~~ Clonare il repo: git://git.drogon.net/wiringPi 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. 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 .. note:: 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 --------------- Gestione del server:: Killare una sessione: tightvncserver -kill :1 Pulire eventuali residui: rm /tmp/.X11-unix/X1 /tmp/.X1-lock 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 .. warning:: Il nuovo utente deve far parte dei gruppi audio, video altrimenti LXDE avra' un comportamento anomalo: la barra del menu' flikering . 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 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" 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 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`` . 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 * La lista degli archivi utilizzati: /etc/apt/sources.list * APT HOWTO https://www.debian.org/doc/manuals/apt-howto/index.it.html Esercizio: Utilities --------------------- Installare / rimuovere i seguenti pacchetti:: apt-get install ncdu discus vim nmap rsync unzip unrar-free less CLI fondamentali ====================== Alcune utilities per lavorare a riga di comando. 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 . * Comandi di base: https://gist.github.com/MohamedAlaa/2961058 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. 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`` 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. * from https://www.raspberrypi.org/help/faqs/#topPower 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. Wiring GPIO ============= Installazione:: apt-get install wiringpi * Esempi: http://wiringpi.com/examples/blink/ * Altri esempi scaricando: git clone git://git.drogon.net/wiringPi Blink -------- Code:: #include 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 .. NOTE:: Il binario va' eseguito da utente root, il PIM pu' fornire ~16ma quindi si usi una resistenza da almeno 86ohms. * Schema della mappatura dei PIN con Wiring: ``gpio readall`` * Scema dei PIN del Cobbler di Adafruit: http://www.electrokit.com/public/upload/productimage/52477-18325-4.jpg * PIN di RPi2: https://ms-iot.github.io/content/images/PinMappings/RP2_Pinout.png Blink.sh ----------- 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 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 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 * Esercizi: https://www.raspberrypi.org/learning/getting-started-with-gpio-zero/ 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 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) /sys GPIO =========== Tutorial da: https://sites.google.com/site/semilleroadt/raspberry-pi-tutorials/gpio Rete ======= Per identificare l'indirizzo IP della propria RPi ci sono vari approcci a seconda di quale opzioni hardware / rete si hanno a disposizione. 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 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. 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. 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. 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 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 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). Architetture ================= * Differenze tra x86 - amd64 - armel - armhf ( - arm) * Arm v6 senza FPU Floating Point Unit: STM32 ARMv6 * Cortex mr34: FPU opzionale, M4F , Armv-7 * IoT: ESP8266 con WiFi integrato: http://wiki.piffa.net/index.php/ESP8266 * Elenco dei Cortex: https://en.wikipedia.org/wiki/ARM_Cortex-M * Alternative: http://www.ti.com/tool/MSP-EXP432P401R - PSOC : http://www.cypress.com/products/psoc-5lp - PIC http://www.microchip.com/pagehandler/en-us/products/picmicrocontrollers * Prospettive: FPGA: http://lab.piffa.net/lista.html#id13 * FPGA SOC: Cortex + FPGA http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=941 * Cloni: http://wiki.piffa.net/index.php/OrangePiPc * Astrazione hardware: datasheet atmega328p * Embedded e microcontrollori, SOC, SOB * Campi uso, batterie, consumi, stabilita' filesystem, caricamento sistema vs. instant on, procedure di shutdown * astrazione: assembler - c - C++ incapsulamento - Librerie - RTOS - Scheduler - HAL - linguaggi interpretati * crosscompile in C: http://notes.andreamanni.com/arm.html * script in python * differenze tra compilatore - interprete - VM * GPIO: wiring e pythongpio 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 Arduino - RPi ================= * Logic levels: implicazioni, LL converter, divisore di voltaggio: resistivita' p rho e conduttanza sigma * Seriale in echo * Seriale per TTY da inittab Spegnere il sistema ===================== Per un corretto shutdown:: su poweroff shutdown -h orario:spegnimento 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. 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. Test the build chain ------------------------- Take whathever c++ example file:: #include // 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/`` . Postgresql ============== 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`` . 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 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: - http://www.postgresql.org/docs/9.1/static/tutorial.html - http://www.faqs.org/docs/ppbook/c4890.htm#AEN4903 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 .. HINT:: 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 Utenti -------------- Da ``root`` fare un su su postgres:: su postgres createuser -d andrea createdb -O andrea mydb 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 Links ========== * Info generali: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/ * https://www.raspberrypi.org/help/quick-start-guide/ * IMG: http://1.bp.blogspot.com/-78uIscNt6tk/VV30MPwMXfI/AAAAAAAAEK0/1Gcf4G_rUK4/s1600/raspberry_pi_b_top1_1.png * Schemi CPU - architettura: https://wolfpaulus.com/journal/embedded/raspberrypi_boot/ * https://learn.adafruit.com/introducing-the-raspberry-pi-2-model-b * Infografica: What RPi can do: http://www.computersciencezone.org/wp-content/uploads/2014/06/Raspberry-Pi.jpg * https://github.com/raspberrypi/documentation * "Datasheet": https://www.adafruit.com/pdfs/raspberrypi2modelb.pdf * PINs: http://pinout.xyz/ * Comparison linguaggi per GPIO: http://elinux.org/RPi_GPIO_Code_Samples#C