(Modifié le 04/05/2019)

Raspberry PI 3

Pin-out

  • Processeur Quad Core Broadcom 2837 ARMv8 64bit
  • Vitesse du processeur : 1,2 GHz
  • 1 GB RAM
  • BCM43143 WiFi intégré
  • Bluetooth Low Energy (BLE) intégré
  • 40 broches d’extension GPIO
  • 4 ports USB2
  • Sortie vidéo et stéréo
  • Port caméra CSI pour connecter la caméra Raspberry Pi
  • Port d’affichage DSI pour connecter l’écran tactile Raspberry Pi
  • Lecteur de carte Micro SD pour charger votre système d’exploitation et stocker vos données
  • Source d’alimentation Micro USB, supporte maintenant jusqu’à 2,5A

SPI0 SPI1 Pin Out

Raspbian Stretch Lite

Raspbian Stretch Lite (download)

Samsung USB 3.0 Flash Drive FIT 32GB

Le Raspberry Pi 3 est capable de booter sur un stockage USB, disque dur externe ou clé USB.

** /!\ ATTENTION : ** il faut une unité de stockage suffisamment rapide pour être prise en compte

Choix d’une clé Samsung USB 3.0 Flash Drive FIT 32GB
Samsung USB 3.0 Flash Drive FIT 32GB

NOTE:La possibilité de booter sur un stockage USB externe est vérifiable après boot sur une carte SD par la commande vcgencmd otp_dump | grep 17: qui doit afficher 17:3020000a

Insérer la clé Samsung USB 3.0 Flash Drive FIT 32GB sur un des connecteurs USB de l’ordinateur linux
Repérer sur quel périphérique

dmesg
[ 3420.876497] sd 4:0:0:0: [sde] 62652416 512-byte logical blocks: (32.1 GB/29.9 GiB)
[ 3420.877074] sd 4:0:0:0: [sde] Write Protect is off
[ 3420.877081] sd 4:0:0:0: [sde] Mode Sense: 43 00 00 00
[ 3420.877653] sd 4:0:0:0: [sde] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3420.884367]  sde: sde1 sde2
[ 3420.886547] sd 4:0:0:0: [sde] Attached SCSI removable disk

La “Clé USB” est sur le périphérique système /dev/sde

Aller dans le dossier contenant l’image de raspbian

sudo dd bs=4M if=2019-04-08-raspbian-stretch-lite.img of=/dev/sde conv=fsync
445+0 enregistrements lus
445+0 enregistrements écrits
1866465280 octets (1,9 GB, 1,7 GiB) copiés, 145,811 s, 12,8 MB/s

ATTENTION !!! Pas d’accès à la carte raspberry en mode terminal par la liaison série ou SSH
Les dernières versions de Raspbian nécessitent un écran et un clavier, car il n’est plus possible de se connecter directement par la liaison série ou SSH au Raspberry par défaut.

  • Pour réactiver le lancement de SSH au boot ,placer dans la partition boot de la carte SD un fichier nommé ssh, vide et sans extension.
  • Pour la liaison série ,il faut modifier le fichier de configuration **config.txt ** avant insertion de la “Clé USB” dans le raspberry

Identifier le périphérique

dmesg
[ 3420.877074] sd 4:0:0:0: [sde] Write Protect is off
[ 3420.877081] sd 4:0:0:0: [sde] Mode Sense: 43 00 00 00
[ 3420.877653] sd 4:0:0:0: [sde] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3420.884367]  sde: sde1 sde2
[ 3420.886547] sd 4:0:0:0: [sde] Attached SCSI removable disk
[ 3664.644705]  sde: sde1 sde2

Montage de la “Clé USB” (sde1 qui correspond au boot) sur un dossier temporaire :

sudo mkdir -p /mnt/temp        #Créer un dossier de montage temporaire
sudo mount /dev/sde1 /mnt/temp #montage de la partition boot sur /mnt/temp

Modifier le fichier **temp/config.txt **

