Funk-lab/progress/2026-05-10.md
alkatrazz 24c0bf9e12 docs: progression 2026-05-14 + désignore progress/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:28:10 +02:00

114 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 |