# VM Debian sur le NAS SasNexte — poste de l'univers Jux

*Procédure établie le 09/09/2026. Machine installée et opérationnelle le jour même.*

---

## 1. Raison d'être

Ce poste n'existe pas pour l'ubiquité, mais pour **l'étanchéité**. Il s'agit de cesser de mélanger deux univers sur une même machine.

| | PC NEXTE (Windows) | VM Debian (NAS) |
|---|---|---|
| Univers | Alteris / NEXTE — professionnel | Jux — personnel |
| BookStack | `bookstack.alteris.ovh` | `bookstack.juxjux.ovh` |
| Serveur d'appui | VPS Alteris `79.137.14.202` | VPS Jux `51.77.141.54` |
| Outils | QGIS, LibreOffice, PostGIS, pièces de mission | Firefox, Thunderbird, FileZilla, Calibre, Claude Code |

**Un seul MCP BookStack par machine.** C'est ce qui rend structurellement impossible de publier une procédure Alteris dans le BookStack perso, ou l'inverse — au lieu d'une discipline à tenir à chaque page.

> **Règle à ne pas relâcher.** Pas de partage de mission NEXTE monté dans la VM, pas de coffre Alteris, pas de clé SSH vers `79.137.14.202`. Un « juste un petit accès » suffit à rendre la séparation décorative.

---

## 2. Prérequis matériels — le seul point bloquant

Le DS220+ embarque un Celeron J4025 (2 cœurs, 2 threads). **Le facteur limitant est la RAM.**

| | Valeur constatée |
|---|---|
| RAM totale | 5776 Mo (2 Go soudés + barrette 4 Go ajoutée en 2023) |
| Consommé par DSM | ~1160 Mo |
| Volume1 | **Btrfs** — exigé par VMM — 1,4 To libres |
| DSM | 7.4 |

VMM **réserve la mémoire statiquement** : les 3 Go sont retirés à DSM en permanence tant que la VM tourne, qu'elle travaille ou non. Il n'y a pas de ballooning dynamique. Le plafond utile est d'environ **3,5 Go**, DSM gardant un socle incompressible de 1,5 à 2 Go. Au-delà, c'est DSM qui swappe — et comme le disque virtuel est sur ce même NAS, tout ralentit ensemble.

Sur 2 Go alloués la VM tiendrait aussi : à l'usage réel, elle consomme **369 Mo au repos**. Le dimensionnement se fait sur le pic, pas sur la somme des applications — elles ne tournent jamais ensemble.

---

## 3. Création de la machine virtuelle

Virtual Machine Manager n'était pas installé : Centre de paquets → **Virtual Machine Manager**, puis créer un stockage sur `volume1`.

À la première ouverture, DSM propose d'ouvrir les ports 30200-30300 dans le pare-feu. Accepter, **puis restreindre la règle** au sous-réseau local (`Panneau de configuration → Sécurité → Pare-feu`, source `192.168.1.0 / 255.255.255.0`). Ces ports n'ont aucune raison d'être joignables de l'extérieur.

### Paramètres retenus

| Écran | Réglage |
|---|---|
| Nom | `debian-jux` |
| Processeurs | 2 |
| Mémoire | 3 Go |
| Carte vidéo | `vmvga` (seul choix) |
| Type de machine | `PC` (châssis i440fx, BIOS legacy) |
| Disque | 40 Go, **contrôleur VirtIO SCSI**, réclamation d'espace **cochée** |
| Réseau | Default VM Network, **VirtIO** |
| Micrologiciel | **Legacy BIOS**, pas UEFI |
| Disposition clavier | `fr` |
| Port série | **Désactiver** — inutile, et il a brouillé le diagnostic |
| Contrôleur USB | Désactivé |
| Autostart | **Oui** |

**Réclamation d'espace** : c'est le TRIM, à ne pas confondre avec l'allocation à la demande (que VMM applique déjà par défaut). Sans elle, le fichier disque croît au fil des `apt` et n'en redescend jamais.

**VirtIO SCSI** expose le disque en `/dev/sda`, pas `/dev/vda`.

---

## 4. Installation de Debian 13

### L'image

Téléchargée directement par le NAS, ce qui évite de faire transiter 755 Mo par le PC :

```bash
cd '/volume1/Iso VM'
wget -c -O debian-13.6.0-amd64-netinst.iso \
  https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.6.0-amd64-netinst.iso
sha256sum debian-13.6.0-amd64-netinst.iso
curl -s https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA256SUMS | grep netinst
```

Les deux sommes doivent être identiques.

### Le mode d'installation

**Prendre « Graphical install »**, pas « Install ». Le mode texte impose de saisir des numéros dans des listes qui défilent hors écran, et la console noVNC de VMM gère mal le clavier. Le mode graphique donne la souris : tous les choix se font au clic.

