Achives de la catégorie ‘Projets’

21 Mar
2025

🚀 Utiliser un dongle 4G Huawei E3372 (HiLink) pour la domotique sous Jeedom (envois SMS)

Si la 2G à été stoppé chez vous, et que comme moi vous vous retrouvez du jour au lendemain avec une box domotique qui ne peux plus envoyer de SMS alors un dongle 4G prend tout son sens pour votre installation domotique.
Dans ce tutoriel, nous allons voir comment utiliser la clé Huawei E3372 (modèle E3372h-607) en mode HiLink sans flasher le firmware, tout en ayant accès aux ports série (/dev/ttyUSB*) indispensables pour le plugin SMS de Jeedom.

P.S Si vous souhaitez commander ce dongle, je ne saurais que trop vous conseiller d’aller le commander via mon second site :

Contexte :

  • Dongle Huawei E3372h-607
  • Opérateur Free avec bande 700 MHz (B28)
  • Serveur domotique Jeedom
  • Plugin SMS pour envoyer/recevoir des SMS

L’astuce réside dans l’activation automatique du mode debug au démarrage grâce à un service systemd. Ainsi, on profite des ports /dev/ttyUSB* pour communiquer en commandes AT (modem).


1. 🌐 Vérifier le dongle en mode HiLink

  1. Branchez le dongle Huawei E3372 sur votre machine (un Raspberry, un mini-PC, etc.).
  2. Vérifiez qu’il est détecté en USB :
lsusb

Exemple de résultat (ID 12d1:1566 indiquant le mode HiLink) :

Bus 001 Device 009: ID 12d1:1566 Huawei Technologies Co., Ltd. HUAWEI_MOBILE
  1. Regardez vos interfaces réseau :
ip addr
  1. Vous devriez voir une nouvelle interface (ex. 192.168.8.100), prouvant que la clé est en mode HiLink.
5: enx0c5b8f279a64: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0c:5b:8f:27:9a:64 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.100/24 brd 192.168.8.255 scope global dynamic noprefixroute enx0c5b8f279a64
       valid_lft 86110sec preferred_lft 75310sec
    inet6 fe80::111b:c083:fe52:12e7/64 scope link
       valid_lft forever preferred_lft forever

Vérifiez l’absence de ports série :

ls -l /dev/ttyUSB*
  1. En mode HiLink, rien n’apparaîtra pour la clé Huawei (vous ne verrez pas /dev/ttyUSB0 lié à ce dongle).


2. ⚙️ Créer un service systemd pour le mode debug

2.1. Pourquoi un service ?

La clé E3372 dispose d’une API HTTP permettant de basculer la clé en mode debug (ce qui fait apparaître les ports /dev/ttyUSB*).
Cependant, ce mode n’est pas persistant : à chaque redémarrage du serveur, il faut réactiver le mode debug.
D’où l’idée de créer un service systemd automatisant cette activation.

2.2. Éditer le fichier de service

Créez un fichier /etc/systemd/system/huawei-debug-mode.service :

sudo nano /etc/systemd/system/huawei-debug-mode.service

Collez-y le contenu suivant :

[Unit]
Description=Switch Huawei E3372 HiLink to debug mode
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot

# On attend 10s pour laisser au modem le temps de monter l'interface 192.168.8.1
ExecStartPre=/bin/sleep 10

# Appel "curl" sur une seule ligne.
# On utilise des quotes simples pour le -d et on laisse
# les double-quotes à l'intérieur pour l'XML.
ExecStart=/usr/bin/curl -s -X POST \
    -d '<?xml version="1.0" encoding="UTF-8"?><api version="1.0"><header><function>switchMode</function></header><body><request><switchType>1</switchType></request></body></api>' \
    http://192.168.8.1/CGI

RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Points importants :

  • ExecStartPre : on attend 10 secondes pour que l’interface réseau du dongle (192.168.8.1) soit disponible.
  • switchType=1 : c’est le paramètre de l’API Huawei qui active le mode debug.

2.3. Activer et lancer le service

Lancez les commandes :
sudo systemctl daemon-reload
sudo systemctl enable huawei-debug-mode.service
sudo systemctl start huawei-debug-mode.service

Vous pouvez aussi redémarrer votre machine pour confirmer que le service se lance bien tout seul au boot.


3. 🔎 Vérifier l’apparition des interfaces /dev/ttyUSB*

Après l’activation (ou après reboot), refaites un :

ls -l /dev/ttyUSB*

Vous devriez voir plusieurs ports, par exemple :

crwxrwxrwx 1 root dialout 188, 1 21 mars 13:21 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 2 21 mars 13:16 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 3 21 mars 13:16 /dev/ttyUSB2
crw-rw---- 1 root dialout 188, 4 21 mars 13:16 /dev/ttyUSB3
crw-rw---- 1 root dialout 188, 5 21 mars 13:16 /dev/ttyUSB4
crw-rw---- 1 root dialout 188, 5 21 mars 13:16 /dev/ttyUSB5

La première interface (/dev/ttyUSB0 dans la plupart des cas) est celle qui accepte les commandes AT pour l’envoi/réception de SMS.


4. 📱 Intégration avec Jeedom (plugin SMS)

  1. Installer le plugin SMS dans Jeedom (Market).
  2. Dans la configuration du plugin, section Modem, sélectionnez :
    • Port modem : /dev/ttyUSB0 (ou celui détecté chez vous).
    • Baudrate : 115200 (valeur habituelle, ou laissez par défaut).
  3. Sauvegardez et relancez le démon du plugin SMS.

