Debian diskless via FOG / iPXE + iSCSI

Procédure validée : le PC sans disque démarre en PXE, iPXE ouvre un LUN iSCSI Synology, GRUB charge Debian puis l’initramfs reprend la session iSCSI pour monter la racine.

Navigation rapide — Debian diskless iSCSI

Architecture validée

PC physique sans disque
  ↓ PXE
FOG / iPXE
  ↓ sanboot iSCSI TCP 3260
Synology 192.168.0.13
  ↓ Target iSCSI / LUN 1
GRUB installé sur le LUN
  ↓
Kernel + initramfs Debian
  ↓ DHCP + open-iscsi / iscsistart
Reconnexion au même LUN
  ↓
root=UUID=... → Debian opérationnel
Test validé : Debian 13 démarre sur un PC physique sans disque local, avec le système installé sur un LUN iSCSI Synology.

1. Préparer Debian sur le LUN iSCSI

Créer le LUN sur le NAS puis le présenter temporairement à une VM Proxmox. Installer Debian normalement sur ce disque. Proxmox masque alors le transport iSCSI et Debian voit un disque classique.

Ne jamais présenter le même LUN en lecture/écriture à la VM et au PC physique en même temps. Éteindre la VM et détacher le LUN avant le test PXE.

Identifier l’UUID de la partition racine :

lsblk -f
cat /etc/fstab

Exemple validé :

UUID=544b21d0-faf8-4cf6-b8a0-f85d0ed731a7 / ext4 errors=remount-ro 0 1

2. Ajouter iSCSI à l’initramfs Debian

Dans Debian démarré depuis la VM :

su -
apt update
apt install open-iscsi initramfs-tools

Vérifier que l’initramfs contient les éléments nécessaires :

lsinitramfs /boot/initrd.img-$(uname -r) | grep -E 'iscsi|r8169' | head -30

On doit notamment retrouver iscsi_tcp, iscsi_ibft, iscsistart, les scripts local-top/iscsi et le pilote réseau du poste physique.

Reconstruire :

update-initramfs -u -k all

3. GRUB : connexion iSCSI puis root par UUID

Le point important est l’ordre des paramètres root=. Debian doit d’abord recevoir le paramètre iSCSI pour ouvrir le LUN, puis le dernier root= doit désigner la vraie partition racine.

nano /etc/default/grub

Configuration validée :

GRUB_CMDLINE_LINUX_DEFAULT="ip=dhcp root=iscsi:192.168.0.13:6:3260:1:iqn.2000-01.com.synology:Nas-Synology.Target-2.5aaa499fd71 root=UUID=544b21d0-faf8-4cf6-b8a0-f85d0ed731a7"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_LINUX_UUID=true

Puis :

update-grub

Contrôler la ligne générée :

grep -n "linux   /boot/vmlinuz" /boot/grub/grub.cfg | head

Résultat attendu, dans cet ordre :

root=/dev/sda1 ro ip=dhcp root=iscsi:192.168.0.13:6:3260:1:IQN_TARGET root=UUID=UUID_DE_LA_RACINE
6 = TCP, 3260 = port iSCSI, 1 = numéro de LUN utilisé dans cette configuration Synology. Adapter l’IP, le LUN, l’IQN et l’UUID à chaque installation.

4. Entrée FOG/iPXE finale

Après extinction de la VM et détachement du LUN de Proxmox, créer l’entrée iPXE :

sanboot iscsi:192.168.0.13:::1:iqn.2000-01.com.synology:Nas-Synology.Target-2.5aaa499fd71

Le 1 est indispensable ici si le disque est exposé en LUN 1. Sans lui, le test a produit Could not open SAN device: Input/output error.

Flux réseau nécessaire :

Client PXE → NAS Synology : TCP 3260