« Graphical install » ne désigne que le mode d'affichage — le premier écran reste le choix de la langue, où l'on prend « French — Français ».

### Les réponses qui comptent

| Écran | Réponse |
|---|---|
| Nom de machine | `jux-debian` |
| Domaine | **vide** |
| Mot de passe root | *(voir remarque ci-dessous)* |
| Partitionnement | Assisté – disque entier → `sda` → **tout dans une seule partition** |
| Miroir | France, `deb.debian.org`, **pas de mandataire** |
| **Sélection des logiciels** | **décocher tout** sauf **serveur SSH** et **utilitaires usuels du système** |
| GRUB | Oui → `/dev/sda` |

Pas de LVM : sur un disque virtuel il n'apporte rien, on agrandit le disque dans VMM. Pas de chiffrement : la VM démarre automatiquement au boot du NAS et réclamerait une passphrase en console à chaque fois.

Ne pas cocher Xfce dans la sélection des logiciels : cette case installe aussi un gestionnaire de connexion, dont on ne veut pas (voir §6).

> **Remarque sur le mot de passe root.** Le laisser vide fait installer `sudo` et place l'utilisateur dans le groupe. En définissant un mot de passe root — ce qui a été fait ici — `sudo` n'est **pas** installé, et le script de post-installation doit être lancé via `su -` avec le nom d'utilisateur en argument.

Avant le redémarrage final : **démonter l'ISO** dans les paramètres de la VM (*Autres → Fichier ISO pour le démarrage → Démonté*), sinon elle reboote sur l'installeur.

---

## 5. LE PIÈGE — la console meurt au démarrage

**Symptôme.** Après l'installation, l'écran se fige systématiquement sur :

```
/dev/sda1: clean, 40622/2485504 files, 552845/9938432 blocks
[  5.812838] systemd-ssh-generator[255]: Failed to query local AF_VSOCK CID
[  5.958389] systemd[1]: Finished modprobe@efi_pstore.service
[  6.941405] ACPI: bus type drm_connector registered
```

Plus rien ensuite. Aucune invite de connexion, `Ctrl+Alt+F2` sans effet, et la machine n'apparaît pas sur le réseau.

**Cause.** Trente millisecondes après `drm_connector registered`, le pilote de la carte vidéo `vmvga` prend la main sur l'écran et **tue la console**. Le système, lui, démarre parfaitement : SSH répond, le réseau monte, l'invite de connexion existe — elle n'est simplement plus affichée nulle part.

**Correctif** — dans `/etc/default/grub` :

```
GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"
```

puis `update-grub`. `nomodeset` interdit le *kernel modesetting* et garde la console en VGA texte de bout en bout.

**Retirer `quiet` en même temps, et ne jamais le remettre.** C'est lui qui rend le diagnostic impossible : entre les messages du noyau et l'invite de connexion, l'écran reste muet, et rien ne distingue un démarrage figé d'un démarrage silencieux.

### Deux fausses pistes, pour ne pas les refaire

- **Le port série.** Plausible — on l'avait activé, et une console redirigée vers `ttyS0` produit exactement ce gel. Mais la ligne GRUB ne contenait **aucun** `console=ttyS0`. Vérifier avant de supposer.
- **Un blocage du démarrage.** Écarté par un détail : le compteur de fichiers affiché par `fsck` augmentait d'un démarrage à l'autre (40500 puis 40622). Un système qui ne démarre pas n'écrit rien.

### Comment atteindre GRUB

La console VMM n'existe que si la VM tourne — impossible de l'ouvrir « avant ». Il faut garder la fenêtre de console ouverte (bouton **Connect**), démarrer la VM depuis DSM, cliquer **Connect** aussitôt et **maintenir Maj** : GRUB affiche alors son menu et suspend le décompte.

Sur la ligne « Debian GNU/Linux », appuyer sur **`e`** — pas Entrée — descendre jusqu'à la ligne `linux /boot/vmlinuz…`, aller en fin de ligne, ajouter `nomodeset` et supprimer `quiet`, puis **`Ctrl+X`**.