Vous pouvez envoyer et recevoir des SMS depuis Jeedom.
Faites un reboot de votre serveur pour vérifier que tout se passe bien : grâce à notre service systemd, le mode debug est réactivé et le plugin SMS reste opérationnel dès le démarrage.


5. 🎉 Conclusion

En suivant ces étapes, vous gardez votre Huawei E3372 en mode HiLink sans le flasher, tout en profitant des ports série pour Jeedom et le plugin SMS.

Récapitulatif :

  1. Brancher le dongle, vérifier qu’il est détecté en mode HiLink (lsusb + ip addr).
  2. Créer un service systemd pour activer le mode debug au démarrage (fichier huawei-debug-mode.service).
  3. Vérifier l’apparition des /dev/ttyUSB*, dont /dev/ttyUSB0 pour les commandes AT.
  4. Configurer le plugin SMS dans Jeedom pour utiliser ce port.
  5. Tester un reboot : le dongle reprend le mode debug automatiquement.

Vous bénéficiez alors d’une connexion 4G fiable (notamment pour la bande des 700 MHz chez Free mais attention au choix du dongle pour les fréquences gérés) et d’un modem SMS fonctionnel pour votre domotique.
Enjoy ! ✨🚀

6 Mar
2025

⚡ Installer carte NVIDIA dans Proxmox / LXC / Docker (IA LLM et Ollama)

Proxmox LXC Debian et Docker pour NVIDIA

Dans ce tutoriel, nous allons configurer une carte graphique NVIDIA sur Proxmox, la rendre disponible dans un conteneur LXC, puis l’exploiter dans Docker au sein de ce même conteneur.
L’exemple final porte sur l’installation de l’application Ollama pour l’IA qui utilisera l’accélération matériel de la carte graphique, mais la procédure s’applique à d’autres usages (Serveur multimedia Plex, encodage/décodage …).


Matériel et environnements testés

  • Serveurs HP : ML110 G9 et Z840
  • Cartes graphiques : Nvidia Quadro P6000 et Nvidia RTX 2080

Mais le plus important c’est :

-D’avoir du CPU Intel
-Une carte Nvidia assez récente en fonction des besoins pour pouvoir suivre ce tuto
-Le mode secure boot désactivé pour pouvoir charger le driver Nvidia (Et donc activer le mode legacy boot), par exemple pour HP :
https://support.hp.com/us-en/document/ish_6930187-6931079-16
-Que la carte graphique soit reconnu en faisant un lspci (dans mon cas une GeForce RTX 2080) :

root@ml110:~# lspci |grep NVIDIA
03:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1)
03:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1)
03:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1)
03:00.3 Serial bus controller: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)
root@ml110:~#

Pour une config AMD, un autre tuto arrivera.


1. 🚀 Configuration de Proxmox

1.1. Modifier le fichier sources.list

nano /etc/apt/sources.list

Assurez-vous d’avoir les dépôts suivants (pour Proxmox 8 sur base Debian Bookworm) :

deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

Note : Commentez (désactivez) le repository ceph et le repository pve-enterprise s’ils sont présents.

1.2. Mettre à jour le système

apt update
apt upgrade

1.3. Installer les dépendances

apt install pve-headers-$(uname -r) build-essential dkms wget libglvnd-dev  sudo libglvnd0

1.4. Activer l’IOMMU dans GRUB

Éditez le fichier /etc/default/grub :

nano /etc/default/grub

Dans la ligne contenant GRUB_CMDLINE_LINUX_DEFAULT, ajoutez les paramètres intel_iommu=on iommu=pt, par exemple :

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

Puis mettez à jour GRUB :

update-grub

1.5. Activer le regroupement des IOMMU (recommandé)

Créez ou modifiez les fichiers suivants :

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu.conf

Puis mettez à jour initramfs

update-initramfs -u

Info : S’il y a eu une mise à jour du noyau (après apt upgrade), redémarrez la machine.

1.6. Désactiver le module nouveau

sudo modprobe -r nouveau

1.7. Installer le driver NVIDIA

(Exemple : version 550.144.03 – adaptez si nécessaire)

wget https://fr.download.nvidia.com/XFree86/Linux-x86_64/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run
chmod +x NVIDIA-Linux-x86_64-550.144.03.run
./NVIDIA-Linux-x86_64-550.144.03.run --dkms

1.8. Charger les modules nécessaires

Modifiez le fichier /etc/modules :

nano /etc/modules

Ajoutez-y :

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

# load nvidia modules
nvidia-drm
nvidia-uvm

1.9. Créer un fichier pour blacklist nouveau

nano /etc/modprobe.d/nvidia-installer-disable-nouveau.conf

Mettez-y :

blacklist nvidiafb
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0

1.10. Règles udev pour gérer les périphériques NVIDIA

nano /etc/udev/rules.d/70-nvidia.rules

Ajoutez-y :

KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
SUBSYSTEM=="module", ACTION=="add", DEVPATH=="/module/nvidia", RUN+="/usr/bin/nvidia-modprobe -m"

Activez immédiatement les règles :

udevadm control --reload-rules && udevadm trigger

1.11. Redémarrer Proxmox

reboot

1.12. Vérifier la présence des périphériques NVIDIA