5. Diagnostic du boot

  • Could not open SAN device: Input/output error → vérifier le numéro de LUN dans l’URI iPXE ; dans le test validé il fallait :::1:.
  • Gave up waiting for root file system device / UUID absent → le kernel a démarré mais l’initramfs n’a pas repris le disque iSCSI.
  • iscsistart ... session exists → une session existe déjà ; vérifier surtout si le disque et ses partitions apparaissent ensuite.
  • sdb: sdb1 ... Attached SCSI disk → la reprise iSCSI fonctionne ; si le boot bloque ensuite, vérifier l’ordre des paramètres root=.
  • mount: bad address 'iscsi'root=iscsi:root= doit être l’UUID de la partition Debian.

Pour récupérer temporairement une VM après une mauvaise ligne GRUB : au menu GRUB, appuyer sur e, supprimer pour ce boot les paramètres ip=dhcp root=iscsi:..., conserver root=UUID=... ro, puis démarrer avec Ctrl+X.

À retenir

iPXE sait amorcer le LUN, mais le kernel Linux doit ensuite reprendre lui-même la session iSCSI. Sous Debian, open-iscsi dans l’initramfs et une ligne GRUB explicite permettent ce passage. Le root NFS/OverlayFS utilisé dans les essais précédents n’est plus nécessaire pour le système diskless.

6. Transformer le Debian diskless en console rétro

Configuration validée sur PC physique : le système Debian reste sur le LUN iSCSI, tandis que les ROMs sont centralisées sur le Synology via NFS.

PXE → FOG/iPXE → LUN iSCSI → Debian 13 → LightDM/Openbox → ES-DE → RetroArch
                                      └→ NFS /mnt/roms pour les ROMs
Ne pas remettre le système sur NFS : NFS sert uniquement aux ROMs. Le système et les fichiers de configuration restent sur le LUN iSCSI.

7. Interface graphique minimale et firmware AMD

Installer Xorg, LightDM, Openbox et RetroArch :

su -
apt update
apt install --no-install-recommends xorg xserver-xorg-video-all xserver-xorg-input-all \
  lightdm lightdm-gtk-greeter openbox dbus-x11
apt install retroarch joystick evtest unzip p7zip-full curl wget

Sur une Radeon RX 6600/Navi 23, le pilote amdgpu était présent mais les firmwares manquaient. Symptômes : LightDM actif, aucun Xorg, aucun /dev/dri et erreurs dimgrey_cavefish_*.bin (-2).

apt install firmware-amd-graphics firmware-realtek
update-initramfs -u -k all
reboot

Contrôle :

ls -l /dev/dri/
lspci -nnk | grep -A4 -Ei 'VGA|3D|Display'

Après connexion LightDM, un écran noir avec seulement le curseur est normal avec Openbox minimal : aucun bureau complet n'est lancé.

8. RetroArch et cores Debian

Pour certains cores, activer les composants APT contrib non-free non-free-firmware en plus de main, puis :

apt update
apt install -y libretro-core-info libretro-nestopia libretro-snes9x \
  libretro-genesisplusgx libretro-gambatte libretro-mgba libretro-desmume

Contrôle :

find /usr/lib -name '*libretro.so' | sort

Cores validés :

NES        → Nestopia
SNES       → Snes9x
Mega Drive → Genesis Plus GX
GB / GBC   → Gambatte
GBA        → mGBA
Nintendo DS→ DeSmuME

9. ROMs sur Synology en NFS

Configuration réellement utilisée :

NAS : 192.168.0.13
Export : /volume2/roms
Montage Debian : /mnt/roms

Installer et tester :

apt install -y nfs-common
mkdir -p /mnt/roms
mount -t nfs -o vers=4 192.168.0.13:/volume2/roms /mnt/roms
df -h /mnt/roms
ls -la /mnt/roms

Montage permanent dans /etc/fstab :

192.168.0.13:/volume2/roms /mnt/roms nfs4 rw,_netdev,x-systemd.automount,nofail 0 0

Puis :

systemctl daemon-reload
mount -a
mount | grep /mnt/roms
x-systemd.automount évite de bloquer le démarrage si le NAS répond lentement.

Les noms de dossiers ES-DE ont de l'importance et Linux distingue majuscules/minuscules :

