375 lines
13 KiB
Bash
375 lines
13 KiB
Bash
#!/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 ""
|