Après reboot, vous devriez voir :

ls -lah /dev/nvidia*

Exemple :

crw-rw-rw- 1 root root 195,   0 Mar  4 19:03 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar  4 19:03 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Mar  4 19:03 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510,   0 Mar  4 19:03 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510,   1 Mar  4 19:03 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
cr--------  1 root root 237, 1 Mar  4 19:03 nvidia-cap1
cr--r--r--  1 root root 237, 2 Mar  4 19:03 nvidia-cap2

On retrouve les numéros majeurs (ex. 195, 510 et 237) pour la configuration du LXC.


2. 🏷 Créer et configurer un conteneur LXC Debian 12

2.1. Créer un LXC Debian 12 privilégié, avec Nesting activé

Depuis l’interface Proxmox, créez un conteneur LXC Debian 12 et, dans l’onglet Options (ou Features selon la version) :

  • Cochez Privileged (ou assurez-vous que la case “Unprivileged container” est désactivée).
  • Activez l’option Nesting.

Vous pouvez également télécharger le template lxc debian et l’installer en ligne de commande :

pveam update
pveam available | grep debian-12-standard

Vous devriez voir la dernière version en date, dans notre cas :

system          debian-12-standard_12.7-1_amd64.tar.zst

SI votre stockage est bien nommé local (par défaut en général dans proxmox) vous pouvez lancer :

pveam download local debian-12-standard_12.7-1_amd64.tar.zst

Lancez la création du LXC avec le template debian :

pct create 100 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
  --hostname debian12-nvidia \
  --cores 4 \
  --memory 4096 \
  --swap 0 \
  --rootfs local-lvm:20 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --features nesting=1 \
  --unprivileged=0 \
  --password TonMotDePasseIci

Dans cet exemple nous allons créer un LXC avec le template Debian précédement télécharger et les paramètres :

-Nom de machine : debian12-nvidia

-Nombre de core CPU : 4

-Taille RAM : 4096

-Taille SWAP :0

-Emplacement du stockage : local-lvm

-Carte réseau – Quel switch virtuel – Paramètres IP : vmbr0 en DHCP

-Activation de l’option Nesting pour Docker : nesting=1

-LXC en mode privilégié : –unprivileged=0

-Mot de passe root du LXC : TonMotDePasseIci

2.2. Éditer la configuration du LXC

Après création, éditez la conf (ex. ID 100) :

nano /etc/pve/lxc/100.conf

Ajoutez à la fin : les instructions suivantes (en adaptant les numéros majeures grace à la commande ls -lah /dev/nvidia* vue au point : 1.12. Vérifier la présence des périphériques NVIDIA) :

lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 510:* rwm
lxc.cgroup2.devices.allow: c 237:* rwm

lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir,mode=0777
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file

2.3. Démarrer le LXC et y transférer le driver NVIDIA

Sur l’hôte Proxmox :

pct start 100
pct push 100 /root/NVIDIA-Linux-x86_64-550.144.03.run /root/NVIDIA-Linux-x86_64-550.144.03.run

(Adaptez le chemin si nécessaire.)

2.4. Configurer la Debian du LXC

Dans le conteneur (SSH ou console Proxmox) :

lxc-attach 100
nano /etc/apt/sources.list

Ajoutez (ou vérifiez) :

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

Puis :

apt update
apt upgrade
apt install gpg curl wget


3. 🎉 Installer NVIDIA Container Toolkit

Parfois, le paquet nvidia-container-toolkit n’est pas dans les dépôts. Pour l’installer directement depuis NVIDIA :

Ajouter la clé GPG officielle :

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/debian11/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Mettre à jour :

apt update

Installer nvidia-container-toolkit :

apt install -y nvidia-container-toolkit

Ajuster la config (si besoin) :

nano /etc/nvidia-container-runtime/config.toml

Pour ajouter ou vérifier :

no-cgroups = true


4. 🔧 Installer le driver NVIDIA dans le LXC

Dans le conteneur :

chmod +x NVIDIA-Linux-x86_64-550.144.03.run
./NVIDIA-Linux-x86_64-550.144.03.run --no-kernel-module

L’option --no-kernel-module est utilisée car le module du noyau est déjà géré par l’hôte Proxmox.

Vérifiez :

ls -lah /dev/nvidia*
nvidia-smi

Vous devriez voir vos périphériques NVIDIA et avoir accès à la carte via nvidia-smi :

root@NVIDIA-TESTS:~# ls -lah /dev/nvidia*
crw-rw-rw- 1 root root 195, 254 Mar  6 13:41 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510,   0 Mar  6 13:41 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510,   1 Mar  6 13:41 /dev/nvidia-uvm-tools
crw-rw-rw- 1 root root 195,   0 Mar  6 13:41 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar  6 13:41 /dev/nvidiactl

/dev/nvidia-caps:
total 0
drw-rw-rw- 2 root root     80 Mar  6 13:41 .
drwxr-xr-x 8 root root    620 Mar  6 14:00 ..
crw-rw-rw- 1 root root 510, 1 Mar  6 13:41 nvidia-cap1
crw-rw-rw- 1 root root 510, 1 Mar  6 13:41 nvidia-cap2
nvidia-smi


5. 🐳 Installer Docker dans le LXC

Ajouter la clé GPG Docker et le dépôt :

apt-get update
apt-get install ca-certificates curl sudo

install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