sudo nano /mnt/temp/config.txt

ajouter en fin de fichier pour activer la liasion série

enable_uart=1

Sauvegarde Crtl x y ou o Entrée
fichier ssh vide dans la partition boot

sudo touch /mnt/temp/ssh

Démontage et insertion “Clé USB” dans le raspberry :

sudo umount /mnt/temp

Après avoir inséré la “Clé USB” dans son logement ,connecté le cordon réseau et la liaison série puis brancher la micro-usb d’alimentation sur la carte raspberry et enfin le DC-Pack sur le secteur.
On peut se connecter soit par la liaison série (A) ou SSH (B)

A - minicom ou screen et un adatateur USB/Série

Interface USB/Série Raspberry
GND 6 (GND)
Rxd 8 (Txd)
Txd 10 (Rxd)

lancer le logiciel de communication (minicom ou screen)

sudo minicom # Débit/Parité/Bits:115200 8N1,Contrôle de flux matériel:Non,Contrôle de flux logiciel:Non  
sudo screen /dev/ttyUSB0 115200

B - Trouver l’adresse avec nmap et utiliser ssh

sudo nmap -T4 -sP 192.168.0.0/24
[...]
Nmap scan report for 192.168.0.41
Host is up (0.00038s latency).
MAC Address: B8:27:EB:54:7E:6A (Raspberry Pi Foundation)
[...]

Connexion SSH

ssh pi@192.168.0.41

Premier boot sur la clé USB

login/motde passe : pi/raspberry
Relever adresse

ip addr show        
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:54:7e:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.41/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a01:e34:eebf:df0:c26a:5794:27e7:5438/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 86091sec preferred_lft 86091sec
    inet6 fe80::8f2a:faf1:46af:fa09/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b8:27:eb:01:2b:3f brd ff:ff:ff:ff:ff:ff

Mise à jour du Firmware

L’utilitaire rpi-update permet de mettre à jour le Firmware de la carte Raspberry.

sudo apt install rpi-update

Exécution de l’utilitaire pour réaliser la mise à jour :

sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13545  100 13545    0     0  18675      0 --:--:-- --:--:-- --:--:-- 18682
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Backing up firmware
 *** Backing up modules 4.14.98-v7+
#############################################################
WARNING: This update bumps to rpi-4.19.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=224931
##############################################################
Would you like to proceed? (y/N)
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    387      0 --:--:-- --:--:-- --:--:--   387
100 58.5M  100 58.5M    0     0   817k      0  0:01:13  0:01:13 --:--:--  832k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.19.37+
 *** depmod 4.19.37-v7+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 18e0a0f9a31e7a3a47d9c4301c7705b980ab0516
 *** A reboot is needed to activate the new firmware

Redémarrage du système :

sudo reboot

Mise à jour des paquets

sudo apt update && sudo apt -y upgrade

Mise à jour distribution Raspbian

sudo apt dist-upgrade

Paramétrage

Connexion pi/raspberry via SSH

ssh pi@192.168.0.41

Paramétrage

Accès configuration raspbian

sudo raspi-config

Wifi
2 Network Options Configure network settings
N2 Wi-fi Enter SSID and passphrase
Country FR
SSID YANN_2GEXT
Mot de passe

Locales


En cas d’erreur locale: Cannot set LC_CTYPE to default locale: No such file or directory , exécuter:
export LC_ALL=C
sudo dpkg-reconfigure locales

Paramètres régionaux

timedatectl
      Local time: Sat 2019-05-04 15:09:49 CEST
  Universal time: Sat 2019-05-04 13:09:49 UTC
        RTC time: n/a
       Time zone: Europe/Paris (CEST, +0200)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Clavier fr

sudo nano /etc/default/keyboard
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT=""
XKBOPTIONS=""

BACKSPACE="guess"

Utilisateur et root

Su raspbian , tous les utilisateurs qui appartiennent au groupe sudo ont les mêmes droits que root

