# 2026-05-10 — dnsmasq, ROCm, LM Studio, NFS, modèles partagés ## Accompli ### Rôle `dnsmasq` (storage-01) - Résolution `*.lab.local` opérationnelle depuis le LAN cluster - DNS gpu-01 mis à jour : `8.8.8.8` → `192.168.10.1` ### Rôle `rocm` (gpu-01) - Repo AMD importé, drivers amdgpu + ROCm installés - `HSA_OVERRIDE_GFX_VERSION=10.3.0` positionné en system-wide (profile.d + service systemd) - RX 6700XT (gfx1031) détectée par ROCm ### Rôle `lm_studio` (gpu-01) — avec résolution de blocages multiples LM Studio installe un module Node natif (`watcher.node`) compilé avec GCC 12 qui requiert `GLIBCXX_3.4.30`. AlmaLinux 9 / GCC 11 fournit au maximum `GLIBCXX_3.4.29`. Le symbole concerné (`std::condition_variable::wait`) existe dans la libstdc++ système mais sous le tag `GLIBCXX_3.4.11`. **Solution retenue : patch ELF de `watcher.node`** - `patch-glibcxx-compat.py` : parseur ELF qui réécrit le champ `vna_hash` + la chaîne de version dans la section `.gnu.version_r` de `watcher.node` (`GLIBCXX_3.4.30` → `GLIBCXX_3.4.11`, même longueur → patch in-place) - `install-lmstudio-compat.sh` : télécharge le bundle officiel, patche `watcher.node` avant le bootstrap, patche aussi la copie installée **Architecture du service systemd** : - `lms server start` quitte avec code 0 après avoir démarré le daemon → systemd déclenchait un cycle de restart - Solution : wrapper `run-llmster.sh` — appelle `lms server start` (qui gère le passkey et démarre `llmster`), puis reste en vie via `pgrep llmster` en boucle - Service `active (running)` avec le wrapper comme PID principal et `llmster` tracké dans le cgroup systemd - `Restart=on-failure` relance proprement si `llmster` meurt **Wrapper `lms` global** : - `/usr/local/bin/lms` → délègue à `sudo -u lmstudio ... lms "$@"` - Accessible depuis n'importe quel user sans préfixe **Validation** : ``` curl http://192.168.10.20:1234/v1/models # depuis storage-01 → OK lms ls # depuis gpu-01 → liste les modèles ``` Détail complet des blocages : `ansible/roles/lm_studio/TROUBLESHOOTING.md` ### Rôle `nfs_server` (storage-01) Le RAID5 `md127` (4×1 TB, créé sous l'OS précédent) a survécu au changement d'OS — les superblocs mdadm sont sur les disques, pas sur l'OS. Assemblage automatique au boot. - `mdadm --detail --scan` → `/etc/mdadm.conf` + rebuild initramfs - `md127` (ext4) monté sur `/srv/data` via UUID dans `/etc/fstab` - Exports NFS : - `/srv/data/nfs/k8s` → pour le futur NFS provisioner k8s - `/srv/data/models` → modèles LM Studio partagés - Ports NFS (111, 2049) déjà ouverts dans nftables (rôle gateway) - `nfs-server` actif et enabled ### Rôle `nfs_client` (gpu-01) - `/mnt/nfs` → `192.168.10.1:/srv/data/nfs/k8s` - `/mnt/models` → `192.168.10.1:/srv/data/models` - Options robustes aux extinctions fréquentes : - `soft` — échoue proprement (EIO) si serveur injoignable, ne bloque jamais - `timeo=30, retrans=3` — 3 s de timeout, 3 tentatives - `_netdev` — montage après réseau disponible seulement - `nofail` — boot du client non bloqué si storage-01 absent - `x-systemd.automount` — montage à la demande (premier accès), pas au boot ### Migration des modèles LM Studio vers NFS - Modèles téléchargés : `gemma-4-e2b` (4.4 GB), `gemma-4-e4b` (6.3 GB) + embedding nomic - Rsync `/opt/lmstudio/.lmstudio/models/` → `/srv/data/models/` (~80 MB/s LAN interne) - Intégrité vérifiée (`diff -rq`) avant suppression locale - `/opt/lmstudio/.lmstudio/models` remplacé par symlink → `/mnt/models` - LM Studio voit les modèles sans aucun changement de configuration - 11 GB libérés sur le disque local de gpu-01 ## Problèmes rencontrés / Solutions | Problème | Solution | |---|---| | `GLIBCXX_3.4.30 not found` dans `watcher.node` | Patch ELF `vna_hash` + string → `GLIBCXX_3.4.11` | | LD_PRELOAD ne satisfait pas DT_VERNEED lié à `libstdc++.so.6` | Abandonné — seul le patch ELF fonctionne | | Offsets mal calculés dans le parseur ELF (`vn_aux` à +4 au lieu de +8) | Corrigé en tenant compte du champ `vn_file` | | Patch vers `GLIBCXX_3.4.29` : symbole inexistant sous cette version | Cibler `GLIBCXX_3.4.11` — là où le symbole existe réellement | | `lms server start` quitte avec 0 → systemd déactivate + tue llmster | Wrapper shell avec boucle `pgrep llmster` comme processus principal | | `lms server start` via ExecStartPost : `Invalid passkey` | lms doit démarrer llmster lui-même pour créer le passkey | | Port 1234 inaccessible depuis le réseau | `firewall-cmd --permanent --add-port=1234/tcp` | | `gcc -lstdc++` introuvable sur AlmaLinux 9 | Chemin complet `/usr/lib64/libstdc++.so.6` | | Automount NFS inactif après `ansible.posix.mount state: mounted` | Utiliser `state: present` + `systemctl enable/start *.automount` | | Tâche firewalld dans `nfs_server` échoue sur storage-01 (nftables) | Condition `when: firewalld est running` | ## État en fin de journée | Composant | État | |---|---| | common (storage-01 + gpu-01) | ✅ | | gateway / nftables / NAT | ✅ | | dnsmasq | ✅ | | ROCm (gpu-01) | ✅ | | LM Studio service systemd (gpu-01) | ✅ active (running) | | API LM Studio `192.168.10.20:1234` | ✅ accessible depuis storage-01 | | RAID5 md127 monté `/srv/data` | ✅ 2.7 TB, état clean | | NFS server + exports | ✅ | | NFS client gpu-01 (automount) | ✅ | | Modèles sur NFS | ✅ gemma-4-e2b, gemma-4-e4b, nomic-embed | | Route statique Freebox | ❌ à faire | | Premier commit GitHub | ❌ à faire | | postgresql / qdrant / minio | ❌ stubs vides | | hermes_agent | ❌ stub vide |