chmod a+r /etc/apt/keyrings/docker.asc

echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update

Installer Docker :

apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Configurer Docker pour utiliser le runtime NVIDIA par défaut :

nano /etc/docker/daemon.json 

Ajoutez :

{
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  },
  "default-runtime": "nvidia"
}

Redémarrer Docker :

systemctl restart docker


6. 🤖 Exemple : Déployer Ollama (IA) via Docker Compose

6.1. Préparer le dossier et le fichier docker-compose.yml

mkdir ollama
cd ollama
nano docker-compose.yml

Exemple de configuration :

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama:/root/.ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
      - OLLAMA_ACCELERATOR=cuda
      - CUDA_VISIBLE_DEVICES=0
      - OLLAMA_FORCE_CUDA=1
      - OLLAMA_USE_CUDA=1
    devices:
      - /dev/nvidia0:/dev/nvidia0
      - /dev/nvidiactl:/dev/nvidiactl
      - /dev/nvidia-uvm:/dev/nvidia-uvm
      - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
      - /dev/nvidia-modeset:/dev/nvidia-modeset
      - /dev/nvidia-caps:/dev/nvidia-caps
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    runtime: nvidia

  ollama-webui:
    image: ghcr.io/ollama-webui/ollama-webui:main
    container_name: ollama-webui
    ports:
      - "3000:8080"
    volumes:
      - ollama-webui:/app/backend/data
    depends_on:
      - ollama
    environment:
      - 'OLLAMA_API_BASE_URL=http://ollama:11434/api'
    restart: unless-stopped

volumes:
  ollama: {}
  ollama-webui: {}

6.2. Lancer les conteneurs

Toujours dans le répertoire ollama :

docker compose up -d

6.3. Optionnel : Installer Portainer

Pour gérer vos conteneurs plus facilement, vous pouvez installer Portainer :

docker run -d -p 8000:8000 -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts


7. 🔎 Vérification du fonctionnement d’Ollama

Consultez les logs pour vérifier que votre GPU est détecté. Par exemple :

docker logs -f ollama
time=2025-03-04T18:47:34.093Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-04T18:47:34.450Z level=INFO source=types.go:130 msg="inference compute" ...
name="NVIDIA GeForce RTX 2080" total="7.8 GiB" available="7.7 GiB"

ou par exemple :

time=2025-03-04T20:05:05.414Z level=INFO source=types.go:130 msg="inference compute" ...
name="Quadro P6000" total="23.9 GiB" available="23.7 GiB"

Tant qu’il affiche bien le nom de la carte, c’est que la configuration fonctionne !


🎉 Conclusion

Vous disposez désormais d’un système Proxmox avec une carte NVIDIA pass-through dans un conteneur LXC (privilégié, Nesting activé) et exploitable dans Docker.
Cette configuration permet notamment d’exécuter des tâches d’IA comme Ollama, ou tout autre outil GPU, dans vos conteneurs.

Vous pouvez bien évidement utiliser la carte graphique simultanément sur plusieurs LXC et plusieurs Dockers

Points essentiels :

  • Vérifiez toujours que le pilote NVIDIA de l’hôte Proxmox est correctement installé et que nvidia-smi fonctionne.
  • Le conteneur LXC doit être privilégié et autoriser l’accès aux périphériques nvidia* et nvidia-caps.
  • Le runtime nvidia-container-runtime est indispensable pour Docker.
  • Adaptez les versions de driver et de paquets à vos besoins matériels et logiciels.


8. 🔎 Debugging

8.1. Dans le cas ou ça à marché mais ça ne marche plus :

Dans le cas ou ça à marché mais ça ne marche plus et que vous voyez dans les logs ollama :

time=2025-03-06T18:37:14.645Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-06T16:37:14.671Z level=WARN source=gpu.go:605 msg="unknown error initializing cuda driver library /usr/lib/x86_64-linux-gnu/libcuda.so.550.144.03: cuda driver library init failure: 999. see https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md for more information"
time=2025-03-06T18:37:14.689Z level=INFO source=gpu.go:377 msg="no compatible GPUs were discovered"
time=2025-03-06T16:37:14.689Z level=INFO source=types.go:130 msg="inference compute" id=0 library=cpu variant="" compute="" driver=0.0 name="" total="125.7 GiB" available="123.0 GiB"

Vérifiez à nouveau sur proxmox les numéro majeure des interfaces :

ls -lah /dev/nvidia*

Exemple :

crw-rw-rw- 1 root root 195,   0 Mar  4 19:03 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar  4 19:03 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Mar  4 19:03 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510,   0 Mar  4 19:03 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510,   1 Mar  4 19:03 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
cr--------  1 root root 237, 1 Mar  4 19:03 nvidia-cap1
cr--r--r--  1 root root 237, 2 Mar  4 19:03 nvidia-cap2

On retrouve les numéros majeurs (ex. 195, 510 et 237) pour la configuration du LXC.

Et vérifiez qu’ils sont identiques à ceux de la config LXC :

root@ml110:~# cat /etc/pve/lxc/100.conf
arch: amd64
cores: 4
features: nesting=1
hostname: NVIDIA-TESTS
memory: 4096
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:AF:CE:A0,ip=dhcp,type=veth
onboot: 1
ostype: debian
rootfs: local-lvm:vm-100-disk-0,size=20G
swap: 0
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 510:* rwm
lxc.cgroup2.devices.allow: c 237:* rwm
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir,mode=0777
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file

