Installation Raspberry Pi OS - Version serveur - Optimisation temps d'amorçage et consommation
Mise à jour : Raspi OS 10.6
Ce document fait suite à "Installation Raspberry Pi OS - Version serveur" et décrit différentes mesures permettant de réduire la consommation, le temps de démarrage ou la charge CPU d'un serveur RPi
avec Raspberrypi OS lite (version serveur - mode console)
piloté via SSH par interface wifi avec adressage internet ipv4
tous les autres périphériques (clavier, affichage, bluetooth, ethernet filaire, ports USB, ...) sont inutilisés
Afin de diminuer la charge du processeur, d'accélérer le temps de démarrage et de diminuer la consommation, on cherche à désactiver les fonctions non utilisées, correspondant
à des matériels non utilisés
ou à des fonctions logicielles non utilisées ou que l'on préfère exécuter à la main
Il est recommandé d'effectuer une sauvegarde ou un clonage de la carte SD avant d'effectuer les modifications afin de pouvoir revenir en arrière en cas de problème
$ lsmod |grep bluetooth bluetooth 393216 2 hci_uart,btbcm ecdh_generic 16384 1 bluetooth rfkill 32768 4 bluetooth,cfg80211
$ sudo systemctl status bluetooth ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor pre> Active: active (running) since Tue 2021-11-16 14:47:43 CET; 4min 2s ago .....
Stoper et désactiver le lancement des services au démarrage
Par défaut, les cartes son intégrées sont actives (une sortie son analogique, deux sorties son hdmi). En supposant la vidéo désactivée, une seule carte est détectée
Redémarrer pour faire prendre en compte la modification
$ sudo reboot
Vérification
$ lsmod |grep ipv6
$ ip add show |grep inet6
6.3 - Adresse ip fixe
Pour mémoire
6.4 - Désactivation dhcp pour interface non utilisée
Si une interface, dans l'exemple ci-dessous, eth0 n'est pas utilisée, il est possible de désactiver l'activité de dhcp pour cet interface, ajouter dans le fichier /etc/dhcpcd.conf
$ ip link show eth0 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether dc:a6:32:c9:70:eb brd ff:ff:ff:ff:ff:ff
$ ip route |grep eth0
6.5 - Prévention mode sommeil du wifi
Par défaut, le wifi passe en mode sommeil en cas d'inactivité
Vérifier le mode par défaut
$ iw wlan0 get power_save Power save: on
Vérifier que le mode Power_save est désactivable
$ sudo iwconfig wlan0 power off
$ iw wlan0 get power_save Power save: off
Pour que le mode Power_save reste actif aux prochains redémarrages, ajouter la ligne
iwconfig wlan0 power off
dans le fichier /etc/rc.local, juste avant la dernière ligne exit 0
$ tail -n 2 /etc/rc.local iwconfi wlan0 power off exit 0
Nécessite libc6>=2.17 (pour arm64) et libc6 >=2.4 (pou non arm64)
$ aptitude versions libc6 p 2.31-13+rpi1+deb11u2 stable 500 i 2.31-13+rpt2+rpi1 stable 500
et libusb-1.0-0 >=2:1.0.16
$ aptitude versions libusb-1.0-0 i A 2:1.0.24-3 stable 500
La dépendance à libc6 n'est pas satisfaite, on tente néanmoins l'installation
$ sudo dpkg -i uhubctl_2.4.0-1_armhf.deb
$ uhubctl -v 2.4.0-1
7.2 - Test
Trois hubs sont disponibles
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
État des hubs
$ sudo uhubctl Current status for hub 2 [1d6b:0003 Linux 5.10.78-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps] Port 1: 02a0 power 5gbps Rx.Detect Port 2: 02a0 power 5gbps Rx.Detect Port 3: 02a0 power 5gbps Rx.Detect Port 4: 02a0 power 5gbps Rx.Detect Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps] Port 1: 0100 power Port 2: 0100 power Port 3: 0100 power Port 4: 0100 power Current status for hub 1 [1d6b:0002 Linux 5.10.78-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 2.00, 1 ports, ppps] Port 1: 0507 power highspeed suspend enable connect [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]
Les hubs notés hub 2 et hub 1-1 ci-dessous fournissent (en doublon) les 2 interfaces USB3 et les 2 interfaces USB3
Le hub noté hub 1 est connecté à la prise USB type C (alimentation et prise OTG) et la puissance n'est pas déconnectable
7.3 - Test
Désactivation hubs 1-1 et 2 (simultanément)
$ sudo uhubctl -l 1-1 -a 0 Current status for hub 2 [1d6b:0003 Linux 5.10.63-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps] Port 1: 02a0 power 5gbps Rx.Detect Port 2: 02a0 power 5gbps Rx.Detect Port 3: 02a0 power 5gbps Rx.Detect Port 4: 02a0 power 5gbps Rx.Detect Sent power off request New status for hub 2 [1d6b:0003 Linux 5.10.63-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps] Port 1: 0080 off Port 2: 0080 off Port 3: 0080 off Port 4: 0080 off Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps] Port 1: 0100 power Port 2: 0100 power Port 3: 0100 power Port 4: 0100 power Sent power off request New status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps] Port 1: 0000 off Port 2: 0000 off Port 3: 0000 off Port 4: 0000 off
# Équivalent à $ sudo uhubctl -l 2 -a 0
Tests :
Connecter une clé usb, un clavier, ... sur chacun des 4 ports USB et vérifier qu'aucune détection n'est effectuée par le noyau
$ watch -n 3 "sudo dmesg |tail -2" Toutes les 3,0s: sudo dmesg |tail -2 raspi: Tue Nov 16 21:54:13 2021
[ 6.063732] random: 7 urandom warning(s) missed due to ratelimiting [ 6.121803] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
Les interfaces réseau ethernet et wifi ne sont pas touchées (au moint sur Pi4)
$ ip link show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether dc:a6:32:c9:70:eb brd ff:ff:ff:ff:ff:ff
$ ip link show wlan0 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT group default qlen 1000 link/ether dc:a6:32:c9:70:ec brd ff:ff:ff:ff:ff:ff
Pour désactiver l'alimentation des hubs usb au démarrage, ajouter dans le fichier /etc/rc.local, en avant dernière ligne, avant exit 0
Redémarrer pour vérifier la bonne prise en compte, vérifier que "Current status" est off
$ sudo uhubctl -l 1-1 Current status for hub 2 [1d6b:0003 Linux 5.10.63-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps] Port 1: 0080 off Port 2: 0080 off Port 3: 0080 off Port 4: 0080 off Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps] Port 1: 0000 off Port 2: 0000 off Port 3: 0000 off Port 4: 0000 off
Note : Pour réalimenter les hubs
$ sudo uhubctl -l 1-1 -a 1
8 - Bilan
8.1 - Divers
config.txt
$ cat /boot/config.txt # For more options and information see # http://rpf.io/configtxt # Some settings may impact device functionality. See link above for details
# Additional overlays and parameters are documented /boot/overlays/README
$ systemd-analyze critical-chain The time when unit became active or started is printed after the "@" character. The time the unit took to start is printed after the "+" character.
On note que certains services périodiques (lograte, man-db, mlocate, ...) sont lancés après que la cible multi-user soit atteinte et retardent la disponibilité du système
9 - Désactivation de services systemd
Certains services systemd peuvent être désactivés afin de réduire la charge du processeur pendant l'amorçage et diminuer, s'ils sont sur le chemin critique, le temps d'amorçage. Avant de désactiver un service, il est prudent de vérifier sa fonction en affichant par exemple le fichier associé. Par exemple pour le service keyboard-setup
Parmi eux, exemple de services pouvant être désactivés s'ils ne sont pas utilisés
Désactivation des entrées /dev/input (bouton d'arrêt, ...)
# Désactivation du démon de lecture des /dev/input $ sudo systemctl disable triggerhappy.service
Désactivation de la gestion du clavier
$ sudo systemctl disable keyboard-setup
Désactivation de console-setup
$ sudo systemctl disable console-setup
Désactivation du backlight
$ sudo systemctl disable rpi-display-backlight
Désactivation du passage du gouverneur du CPU de conservative à ondemand, évite les pics de consommation au prix d'une moindre réactivité du processeur
$ sudo systemctl disable raspi-config.service
Désactivation du fichier de swap pour limiter les accès à la carte SD
$ sudo systemctl disable dphys-swapfile.service
Désactivation de la recherche et mise à jour automatique de l'eeprom
Une liste des timers activés avec services et activités associées est fournie par
$ systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES Mon 2021-11-22 00:00:00 CET 5h 46min left Sun 2021-11-21 15:04:33 CET 3h 9min ago logrotate.timer logrotate.service Mon 2021-11-22 00:00:00 CET 5h 46min left Sun 2021-11-21 15:04:33 CET 3h 9min ago man-db.timer man-db.service Mon 2021-11-22 00:00:00 CET 5h 46min left Sun 2021-11-21 15:04:33 CET 3h 9min ago mlocate.timer mlocate.service Mon 2021-11-22 00:30:07 CET 6h left Mon 2021-11-15 18:26:12 CET 5 days ago fstrim.timer fstrim.service Mon 2021-11-22 15:19:51 CET 21h left Sun 2021-11-21 15:19:51 CET 2h 53min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Sun 2021-11-28 03:10:57 CET 6 days left Sun 2021-11-21 15:04:59 CET 3h 8min ago e2scrub_all.timer e2scrub_all.service n/a n/a n/a n/a apt-daily-upgrade.timer apt-daily-upgrade.service n/a n/a n/a n/a apt-daily.timer apt-daily.service
8 timers listed.
Après avoir pris connaissance des services associés, déterminer ceux qui ne sont pas nécessaires et les désactiver via leur timer. Par exemple
Mise à jour du cache de apt
$ sudo systemctl disable apt-daily.timer
Mise à jour des paquets
$ sudo systemctl disable apt-daily-upgrade.timer
Strim des SSDs
$ sudo systemctl disable fstrim.timer
Mise à jour de la base de donnée des manuels
$ sudo systemctl disable man-db.timer
Mise à jour de la base de donnée mlocate
$ sudo systemctl disable mlocate.timer
Il est également possible de désactiver les timers dans une seule commande
$ systemctl list-timers --all NEXT LEFT LAST PASSED UNIT AC> Thu 2021-11-25 17:11:49 CET 11min left n/a n/a systemd-tmpfiles-clean.timer sy> Fri 2021-11-26 00:00:00 CET 7h left Thu 2021-11-25 00:00:13 CET 16h ago logrotate.timer lo> Sun 2021-11-28 03:10:06 CET 2 days left Sun 2021-11-21 15:04:59 CET 4 days ago e2scrub_all.timer e2>
3 timers listed.
les services correspondant ne doivent plus apparaître dans