/mnt/roms/nes/       → NES
/mnt/roms/snes/      → Super Nintendo
/mnt/roms/gb/        → Game Boy
/mnt/roms/gbc/       → Game Boy Color
/mnt/roms/gba/       → Game Boy Advance
/mnt/roms/megadrive/ → Mega Drive
/mnt/roms/nds/       → Nintendo DS
/mnt/roms/n64/       → Nintendo 64

Exemple : une ROM .sfc est une ROM SNES et doit être placée dans /mnt/roms/snes/.

10. ES-DE

ES-DE est lancé sous forme AppImage dans le compte jedi :

mkdir -p ~/Applications
cd ~/Applications
chmod +x ES-DE_x64.AppImage

Test depuis SSH dans la session graphique X11 :

DISPLAY=:0 XAUTHORITY=/home/jedi/.Xauthority ~/Applications/ES-DE_x64.AppImage

Au premier lancement, choisir /mnt/roms comme répertoire des ROMs. Les données ES-DE sont créées dans /home/jedi/ES-DE/.

11. Audio PipeWire / HDMI

Si ES-DE affiche ALSA: Couldn't open audio device, installer la pile audio utilisateur :

su -
apt install -y alsa-utils pipewire pipewire-audio wireplumber
exit
systemctl --user enable --now pipewire pipewire-pulse wireplumber

Contrôler :

aplay -l
wpctl status

Sur le poste validé, la sortie HDMI/DP de la RX 6600 était l'ID 56 :

wpctl set-default 56
wpctl set-volume 56 0.8
speaker-test -D pipewire -c 2 -t wav
L'ID PipeWire peut changer selon le matériel ou le démarrage. Toujours vérifier avec wpctl status avant de reprendre un numéro d'exemple.

12. Démarrage automatique : autologin + ES-DE

Dans /etc/lightdm/lightdm.conf :

[Seat:*]
autologin-user=jedi
autologin-user-timeout=0
user-session=openbox

Créer /home/jedi/.config/openbox/autostart. Il faut déclencher le montage NFS avant ES-DE, sinon ES-DE peut redemander le chemin des ROMs :

# Déclenche le montage NFS
ls /mnt/roms >/dev/null 2>&1

# Attend que le montage soit disponible
while ! mountpoint -q /mnt/roms; do
    sleep 1
done

# Lance ES-DE
/home/jedi/Applications/ES-DE_x64.AppImage &

Puis :

chmod +x /home/jedi/.config/openbox/autostart
reboot

Résultat validé :

Allumage → PXE → FOG/iPXE → iSCSI → Debian → autologin → NFS ROMs → ES-DE

13. Arrêt / redémarrage propre depuis ES-DE — méthode validée

Dans la configuration testée, ES-DE ne proposait pas directement d’option Shutdown. La méthode validée consiste à faire exécuter l’arrêt par Openbox, puis à déclencher le raccourci Openbox depuis un faux système ES-DE à l’aide de xdotool.

Ne jamais couper brutalement l’alimentation : Debian écrit sur le LUN iSCSI et RetroArch peut écrire une sauvegarde. Utiliser systemctl poweroff ou le choix « Éteindre » créé dans ES-DE.

13.1 Autoriser uniquement poweroff et reboot sans mot de passe

su -
apt install -y sudo
nano /etc/sudoers.d/esde-power

Contenu :

jedi ALL=(root) NOPASSWD: /usr/bin/systemctl poweroff, /usr/bin/systemctl reboot

Permissions et validation :

chmod 440 /etc/sudoers.d/esde-power
visudo -cf /etc/sudoers.d/esde-power
exit
sudo -l

Résultat attendu :

(root) NOPASSWD: /usr/bin/systemctl poweroff, /usr/bin/systemctl reboot
sudo reboot peut appeler /usr/sbin/reboot et n’est donc pas couvert par cette règle. La commande validée est sudo -n /usr/bin/systemctl reboot ou sudo -n /usr/bin/systemctl poweroff.

13.2 Créer deux raccourcis globaux Openbox