relancez votre LXC :

pct stop 100 && pct start 100

Connectez-vous au conteneur LXC :

root@ml110:~# lxc-attach 100

Et vérifiez à nouveau les logs ollama :

root@NVIDIA-TESTS:~# docker logs -f ollama
...
time=2025-03-06T18:38:39.326Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-06T18:38:40.310Z level=INFO source=types.go:130 msg="inference compute" id=GPU-000a74e5-c3c6-1f93-1295-5a276ecbeed4 library=cuda variant=v12 compute=7.5 driver=12.4 name="NVIDIA GeForce RTX 2080" total="7.8 GiB" available="7.7 GiB"

Si vous voyez à nouveau votre GPU, ça devrait fonctionner sans problèmes !

8.2. Dans le cas le driver NVIDIA-Linux-x86_64-550.144.03.run ne veut pas s’installer :

Si vous bloquez dès l’installation de l’exécutable Nvidia, il est fort probable que vous ayez des drivers nvidia deja installé avec le gestionnaire de dépot debian (apt);

Lancez donc ces commandes pour supprimer tous les drivers Nvidia installés :

apt remove --purge '^nvidia-.*' '^libnvidia-.*' '^cuda-.*' '^libcuda.*' -y
apt autoremove -y
apt clean

rm -rf /etc/modprobe.d/nvidia.conf
rm -rf /etc/modules-load.d/nvidia.conf
rm -rf /etc/X11/xorg.conf.d/10-nvidia.conf
rm -rf /usr/local/cuda*
rm -rf /etc/apt/sources.list.d/cuda.list
rm -rf /var/lib/dkms/nvidia/
rm -rf /usr/lib/nvidia
rm -rf /usr/share/nvidia
rm -rf /var/cache/nvidia-installer

update-initramfs -u

Et recommencez le tuto à partir du point 1.6. Désactiver le module nouveau

8.3. Pour tout autre cas :

Si vous n’arrivez toujours pas à faire fonctionner votre carte Nvidia, je vous invite à poster un commentaire avec un max d’indications, logs etc …


Bonne continuation et bon usage de votre GPU !
✨🚀

2 Jan
2024

Découverte et Création Durant les Fêtes : Naissance de Resin Print Portal

Un Week-end du Nouvel An sous le Signe de l’Innovation

Alors que le monde célébrait l’arrivée de la nouvelle année, je me suis lancé dans un projet passionnant, motivé par l’envie de repousser les limites de l’impression 3D, je me suis payé une imprimante résine. Armé de ma toute nouvelle imprimante #Elegoo Saturn 3 Ultra, un cadeau de Noël à moi-même, j’étais prêt à explorer les possibilités offertes par cette technologie fascinante.

Le Dilemme des Slicers

Au cœur de l’impression 3D se trouve le slicer, un logiciel indispensable pour préparer les modèles pour l’impression. J’ai commencé par faire l’expérience des slicers fournit comme Chitubox et Voxeldance Tango. Cependant, je me suis heurté à des limitations avec la version gratuite de Chitubox, et des problèmes de licence avec Voxeldance Tango.

Dans ma quête de solutions, je me suis tourné vers Lychee Slicer, dont j’avais beaucoup entendu parler. Malgré son prix, j’ai été conquis par ses fonctionnalités (entre autre la détection d’effet ventouse) et j’ai fini par acquérir une licence. Lychee Slicer était un plaisir à utiliser, mais il manquait une fonctionnalité cruciale pour moi : la possibilité d’envoyer directement des fichiers à mon imprimante en WiFi.

De la Frustration à la Création

La procédure pour envoyer mes fichiers était fastidieuse : préparer le modèle dans Lychee Slicer, puis le réimporter dans Chitubox uniquement pour l’envoi en WiFi, une opération qui prenait un temps considérable. Cette routine frustrante m’a rapidement poussé à chercher une solution plus pratique.

C’est alors que je suis tombé sur le projet Cassini, qui offrait la possibilité d’envoyer des fichiers à l’imprimante en ligne de commande. Si Cassini apportait une réponse à mon problème, l’absence d’une interface utilisateur graphique me laissait sur ma faim. Habitué à la convivialité d’OctoPrint pour mon imprimante à filament, je désirais quelque chose de similaire pour mon imprimante à résine.

La Naissance de Resin Print Portal

C’est ainsi qu’est né Resin Print Portal (RPP). Inspiré par Cassini, j’ai développé une interface web pour gérer mon imprimante résine, un outil qui allie la simplicité d’utilisation à l’efficacité, en voici un aperçu :

RPP est conçu pour rendre l’impression 3D à base de résine aussi pratique et agréable que possible, en permettant l’envoi de fichiers, le lancement et le suivi des impressions, le tout via une interface web conviviale.

L’Esprit d’Initiative d’un Non-Développeur

Il est important de mentionner que je ne suis pas un développeur de formation. Mon parcours dans la création de RPP est simplement celui d’un geek, motivé par le désir de surmonter un défi pratique plutôt que par une expertise en programmation. Ce projet est le fruit d’un apprentissage autodidacte, de l’exploration, la détermination et aussi un bon coup de main de ChatGPT. J’ai rassemblé des connaissances ici et là, apprenant sur le tas pour transformer mon idée en réalité.

