[ADD] qemu: deploy ERPLibre VMs from cloud images
Deploys Ubuntu, Debian, Fedora and Arch cloud images through libvirt, on
amd64, arm64 and s390x. Handles the image download with mirror fallback,
the cloud-init seed, UEFI without Secure Boot, and the host setup.
--- FR ---
Déploie des images cloud Ubuntu, Debian, Fedora et Arch via libvirt, en
amd64, arm64 et s390x. Gère le téléchargement avec repli sur miroir, le seed
cloud-init, l'UEFI sans Secure Boot et la préparation de l'hôte.
Assisted-by: Claude Opus 4.8
2026-08-07 03:22:26 -04:00
|
|
|
|
|
|
|
|
# QEMU/KVM — Déploiement de VM Linux (Ubuntu / Debian / Fedora)
|
|
|
|
|
|
|
|
|
|
`deploy_qemu.py` déploie une VM Linux (libvirt/KVM) à partir d'une image
|
|
|
|
|
cloud officielle, via `qemu-img` + `cloud-init` + `virt-install`. Choisissez
|
|
|
|
|
la distribution avec `--distro` (`ubuntu` par défaut, `debian`, `fedora`) et
|
|
|
|
|
la version avec `--version` ; `--list-images` affiche tout le catalogue avec
|
|
|
|
|
les specs minimales. Il :
|
|
|
|
|
|
|
|
|
|
1. **Télécharge lui-même l'image cloud** (mise en cache, sans double
|
|
|
|
|
téléchargement).
|
|
|
|
|
2. La convertit en un disque de travail qcow2 dédié et le redimensionne.
|
|
|
|
|
3. Génère `user-data` / `meta-data` et construit le `seed.iso` (cloud-init).
|
|
|
|
|
4. Lance `virt-install` en important le disque + le seed en CD-ROM.
|
|
|
|
|
5. Attend le bail DHCP et affiche la commande SSH.
|
|
|
|
|
|
|
|
|
|
## Prérequis
|
|
|
|
|
|
|
|
|
|
- Un hôte disposant de KVM (bare-metal ou virtualisation imbriquée activée).
|
|
|
|
|
- Les droits `sudo` (le déploiement écrit dans `/var/lib/libvirt/images` et
|
|
|
|
|
pilote libvirt).
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
|
|
Le script **installe automatiquement les composants manquants** : au premier
|
|
|
|
|
lancement, il détecte votre gestionnaire de paquets (apt / dnf / pacman /
|
|
|
|
|
zypper / brew), liste les composants absents (les outils clients, **ainsi que
|
|
|
|
|
le démon libvirt et l'émulateur QEMU système**), demande confirmation, les
|
|
|
|
|
installe avec `sudo`, puis active et démarre `libvirtd`. Utilisez `-y` pour
|
|
|
|
|
accepter automatiquement ou `--no-install-deps` pour désactiver ce
|
|
|
|
|
comportement.
|
|
|
|
|
|
|
|
|
|
Pour tout installer manuellement sur Ubuntu/Debian (pile KVM complète
|
|
|
|
|
recommandée) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo apt install qemu-utils virtinst libvirt-clients cloud-image-utils \
|
|
|
|
|
libvirt-daemon-system qemu-system-x86
|
|
|
|
|
sudo systemctl enable --now libvirtd
|
|
|
|
|
sudo usermod -aG libvirt,kvm "$USER" # re-login / reconnectez-vous
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`libvirt-daemon-system` fournit le démon `libvirtd` (et le socket
|
|
|
|
|
`/var/run/libvirt/libvirt-sock`) et `qemu-system-x86` l'émulateur — sans eux
|
|
|
|
|
`virt-install` échoue avec *« Failed to connect socket to
|
|
|
|
|
'/var/run/libvirt/libvirt-sock' »*. Le script les installe et les démarre pour
|
|
|
|
|
vous ; cette commande manuelle n'est utile que si vous préférez préparer
|
|
|
|
|
l'hôte vous-même ou utiliser `--no-install-deps`.
|
|
|
|
|
|
|
|
|
|
## Utilisation
|
|
|
|
|
|
|
|
|
|
Forme la plus simple — l'image est téléchargée automatiquement (chemin déduit
|
|
|
|
|
de `--version`, mis en cache dans `/var/lib/libvirt/images/iso`) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --name test-vm --version 24.04 \
|
|
|
|
|
--ssh-key ~/.ssh/id_ed25519.pub
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Télécharger (et vérifier) une image sans créer de VM :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --download-only --version 24.04 --verify
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Déployer avec un mot de passe interactif au lieu d'une clé SSH :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --name test-vm --version 24.04 --ask-password
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
VM plus grande (8 Go RAM, 8 vCPU, disque 120 Go), en écrasant un disque
|
|
|
|
|
existant :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --name test-vm --version 24.04 \
|
|
|
|
|
--memory 8192 --vcpus 8 --disk-size 120G --ask-password --force
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Prévisualiser ce qui serait fait, sans rien exécuter (sans sudo, sans
|
|
|
|
|
téléchargement) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
./script/qemu/deploy_qemu.py --name test-vm --version 24.04 --dry-run
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Déploiement non interactif (accepte automatiquement l'installation des
|
|
|
|
|
dépendances) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --name test-vm --version 24.04 \
|
|
|
|
|
--ssh-key ~/.ssh/id_ed25519.pub -y
|
|
|
|
|
```
|
|
|
|
|
|
[UPD] support: drop Ubuntu 20.04/22.04, add AlmaLinux and Rocky
Ubuntu 20.04 and 22.04 leave EVERY architecture, not just s390x. pikepdf
needs qpdf 12.2, whose build requires C++20, while focal ships GCC 9 and
publishes no g++-10 for s390x at all. Python 3.8, node 10, cargo 0.67 and
OpenSSL 1.1.1 each had a workaround; the pile of them did not. 18.04
follows, already off the lists. The refusal lands before any apt, this
script also serving existing machines.
AlmaLinux 9 and 10, Rocky 9 and 10 join the catalog on all four
architectures: the twelve "latest" URLs were opened, with no index to
parse unlike Fedora. They would have booted unreachable though -- the
cloud-config forced "groups: users, sudo", but the RHEL family has no
sudo group, only wheel, and an unknown group makes useradd fail, hence no
password and no key. The very trap already known for Debian, repeated
elsewhere. Host side, EPEL and CRB are enabled: without them most -devel
packages are missing, silently.
The server / graphical choice gains Cinnamon, the Linux Mint desktop,
from the distribution's own repositories. Mint's repository is set aside:
plain HTTP, and i386/amd64 only, which would rule out arm64 and s390x.
Along the way, dnf now installs an ENVIRONMENT rather than a group --
"gnome-desktop" brings gdm and gnome-shell but not base-x, hence no X
server.
--- FR ---
Ubuntu 20.04 et 22.04 partent de TOUTES les architectures, pas seulement
de s390x. pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
quand focal livre GCC 9 et ne publie même pas de g++-10 pour s390x.
Python 3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur
contournement ; leur accumulation, non. 18.04 suit, déjà hors des
listes. Le refus tombe avant tout apt, ce script servant aussi les
machines existantes.
AlmaLinux 9 et 10, Rocky 9 et 10 entrent au catalogue, sur les quatre
architectures : les douze URL « latest » ont été ouvertes, aucun index à
analyser contrairement à Fedora. Elles auraient pourtant démarré
inaccessibles — le cloud-config imposait « groups: users, sudo », or la
famille RHEL n'a pas de groupe sudo mais wheel, et un groupe inconnu fait
échouer useradd, donc ni mot de passe ni clé. C'est le piège déjà connu
pour Debian, reproduit ailleurs. Côté hôte, EPEL et CRB sont activés :
sans eux la plupart des -devel manquent, en silence.
Le choix serveur / graphique gagne Cinnamon, le bureau de Linux Mint,
depuis les dépôts de la distribution. Le dépôt de Mint lui-même est
écarté : il est en HTTP nu et ne publie que i386 et amd64, ce qui
exclurait arm64 et s390x. Au passage, dnf installe désormais un
ENVIRONNEMENT et non un groupe — « gnome-desktop » apporte gdm et
gnome-shell mais pas base-x, donc pas de serveur X.
Assisted-by: Claude Opus 5
2026-08-11 18:46:11 -04:00
|
|
|
Catalogue, par architecture (`deploy_qemu.py` fait autorité) :
|
|
|
|
|
|
|
|
|
|
| Distro | Versions | amd64 | arm64 | s390x |
|
|
|
|
|
|---|---|:-:|:-:|:-:|
|
|
|
|
|
| ubuntu | `24.04` (défaut), `25.10`, `26.04` | ✔ | ✔ | ✔ |
|
|
|
|
|
| debian | `11`, `12` (défaut), `13` | ✔ | ✔ | — |
|
[ADD] catalogue: Fedora 43 for s390x
Fedora does publish an s390x cloud image, just elsewhere: the arch is
SECONDARY there, its images live under "fedora-secondary" rather than
/pub/fedora/linux/. The catalog comment read "404" -- it was the wrong
tree.
It brings what nothing else has on this architecture: qpdf 12.2.0,
exactly the pikepdf 10 threshold. The qpdf build, half an hour under
emulation, disappears. With GCC 15, Python 3.14 and cargo 1.90, none of
the s390x workarounds fire there.
Only 43 is kept: Fedora builds s390x for the current release only. 41 and
42 return 404 on the master mirror, 44 sits on third-party mirrors only.
Hence a positive per-architecture declaration, read by both interfaces --
the catalog never offers what deployment would refuse.
--- FR ---
Fedora publie bien une image cloud s390x, mais ailleurs : l'architecture
est SECONDAIRE chez elle, ses images vivent sous « fedora-secondary » et
non sous /pub/fedora/linux/. Le commentaire du catalogue disait « 404 » —
c'était la mauvaise arborescence.
Elle apporte ce qu'aucune autre n'a sur cette architecture : qpdf 12.2.0,
soit exactement le seuil de pikepdf 10. La compilation de qpdf, une demi-
heure sous émulation, disparaît. Avec GCC 15, Python 3.14 et cargo 1.90,
aucun des contournements s390x ne s'y déclenche.
Seule la 43 est retenue : Fedora ne construit s390x que pour la version
courante. Les 41 et 42 rendent 404 sur le miroir maître, la 44 n'est que
sur certains miroirs tiers. D'où une déclaration positive par
architecture, que les deux interfaces relisent — le catalogue ne propose
pas ce que le déploiement refuserait.
Assisted-by: Claude Opus 5
2026-08-11 19:55:09 -04:00
|
|
|
| fedora | `41`, `42` (défaut), `43`, `44` | ✔ | ✔ | `43` seule |
|
[UPD] support: drop Ubuntu 20.04/22.04, add AlmaLinux and Rocky
Ubuntu 20.04 and 22.04 leave EVERY architecture, not just s390x. pikepdf
needs qpdf 12.2, whose build requires C++20, while focal ships GCC 9 and
publishes no g++-10 for s390x at all. Python 3.8, node 10, cargo 0.67 and
OpenSSL 1.1.1 each had a workaround; the pile of them did not. 18.04
follows, already off the lists. The refusal lands before any apt, this
script also serving existing machines.
AlmaLinux 9 and 10, Rocky 9 and 10 join the catalog on all four
architectures: the twelve "latest" URLs were opened, with no index to
parse unlike Fedora. They would have booted unreachable though -- the
cloud-config forced "groups: users, sudo", but the RHEL family has no
sudo group, only wheel, and an unknown group makes useradd fail, hence no
password and no key. The very trap already known for Debian, repeated
elsewhere. Host side, EPEL and CRB are enabled: without them most -devel
packages are missing, silently.
The server / graphical choice gains Cinnamon, the Linux Mint desktop,
from the distribution's own repositories. Mint's repository is set aside:
plain HTTP, and i386/amd64 only, which would rule out arm64 and s390x.
Along the way, dnf now installs an ENVIRONMENT rather than a group --
"gnome-desktop" brings gdm and gnome-shell but not base-x, hence no X
server.
--- FR ---
Ubuntu 20.04 et 22.04 partent de TOUTES les architectures, pas seulement
de s390x. pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
quand focal livre GCC 9 et ne publie même pas de g++-10 pour s390x.
Python 3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur
contournement ; leur accumulation, non. 18.04 suit, déjà hors des
listes. Le refus tombe avant tout apt, ce script servant aussi les
machines existantes.
AlmaLinux 9 et 10, Rocky 9 et 10 entrent au catalogue, sur les quatre
architectures : les douze URL « latest » ont été ouvertes, aucun index à
analyser contrairement à Fedora. Elles auraient pourtant démarré
inaccessibles — le cloud-config imposait « groups: users, sudo », or la
famille RHEL n'a pas de groupe sudo mais wheel, et un groupe inconnu fait
échouer useradd, donc ni mot de passe ni clé. C'est le piège déjà connu
pour Debian, reproduit ailleurs. Côté hôte, EPEL et CRB sont activés :
sans eux la plupart des -devel manquent, en silence.
Le choix serveur / graphique gagne Cinnamon, le bureau de Linux Mint,
depuis les dépôts de la distribution. Le dépôt de Mint lui-même est
écarté : il est en HTTP nu et ne publie que i386 et amd64, ce qui
exclurait arm64 et s390x. Au passage, dnf installe désormais un
ENVIRONNEMENT et non un groupe — « gnome-desktop » apporte gdm et
gnome-shell mais pas base-x, donc pas de serveur X.
Assisted-by: Claude Opus 5
2026-08-11 18:46:11 -04:00
|
|
|
| almalinux | `9` (défaut), `10` | ✔ | ✔ | ✔ |
|
|
|
|
|
| rocky | `9`, `10` (défaut) | ✔ | ✔ | ✔ |
|
[ADD] qemu: openSUSE Leap 16.0, numbered, as the default
The catalogue only offered openSUSE Tumbleweed, a rolling release with
no version number. Nearly every openSUSE incident in this series came
from that: the cloud image is a snapshot lagging behind its own repos,
hence the mandatory "zypper dup", and two VMs deployed the same day saw
git-daemon 2.54 on s390x against 2.55 on amd64. For an ERP platform,
that is not what should be offered by default.
Leap 16.0 is numbered, stable, and publishes the three architectures
that matter -- verified, x86_64, aarch64 and s390x all 200. It also
unifies its tree: no separate /ports/, unlike Tumbleweed, whose
equivalent paths 404 for Leap.
Tumbleweed stays on offer, as a bellwether for breakage to come. Two
things separate them in the scripts: the repository path, and "dup" --
which on Leap means CHANGING version, not updating.
--- FR ---
Le catalogue n'offrait qu'openSUSE Tumbleweed, une rolling sans numéro
de version. Presque tous les incidents openSUSE de la série venaient de
là : l'image cloud est un instantané en retard sur ses dépôts, d'où le
« zypper dup » obligatoire, et deux VM déployées le même jour ont vu
git-daemon 2.54 sur s390x contre 2.55 sur amd64. Pour une plateforme
ERP, ce n'est pas ce qu'on veut proposer par défaut.
Leap 16.0 est numérotée, stable, et publie les trois architectures qui
comptent — vérifié, x86_64, aarch64 et s390x en 200. Elle unifie de plus
son arbre : pas de /ports/ séparé, contrairement à Tumbleweed, dont les
chemins équivalents rendent 404 pour Leap.
Tumbleweed reste offerte, comme banc d'essai des ruptures à venir.
Deux points les séparent dans les scripts : le chemin des dépôts, et
« dup » — qui sur Leap sert à CHANGER de version, pas à mettre à jour.
Assisted-by: Claude Opus 5
2026-08-12 01:16:17 -04:00
|
|
|
| opensuse | `16.0` (défaut), `tumbleweed` | ✔ | ✔ | ✔ |
|
[UPD] support: drop Ubuntu 20.04/22.04, add AlmaLinux and Rocky
Ubuntu 20.04 and 22.04 leave EVERY architecture, not just s390x. pikepdf
needs qpdf 12.2, whose build requires C++20, while focal ships GCC 9 and
publishes no g++-10 for s390x at all. Python 3.8, node 10, cargo 0.67 and
OpenSSL 1.1.1 each had a workaround; the pile of them did not. 18.04
follows, already off the lists. The refusal lands before any apt, this
script also serving existing machines.
AlmaLinux 9 and 10, Rocky 9 and 10 join the catalog on all four
architectures: the twelve "latest" URLs were opened, with no index to
parse unlike Fedora. They would have booted unreachable though -- the
cloud-config forced "groups: users, sudo", but the RHEL family has no
sudo group, only wheel, and an unknown group makes useradd fail, hence no
password and no key. The very trap already known for Debian, repeated
elsewhere. Host side, EPEL and CRB are enabled: without them most -devel
packages are missing, silently.
The server / graphical choice gains Cinnamon, the Linux Mint desktop,
from the distribution's own repositories. Mint's repository is set aside:
plain HTTP, and i386/amd64 only, which would rule out arm64 and s390x.
Along the way, dnf now installs an ENVIRONMENT rather than a group --
"gnome-desktop" brings gdm and gnome-shell but not base-x, hence no X
server.
--- FR ---
Ubuntu 20.04 et 22.04 partent de TOUTES les architectures, pas seulement
de s390x. pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
quand focal livre GCC 9 et ne publie même pas de g++-10 pour s390x.
Python 3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur
contournement ; leur accumulation, non. 18.04 suit, déjà hors des
listes. Le refus tombe avant tout apt, ce script servant aussi les
machines existantes.
AlmaLinux 9 et 10, Rocky 9 et 10 entrent au catalogue, sur les quatre
architectures : les douze URL « latest » ont été ouvertes, aucun index à
analyser contrairement à Fedora. Elles auraient pourtant démarré
inaccessibles — le cloud-config imposait « groups: users, sudo », or la
famille RHEL n'a pas de groupe sudo mais wheel, et un groupe inconnu fait
échouer useradd, donc ni mot de passe ni clé. C'est le piège déjà connu
pour Debian, reproduit ailleurs. Côté hôte, EPEL et CRB sont activés :
sans eux la plupart des -devel manquent, en silence.
Le choix serveur / graphique gagne Cinnamon, le bureau de Linux Mint,
depuis les dépôts de la distribution. Le dépôt de Mint lui-même est
écarté : il est en HTTP nu et ne publie que i386 et amd64, ce qui
exclurait arm64 et s390x. Au passage, dnf installe désormais un
ENVIRONNEMENT et non un groupe — « gnome-desktop » apporte gdm et
gnome-shell mais pas base-x, donc pas de serveur X.
Assisted-by: Claude Opus 5
2026-08-11 18:46:11 -04:00
|
|
|
| arch | `latest` | ✔ | — | — |
|
|
|
|
|
|
[ADD] catalogue: Fedora 43 for s390x
Fedora does publish an s390x cloud image, just elsewhere: the arch is
SECONDARY there, its images live under "fedora-secondary" rather than
/pub/fedora/linux/. The catalog comment read "404" -- it was the wrong
tree.
It brings what nothing else has on this architecture: qpdf 12.2.0,
exactly the pikepdf 10 threshold. The qpdf build, half an hour under
emulation, disappears. With GCC 15, Python 3.14 and cargo 1.90, none of
the s390x workarounds fire there.
Only 43 is kept: Fedora builds s390x for the current release only. 41 and
42 return 404 on the master mirror, 44 sits on third-party mirrors only.
Hence a positive per-architecture declaration, read by both interfaces --
the catalog never offers what deployment would refuse.
--- FR ---
Fedora publie bien une image cloud s390x, mais ailleurs : l'architecture
est SECONDAIRE chez elle, ses images vivent sous « fedora-secondary » et
non sous /pub/fedora/linux/. Le commentaire du catalogue disait « 404 » —
c'était la mauvaise arborescence.
Elle apporte ce qu'aucune autre n'a sur cette architecture : qpdf 12.2.0,
soit exactement le seuil de pikepdf 10. La compilation de qpdf, une demi-
heure sous émulation, disparaît. Avec GCC 15, Python 3.14 et cargo 1.90,
aucun des contournements s390x ne s'y déclenche.
Seule la 43 est retenue : Fedora ne construit s390x que pour la version
courante. Les 41 et 42 rendent 404 sur le miroir maître, la 44 n'est que
sur certains miroirs tiers. D'où une déclaration positive par
architecture, que les deux interfaces relisent — le catalogue ne propose
pas ce que le déploiement refuserait.
Assisted-by: Claude Opus 5
2026-08-11 19:55:09 -04:00
|
|
|
Fedora ne construit s390x que pour la version courante, et sur une
|
|
|
|
|
arborescence à part (`fedora-secondary`) — d'où la version unique.
|
|
|
|
|
|
[ADD] qemu: openSUSE Leap 16.0, numbered, as the default
The catalogue only offered openSUSE Tumbleweed, a rolling release with
no version number. Nearly every openSUSE incident in this series came
from that: the cloud image is a snapshot lagging behind its own repos,
hence the mandatory "zypper dup", and two VMs deployed the same day saw
git-daemon 2.54 on s390x against 2.55 on amd64. For an ERP platform,
that is not what should be offered by default.
Leap 16.0 is numbered, stable, and publishes the three architectures
that matter -- verified, x86_64, aarch64 and s390x all 200. It also
unifies its tree: no separate /ports/, unlike Tumbleweed, whose
equivalent paths 404 for Leap.
Tumbleweed stays on offer, as a bellwether for breakage to come. Two
things separate them in the scripts: the repository path, and "dup" --
which on Leap means CHANGING version, not updating.
--- FR ---
Le catalogue n'offrait qu'openSUSE Tumbleweed, une rolling sans numéro
de version. Presque tous les incidents openSUSE de la série venaient de
là : l'image cloud est un instantané en retard sur ses dépôts, d'où le
« zypper dup » obligatoire, et deux VM déployées le même jour ont vu
git-daemon 2.54 sur s390x contre 2.55 sur amd64. Pour une plateforme
ERP, ce n'est pas ce qu'on veut proposer par défaut.
Leap 16.0 est numérotée, stable, et publie les trois architectures qui
comptent — vérifié, x86_64, aarch64 et s390x en 200. Elle unifie de plus
son arbre : pas de /ports/ séparé, contrairement à Tumbleweed, dont les
chemins équivalents rendent 404 pour Leap.
Tumbleweed reste offerte, comme banc d'essai des ruptures à venir.
Deux points les séparent dans les scripts : le chemin des dépôts, et
« dup » — qui sur Leap sert à CHANGER de version, pas à mettre à jour.
Assisted-by: Claude Opus 5
2026-08-12 01:16:17 -04:00
|
|
|
`opensuse` recouvre deux produits distincts, pas deux versions du même. Leap
|
|
|
|
|
`16.0` est numérotée et stable (base SLE) : c'est le défaut. `tumbleweed` est
|
|
|
|
|
la rolling, gardée comme banc d'essai des ruptures à venir — sa dérive
|
|
|
|
|
d'instantanés est réelle, et elle impose un `zypper dup` complet avant toute
|
|
|
|
|
installation.
|
|
|
|
|
|
|
|
|
|
Les deux livrent un qpdf au-dessus du seuil de pikepdf : la compilation de
|
|
|
|
|
qpdf, une demi-heure, ne s'y déclenche jamais — ce qui compte sous émulation
|
|
|
|
|
s390x.
|
[ADD] install: openSUSE support, mirrors and packages
Tumbleweed is the only catalog entry whose qpdf already clears the pikepdf
threshold: 12.3.2 against 12.2 required, so the half-hour qpdf build under
s390x emulation never runs there. It is also the only family foreign to
both RHEL and Debian, and it brings zypper, absent from the repository:
wired into the install_dev.sh dispatch, a dependency script, the remote
bootstrap and the desktop block.
Four SUSE traps, all met on real machines. Global options precede the
subcommand, and misplaced ones abort the call; without
"--auto-agree-with-licenses" zypper waits for an answer nobody gives in a
detached install. A compat package that PROVIDES another under a different
name makes zypper raise a conflict and drop the whole batch, so only what
nothing already provides is requested. pkg-config no longer exists as an
RPM, only as a capability. And a single mirror, unreachable one day, sent
everyone back to Europe -- three are probed in order now.
CentOS Stream is dropped again: it served as a canary but 10 duplicates
what Alma and Rocky already cover.
--- FR ---
Tumbleweed est la seule entrée du catalogue dont qpdf franchit déjà le
seuil de pikepdf : 12.3.2 contre 12.2 exigé, si bien que la demi-heure de
compilation de qpdf sous émulation s390x ne s'y déclenche jamais. C'est
aussi la seule famille étrangère à RHEL comme à Debian, et elle apporte
zypper, absent du dépôt : câblé dans l'aiguillage d'install_dev.sh, un
script de dépendances, l'amorçage distant et le bloc bureau.
Quatre pièges SUSE, tous rencontrés sur machine réelle. Les options
globales précèdent la sous-commande, mal placées elles arrêtent l'appel ;
sans « --auto-agree-with-licenses » zypper attend une réponse que personne
ne donne dans une installation détachée. Un paquet compat qui FOURNIT un
autre sous un nom différent fait lever un conflit à zypper, qui abandonne
le lot entier : on ne demande donc que ce que rien ne fournit déjà.
pkg-config n'existe plus comme RPM, seulement comme capacité. Et un miroir
unique, injoignable un jour, renvoyait tout le monde en Europe — trois
sont désormais sondés dans l'ordre.
CentOS Stream repart : il servait de canari, mais 10 double ce qu'Alma et
Rocky couvrent déjà.
Assisted-by: Claude Opus 5
2026-08-11 20:38:12 -04:00
|
|
|
|
[UPD] support: drop Ubuntu 20.04/22.04, add AlmaLinux and Rocky
Ubuntu 20.04 and 22.04 leave EVERY architecture, not just s390x. pikepdf
needs qpdf 12.2, whose build requires C++20, while focal ships GCC 9 and
publishes no g++-10 for s390x at all. Python 3.8, node 10, cargo 0.67 and
OpenSSL 1.1.1 each had a workaround; the pile of them did not. 18.04
follows, already off the lists. The refusal lands before any apt, this
script also serving existing machines.
AlmaLinux 9 and 10, Rocky 9 and 10 join the catalog on all four
architectures: the twelve "latest" URLs were opened, with no index to
parse unlike Fedora. They would have booted unreachable though -- the
cloud-config forced "groups: users, sudo", but the RHEL family has no
sudo group, only wheel, and an unknown group makes useradd fail, hence no
password and no key. The very trap already known for Debian, repeated
elsewhere. Host side, EPEL and CRB are enabled: without them most -devel
packages are missing, silently.
The server / graphical choice gains Cinnamon, the Linux Mint desktop,
from the distribution's own repositories. Mint's repository is set aside:
plain HTTP, and i386/amd64 only, which would rule out arm64 and s390x.
Along the way, dnf now installs an ENVIRONMENT rather than a group --
"gnome-desktop" brings gdm and gnome-shell but not base-x, hence no X
server.
--- FR ---
Ubuntu 20.04 et 22.04 partent de TOUTES les architectures, pas seulement
de s390x. pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
quand focal livre GCC 9 et ne publie même pas de g++-10 pour s390x.
Python 3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur
contournement ; leur accumulation, non. 18.04 suit, déjà hors des
listes. Le refus tombe avant tout apt, ce script servant aussi les
machines existantes.
AlmaLinux 9 et 10, Rocky 9 et 10 entrent au catalogue, sur les quatre
architectures : les douze URL « latest » ont été ouvertes, aucun index à
analyser contrairement à Fedora. Elles auraient pourtant démarré
inaccessibles — le cloud-config imposait « groups: users, sudo », or la
famille RHEL n'a pas de groupe sudo mais wheel, et un groupe inconnu fait
échouer useradd, donc ni mot de passe ni clé. C'est le piège déjà connu
pour Debian, reproduit ailleurs. Côté hôte, EPEL et CRB sont activés :
sans eux la plupart des -devel manquent, en silence.
Le choix serveur / graphique gagne Cinnamon, le bureau de Linux Mint,
depuis les dépôts de la distribution. Le dépôt de Mint lui-même est
écarté : il est en HTTP nu et ne publie que i386 et amd64, ce qui
exclurait arm64 et s390x. Au passage, dnf installe désormais un
ENVIRONNEMENT et non un groupe — « gnome-desktop » apporte gdm et
gnome-shell mais pas base-x, donc pas de serveur X.
Assisted-by: Claude Opus 5
2026-08-11 18:46:11 -04:00
|
|
|
Fournissez un chemin d'image en argument positionnel pour surcharger
|
|
|
|
|
l'emplacement de téléchargement automatique.
|
|
|
|
|
|
|
|
|
|
Les Ubuntu `20.04` et `22.04` sont **abandonnées sur toutes les
|
|
|
|
|
architectures** : pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
|
|
|
|
|
et focal livre GCC 9 — elle ne publie même pas de `g++-10` pour s390x. Python
|
|
|
|
|
3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur contournement ;
|
|
|
|
|
leur accumulation, non.
|
[REM] install: drop Ubuntu 20.04 and 22.04
Two blockers on 20.04, neither worth carrying. "TypeError: unsupported
operand type(s) for |" fired before the install even started:
update_env_version.py imports erplibre_state as the very first thing
"make install_os" does, hence before pyenv, on the system Python 3.8,
where a "str | None" annotation is evaluated at import. And cryptography
now demands OpenSSL 3, while focal ships 1.1.1.
Annotations are therefore deferred, a contract the bootstrap file already
stated in a comment and now holds across script/version and
script/install. But the releases themselves go: pikepdf requires
qpdf >= 12.2, compiled in C++20, when focal ships GCC 9.
--- FR ---
Deux blocages sur 20.04, aucun ne méritant d'être porté. « TypeError:
unsupported operand type(s) for | » se déclenchait avant même le début de
l'installation : update_env_version.py importe erplibre_state en tout
premier lieu de « make install_os », donc avant pyenv, sur le Python 3.8
du système, où une annotation « str | None » est évaluée à l'import. Et
cryptography exige désormais OpenSSL 3, quand focal livre 1.1.1.
Les annotations sont donc différées, contrat que le fichier d'amorçage
énonçait déjà en commentaire et qui tient maintenant sur script/version et
script/install. Mais les versions elles-mêmes partent : pikepdf réclame
qpdf >= 12.2, compilé en C++20, quand focal livre GCC 9.
Assisted-by: Claude Opus 5
2026-08-11 08:03:32 -04:00
|
|
|
|
[ADD] qemu: deploy ERPLibre VMs from cloud images
Deploys Ubuntu, Debian, Fedora and Arch cloud images through libvirt, on
amd64, arm64 and s390x. Handles the image download with mirror fallback,
the cloud-init seed, UEFI without Secure Boot, and the host setup.
--- FR ---
Déploie des images cloud Ubuntu, Debian, Fedora et Arch via libvirt, en
amd64, arm64 et s390x. Gère le téléchargement avec repli sur miroir, le seed
cloud-init, l'UEFI sans Secure Boot et la préparation de l'hôte.
Assisted-by: Claude Opus 4.8
2026-08-07 03:22:26 -04:00
|
|
|
## Après le déploiement
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
virsh list --all
|
|
|
|
|
virsh console test-vm # Ctrl+] to quit / pour quitter
|
|
|
|
|
virsh domifaddr test-vm --source lease # find the IP / trouver l'IP
|
|
|
|
|
ssh erplibre@<IP>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
L'utilisateur par défaut est `erplibre` (modifiable avec `--user`).
|
|
|
|
|
|
|
|
|
|
## Via le menu TODO
|
|
|
|
|
|
|
|
|
|
Le script est intégré à l'assistant interactif. Lancez `make todo` (ou
|
|
|
|
|
`./script/todo/todo.py`), puis allez dans **Execute → Deploy → QEMU/KVM -
|
|
|
|
|
Deploy an Ubuntu VM (libvirt)**. De là, vous pouvez déployer une VM,
|
|
|
|
|
prévisualiser un dry-run, télécharger une image, lister les VM et afficher
|
|
|
|
|
l'IP d'une VM — le menu demande les paramètres et construit la commande pour
|
|
|
|
|
vous.
|
|
|
|
|
|
|
|
|
|
## Principales options
|
|
|
|
|
|
|
|
|
|
- `--distro` — `ubuntu` (défaut), `debian` ou `fedora`.
|
|
|
|
|
- `--version` — version de la distro (défaut : celle par défaut de la distro).
|
|
|
|
|
- `--list-images` — affiche toutes les distros/versions et leurs specs.
|
|
|
|
|
- `--image-dir` — répertoire de cache des images (défaut
|
|
|
|
|
`/var/lib/libvirt/images/iso`).
|
|
|
|
|
- `--download-only` — télécharge l'image puis quitte (sans VM).
|
|
|
|
|
- `--name` — nom de la VM (requis pour le déploiement).
|
|
|
|
|
- `--memory`, `--vcpus`, `--disk-size` — dimensionnement de la VM. Omis,
|
|
|
|
|
`--memory` et `--disk-size` prennent le **minimum requis par la version**
|
|
|
|
|
choisie (valeurs libosinfo, voir `--list-images` : Ubuntu 24.04+ →
|
|
|
|
|
3072 Mo/20G, Debian → 1024 Mo/10G, Fedora → 2048 Mo/15G) ; `--vcpus`
|
|
|
|
|
vaut 2 par défaut.
|
|
|
|
|
- `--ssh-key`, `--ask-password`, `--password-hash` — authentification.
|
|
|
|
|
- `-y` / `--assume-yes` — accepte automatiquement l'installation des
|
|
|
|
|
dépendances.
|
|
|
|
|
- `--no-install-deps` — n'installe jamais les dépendances automatiquement.
|
|
|
|
|
- `--dry-run` — affiche les commandes sans rien exécuter.
|
|
|
|
|
- `--force` — écrase le disque de travail qcow2 existant.
|
|
|
|
|
|
|
|
|
|
Lancez `./script/qemu/deploy_qemu.py --help` pour la liste complète.
|
|
|
|
|
|
|
|
|
|
## Gestion des VM
|
|
|
|
|
|
|
|
|
|
Lister, arrêter et supprimer les VM (le disque qcow2 sous
|
|
|
|
|
`/var/lib/libvirt/images` est conservé tant que vous ne le supprimez pas) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo virsh list --all # toutes les VM et leur état / all VMs and state
|
|
|
|
|
sudo virsh shutdown <nom-vm> # arrêt propre ACPI / graceful shutdown
|
|
|
|
|
sudo virsh destroy <nom-vm> # arrêt forcé / force off (pull the plug)
|
|
|
|
|
sudo virsh undefine <nom-vm> # supprime la définition / remove definition
|
|
|
|
|
sudo virsh domifaddr <nom-vm> # adresse IP de la VM / VM IP address
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`destroy` ne fait qu'éteindre la VM (disque conservé) ; `undefine` supprime sa
|
|
|
|
|
définition. Pour recréer proprement une VM du même nom, faites `destroy` +
|
|
|
|
|
`undefine` d'abord, ou redéployez avec `--force`.
|
|
|
|
|
|
|
|
|
|
## Accès SSH depuis une autre machine (ProxyJump)
|
|
|
|
|
|
|
|
|
|
Avec le réseau NAT par défaut, la VM n'est joignable que **depuis l'hôte
|
|
|
|
|
KVM**. Pour l'atteindre depuis une autre machine **sans toucher au réseau**,
|
|
|
|
|
utilisez l'hôte comme rebond (il joint déjà la VM). Récupérez l'IP de la VM
|
|
|
|
|
avec `sudo virsh domifaddr <nom-vm>`, puis depuis l'autre machine :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Rebond SSH vers la VM / jump through the KVM host
|
|
|
|
|
ssh -J user@<ip-hote> erplibre@<ip-vm>
|
|
|
|
|
|
|
|
|
|
# Tunnel d'un service, ex. Odoo 8069 / tunnel a service, then http://localhost:8069
|
|
|
|
|
ssh -L 8069:<ip-vm>:8069 user@<ip-hote>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Pour le rendre permanent, ajoutez ceci à `~/.ssh/config` sur l'autre machine
|
|
|
|
|
(ensuite `ssh myvm` suffit) :
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
Host myvm
|
|
|
|
|
HostName <ip-vm> # ex. 192.168.122.50 (reseau NAT)
|
|
|
|
|
User erplibre
|
|
|
|
|
ProxyJump user@<ip-hote> # IP LAN de l'hote KVM
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Ça marche en Wi-Fi et sans arrêter la VM — l'option la plus simple pour un
|
|
|
|
|
accès personnel. Préférez un pont (ci-dessous) si la VM doit être un serveur
|
|
|
|
|
à part entière exposé sur le LAN.
|
|
|
|
|
|
|
|
|
|
## QEMU dans QEMU (imbriqué) & exposer la VM via un pont
|
|
|
|
|
|
|
|
|
|
Si l'hôte KVM est **lui-même une VM** (QEMU dans QEMU), le déploiement ne
|
|
|
|
|
fonctionne que si la **virtualisation imbriquée** est activée sur l'hôte
|
|
|
|
|
physique et que la VM intermédiaire utilise le mode CPU `host-passthrough`.
|
|
|
|
|
Vérifiez depuis l'hôte KVM (la première commande doit être non vide) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
grep -E -o '(vmx|svm)' /proc/cpuinfo | sort -u # extensions visibles / visible
|
|
|
|
|
# Sur l'hote PHYSIQUE / on the PHYSICAL host:
|
|
|
|
|
cat /sys/module/kvm_intel/parameters/nested # Intel -> Y/1
|
|
|
|
|
cat /sys/module/kvm_amd/parameters/nested # AMD -> Y/1
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Pour activer l'imbrication sur l'hôte physique (Intel montré ; `kvm_amd` sur
|
|
|
|
|
AMD), puis recréer la VM intermédiaire en `host-passthrough` :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-nested.conf
|
|
|
|
|
sudo modprobe -r kvm_intel && sudo modprobe kvm_intel # ou / or reboot
|
|
|
|
|
```
|
|
|
|
|
|
[IMP] qemu: a VM one can reach, and a first boot that does not stall
The monitor froze the address given at launch, so it lost the VM as soon as
cloud-init renamed the host and DHCP handed out another lease. It now
re-resolves at each attempt, in the views too, and reads virsh without sudo
— « sudo -n » fails in a detached session with no tty.
First boot also stopped paying for what it does not need: the guest agent
leaves cloud-init, snapd and locale-gen go, apt takes the fastest mirror.
The timezone follows the host. And when KVM is missing, the deployment says
so before the wait instead of being mysteriously fifteen times slower.
--- FR ---
Le suivi figeait l'adresse connue au lancement : il perdait donc la VM dès
que cloud-init posait le vrai nom d'hôte et que DHCP donnait un autre bail.
Il la ré-résout désormais à chaque tentative, dans les vues aussi, et lit
virsh sans sudo — « sudo -n » échoue dans une session détachée, sans tty.
Le premier démarrage cesse aussi de payer l'inutile : l'agent invité sort
de cloud-init, snapd et locale-gen disparaissent, apt prend le miroir le
plus rapide. Le fuseau suit l'hôte. Et faute de KVM, le déploiement le dit
avant l'attente, au lieu d'être quinze fois plus lent sans raison visible.
Assisted-by: Claude Opus 5
2026-08-10 03:10:50 -04:00
|
|
|
Sur **s390x et arm64**, le paramètre vit sur le module `kvm` lui-même, et non
|
|
|
|
|
sur `kvm_intel` / `kvm_amd` — et `/sys/module/kvm/parameters/nested` n'existe
|
|
|
|
|
même pas sur x86. Lire le mauvais fichier renvoie un `0` rassurant qui ne
|
|
|
|
|
commande rien :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
echo "options kvm nested=1" | sudo tee /etc/modprobe.d/kvm-nested.conf
|
|
|
|
|
sudo modprobe -r kvm && sudo modprobe kvm # ou / or reboot
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`nested` sur une machine signifie « j'autorise MES invités à faire tourner des
|
|
|
|
|
VM ». Pour accélérer une VM créée sur l'hôte H, le réglage appartient à
|
|
|
|
|
l'hyperviseur **au-dessus** de H, pas à H. La commande qui tranche, sur H :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
ls -l /dev/kvm # absent -> pas d'imbrication, tout sera émulé
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Mesuré sur un hôte s390x lui-même invité KVM sans imbrication : `/dev/kvm`
|
|
|
|
|
absent, `virsh dumpxml` affichant `<domain type='qemu'>`, et un démarrage de
|
|
|
|
|
7 min 30 au lieu de bien moins d'une minute. `systemd-detect-virt` dans la VM
|
|
|
|
|
ne prouve **pas** l'accélération — sur s390x, QEMU fabrique la réponse STSI et
|
|
|
|
|
annonce `kvm` même en TCG. Seul `<domain type=…>` sur l'hôte fait foi.
|
|
|
|
|
|
|
|
|
|
### Bridge for external access
|
|
|
|
|
|
|
|
|
|
A NAT VM is isolated; a **bridged** VM gets an IP directly on the LAN,
|
|
|
|
|
reachable by any machine. On the KVM host, create a bridge `br0` over the
|
|
|
|
|
physical NIC (**wired only** — Wi-Fi cannot be bridged). netplan (Ubuntu
|
|
|
|
|
server) — replace `enp3s0` with your interface:
|
|
|
|
|
|
[ADD] qemu: deploy ERPLibre VMs from cloud images
Deploys Ubuntu, Debian, Fedora and Arch cloud images through libvirt, on
amd64, arm64 and s390x. Handles the image download with mirror fallback,
the cloud-init seed, UEFI without Secure Boot, and the host setup.
--- FR ---
Déploie des images cloud Ubuntu, Debian, Fedora et Arch via libvirt, en
amd64, arm64 et s390x. Gère le téléchargement avec repli sur miroir, le seed
cloud-init, l'UEFI sans Secure Boot et la préparation de l'hôte.
Assisted-by: Claude Opus 4.8
2026-08-07 03:22:26 -04:00
|
|
|
Si l'imbrication est indisponible, QEMU tourne quand même en émulation
|
|
|
|
|
logicielle (TCG) — ça marche mais c'est lent.
|
|
|
|
|
|
|
|
|
|
### Pont pour l'accès externe
|
|
|
|
|
|
|
|
|
|
Une VM en NAT est isolée ; une VM **pontée** obtient une IP directement sur le
|
|
|
|
|
LAN, joignable par n'importe quelle machine. Sur l'hôte KVM, créez un pont
|
|
|
|
|
`br0` sur la carte physique (**filaire uniquement** — le Wi-Fi ne se ponte
|
|
|
|
|
pas). netplan (Ubuntu serveur) — remplacez `enp3s0` par votre interface :
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
# /etc/netplan/01-br0.yaml
|
|
|
|
|
network:
|
|
|
|
|
version: 2
|
|
|
|
|
renderer: networkd
|
|
|
|
|
ethernets:
|
|
|
|
|
enp3s0: {dhcp4: no, dhcp6: no}
|
|
|
|
|
bridges:
|
|
|
|
|
br0:
|
|
|
|
|
interfaces: [enp3s0]
|
|
|
|
|
dhcp4: yes
|
|
|
|
|
parameters: {stp: false, forward-delay: 0}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Appliquez avec filet de sécurité (annulation auto en cas de coupure) et
|
|
|
|
|
vérifiez — ou via NetworkManager (Ubuntu bureau) :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# netplan
|
|
|
|
|
sudo netplan try && sudo netplan apply
|
|
|
|
|
ip addr show br0 # br0 porte l'IP du LAN / br0 holds the LAN IP
|
|
|
|
|
|
|
|
|
|
# NetworkManager (alternative)
|
|
|
|
|
nmcli con add type bridge ifname br0 con-name br0
|
|
|
|
|
nmcli con add type ethernet ifname enp3s0 master br0 con-name br0-port
|
|
|
|
|
nmcli con modify br0 ipv4.method auto
|
|
|
|
|
nmcli con down "Wired connection 1" ; nmcli con up br0
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Rattachez ensuite la VM au pont — **soit à la création** :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo ./script/qemu/deploy_qemu.py --name <nom-vm> --version 24.04 \
|
|
|
|
|
--ssh-key ~/.ssh/id_ed25519.pub --network bridge=br0,model=virtio -y --force
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**soit par édition d'une VM déjà créée** : arrêtez-la, remplacez son bloc
|
|
|
|
|
`<interface>` (`type='network'` / `<source network='default'/>` →
|
|
|
|
|
`type='bridge'` / `<source bridge='br0'/>`), puis redémarrez-la :
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo virsh shutdown <nom-vm>
|
|
|
|
|
sudo virsh edit <nom-vm> # mettre l'interface en bridge=br0
|
|
|
|
|
sudo virsh start <nom-vm>
|
|
|
|
|
sudo virsh domifaddr <nom-vm> # nouvelle IP LAN / new LAN IP
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
La VM obtient maintenant une IP LAN de votre routeur, joignable par les autres
|
|
|
|
|
machines. Depuis Internet, il faut en plus une redirection de port sur votre
|
|
|
|
|
routeur (ou un VPN) ; en configuration imbriquée, l'hôte externe doit aussi
|
|
|
|
|
rediriger/exposer la VM intermédiaire.
|