Créer ou sauvegarder la configuration Openbox :

mkdir -p ~/.config/openbox
[ -f ~/.config/openbox/rc.xml ] && cp ~/.config/openbox/rc.xml ~/.config/openbox/rc.xml.bak
nano ~/.config/openbox/rc.xml

Configuration minimale validée :

<?xml version="1.0" encoding="UTF-8"?>
<openbox_config xmlns="http://openbox.org/3.4/rc">
  <keyboard>
    <keybind key="C-A-End">
      <action name="Execute">
        <command>sudo /usr/bin/systemctl poweroff</command>
      </action>
    </keybind>
    <keybind key="C-A-Home">
      <action name="Execute">
        <command>sudo /usr/bin/systemctl reboot</command>
      </action>
    </keybind>
  </keyboard>
</openbox_config>

Vérifier la syntaxe XML et recharger Openbox depuis SSH :

su -
apt install -y libxml2-utils
exit
xmllint --noout ~/.config/openbox/rc.xml
DISPLAY=:0 XAUTHORITY=/home/jedi/.Xauthority openbox --reconfigure

Tests clavier validés :

Ctrl + Alt + Home  → redémarrage propre
Ctrl + Alt + End   → arrêt propre

13.3 Ajouter « Éteindre » et « Redémarrer » comme choix dans ES-DE

Installer xdotool :

su -
apt install -y xdotool
exit

Créer le système personnalisé ES-DE :

mkdir -p ~/ES-DE/custom_systems ~/ES-DE/systemtools
nano ~/ES-DE/custom_systems/es_systems.xml

Contenu validé :

<?xml version="1.0"?>
<systemList>
  <system>
    <name>systemtools</name>
    <fullname>Système</fullname>
    <path>/home/jedi/ES-DE/systemtools</path>
    <extension>.sh</extension>
    <command label="Commande système">%STARTDIR%=%GAMEDIR% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%</command>
    <platform>pc</platform>
    <theme>systemtools</theme>
  </system>
</systemList>

Créer les deux entrées :

cat > ~/ES-DE/systemtools/Redémarrer.sh <<'EOF'
#!/bin/bash
xdotool key ctrl+alt+Home
EOF

cat > ~/ES-DE/systemtools/Éteindre.sh <<'EOF'
#!/bin/bash
xdotool key ctrl+alt+End
EOF

chmod +x ~/ES-DE/systemtools/*.sh

Quitter complètement ES-DE puis le relancer. Le système Système contient alors deux éléments sélectionnables à la manette :

Système
├── Éteindre
└── Redémarrer

Chaîne réellement validée :

ES-DE → script .sh → xdotool → raccourci Openbox → sudo systemctl → arrêt/reboot propre
Cette méthode a été retenue car les scripts d’arrêt fonctionnaient en shell mais n’étaient pas exécutés correctement directement depuis ES-DE. Le passage par xdotool et les raccourcis Openbox a été testé avec succès.

13.4 Arrêt de secours en SSH

sudo -n /usr/bin/systemctl poweroff
sudo -n /usr/bin/systemctl reboot

14. Sauvegardes de jeux

Les sauvegardes RetroArch et save states doivent être vérifiées avant de les externaliser. Le principe recommandé est de conserver les fichiers actifs sur le LUN iSCSI, puis de les sauvegarder vers le NAS plutôt que d'écrire directement les saves actives sur NFS.

find ~/.config/retroarch -type f | grep -Ei '\.(srm|sav|state|state[0-9]+)$'

Architecture recommandée :

RetroArch → sauvegarde locale sur LUN iSCSI → copie/sauvegarde vers NAS → snapshots Synology

À retenir

La borne validée utilise iSCSI pour Debian et NFS uniquement pour les ROMs. Le démarrage automatique attend explicitement le montage /mnt/roms avant de lancer ES-DE. Pour quitter proprement, les choix « Éteindre » et « Redémarrer » d’ES-DE déclenchent xdotool, puis les raccourcis Openbox, puis systemctl avec une règle sudoers limitée.