C’est peut-être cette perspective de non-développeur qui rend RPP si intuitif et centré sur l’utilisateur. Mon objectif n’était pas de créer un outil complexe avec des fonctionnalités avancées, mais plutôt quelque chose de simple, efficace et, surtout, totalement fonctionnel. Dans le monde de la technologie, où l’on peut facilement se perdre dans les détails techniques, rappelons-nous que l’utilité et la fonctionnalité sont souvent ce qui compte le plus.

Resin Print Portal est la preuve qu’avec un peu de persévérance et beaucoup d’enthousiasme, les barrières de la complexité peuvent être franchies, même par ceux qui ne sont pas des professionnels du domaine.

Vers un Avenir Plus Lumineux en 3D

Alors que les feux d’artifice du Nouvel An illuminaient le ciel, Resin Print Portal est devenu mon feu de joie personnel. Ce projet est un exemple parfait de la manière dont une frustration peut se transformer en une opportunité de créer quelque chose de nouveau et d’utile, pas seulement pour moi, mais pour toute la communauté des passionnés d’impression 3D.

Si vous souhaitez en savoir plus sur ce projet ou y contribuer, je vous invite à visiter le projet sur GitHub.

2 Oct
2017

Domotiser simplement un radiateur à fil pilote

Bonjour à tous,

La semaine dernière j’ai fait changer mes vieux radiateurs électrique par un modèle plus récent et surtout avec l’option « Fil pilote ».
Loin de moi de l’idée de faire de la pub pour une marque ou une autre, mais c’est MON Blog et donc oui je vais citer les marques n’en déplaisent à certains.
Pour les radiateur, ils sont de chez Balma, une marque Française que je ne connaissais pas donc bon coté fiabilité je ne pourrais pas m’avancer pour le moment …
Par contre ils ont un fil pilote 6 ordres et ça c’est chouette !
Alors un fil pilote pour résumer c’est une vieille techno qui permets d’effectuer quelques contrôles sur son radiateur en « bidouillant » la tension 230v alternative de votre arrivée électrique.
Du peu que j’en ai vu, il y a des fils pilotes à 4 ou 6 ordres et j’ai bien l’impression que c’est normé (ouf).
Voici les 6 ordres disponibles sur mon modèle :
01_10_2017 22_19 Office Lens

Sur un modèle avec fil pilote à 4 ordres vous n’aurez que  :

-Confort

-Eco

-Hors-gel

-Arrêt chauffage

 

Ma domotique fonctionnant sur un Raspberry avec Jeedom, pour le moment je ne gère que du Zigbee (Xiaomi, Philips Hue) et du 433Mhz avec une gateway RFXcom de chez nodo-shop.nl

Après quelques recherches je suis tombé sur un module qui gère les 6 ordres mais sur du Z-wave : QUBINO ZMNHJD1

le gros avantage de ce module c’est qu’il est compatible toute box Z-wave car pour le changement d’état sur le fil pilote il utilise simplement la fonction dimmer (de 0 à 10% mode confort -2, de 11 à 20% mode confort -1, etc …) Il permet également de remonter des états ou de contrôler des boutons poussoirs donc pour les plus bricoleurs, vous pouvez interfacer les interrupteurs du radiateur sur votre module Qubino pour pouvoir par exemple contrôler la température de consigne sur le radiateur ! Mais pour les retours d’affichage … Je pense qu’il va falloir faire sans…

Le plus gros inconvénient est financier, en effet 60 euro le module par radiateur plus un dongle également à 60 euro ça fait pratiquement 200 euros pour contrôler simplement les 6 ordres de deux radiateurs .

Mais ATTENTION, on ne peut contrôler la température du thermostat intégré au radiateur sans le démonter et relier les interrupteurs au module, je suis bricoleur mais là j’ai mes limites d’autant plus que si l’on démonte le radiateur on perds généralement la garantie et en cas d’incendie je n’ai pas envie de batailler avec les assurances …

J’ai donc fait pour ma part le choix économique, je ne gère que deux ordres :

-Confort : Le radiateur tourne en fonctionnement normal

-Arrêt chauffage : Radiateur éteint

Et je peux gérer ces deux ordres très simplement avec un module type luminaire On/Off de chez Chacon (que l’on trouve à 15 euro chez Amazon).

Pour le mode confort, aucun signal n’es envoyé au signa pilote, il correspondra à l’état Off du module Chacon

Pour le mode Arrêt chauffage, il suffit d’envoyer 115v positif, à la sortie du module Chacon il nous faudra donc une diode pour ne pas laisser passer la partie négative du signal électrique (Qui est de 230v alternative sinusoidale) ce qui nous donnera une demi sinusoidale oscillant entre 0 et 115v positif.

Voici une petite photo avant intégration dans un boitier encastrable :

Et voici un petit schémas :

Avec ça je vais pouvoir contrôler le radiateur via Jeedom et avec les sondes de températures des différentes pièces je vais pouvoir allumer ou non un radiateur pour atteindre la température désiré dans la pièce.

Evidement il va falloir que la température de consigne paramétré sur le radiateur soit supérieur à la température maximal souhaité mais le résultat est là .

La journée j’ai mon 20° quand je suis présent et la nuit je passe à 17° dans la chambre et je passe à 16 dans le salon (mes pièces sont très rapide à chauffer).

 

