Scripts triple boot Debian 13 x86_64 pour Terra portable tactile

- tripleboot-install.sh : partitionnement + 3x debootstrap automatisé
- install-x86.sh : installation appli adaptée x86
- setup-kiosk.sh : auto-login + Chromium kiosk tactile
- photobooth-x86.service : service systemd x86
- install-tripleboot.md : guide d'installation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 09:53:51 +02:00
parent 32392d3ccd
commit c6fb8cae20
5 changed files with 562 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
# Triple Boot Debian 13 - Terra Portable Tactile
## Materiel
- Terra portable tactile
- NVMe 512 Go
- Ecran tactile integre
## Schema de partitionnement
| # | Partition | Taille | Type | Usage |
|---|--------------|--------|-------|----------|
| 1 | EFI | 512 Mo | FAT32 | Partagee |
| 2 | photobooth | 155 Go | ext4 | Projet 1 |
| 3 | photostation | 155 Go | ext4 | Projet 2 |
| 4 | autre | 155 Go | ext4 | Projet 3 |
| 5 | swap | 8 Go | swap | Partage |
> Disque Terra : NVMe 512 Go (476 Go utiles)
## Preparation
1. Telecharger l'ISO Debian 13 (Trixie) netinst :
https://www.debian.org/devel/debian-installer/
2. Creer une cle USB bootable :
```bash
sudo dd if=debian-13-amd64-netinst.iso of=/dev/sdX bs=4M status=progress
```
## Installation 1 : Photobooth
1. Booter sur la cle USB
2. Choisir "Install" (pas graphique, plus leger)
3. Nom de machine : `photobooth`
4. Utilisateur : `jules`
5. Partitionnement **manuel** :
- Creer partition EFI 512 Mo (FAT32, flag boot)
- Creer partition 150 Go ext4, montee sur `/`
- Creer partition 150 Go ext4 (ne PAS monter, pour photostation)
- Creer partition 145 Go ext4 (ne PAS monter, pour autre)
- Creer partition 8 Go swap
6. Selection logiciels : decocher TOUT sauf "utilitaires usuels du systeme"
- Pas de bureau, pas de serveur web, rien
7. Installer GRUB sur le disque
## Installation 2 : Photostation
1. Booter a nouveau sur la cle USB
2. Nom de machine : `photostation`
3. Partitionnement **manuel** :
- Utiliser la partition EFI existante (512 Mo, monter sur `/boot/efi`)
- Monter la 2eme partition 150 Go sur `/` (formater)
- NE PAS toucher aux autres partitions
- Utiliser le swap existant
4. Meme selection logiciels minimale
5. Installer GRUB (il detectera les autres OS)
## Installation 3 : Autre
1. Meme procedure, sur la 3eme partition 145 Go
2. Nom de machine : `autre`
## Apres les 3 installations
### Renommer les entrees GRUB (depuis n'importe quelle partition)
```bash
sudo nano /etc/grub.d/40_custom
```
Ajouter :
```
menuentry "Photobooth" {
search --no-floppy --fs-uuid --set=root <UUID-PARTITION-1>
linux /boot/vmlinuz root=UUID=<UUID-PARTITION-1> ro quiet splash
initrd /boot/initrd.img
}
menuentry "Photostation" {
search --no-floppy --fs-uuid --set=root <UUID-PARTITION-2>
linux /boot/vmlinuz root=UUID=<UUID-PARTITION-2> ro quiet splash
initrd /boot/initrd.img
}
menuentry "Autre" {
search --no-floppy --fs-uuid --set=root <UUID-PARTITION-3>
linux /boot/vmlinuz root=UUID=<UUID-PARTITION-3> ro quiet splash
initrd /boot/initrd.img
}
```
Puis :
```bash
sudo update-grub
```
### Installer le photobooth (sur la partition photobooth)
```bash
sudo apt install -y git
git clone https://git.copydev.fr/jules/photobooth.git ~/photobooth
cd ~/photobooth
chmod +x scripts/*.sh
sudo bash scripts/install-x86.sh
sudo reboot
```
## Notes
- L'ecran tactile Terra devrait fonctionner out-of-the-box avec le driver evdev/libinput
- Si besoin de calibrer le tactile : `xinput_calibrator`
- Pour changer le projet au boot : maintenir Shift au demarrage pour afficher GRUB
- Timeout GRUB par defaut : 5 secondes, puis boot sur le dernier OS utilise