> Les entrées « recovery mode » sont inutilisables si le compte root est verrouillé (mot de passe vide à l'installation) : le shell de secours refuse de s'ouvrir.

---

## 6. Post-installation

Script : `260909-postinstall_vm_debian_jux_v2.sh`. Idempotent, environ 20 minutes et 1,5 Go de paquets.

```bash
su -
bash /home/julien/260909-postinstall_vm_debian_jux_v2.sh julien 2>&1 \
  | tee /home/julien/260909-postinstall.log
```

L'argument `julien` est nécessaire : sans `sudo`, le script ne peut pas deviner pour quel utilisateur il travaille.

| Étape | Contenu |
|---|---|
| 0 | GRUB : `nomodeset` ajouté, `quiet` retiré, fichier d'origine sauvegardé |
| 1 | Locale `fr_FR.UTF-8`, clavier français, fuseau Europe/Paris |
| 2-3 | Mise à jour, socle (`sudo`, `curl`, `git`, `ripgrep`…) |
| 4 | XFCE **sans gestionnaire de connexion** |
| 5 | xrdp + xorgxrdp, `~/.xsession`, règle polkit |
| 6 | Firefox ESR, Thunderbird, FileZilla, Calibre (+ paquets de langue) |
| 7 | Node.js, puis Claude Code via npm avec préfixe `~/.npm-global` |
| 8 | Syncthing, ufw (22, 3389, 22000, 21027) |

### Deux partis pris

**Pas de gestionnaire de connexion.** La VM n'a pas d'écran ; c'est xrdp qui ouvre la session. Cela évite le conflit « session déjà ouverte » qui empoisonne les installations XFCE + xrdp, et économise environ 150 Mo.

**L'interface web de Syncthing n'écoute qu'en local.** L'exposer sur le réseau donnerait un accès sans mot de passe à tout le contenu synchronisé.

---

## 7. Accès

### Bureau à distance

```
mstsc /v:192.168.1.10
```

Accepter l'avertissement de certificat (auto-signé), puis sur l'écran xrdp : **Session = `Xorg`**, utilisateur `julien`.

Depuis un mobile : *Microsoft Remote Desktop*, même adresse.

**RustDesk a été écarté.** L'infrastructure existe pourtant sur le VPS Jux (hbbs/hbbr, client enregistré, diode verte) mais n'a jamais donné de session exploitable — il échoue silencieusement, sans rien laisser d'exploitable pour diagnostiquer.

Pour l'accès en déplacement, la voie retenue est **WireGuard sur le VPS Jux** + RDP : le diagnostic y est binaire (`wg show` affiche un handshake, ou rien), les clients sont natifs partout, aucun port n'est à ouvrir sur la box — c'est la VM qui monte le tunnel vers le VPS — et le même tunnel sert aussi pour SSH et pour DSM.

### Interface Syncthing

```bash
ssh -L 8385:127.0.0.1:8384 julien@192.168.1.10
```

puis `http://127.0.0.1:8385`.

Le port local est **8385** et non 8384 : le Syncthing du PC NEXTE occupe déjà 8384, et le tunnel échouerait sur `bind: Permission denied`. Les deux interfaces sont identiques à l'écran — vérifier le nom de l'appareil en haut à droite (`jux-debian`) avant de déclarer un partage.

---

## 8. État final vérifié

| | |
|---|---|
| Machine | `jux-debian`, `192.168.1.10`, Debian 13.6, noyau 6.12.107 |
| Interface réseau | `ens3` (VirtIO) |
| Services actifs | ssh, xrdp, syncthing@julien |
| Ports ouverts | 22 et 3389 ; 8384 fermé de l'extérieur |
| Applications | Firefox ESR 140, Thunderbird 140, FileZilla 3.68, Calibre 8.5, XFCE 4.20 |
| Claude Code | 2.1.266 |
| RAM au repos | **369 Mo sur 2978** |

---

## 9. Reste à faire

**1 · MCP BookStack perso**, dans la VM — jeton à créer sur `bookstack.juxjux.ovh` (profil → Jetons d'API ; le secret n'est affiché qu'une fois) :

```bash
claude mcp add -s user bookstack-jux \
  -e BOOKSTACK_BASE_URL=https://bookstack.juxjux.ovh/api \
  -e BOOKSTACK_API_TOKEN=ID:SECRET \
  -e MCP_TRANSPORT=stdio -- npx -y bookstack-mcp-server
```

Le suffixe `/api` est obligatoire, le jeton s'écrit `id:secret`.

**2 · Réserver `192.168.1.10`** dans le DHCP de la box, sinon l'adresse bougera.

**3 · Comptes Thunderbird.**

**4 · WireGuard** sur le VPS Jux `51.77.141.54`.

**5 · Vérifier ufw** : `sudo ufw status verbose`. Le pare-feu annonce *« Firewall is active and enabled on system startup »* et ses règles sont chargées, mais `systemctl is-active ufw` renvoie `inactive` — comportement connu de cette unité, non confirmé faute de droits root au moment du contrôle.

---

## 10. À retenir pour toute future VM Linux sur ce NAS

- **`nomodeset` est obligatoire** avec la carte `vmvga` de VMM sous Debian 13. Sans lui, la machine paraît plantée alors qu'elle fonctionne parfaitement.
- **Ne jamais laisser `quiet`** : c'est la différence entre un diagnostic en deux minutes et une heure de tâtonnements.
- **Désactiver le port série** : inutile, et il oriente le diagnostic sur une fausse piste.
- **Mode graphique pour l'installeur**, à cause du clavier de la console noVNC.
- **VirtIO SCSI → `/dev/sda`**, jamais `/dev/vda`.