Evidemment le mode éco m’intéresse également, pour la nuit ce mode devrait être largement suffisant et me permettrait de faire quelques économies supplémentaires. je pourrais trouver un module pour gérer plusieurs relais mais je pense plutôt que je sauterais un jour le pas sur du Z-wave et changerais le module Chacon par le QUBINO.

 

Si vous avez des questions, n’hésitez pas les commentaires sont fait pour ça !!

 

JJ

8 Mar
2017

DIY – Distributeur de croquettes connecté sous arduino

Bonjour à tous,

Ce samedi matin, comme d’habitude je me suis réveillé un peu ronchon …

Car comme tous les amoureux des animaux, je me fait réveillé par la meute qui vit à la maison.

Mais ce matin là, j’ai décidé de ne pas me laisser faire, après quelques recherche sur comment manger nourrir son chat automatiquement, je suis tombé sur des distributeurs de croquettes à piles et après quelques rapides passages sur les commentaires, j’ai compris qu’en dessous de 50 euros bah c’est de la merde !

En plus ayant deux chats qui ne mangent pas au meme endroit, ça fait cher la tranquillité …

Tout ça pour balancer quelques croquettes dans un bol, je dirais meme que c’est abusé…

J’ai commencé à regarder les différents systèmes permettant de distribuer des croquettes, on peut y trouver des systèmes de cylindre avec une ouverture sur le coté, ou encore des systèmes à vis infini voir des trucs encore plus fou.

Mais j’ai craqué pour un système basé sur deux contenant et un servo moteur, le servo tourne le contenant du haut pour que l’ouverture croise celle du bas un cours instant (assez pour faire tomber quelques croquettes), cette idée je l’ai piqué sur une vidéo youtube russe dont je ne retrouve plus le lien …(promis je vais chercher).

Bon une fois le problème de distribution de croquettes réglé, il faut se pencher sur le coté connecté de l’objet.

Alors là ayant en stock des ESP 8266 (ESP-12E, ce sont en gros des puces wifi que l’on peut programmer comme un arduino) je me suis dit que c’était parfait d’autant que Jeedom contient un plugin EasyESP.

 

Et voici ce que ça donne en vidéo :

Si vous souhaitez réaliser vous meme votre distributeur de croquettes et que vous êtes pressé, n’hésitez pas à me contacter, sinon soyez patient, un tuto complet en vidéo ne devrait pas trop tarder.

 

Su ce, je retournes me coucher

4 Nov
2016

Raspberry Pi – Raspbian pixel et Chromium en mode kiosk – ouverture automatique d’un navigateur en mode plein écran au démarrage de Raspbian

Bonjour à tous,

Aujourd’hui je vais vous présenter une façon simple de démarrer votre raspberry pi en lançant automatiquement un navigateur (En mode kiosk).

Nous allons aller un peu plus loin de la plupart des tutoriels en ajoutant l’autologin ainsi que la rotation automatique d’un onglet à l’autre.

J’ai deja écrit un premier article sur le sujet avec midori et firefox, mais ayant une préférence pour chromium et avec l’arrivée de Raspbian pixel, je me devais de faire un nouveau tutoriel.

Dashboard

 

Ce tuto à été fait avec Raspbian Pixel.

Ouvrez un terminal sur votre raspberry (En local ou via ssh).

Mettez à jour vos dépots :

sudo aptitude update

 

Lançons ensuite l’installation du navigateur :

sudo aptitude install rpi-chromium-mods chromium-browser

 

Puis nous allons éditer le fichier :

sudo nano ~/.config/lxsession/LXDE-pi/autostart

Commentez la ligne :

#@xscreensaver -no-splash

Et ajoutez les lignes suivante à la fin du fichier :

@xset s off
@xset -dpms
@xset s noblank

Si vous ne voulez pas que chrome vous affiche ses message d’erreur en cas de plantage et reboot du raspberry, ajoutez :

@sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium/Default/Preferences

Si vous ne voulez pas que chromium ne vous affiche pas la popup restore table, editez le fichier :

sudo nano /etc/rc.local

Et ajoutez ces deux lignes avant le exit 0; :

## Empeche l'affichage du restore table au reboot de chromium
sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium/Default/Preferences
sed -i 's/"exit_type": "Crashed"/"exit_type": "None"/' ~/.config/chromium/Default/Preferences

 

Passons maintenant au plus interessant, le lancement du navigateur!

Nous allons voir plusieurs cas avec des options différentes que vous pourrez par la suite adapter à vos besoins :

-Ouvrir le navigateur vers l’adresse  www.jjtronics.com :

@chromium-browser -noerrdialogs http://www.jjtronics.com

Maintenant avec le mode Kiosk (un mode full screen que l’on ne peut quitter)

-Ouvrir le navigateur en plein écran Kiosk vers l’adresse www.jjtronics.com :

@chromium-browser -noerrdialogs -kiosk http://www.jjtronics.com

Comme vous pouvez le constater,  c’est l’option kiosk qui permet un affichage full screen

-Ouvrir le navigateur en plein écran Kiosk et en mode navigation privé vers l’adresse www.jjtronics.com :

@chromium-browser -noerrdialogs -kiosk -incognito http://www.jjtronics.com

-Ouvrir le navigateur en plein écran Kiosk, en mode navigation privé avec deux onglets, l’un pointant sur www.jjtronics.com et un second sur www.keepfreeze.com

@chromium-browser -noerrdialogs -kiosk -incognito http://www.jjtronics.com http://www.keepfreeze.com