id pi
uid=1000(pi) gid=1000(pi) groupes=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),999(spi),998(i2c),997(gpio)

Changer le mot de passe utilisateur et root

sudo passwd pi
sudo passwd root

hostname

hostnamectl
   Static hostname: raspberrypi
         Icon name: computer
        Machine ID: 3451d71e19fb4ef787b592b6ada3cd77
           Boot ID: 084b078d7ce84c60b084b10cc6a1536f
  Operating System: Raspbian GNU/Linux 9 (stretch)
            Kernel: Linux 4.14.80-v7+
      Architecture: arm

Exécution script sur connexion SSH

Exécuter un fichier utilisateur nommé $HOME/.ssh/rc si présent
Pour tous les utilisateurs exécuter un fichier nommé /etc/ssh/sshrc si présent
Installer les utilitaires curl jq figlet git

sudo apt -y install curl jq figlet git

Le batch

mkdir -p ~/.ssh
nano ~/.ssh/rc
#!/bin/bash

#clear
PROCCOUNT=`ps -Afl | wc -l`  		# nombre de lignes
PROCCOUNT=`expr $PROCCOUNT - 5`		# on ote les non concernées
GROUPZ=`users`
ipinfo=$(curl -s ipinfo.io) 		# info localisation format json
publicip=$(echo $ipinfo | jq -r '.ip')  # extraction des données , installer préalablement "jq"
ville=$(echo $ipinfo | jq -r '.city')
pays=$(echo $ipinfo | jq -r '.country')
cpuname=`cat /proc/cpuinfo |grep 'model name' | cut -d: -f2 | sed -n 1p`
iplink=`ip link show |grep -m 1 "2:" | awk '{print $2}' | cut -d: -f1`