60
scripts/install-x86.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/bin/bash
# Installation du photobooth sur Debian 13 x86_64 (Terra portable tactile)
set -e
echo "=== Installation Photobooth - Debian 13 x86_64 ==="
# Mise a jour systeme
sudo apt update && sudo apt upgrade -y
# Dependances systeme
sudo apt install -y \
python3 python3-pip python3-venv \
libgphoto2-dev gphoto2 \
cups libcups2-dev \
chromium \
libopencv-dev python3-opencv \
unclutter-xfixes \
git \
xinput \
xdotool
# Repertoire du projet
APP_DIR="/home/jules/photobooth"
# Cloner ou mettre a jour le depot
if [ -d "$APP_DIR" ]; then
echo "Mise a jour du depot..."
cd "$APP_DIR"
git pull
else
echo "Clonage du depot..."
git clone https://git.copydev.fr/jules/photobooth.git "$APP_DIR"
cd "$APP_DIR"
fi
# Creer le venv
python3 -m venv .venv
source .venv/bin/activate
# Installer les dependances Python
pip install -r backend/requirements.txt
# Creer les dossiers de donnees
mkdir -p data/photos data/exports
mkdir -p frontend/assets/overlays frontend/assets/backgrounds frontend/assets/sounds
# Installer le service systemd
sudo cp scripts/photobooth-x86.service /etc/systemd/system/photobooth.service
sudo systemctl daemon-reload
sudo systemctl enable photobooth
# Configurer l'auto-login en mode kiosk
echo ""
echo "=== Configuration auto-login kiosk ==="
sudo bash scripts/setup-kiosk.sh
echo ""
echo "=== Installation terminee ==="
echo "Redemarrer pour lancer le photobooth automatiquement"
echo "Ou manuellement : ./scripts/start.sh"

View File

@@ -0,0 +1,17 @@
[Unit]
Description=Photobooth
After=network.target graphical.target
Wants=graphical.target
[Service]
Type=simple
User=jules
WorkingDirectory=/home/jules/photobooth
ExecStart=/home/jules/photobooth/scripts/start.sh
Restart=always
RestartSec=5
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/jules/.Xauthority
[Install]
WantedBy=graphical.target

69
scripts/setup-kiosk.sh Normal file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
# Configure l'auto-login et le mode kiosk pour le photobooth
# A executer en root
set -e
USER="jules"
echo "--- Configuration auto-login getty ---"
# Auto-login sur tty1 via systemd override
mkdir -p /etc/systemd/system/getty@tty1.service.d
cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf <<EOF
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
EOF
echo "--- Configuration X auto-start ---"
# .bash_profile lance X automatiquement sur tty1
BASH_PROFILE="/home/$USER/.bash_profile"
cat > "$BASH_PROFILE" <<'BASHEOF'
# Auto-start X sur tty1 pour le photobooth kiosk
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
exec startx -- -nocursor
fi
BASHEOF
chown "$USER:$USER" "$BASH_PROFILE"
# .xinitrc lance le photobooth en plein ecran
XINITRC="/home/$USER/.xinitrc"
cat > "$XINITRC" <<'XEOF'
#!/bin/bash
# Desactiver l'ecran de veille et le DPMS
xset s off
xset -dpms
xset s noblank
# Rotation ecran si necessaire (decommenter et ajuster)
# xrandr --output eDP-1 --rotate right
# Attendre le demarrage du backend
sleep 2
# Lancer Chromium en mode kiosk
exec chromium \
--kiosk \
--noerrdialogs \
--disable-infobars \
--disable-translate \
--disable-features=TranslateUI \
--disable-session-crashed-bubble \
--disable-component-update \
--check-for-update-interval=31536000 \
--autoplay-policy=no-user-gesture-required \
--start-fullscreen \
--incognito \
--touch-events=enabled \
--enable-touch-drag-drop \
http://localhost:8080
XEOF
chown "$USER:$USER" "$XINITRC"
chmod +x "$XINITRC"
# Installer xinit si absent
apt install -y xinit x11-xserver-utils
echo "--- Kiosk configure ---"
echo "Au prochain reboot, le photobooth demarrera automatiquement."