Et voici en mode plein écran que l’on peut quitter :

-Ouvrir le navigateur en plein écran vers l’adresse www.jjtronics.com :

@chromium-browser -noerrdialogs--start-fullscreen http://www.jjtronics.com

-Ouvrir le navigateur en plein écran et en mode navigation privé vers l’adresse www.jjtronics.com :

@chromium-browser -noerrdialogs --start-fullscreen -incognito http://www.jjtronics.com

-Ouvrir le navigateur en plein écran, en mode navigation privé avec deux onglets, l’un pointant sur www.jjtronics.com et un second sur www.keepfreeze.com

@chromium-browser -noerrdialogs --start-fullscreen -incognito http://www.jjtronics.com http://www.keepfreeze.com

 

 

Maintenant que nous avons un kiosk avec plusieurs onglets, il va falloir automatiser le changement d’onglet, ce qui va permettre d’afficher plusieurs pages web avec un intervale de rotation d’un onglet vers l’autre.

Pour ce faire, nous allons simplement utiliser l’extension revolver-tabs.

ATTENTION, le mode navigation privé n’autorise pas l’utilisation de plugins, nous allons donc enlever l’option -incognito.

Ouvrez votre navigateur chromium sur le raspberry et allez à l’adresse :

https://chrome.google.com/webstore/detail/revolver-tabs/dlknooajieciikpedpldejhhijacnbda

Installez l’extension et allez ensuite dans les parametres de revolver :

revolver-tabs-1

-Parametrez le délais avant de switcher d’un onglet vers l’autre

-Activez l’auto-start pour que l’extension puisse se lancer automatiquement au lancement du navigateur

-Activez l’option Rotate only when inactive (Cela vous évitera de batailler pour rester sur un onglet)

Voici pour les options de base, une fois paramétré, vous pouvez redémarrer votre raspberry pour voir ce que ça donne.

Vous devriez avoir Chromium qui se lance en plein écran avec les deux onglets qui s’affiche l’un après l’autre au bout de X secondes.

Votre Kiosk commence à ressembler à quelque chose, mais si comme moi, vous avez certains sites web qui nécessite une authentification avant d’afficher vos précieuses informations et que vous souhaitez vraiment que dès le démarrage de votre Raspberry, votre kiosk s’authentifie automatiquement aux divers sites web que vous affichez, il y a l’extension auto-login pour chrome que vous pouvez installer en ouvrant votre navigateur chrome et allez à l’adresse :

https://chrome.google.com/webstore/detail/auto-login/kjdgohfkopafhjmmlbojhaabfpndllgk

Une fois installé, allez sur un site nécessitant une authentification :

auto-login-learn

Comme vous pouvez le voir sur votre droite, un icone est apparu, vous devez cliquer dessus pour que l’extension enrengistre les credentials que vous allez taper.

Une fois votre premier site web enrengistré, vous pouvez activer ou non l’auto-login en allant dans les options de l’extension :

auto-login-options

Vous pouvez maintenant tenter un reboot de votre Raspberry, votre navigateur devrait s’ouvrir en plein écran avec deux onglets qui tournent au bout de X secondes et authentifié sur les sites que vous avez préalablement enrengistré sur auto-login.

Que demander de plus ?

 

Je vous souhaite bon courage pour la suite et n’hésitez pas si vous avez des soucis ou une autre façon de faire ;)

Raspberry Pi 2 ou 3 et Raspbian Jessie - VLC 2.4 et accélération matériel (hardware acceleration)

Raspberry Pi 2 ou 3 et Raspbian Jessie – VLC 2.4 et accélération matériel (hardware acceleration)

Aujourd’hui je vais à nouveau publier une mise à jour de l’article : Raspberry Pi 2 – VLC et accélération matériel (hardware [&hellip

Raspberry Pi 2 ou 3 et Raspbian Jessie - VLC 2.2 et accélération matériel (hardware acceleration)

Raspberry Pi 2 ou 3 et Raspbian Jessie – VLC 2.2 et accélération matériel (hardware acceleration)

UPDATE : Raspberry Pi 2 ou 3 et Raspbian Pixel – VLC 2.4 et accélération matériel (hardware acceleration) Aujourd’hui je vais [&hellip

Compilation de la derniere version de FFMPEG

Compilation de la derniere version de FFMPEG

Bonjour à tous, Aujourd’hui un petit tuto pour avoir la dernière version de ffmpeg, ce tutoriel à été utilisé maintes [&hellip

Raspberry Pi 2 - VLC et accélération matériel (hardware acceleration)

Raspberry Pi 2 – VLC et accélération matériel (hardware acceleration)

UPDATE : Raspberry Pi 3 et Raspbian Pixel – VLC 2.4 et accélération matériel (hardware acceleration) Ayant un petit projet de [&hellip

FFMPEG - Diffuser un flux ip multicast en adaptative smooth streaming

FFMPEG – Diffuser un flux ip multicast en adaptative smooth streaming

Un petit script bien utile pour délivrer un flux video multicast en adaptative smooth streaming

Installation de Transform Manager

Installation de Transform Manager

Prérequis – résumé : Télécharger Transform Manager Télécharger IIS Media Services 4.1 Télécharger IIS Managment console Télécharger .NET Framework 3.5 [&hellip

Suivez moi !

Follow Me! Follow Me! Follow Me! Follow Me!

Chercher