echo "\033[0m\033[1;31m"  
figlet "`hostname --fqdn`"
echo "\033[0m
\033[1;35m    \033[1;37mHostname \033[1;35m= \033[1;32m`hostname`
\033[1;35m  \033[1;37mWired IpV4 \033[1;35m= \033[1;32m`ip addr show $iplink | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\033[1;35m  \033[1;37mWired IpV6 \033[1;35m= \033[1;32m`ip addr show $iplink | grep -E 'inet6' |grep -E 'scope link' | awk '{print $2}' | cut -d/ -f1`
\033[1;35m      \033[1;37mKernel \033[1;35m= \033[1;32m`uname -r`
\033[1;35m      \033[1;37mDebian \033[1;35m= \033[1;32m`cat /etc/debian_version`
\033[1;35m      \033[1;37mUptime \033[1;35m= \033[1;32m`uptime | sed 's/.*up ([^,]*), .*/1/' | sed -e 's/^[ \t]*//'`
\033[1;35m         \033[1;37mCPU \033[1;35m= \033[1;32m`echo $cpuname`
\033[1;35m  \033[1;37mMemory Use \033[1;35m= \033[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\033[1;35m    \033[1;37mUsername \033[1;35m= \033[1;32m`whoami`
\033[1;35m    \033[1;37mSessions \033[1;35m= \033[1;32m`who | grep $USER | wc -l`
\033[1;35m \033[1;37mPublic IpV4 \033[1;35m= \033[1;32m`echo $publicip`
\033[1;35m \033[1;37mPublic IpV6 \033[1;35m= \033[1;32m`ip addr show $iplink | grep -m 1 'inet6\b'  | awk '{print $2}' | cut -d/ -f1`
\033[0m"
df -h /
#curl fr.wttr.in/$ville?0

Effacer motd

sudo rm /etc/motd

Déconnexion puis connexion

SSH + Clés

sur l'ordinateur de bureau
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé xs35v2 pour une liaison SSH avec le serveur KVM.

ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/rpi3

Envoyer la clé publique sur le serveur KVM

scp ~/.ssh/rpi3.pub xsuser@192.168.0.45:/home/xsuser/

sur le Raspberry PI 3
Copier le contenu de la clé publique dans /home/$USER/.ssh/authorized_keys

$ cd ~

Sur le KVM ,créer un dossier .ssh

mkdir -p .ssh
cat /home/$USER/rpi3.pub >> /home/$USER/.ssh/authorized_keys

et donner les droits

chmod 600 /home/$USER/.ssh/authorized_keys

effacer le fichier de la clé

rm /home/$USER/xs35v2.pub

Modifier la configuration serveur SSH

sudo nano /etc/ssh/sshd_config

Modifier

Port = 55029                # si souhaité sinon 22
PasswordAuthentication no

Relancer openSSH

sudo systemctl restart ssh

Accès depuis le poste distant avec la clé privée

ssh -i ~/.ssh/rpi pi@192.168.0.41

IPV6

Adresse inet6 fe80::107e:c702:47df:3f78/64 scope link

La carte n’est joignable de l’internet que par son adresse IPV6
NextHop Freebox permet d’attribuer une adresse IPV6

Prefixe : 2a01:e34:ee6a:b275:://64
Next Hop: fe80::107e:c702:47df:3f78
Passerelle IPV6 Box : fe80::224:d4ff:fea6:aa20

Modifier interface réseau raspbian

sudo nano /etc/dhcpcd.conf # y ajouter ce qui suit
interface eth0
static ip6_address=2a01:e34:ee6a:b275::1/64
static routers=fe80::224:d4ff:fea6:aa20
static domain_name_servers=80.67.169.12 80.67.169.40 2a01:e00::1 2a01:e00::2

Redémarrez pour que les modifications prennent effet :

sudo reboot

Adresse publique IPV6 attribuée

[...]
 inet6 2a01:e34:ee6a:b275::1/64 scope global noprefixroute 
[...]

Parefeu (iptables)

iptables est normalement installé par défaut sur les serveurs.Dans le cas contraire

sudo apt install iptables # debian/ubuntu

Création script /usr/local/sbin/config_firewall pour le serveur

#!/bin/sh

###################
#      IPv4       #
###################

# tout refuser par défaut
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT

# interface lo (loop) accessible
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# maintenir les connexions établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# accepter en entrée le ping (icmp), et les
# connexions sur les ports nécessaires.
iptables -A INPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT

# accepter en sortie le ping, les requêtes HTTP(S), DNS,
# et les connexions sur les ports nécessaires.
iptables -A OUTPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
#iptables -A OUTPUT -p tcp --dport xxxx -j ACCEPT
#iptables -A OUTPUT -p udp --dport xxxx -j ACCEPT


###################
#      IPv6       #
###################

# tout refuser par défaut
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P FORWARD DROP
ip6tables -t filter -P OUTPUT ACCEPT

# interface lo (loop) accessible
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

# maintenir les connexions établies
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# NDP pour toute interface de type broadcast
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT

ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT

# accepter en entrée le ping (icmpv6), les
# connexions entrantes déjà établies et les connexions sur les ports nécessaires.
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -m limit --limit 1/s --limit-burst 1 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p udp --dport 22 -j ACCEPT

# accepter en sortie le ping, les requêtes HTTP(S), DNS,
# et les connexions sur les ports nécessaires.
ip6tables -t filter -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 53 -j ACCEPT
#ip6tables -A OUTPUT -p tcp --dport xxxx -j ACCEPT
#ip6tables -A OUTPUT -p udp --dport xxxx -j ACCEPT

Rendre exécutable et restreindre les droits sur le script

sudo chmod +x /usr/local/sbin/config_firewall
sudo chown root:root /usr/local/sbin/config_firewall
sudo chmod 740 /usr/local/sbin/config_firewall

Exécuter le script /usr/local/sbin/config_firewall

sudo /usr/local/sbin/config_firewall

Installer le paquet iptables-persistent pour définir des règles persistantes après un reboot.

sudo apt install iptables-persistent

Pendant, l’installation du paquet, on vous est demande si vous souhaitez que les règles actuellement en cours d’utilisation soient enregistrées dans le fichier .
Valider Yes/Oui, pour IPV4 comme pour IPV6.

Horloge externe (RTC) pour Raspberry Pi

Module I2C RTC DS1307 (Real Time Clock)

Liaisons entre le connecteur GPIO de la carte Raspberry Pi et le module I2C Real Time Clock DS1307 (5v) ou DS1338 (3.3v)
Le module utilisé est alimenté en 3.3v

RPI Couleur Module RTC RPI désignation
1 Rouge -> Vcc +3.3v
3 Blanc -> SDA GPIO02 (SDA1)
5 Jaune -> SCL GPIO03 (SCL1)
9 Noir -> GND GND

ATTENTION : Utilisation du bus i2c-2

i2c

Activer le port i2c

 sudo raspi-config

Dans le menu Interfacing Options -> P5 I2C il faut rendre actif le port i2c.
Simple vérification

dmesg |grep i2c
        [ 2115.700449] i2c /dev entries driver

Nous allons vérifier que le module RTC est bien détecté
Installation outil de test et vérification bus i2c

sudo apt -y install i2c-tools python-smbus

Les bus détectés

sudo i2cdetect -l
i2c-1	i2c       	bcm2835 I2C adapter             	I2C adapter

Le module est connecté sur le bus 1

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

On voit que le RPi a détecté un composant à l’adresse 0x68 qui d’après la doc constructeur est l’adresse par défaut.Il faut un élément logiciel pour le contrôler (pilote).

Chargement Module RTC ds1307

On va ajouter la gestion du module en éditant le fichier de configuration de boot.

sudo nano /boot/config.txt

Auquel on va ajouter les lignes suivantes à la fin du fichier :

# Module RTC
dtoverlay=i2c-rtc,ds1307

A ce stade, vous devez redémarrez votre système :

sudo reboot

Une fois le système de nouveau actif, éxécuter de nouveau:

sudo i2cdetect -y 1

Vous devriez observer si le prise en charge de l’horloge est effective en obtenant les caractères UU à l’adresse 0X68

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

Il faut désactiver l’horloge qui émule l’horloge hardware fake hwclock avec les instructions suivantes

sudo apt -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove

Exécutez la commande suivante pour éditer le script RTC original.

sudo nano /lib/udev/hwclock-set

Trouvez et commentez les trois lignes suivantes en plaçant # en tête de ligne

if [ -e /run/systemd/system ] ; then
    exit 0
fi

Commenter avec #

#if [ -e /run/systemd/system ] ; then
#    exit 0
#fi

Synchronisation temps entre module Pi et RTC

Maintenant que notre module RTC est branché et que Raspbian et le Raspberry Pi sont correctement configurés, nous devons synchroniser l’heure avec notre module RTC. La raison en est que le temps fourni par un nouveau module RTC sera incorrect.

  1. Vous pouvez lire l’heure directement à partir du module RTC en exécutant la commande suivante si vous l’essayez maintenant, vous remarquerez qu’elle est actuellement très loin de notre temps réel actuel.

    sudo hwclock -D -r

  2. Maintenant avant d’aller de l’avant et de synchroniser l’heure correcte de notre Raspberry Pi à notre module RTC, nous devons exécuter la commande suivante pour nous assurer que l’heure sur le Raspberry Pi est bien correcte, assurez-vous d’être connecté à une connexion Wi-Fi ou Ethernet.

    date

  3. Si l’heure affichée par la commande date est correcte, nous pouvons lancer la commande suivante sur votre Raspberry Pi. Cette commande permet d’écrire l’heure entre le Raspberry Pi et le module RTC.

    sudo hwclock -w

  4. Maintenant, si vous lisez à nouveau l’heure directement depuis le module RTC, vous remarquerez qu’elle a été modifiée à la même heure que celle à laquelle votre Raspberry Pi a été réglé. Vous ne devriez jamais avoir à réexécuter la commande précédente si vous avez une pile dans le module RTC.

    sudo hwclock -r

Vous disposez d’un module RTC entièrement opérationnel qui maintient activement l’heure de votre Raspberry Pi à l’heure correcte, même hors connexion Internet.


Ecran tactile (résistif) TFT LCD 2.8” serial SPI

Raspberry PI/TouchScreen SPI TFT LCD 2.8p (ILI9341)

RPI Aff. Couleur RPI désignation
37 T_IRQ Jaune GPIO_GEN0 GPIO26
  T_D0 relié avec MISO    
  T_DIN relié avec MOSI    
26 T_CS (CS1) Blanc SPI_CE1 GPIO7
  T_CLK relié avec SCLK    
21 MISO Jaune SPI_MISO GPIO9
16 Led Orange GPIO_GEN4 GPIO23
23 SCLK Violet SPI_CLK GPIO11
19 MOSI Bleu SPI_MOSI GPIO10
18 D/C Gris GPIO_GEN5 GPIO24
22 Reset Brun GPIO25
24 CS Vert SPI_CE0 GPIO8
25 GND Noir - alimentation
17 +3.3v/Vcc Rouge + alimentation

Features:

  • Compatible with Raspberry Pi B+ and B
  • Supports Raspbian Operating system
  • 65K colors and 320x240 Pixel Resolution
  • Powered directly off Raspberry Pi
  • Display full GUI output / primary output
  • High Speed 48MHz SPI connection
  • 25 Frames per second
  • Integrated ILI9341 TFT LCD Driver
  • Integrated 4-wire Resistive Touch Panel and XPT2046 Driver

Activation du module SPI

  sudo nano /boot/config.txt

Enlever le commentaire (#) sur la ligne suivante du fichier

  dtparam=spi=on Redémarrer

  sudo reboot

Vérifier chargement module SPI : ls /dev
SPI est actif si /dev/spidev0.1 existe.

Il y a 2 méthodes pour l’affichage:

Utilisation de python

La fiche technique de l’ili9341 SPI LCD est facilement disponible et vous pouvez l’utiliser pour créer votre pilote python. On utilise le pilote écrit par Brian Lavery qui peut être téléchargé sur son github.

ATTENTION ,si méthode A utilisé, il faut revenir à l’état initial

  • Commenter les 2 lignes du fichier /etc/rc.local en ajoutant le caractère # en début de chaque ligne :
    #exec /sbin/modprobe fbtft_device name=adafruit28 speed=48000000 rotate=90 verbose=1
    #sudo sh -c "TERM=linux setterm -blank 0 >/dev/tty0" # pour éviter le passage en veille
  • Oter les 2 commandes en fin de ligne du fichier /boot/cmdline.txt :
    fbcon=map:10 fbcon=font:VGA8x8
  • Modifier le fichier /boot/config.txt , commenter la ligne (ajout # en début de ligne) :
    #dtoverlay=ads7846,cs=1,penirq=26,xmin=200,xmax=3900,ymin=200,ymax=3900,xohms=60,pmax=255,swapxy
    Vérifier ou modifier le paramètre SPI: dtparam=spi=on
    Ajouter au fichier /boot/config.txt : dtoverlay=spi1-1cs Ceci n’activera qu’une seule ligne CS , vous pouvez en avoir jusqu’à 3 sur le bus SPI1. Pour les options voir /boot/overlays/README
  • Redémarrer : sudo reboot

Vérifier

ls /dev/spi*
    /dev/spidev0.0  /dev/spidev0.1  /dev/spidev1.0

Python 2 et 3 + librairies

Installer python 2 et 3, pip et les dépendances de pillow

sudo apt -y install python-pip libjpeg62 libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev python-dev python3-dev python-spidev python3-spidev

Installer SPIDEV (py-spidev)
Télécharger’py-spidev’ et le compiler prêt à l’emploi :

sudo apt update
sudo apt upgrade
cd ~
#git clone https://github.com/doceme/py-spidev.git
git clone https://github.com/Gadgetoid/py-spidev.git
cd py-spidev
#make
#sudo make install
sudo python setup.py install
sudo python3 setup.py install

Vous devriez maintenant être prêt à communiquer avec des cartes d’extension utilisant leurs propres bibliothèques (par exemple PiFace) ou d’autres périphériques SPI (par exemple le MCP3008 ADC).

ili9341 SPI Raspberry (affichage uniquement)

Connexions ili9341 SPI Raspberry Pi

RPI Pin Aff. ili9341 Couleur RPI désignation
37 PEN T_IRQ Jaune GPIO_GEN0 (GPIO26)
  T_D0 relié avec MISO    
  T_DIN relié avec MOSI    
26 T_CS (CS1) Blanc SPI0_CE1 (GPIO7)
  T_CLK relié avec SCLK    
21 SDO(MISO) Jaune SPI0_MISO (GPIO9)
16 Led Orange GPIO_GEN4 GPIO23
23 SCLK Violet SPI0_CLK (GPIO11)
19 SDI(MOSI) Bleu SPI0_MOSI (GPIO10)
18 D/C Gris GPIO_GEN5 (GPIO24)
22 Reset Brun (GPIO25)
24 CS Vert SPI_CE0 (GPIO8)
25 GND Noir - alimentation
17 +3.3v/Vcc Rouge + alimentation

Pour une utilisation sans “led” et “rst”:
Relier rst (brun) de l’afficheur TFT LCD ili9341 au +3.3V
Relier led (orange) de l’afficheur TFT LCD ili9341 au +3.3V

Installer PIL Pillow

sudo pip install Pillow
[...]
Successfully installed Pillow-5.3.0

Démonstration
Une fois que vous avez câblé l’écran LCD ili9341 sur le Pi et que vous avez installé toutes les conditions préalables, cloner le fork du git de Brian Lavery dans votre espace utilisateur sur le Pi

cd ~
git clone https://gitlab.cinay.xyz/spm/rpi-lib-tft-lcd.git
cd rpi-lib-tft-lcd

et exécutez la commande suivante :

python BTS_SPI_LCD_DEMO.py

S’il fonctionne correctement, vous verrez sur le terminal SSH :

Loading image...
Drawing image
Test a long para of text, auto-wrapped into screen lines.
show a font in giant letters
Loading image...
Drawing image
Test a long para of text, auto-wrapped into screen lines.
show a font in giant letters

Et sur l’écran TFT LCD, une séquence de couleur, textes et images …
Arrêt Ctrl + c

ili9341 Python écran tactile

Maintenant que vous avez un écran fonctionnel, il est temps de faire fonctionner l’écran tactile.

Le Raspberry Pi a 2 bus SPI, SPI0 et SPI1. SPI0 peut prendre en charge 2 appareils, nous pouvons donc également connecter la partie tactile à SPI0. La partie Touch est connecté sur SPI0 avec le SPI0_CE1 (SPI0_CE0 est utilisé pour l’affichage).

RPI Pin Aff. ili9341 Couleur RPI désignation
37 T_IRQ Jaune GPIO_GEN0 (GPIO26)
  T_D0 relié avec MISO -> SPI0_MISO (GPIO9)    
  T_DIN relié avec MOSI -> SPI0_MOSI (GPIO10)    
26 T_CS (CS1) Blanc SPI0_CE1 (GPIO7)
  T_CLK relié avec SCLK -> SPI0_CLK (GPIO11)    

Lancer la calibration écran tactile

cd ~/rpi-lib-tft-lcd
python example-tft24T-touch-calibration.py

Suivez les instructions sur votre terminal SSH et vous aurez besoin de votre stylet pour cela…
Une fois fait, vous verrez quelques chiffres d’étalonnage, notez-les. Vous devrez les entrer dans le fichier lib_tft24T.py.

pygame

https://www.pygame.org/wiki/

Installer python3-pip

sudo apt install python3-pip

Installer pygame

sudo apt install python3-pygame

Activer le module

sudo /sbin/modprobe fbtft_device name=adafruit28 speed=48000000 rotate=90 verbose=1

Test test1.py

cd ~/tutorials/pygamelcd/
'''
Created on Jul 12, 2014

@author: jeremyblythe
'''
import pygame
import os
from time import sleep

os.putenv('SDL_FBDEV', '/dev/fb1')
pygame.init()
lcd = pygame.display.set_mode((320, 240))
lcd.fill((255,0,0))
pygame.display.update()
sleep(1)

pygame.mouse.set_visible(False)

lcd.fill((0,0,0))

Exécution

sudo python3 test1.py

Nginx PHP7 MariaDB

Domaine et certificats

                       _   _ _                             
  ___  _   _  ___  ___| |_| (_)_ __   ___  __  ___   _ ____
 / _ \| | | |/ _ \/ __| __| | | '_ \ / _ \ \ \/ / | | |_  /
| (_) | |_| |  __/\__ \ |_| | | | | |  __/_ >  <| |_| |/ / 
 \___/ \__,_|\___||___/\__|_|_|_| |_|\___(_)_/\_\\__, /___|
                                                 |___/     

Installation client acme

cd ~
sudo -s  # en mode super utilisateur
apt install netcat  # prérequis
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install # --nocron 
cd ..
rm -rf acme.sh/

le client est installé dans /root/.acme.sh/

Utilisation clé et code secret avec API OVH

OVH : Création de clé API application
How to use OVH domain api

En mode su , on exporte en local la clé et le code

export OVH_AK="REC23OMyBq2FZrLN"
export OVH_AS="32eqGDOrrF6b1Smj4kFgQdv1zX2DW7US"

Génération des certificats

/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength ec-384 -d ouestline.xyz -d *.ouestline.xyz
[mardi 20 novembre 2018, 21:18:22 (UTC+0100)] Your cert is in  /root/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.cer 
[mardi 20 novembre 2018, 21:18:22 (UTC+0100)] Your cert key is in  /root/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.key 
[mardi 20 novembre 2018, 21:18:22 (UTC+0100)] The intermediate CA cert is in  /root/.acme.sh/ouestline.xyz_ecc/ca.cer 
[mardi 20 novembre 2018, 21:18:22 (UTC+0100)] And the full chain certs is there:  /root/.acme.sh/ouestline.xyz_ecc/fullchain.cer 

Créer des liens

sudo ln -s /root/.acme.sh/ouestline.xyz_ecc/fullchain.cer /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
sudo ln -s /root/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.key /etc/ssl/private/ouestline.xyz.key.pem;

Le fichier de configuration /etc/nginx/conf.d/default.conf

server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name ouestline.xyz *.ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ouestline.xyz;
    root /var/www/ ;

    ssl_certificate /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz.key.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;

    # As suggested by https://cipherli.st/
    ssl_ecdh_curve secp384r1;

    ssl_prefer_server_ciphers on;

    # Ciphers with intermediate compatibility
    #----------------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=intermediate
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

    # Ciphers with modern compatibility
    #---------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
    # Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android < 5.0, Internet Explorer < 10, ...)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';


    # Follows the Web Security Directives from the Mozilla Dev Lab and the Mozilla Obervatory + Partners
    # https://wiki.mozilla.org/Security/Guidelines/Web_Security
    # https://observatory.mozilla.org/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

    index index.php index.html;
        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/run/php/php7.2-fpm.sock;   # PHP7.2
           fastcgi_index index.php;
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $request_filename;
        }
    access_log /var/log/nginx/ouestline.xyz-access.log;
    error_log /var/log/nginx/ouestline.xyz-error.log;
}

Vérifier et relancer nginx

sudo nginx -t
sudo systemctl restart nginx

Lien https://ouestline.xyz

Vérifier la validité TLSV1.3 sur le navigateur