View File

@@ -0,0 +1,303 @@
#!/bin/bash
# Triple Boot Debian 13 (Trixie) - Installation automatisee
# A executer depuis une cle USB live Debian/Ubuntu
set -e
# === CONFIGURATION ===
DISK="/dev/nvme0n1"
USER="jules"
PASSWORD="jules" # A changer apres installation
MIRROR="http://deb.debian.org/debian"
SUITE="trixie"
PARTITIONS=("photobooth" "photostation" "autre")
PART_SIZES=("155G" "155G" "155G")
SWAP_SIZE="8G"
EFI_SIZE="512M"
# === COULEURS ===
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERREUR]${NC} $1"; exit 1; }
# === VERIFICATIONS ===
if [ "$EUID" -ne 0 ]; then
error "Ce script doit etre execute en root (sudo)"
fi
if [ ! -b "$DISK" ]; then
error "Disque $DISK non trouve. Verifier avec 'lsblk'"
fi
# Detecter le suffixe de partition (nvme = p1, sda = 1)
if [[ "$DISK" == *"nvme"* ]]; then
PART_PREFIX="${DISK}p"
else
PART_PREFIX="${DISK}"
fi
echo ""
echo "=========================================="
echo " TRIPLE BOOT DEBIAN 13 - TERRA"
echo "=========================================="
echo ""
echo "Disque cible : $DISK"
echo "Partitions : ${PARTITIONS[*]}"
echo ""
warn "TOUTES LES DONNEES SUR $DISK SERONT EFFACEES !"
echo ""
read -p "Continuer ? (oui/non) : " CONFIRM
if [ "$CONFIRM" != "oui" ]; then
echo "Annule."
exit 0
fi
# === INSTALLATION DES OUTILS ===
info "Installation des outils necessaires..."
apt-get update -qq
apt-get install -y -qq debootstrap parted dosfstools arch-install-scripts > /dev/null 2>&1 || {
# arch-install-scripts fournit genfstab, sinon on s'en passe
apt-get install -y -qq debootstrap parted dosfstools > /dev/null 2>&1
}
# === PARTITIONNEMENT ===
info "Partitionnement de $DISK..."
# Effacer la table de partition
wipefs -a "$DISK" > /dev/null 2>&1
sgdisk --zap-all "$DISK" > /dev/null 2>&1 || true
# Creer la table GPT et les partitions
parted -s "$DISK" mklabel gpt
parted -s "$DISK" mkpart "EFI" fat32 1MiB 513MiB
parted -s "$DISK" set 1 esp on
parted -s "$DISK" mkpart "photobooth" ext4 513MiB 159233MiB # ~155 Go
parted -s "$DISK" mkpart "photostation" ext4 159233MiB 318465MiB # ~155 Go
parted -s "$DISK" mkpart "autre" ext4 318465MiB 477697MiB # ~155 Go
parted -s "$DISK" mkpart "swap" linux-swap 477697MiB 485889MiB # ~8 Go
# Attendre que les partitions apparaissent
sleep 2
partprobe "$DISK"
sleep 2
# Formater
info "Formatage des partitions..."
mkfs.fat -F32 "${PART_PREFIX}1"
mkfs.ext4 -q -L "photobooth" "${PART_PREFIX}2"
mkfs.ext4 -q -L "photostation" "${PART_PREFIX}3"
mkfs.ext4 -q -L "autre" "${PART_PREFIX}4"
mkswap -L "swap" "${PART_PREFIX}5"
# Recuperer les UUID
UUID_EFI=$(blkid -s UUID -o value "${PART_PREFIX}1")
UUID_1=$(blkid -s UUID -o value "${PART_PREFIX}2")
UUID_2=$(blkid -s UUID -o value "${PART_PREFIX}3")
UUID_3=$(blkid -s UUID -o value "${PART_PREFIX}4")
UUID_SWAP=$(blkid -s UUID -o value "${PART_PREFIX}5")
UUIDS=("$UUID_1" "$UUID_2" "$UUID_3")
info "Partitionnement termine."
lsblk "$DISK"
# === INSTALLATION DES 3 SYSTEMES ===
install_system() {
local INDEX=$1
local NAME="${PARTITIONS[$INDEX]}"
local PART="${PART_PREFIX}$((INDEX + 2))"
local UUID="${UUIDS[$INDEX]}"
local MNT="/mnt/${NAME}"
info "=== Installation de ${NAME} ($PART) ==="
# Monter
mkdir -p "$MNT"
mount "$PART" "$MNT"
mkdir -p "$MNT/boot/efi"
mount "${PART_PREFIX}1" "$MNT/boot/efi"
# Debootstrap
info " debootstrap ${NAME}..."
debootstrap --arch=amd64 "$SUITE" "$MNT" "$MIRROR"
# fstab
cat > "$MNT/etc/fstab" <<FSTAB
UUID=$UUID / ext4 errors=remount-ro 0 1
UUID=$UUID_EFI /boot/efi vfat umask=0077 0 1
UUID=$UUID_SWAP none swap sw 0 0
FSTAB
# Hostname
echo "$NAME" > "$MNT/etc/hostname"
cat > "$MNT/etc/hosts" <<HOSTS
127.0.0.1 localhost
127.0.1.1 $NAME
HOSTS
# Sources APT
cat > "$MNT/etc/apt/sources.list" <<SOURCES
deb $MIRROR $SUITE main contrib non-free non-free-firmware
deb $MIRROR ${SUITE}-updates main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security ${SUITE}-security main contrib non-free non-free-firmware
SOURCES
# Chroot pour configurer
mount --bind /dev "$MNT/dev"
mount --bind /dev/pts "$MNT/dev/pts"
mount --bind /proc "$MNT/proc"
mount --bind /sys "$MNT/sys"
mount --bind /run "$MNT/run"
# Script de configuration dans le chroot
cat > "$MNT/tmp/setup.sh" <<SETUP
#!/bin/bash
set -e
# Locale et timezone
echo "Europe/Paris" > /etc/timezone
ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
apt-get update -qq
apt-get install -y -qq locales
sed -i 's/# fr_FR.UTF-8/fr_FR.UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=fr_FR.UTF-8
# Installer le noyau, GRUB, firmware et outils de base
apt-get install -y -qq \
linux-image-amd64 \
grub-efi-amd64 \
firmware-linux \
sudo \
network-manager \
openssh-server \
bash-completion \
console-setup \
keyboard-configuration
# Creer l'utilisateur
useradd -m -s /bin/bash -G sudo,video,input,audio $USER
echo "$USER:$PASSWORD" | chpasswd
echo "root:$PASSWORD" | chpasswd
# Sudo sans mot de passe (optionnel, pratique pour le kiosk)
echo "$USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USER
# Activer NetworkManager
systemctl enable NetworkManager
# Configurer le clavier FR
cat > /etc/default/keyboard <<KBD
XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
KBD
SETUP
chmod +x "$MNT/tmp/setup.sh"
chroot "$MNT" /tmp/setup.sh
# GRUB : installer seulement depuis le premier systeme
if [ "$INDEX" -eq 0 ]; then
chroot "$MNT" grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck
fi
# Nettoyer
rm -f "$MNT/tmp/setup.sh"
umount "$MNT/run" "$MNT/sys" "$MNT/proc" "$MNT/dev/pts" "$MNT/dev"
umount "$MNT/boot/efi"
umount "$MNT"
info " ${NAME} installe."
}
# Installer les 3 systemes
for i in 0 1 2; do
install_system "$i"
done
# === CONFIGURATION GRUB FINALE ===
info "Configuration de GRUB..."
MNT="/mnt/photobooth"
mkdir -p "$MNT"
mount "${PART_PREFIX}2" "$MNT"
mount "${PART_PREFIX}1" "$MNT/boot/efi"
mount --bind /dev "$MNT/dev"
mount --bind /dev/pts "$MNT/dev/pts"
mount --bind /proc "$MNT/proc"
mount --bind /sys "$MNT/sys"
mount --bind /run "$MNT/run"
# Creer les entrees GRUB personnalisees
cat > "$MNT/etc/grub.d/40_custom" <<GRUB
#!/bin/sh
exec tail -n +3 \$0
menuentry "Photobooth" {
search --no-floppy --fs-uuid --set=root $UUID_1
linux /boot/vmlinuz-\$(ls /mnt/photobooth/boot/ | grep vmlinuz | head -1 | sed 's/vmlinuz-//') root=UUID=$UUID_1 ro quiet splash
initrd /boot/initrd.img-\$(ls /mnt/photobooth/boot/ | grep initrd | head -1 | sed 's/initrd.img-//')
}
menuentry "Photostation" {
search --no-floppy --fs-uuid --set=root $UUID_2
linux /boot/vmlinuz-\$(ls /mnt/photostation/boot/ | grep vmlinuz | head -1 | sed 's/vmlinuz-//') root=UUID=$UUID_2 ro quiet splash
initrd /boot/initrd.img-\$(ls /mnt/photostation/boot/ | grep initrd | head -1 | sed 's/initrd.img-//')
}
menuentry "Autre" {
search --no-floppy --fs-uuid --set=root $UUID_3
linux /boot/vmlinuz-\$(ls /mnt/autre/boot/ | grep vmlinuz | head -1 | sed 's/vmlinuz-//') root=UUID=$UUID_3 ro quiet splash
initrd /boot/initrd.img-\$(ls /mnt/autre/boot/ | grep initrd | head -1 | sed 's/initrd.img-//')
}
GRUB
chmod +x "$MNT/etc/grub.d/40_custom"
# Desactiver os-prober et les entrees auto pour eviter les doublons
cat > "$MNT/etc/default/grub" <<GRUBCFG
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Triple Boot Terra"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=true
GRUB_DISABLE_RECOVERY=true
GRUBCFG
chroot "$MNT" update-grub
# Nettoyer
umount "$MNT/run" "$MNT/sys" "$MNT/proc" "$MNT/dev/pts" "$MNT/dev"
umount "$MNT/boot/efi"
umount "$MNT"
# === TERMINE ===
echo ""
echo "=========================================="
echo -e "${GREEN} TRIPLE BOOT INSTALLE AVEC SUCCES${NC}"
echo "=========================================="
echo ""
echo " 1. Photobooth (${PART_PREFIX}2)"
echo " 2. Photostation (${PART_PREFIX}3)"
echo " 3. Autre (${PART_PREFIX}4)"
echo ""
echo " Utilisateur : $USER"
echo " Mot de passe : $PASSWORD (a changer !)"
echo ""
echo " Retirer la cle USB et redemarrer."
echo " Au boot, GRUB affichera les 3 choix."
echo ""
echo " Pour installer le photobooth :"
echo " sudo apt install git"
echo " git clone https://git.copydev.fr/jules/photobooth.git ~/photobooth"
echo " cd ~/photobooth && sudo bash scripts/install-x86.sh"
echo ""