#!/bin/bash # ============================================================================= # optimize-system.sh - Optimisation Raspberry Pi 4 (2 Go RAM) pour photomaton # ============================================================================= # Usage: sudo bash optimize-system.sh # A executer UNE SEULE FOIS lors du setup initial, puis reboot # ============================================================================= set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } if [ "$EUID" -ne 0 ]; then log_error "Ce script doit etre execute en root (sudo)" exit 1 fi echo "=============================================" echo " Optimisation systeme pour Photomaton" echo " Raspberry Pi 4 - 2 Go RAM" echo " Raspberry Pi OS / Debian 13 Trixie" echo "=============================================" echo "" # ------------------------------------------------------------------- # 0. DETECTION DE L'ENVIRONNEMENT # ------------------------------------------------------------------- log_info "Detection de l'environnement..." # Config.txt : priorite a /boot/firmware/config.txt (Trixie) CONFIG_FILE="" if [ -f /boot/firmware/config.txt ]; then CONFIG_FILE="/boot/firmware/config.txt" elif [ -f /boot/config.txt ]; then CONFIG_FILE="/boot/config.txt" fi log_info " config.txt: ${CONFIG_FILE:-'non trouve'}" # Chromium : s'appelle 'chromium' sous Trixie (pas 'chromium-browser') CHROMIUM_BIN="" if command -v chromium &>/dev/null; then CHROMIUM_BIN="chromium" elif command -v chromium-browser &>/dev/null; then CHROMIUM_BIN="chromium-browser" fi log_info " Chromium: ${CHROMIUM_BIN:-'non trouve'}" # OS OS_PRETTY=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d'"' -f2 || echo "inconnu") log_info " OS: $OS_PRETTY" echo "" # ------------------------------------------------------------------- # 1. SWAP - Augmenter pour compenser les 2 Go de RAM # ------------------------------------------------------------------- log_info "Configuration du swap..." # Verifier si zram est deja actif if zramctl 2>/dev/null | grep -q "zram"; then log_info "zram deja actif, on le conserve" else # Installer zram si pas present (voir section 5) log_info "zram non detecte, sera installe plus bas" fi # Ajouter un swap fichier sur disque en COMPLEMENT de zram # C'est un filet de securite: si zram est plein, le systeme utilise le disque # au lieu de faire un OOM kill (crash) if ! swapon --show | grep -q "/swapfile"; then if [ ! -f /swapfile ]; then log_info "Creation d'un swapfile de 1 Go (filet de securite en complement de zram)..." fallocate -l 1G /swapfile 2>/dev/null || dd if=/dev/zero of=/swapfile bs=1M count=1024 chmod 600 /swapfile mkswap /swapfile log_info "Swapfile 1 Go cree" fi swapon -p 10 /swapfile 2>/dev/null || true # Ajouter au fstab si pas deja present if ! grep -q '/swapfile' /etc/fstab; then echo '/swapfile none swap sw,pri=10 0 0' >> /etc/fstab fi log_info "Swapfile active avec priorite 10 (zram priorite 100 = utilise en premier)" else log_info "Swapfile deja actif" fi # Reduire le swappiness (60 par defaut est trop eleve pour 2 Go) # 10 = le systeme utilise la RAM au maximum avant de swapper echo 'vm.swappiness=10' > /etc/sysctl.d/99-photomaton-swap.conf sysctl -p /etc/sysctl.d/99-photomaton-swap.conf 2>/dev/null || true log_info "Swappiness regle a 10 (etait probablement a 60)" # ------------------------------------------------------------------- # 2. GPU MEMORY - Allouer assez pour la camera sans gaspiller # ------------------------------------------------------------------- log_info "Configuration memoire GPU..." if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then # 128 Mo pour la camera Module 3 (minimum recommande) # Ne pas mettre plus, chaque Mo compte avec 2 Go de RAM if grep -q '^gpu_mem=' "$CONFIG_FILE"; then sed -i 's/^gpu_mem=.*/gpu_mem=128/' "$CONFIG_FILE" else echo 'gpu_mem=128' >> "$CONFIG_FILE" fi # S'assurer que la camera est activee (pour libcamera) # Sur Bookworm+, camera_auto_detect est par defaut if ! grep -q 'camera_auto_detect' "$CONFIG_FILE"; then echo 'camera_auto_detect=1' >> "$CONFIG_FILE" fi log_info "GPU memory = 128 Mo, camera auto-detect active" else log_warn "Fichier config.txt non trouve, configuration GPU manuelle requise" fi # ------------------------------------------------------------------- # 3. DESACTIVER LES SERVICES INUTILES pour liberer la RAM # ------------------------------------------------------------------- log_info "Desactivation des services inutiles..." # Liste des services a desactiver (adapter selon tes besoins) SERVICES_TO_DISABLE=( # Bluetooth (inutile pour le photomaton) "bluetooth.service" "hciuart.service" # ModemManager (pas de modem) "ModemManager.service" # Triggerhappy (raccourcis clavier inutiles) "triggerhappy.service" # Avahi (decouverte reseau, peut interrerer) # "avahi-daemon.service" # Garder si CUPS en a besoin # Apt services automatiques (consomment RAM/CPU en arriere-plan) "apt-daily.timer" "apt-daily-upgrade.timer" "apt-daily.service" "apt-daily-upgrade.service" # Man-db auto update "man-db.timer" # Packagekit (si installe) "packagekit.service" # RPC bind (NFS/RPC, totalement inutile pour un photomaton) "rpcbind.service" "rpcbind.socket" ) for service in "${SERVICES_TO_DISABLE[@]}"; do if systemctl is-enabled "$service" &>/dev/null; then systemctl disable "$service" 2>/dev/null || true systemctl stop "$service" 2>/dev/null || true log_info " Desactive: $service" fi done # Desactiver le Bluetooth au niveau kernel aussi if [ -f "$CONFIG_FILE" ]; then if ! grep -q 'dtoverlay=disable-bt' "$CONFIG_FILE"; then echo 'dtoverlay=disable-bt' >> "$CONFIG_FILE" log_info " Bluetooth desactive au niveau kernel" fi fi # ------------------------------------------------------------------- # 4. OPTIMISATION MEMOIRE - Parametres kernel # ------------------------------------------------------------------- log_info "Optimisation parametres memoire kernel..." cat > /etc/sysctl.d/99-photomaton-memory.conf << 'EOF' # Reduire la pression memoire cache vm.vfs_cache_pressure=200 # Ecriture sur disque plus frequente (eviter accumulation en RAM) vm.dirty_ratio=10 vm.dirty_background_ratio=5 # Limiter la reserve memoire minimale vm.min_free_kbytes=16384 # OOM killer plus agressif sur les gros processus vm.oom_kill_allocating_task=1 EOF sysctl -p /etc/sysctl.d/99-photomaton-memory.conf 2>/dev/null || true log_info "Parametres memoire appliques" # ------------------------------------------------------------------- # 5. ZRAM - Compression memoire (doublement effectif de la RAM) # ------------------------------------------------------------------- log_info "Verification de zram..." if zramctl 2>/dev/null | grep -q "zram"; then log_info "zram deja actif et fonctionnel ($(zramctl --output NAME,ALGORITHM,DISKSIZE --noheadings))" log_info "Aucune modification necessaire" else log_info "zram non detecte, installation..." if ! dpkg -l | grep -q zram-tools; then apt-get update -qq apt-get install -y -qq zram-tools fi cat > /etc/default/zramswap << 'EOF' # Utiliser 50% de la RAM pour zram (compresse ~2x, donc ~2Go supplementaires) ALGO=zstd PERCENT=50 PRIORITY=100 EOF fi systemctl enable zramswap 2>/dev/null || true systemctl restart zramswap 2>/dev/null || true log_info "zram configure (compression memoire active)" # ------------------------------------------------------------------- # 6. TMPFS - Reduire les ecritures disque et accelerer # ------------------------------------------------------------------- log_info "Configuration tmpfs..." # Monter /tmp en RAM (accelere les fichiers temporaires) if ! grep -q 'tmpfs.*/tmp' /etc/fstab; then echo 'tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size=256M 0 0' >> /etc/fstab log_info " /tmp monte en tmpfs (256 Mo)" fi # Logs en RAM pour reduire les ecritures SD (optionnel mais recommande) if ! grep -q 'tmpfs.*/var/log' /etc/fstab; then echo 'tmpfs /var/log tmpfs defaults,noatime,nosuid,nodev,size=64M 0 0' >> /etc/fstab log_info " /var/log monte en tmpfs (64 Mo) - ATTENTION: logs perdus au reboot" fi # ------------------------------------------------------------------- # 7. CHROMIUM / NAVIGATEUR - Optimisation kiosk mode # ------------------------------------------------------------------- log_info "Creation du script de lancement Chromium kiosk..." SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" KIOSK_SCRIPT="${SCRIPT_DIR}/../config/chromium-kiosk.sh" cat > "$KIOSK_SCRIPT" << 'KIOSK_EOF' #!/bin/bash # Lancement de Chromium en mode kiosk pour photomaton # Raspberry Pi OS Trixie (Wayland) # A utiliser dans un fichier .desktop dans ~/Desktop/ # Attendre que photobooth-app soit pret MAX_WAIT=60 WAITED=0 while ! curl -s -o /dev/null --max-time 2 http://127.0.0.1:8083/ 2>/dev/null; do sleep 2 WAITED=$((WAITED + 2)) if [ "$WAITED" -ge "$MAX_WAIT" ]; then echo "photobooth-app non pret apres ${MAX_WAIT}s, lancement quand meme" break fi done # Detecter le binaire Chromium (chromium sous Trixie, chromium-browser avant) CHROMIUM=$(command -v chromium || command -v chromium-browser || echo "chromium") # Lancer Chromium en mode kiosk # - Wayland natif (ozone-platform=wayland) # - Optimisations memoire pour Pi 4 2Go "$CHROMIUM" \ --kiosk \ --accept-lang=fr-FR \ --incognito \ --password-store=basic \ --ozone-platform=wayland \ --enable-features=OverlayScrollbar \ --disable-features=Translate,OverscrollHistoryNavigation \ --noerrdialogs \ --disable-infobars \ --disable-session-crashed-bubble \ --disable-component-update \ --disable-background-networking \ --disable-sync \ --disable-extensions \ --disable-dev-shm-usage \ --no-first-run \ --start-maximized \ --process-per-site \ --js-flags="--max-old-space-size=128" \ --renderer-process-limit=1 \ "http://127.0.0.1:8083/" KIOSK_EOF chmod +x "$KIOSK_SCRIPT" log_info "Script kiosk Chromium cree" # ------------------------------------------------------------------- # 8. OVERCLOCK LEGER (optionnel, stable) # ------------------------------------------------------------------- log_info "Configuration overclock leger..." if [ -f "$CONFIG_FILE" ]; then # Overclock leger et stable pour le Pi 4 # over_voltage=2 est tres conservateur if ! grep -q '^arm_freq=' "$CONFIG_FILE"; then cat >> "$CONFIG_FILE" << 'EOF' # Overclock leger pour photomaton (stable) # Decommenter pour activer: #arm_freq=1800 #over_voltage=2 EOF log_info "Overclock leger prepare (desactive par defaut, decommenter si souhaite)" fi fi # ------------------------------------------------------------------- # 9. CGROUPS - Limiter la memoire de Node-RED si encore utilise # ------------------------------------------------------------------- log_info "Configuration des limites memoire..." # Si Node-RED est installe, creer un override pour limiter sa RAM if systemctl is-enabled nodered.service &>/dev/null 2>&1; then mkdir -p /etc/systemd/system/nodered.service.d/ cat > /etc/systemd/system/nodered.service.d/memory-limit.conf << 'EOF' [Service] MemoryMax=256M MemorySwapMax=128M EOF systemctl daemon-reload log_info "Node-RED limite a 256 Mo RAM max" fi # ------------------------------------------------------------------- # 10. RESEAU - Optimiser pour le WiFi hotspot # ------------------------------------------------------------------- log_info "Optimisation reseau..." cat > /etc/sysctl.d/99-photomaton-network.conf << 'EOF' # Optimiser pour servir les photos via WiFi net.core.somaxconn=256 net.ipv4.tcp_fastopen=3 net.core.netdev_max_backlog=1000 EOF sysctl -p /etc/sysctl.d/99-photomaton-network.conf 2>/dev/null || true log_info "Parametres reseau optimises" # ------------------------------------------------------------------- # RESUME # ------------------------------------------------------------------- echo "" echo "=============================================" echo " Optimisation terminee !" echo "=============================================" echo "" echo "Environnement: $OS_PRETTY" echo "config.txt: ${CONFIG_FILE:-'non trouve'}" echo "" echo "Modifications appliquees:" echo " - Swapfile 1 Go ajoute (filet de securite en complement de zram)" echo " - Swappiness reduit a 10" echo " - GPU memory = 128 Mo (si config.txt present)" echo " - Services inutiles desactives" echo " - Bluetooth desactive" echo " - zram conserve/installe (compression memoire)" echo " - tmpfs pour /tmp et /var/log" echo " - Parametres memoire kernel optimises" echo " - Script kiosk Chromium cree (${CHROMIUM_BIN:-chromium})" echo " - Limites memoire Node-RED (si present)" echo "" echo -e "${YELLOW}IMPORTANT: Redemarrer le Raspberry Pi pour appliquer tous les changements${NC}" echo " sudo reboot" echo "" echo -e "${YELLOW}NOTE: /var/log est en tmpfs - les logs seront perdus au reboot.${NC}" echo " Si vous voulez conserver les logs, commentez la ligne tmpfs /var/log dans /etc/fstab" echo ""