Suivant: , Précédent: , Monter: Services   [Table des matières][Index]


10.8.26 Services de virtualisation

Le module (gnu services virtualization) fournit des services pour les démons libvirt et virtlog, ainsi que d’autres services liés à la virtualisation.

Démon libvirt

libvirtd is the server side daemon component of the libvirt virtualization management system. This daemon runs on host servers and performs required management tasks for virtualized guests.

Variable Scheme : libvirt-service-type

C’est le type du démon libvirt. Sa valeur doit être un libvirt-configuration.

(service libvirt-service-type
         (libvirt-configuration
          (unix-sock-group "libvirt")
          (tls-port "16555")))

Les champs de libvirt-configuration disponibles sont :

paramètre de libvirt-configuration : package libvirt

Paquet libvirt.

paramètre de libvirt-configuration : boolean listen-tls?

Indique s’il faut écouter des connexions TLS sécurisées sur le port TCP/IP public. Vous devez remplir le champ listen pour que cela ait un effet.

Il est nécessaire de mettre en place une CA et de créer un certificat serveur avant d’utiliser cette fonctionnalité.

La valeur par défaut est ‘#t’.

paramètre de libvirt-configuration : boolean listen-tcp?

Écoute des connexions non-chiffrées sur le port TCP/IP public. Vous devez remplir le champ listen pour que cela ait un effet.

L’utilisation des sockets TCP requiert une authentification SASL par défaut. Seuls les mécanismes SASL qui prennent en charge le chiffrement des données sont permis. Il s’agit de DIGEST_MD5 et GSSAPI (Kerberos5).

La valeur par défaut est ‘#f’.

paramètre de libvirt-configuration : string tls-port

Port pour accepter les connexions TLS sécurisées. Il peut s’agir d’un numéro de port ou d’un nom de service.

La valeur par défaut est ‘"16514"’.

paramètre de libvirt-configuration : string tcp-port

Port sur lequel accepter les connexions TCP non sécurisées. Cela peut être un numéro de port ou un nom de service.

La valeur par défaut est ‘"16509"’.

paramètre de libvirt-configuration : string listen-addr

Adresse IP ou nom d’hôte utilisé pour les connexions des clients.

La valeur par défaut est ‘"0.0.0.0"’.

paramètre de libvirt-configuration : boolean mdns-adv?

Indique s’il faut publier le service libvirt en mDNS.

Autrement, vous pouvez désactiver cela pour tous les services en stoppant le démon Avahi.

La valeur par défaut est ‘#f’.

paramètre de libvirt-configuration : string mdns-name

Nom publié par défaut sur mDNS. Cela doit être unique sur le réseau local.

La valeur par défaut est ‘"Virtualization Host <hostname>"’.

paramètre de libvirt-configuration : string unix-sock-group

Groupe propriétaire du socket Unix domain. Cela peut être utilisé pour permettre à un ensemble d’utilisateurs « de confiance » de gérer les fonctionnalités sans devenir root.

La valeur par défaut est ‘"root"’.

paramètre de libvirt-configuration : string unix-sock-ro-perms

Permission Unix pour le socket en lecture seule. Il est utilisé pour surveiller le statut des VM uniquement.

La valeur par défaut est ‘"0777"’.

paramètre de libvirt-configuration : string unix-sock-rw-perms

Permission Unix pour le socket en lecture-écriture. La valeur par défaut n’autorise que root. Si PolicyKit est activé sur le socket, la valeur par défaut change et permet tout le monde (c.-à-d. 0777).

La valeur par défaut est ‘"0770"’.

paramètre de libvirt-configuration : string unix-sock-admin-perms

Permissions Unix pour le socket d’administration. La valeur par défaut ne permet que le propriétaire (root), ne la changez pas à moins que vous ne soyez sûr de savoir à qui vous exposez cet accès.

La valeur par défaut est ‘"0777"’.

paramètre de libvirt-configuration : string unix-sock-dir

Le répertoire dans lequel les sockets sont créés.

La valeur par défaut est ‘"/var/run/libvirt"’.

paramètre de libvirt-configuration : string auth-unix-ro

Schéma d’authentification pour les socket Unix en lecture-seule. Par défaut les permissions des socket permettent à n’importe qui de se connecter

La valeur par défaut est ‘"polkit"’.

paramètre de libvirt-configuration : string auth-unix-rw

Schéma d’authentification pour les socket UNIX en lecture-écriture. Par défaut les permissions du socket ne permettent que root. Si le support de PolicyKit a été compilé dans libvirt, la valeur par défaut utilise l’authentification « polkit ».

La valeur par défaut est ‘"polkit"’.

paramètre de libvirt-configuration : string auth-tcp

Schéma d’authentification pour les sockets TCP. Si vous n’avez pas activé SASL, alors tout le trafic TCP est en clair. Ne le faites pas en dehors de scénario de développement ou de test.

La valeur par défaut est ‘"sasl"’.

paramètre de libvirt-configuration : string auth-tls

Schéma d’authentification pour les sockets TLS. Les sockets TLS sont déjà chiffrés par la couche TLS, et une authentification limitée est effectuée avec les certificats.

Il est possible d’utiliser de n’importe quel mécanisme d’authentification SASL en utilisant « sasl » pour cette option

La valeur par défaut est ‘"none"’.

paramètre de libvirt-configuration : optional-list access-drivers

Schéma de contrôle d’accès à l’API.

Par défaut un utilisateur authentifié peut accéder à toutes les API. Les pilotes d’accès peuvent placer des restrictions là-dessus.

La valeur par défaut est ‘()’.

paramètre de libvirt-configuration : string key-file

Chemin de fichier de la clef du serveur. Si la valeur est une chaîne vide, aucune clef privée n’est chargée.

La valeur par défaut est ‘""’.

paramètre de libvirt-configuration : string cert-file

Chemin de fichier de la clef du serveur. Si la chaîne est vide, aucun certificat n’est chargé.

La valeur par défaut est ‘""’.

paramètre de libvirt-configuration : string ca-file

Chemin de fichier de la clef du serveur. Si la chaîne est vide, aucun certificat de CA n’est chargé.

La valeur par défaut est ‘""’.

paramètre de libvirt-configuration : string crl-file

Chemin de la liste de révocation des certificats. Si la chaîne est vide, aucun CRL n’est chargé.

La valeur par défaut est ‘""’.

paramètre de libvirt-configuration : boolean tls-no-sanity-cert

Désactive la vérification de nos propres certificats serveurs.

Lorsque libvirtd démarre il effectue des vérifications de routine sur ses propres certificats.

La valeur par défaut est ‘#f’.

paramètre de libvirt-configuration : boolean tls-no-verify-cert

Désactive la vérification des certificats clients.

La vérification des certificats clients est le mécanisme d’authentification principal. Tout client qui ne présent pas de certificat signé par la CA sera rejeté.

La valeur par défaut est ‘#f’.

paramètre de libvirt-configuration : optional-list tls-allowed-dn-list

Liste blanche des Distinguished Name x509 autorisés.

La valeur par défaut est ‘()’.

paramètre de libvirt-configuration : optional-list sasl-allowed-usernames

Liste blanche des noms d’utilisateur SASL permis. Le format des noms d’utilisateurs dépend du mécanisme d’authentification SASL.

La valeur par défaut est ‘()’.

paramètre de libvirt-configuration : string tls-priority

Modifie la chaine de priorité TLS par défaut fixée à la compilation. La valeur par défaut est typiquement ‘NORMAL’ à moins qu’elle n’ait été modifiée à la compilation. Ne l’indiquez que si vous voulez que libvirt agisse différemment des paramètres par défaut globaux.

La valeur par défaut est ‘"NORMAL"’.

paramètre de libvirt-configuration : integer max-clients

Nombre maximum de connexions clientes en même temps sur tous les sockets.

La valeur par défaut est ‘5000’.

paramètre de libvirt-configuration : integer max-queued-clients

Longueur maximum de la queue de connexions en attente d’acceptation du démon. Remarquez que certains protocoles supportant la retransmission peuvent obéir à ce paramètre pour qu’une connexion ultérieure réussisse.

La valeur par défaut est ‘1000’.

paramètre de libvirt-configuration : integer max-anonymous-clients

Longueur maximum de la queue des clients acceptés mais pas authentifiés. Indiquez zéro pour désactiver ce paramètre

La valeur par défaut est ‘20’.

paramètre de libvirt-configuration : integer min-workers

Nombre de processus de travail démarrés initialement.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer max-workers

Nombre maximum de threads de travail.

Si le nombre de clients actifs dépasse min-workers, plus de threads seront démarrés, jusqu’à la limite de max_workers. Typiquement vous voulez que max_workers soit égal au nombre maximum de clients permis.

La valeur par défaut est ‘20’.

paramètre de libvirt-configuration : integer prio-workers

Nombre de travailleurs prioritaires. Si tous les threads de travail du groupe ci-dessus sont bloqués, certains appels marqués comme prioritaires (notamment domainDestroy) peuvent être exécutés par ce groupe.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer max-requests

Limite globale totale sur les appels RPC concurrents.

La valeur par défaut est ‘20’.

paramètre de libvirt-configuration : integer max-client-requests

Limite de requêtes concurrentes depuis une connexion cliente unique. Pour éviter qu’un client ne monopolise le serveur, vous devriez indiquer une petite partie des paramètres global max_requests et max_workers.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-min-workers

Comme min-workers mais pour l’interface d’administration.

La valeur par défaut est ‘1’.

paramètre de libvirt-configuration : integer admin-max-workers

Comme max-workers mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-max-clients

Comme max-clients mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-max-queued-clients

Comme max-queued-clients mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-max-client-requests

Comme max-client-requests mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer log-level

Niveau de journalisation. 4 : erreurs, 3 : avertissements, 2 : information, 1 : débogage.

La valeur par défaut est ‘3’.

paramètre de libvirt-configuration : string log-filters

Filtres de journalisation.

Un filtre qui permet de sélectionner un niveau de journalisation différent pour une catégorie donnée. Le format d’un filtre est :

nom est une chaine de caractères qui correspond à la catégorie donnée dans VIR_LOG_INIT() au début de chaque fichier source de libvirt, p. ex. ‘remote’, ‘qemu’ ou ‘util.json’ (le nom dans le filtre peut être une sous-chaine du nom complet de la catégorie, pour pouvoir correspondre à plusieurs catégories similaires), le préfixe facultatif ‘+’ dit à libvirt d’enregistrer les traces de piles pour chaque message qui correspond au nom, et x est le niveau minimal des messages qui devraient être enregistrés :

On peut définir plusieurs filtres dans une seule déclaration de filtres, ils doivent juste être séparés par des espaces.

La valeur par défaut est ‘"3:remote 4:event"’.

paramètre de libvirt-configuration : string log-outputs

Sorties de débogage.

Une sortie est l’un des endroits où les journaux sont enregistrés. Le format d’une sortie peut être :

x:stderr

la sortie va vers stderr

x:syslog:nom

utilise syslog comme sortie et utilise le nom donné comme identifiant

x:file:chemin_fichier

la sortie va vers un fichier, avec le chemin donné

x:journald

la sortie va vers le système de journalisation journald

Dans tous les cas, le préfixe x est le niveau minimal, qui agit comme un filtre

Plusieurs sorties peuvent être définies, elles doivent juste être séparées par des espaces.

La valeur par défaut est ‘"3:stderr"’.

paramètre de libvirt-configuration : integer audit-level

Permet de modifier l’utilisation du sous-système d’audit

La valeur par défaut est ‘1’.

paramètre de libvirt-configuration : boolean audit-logging

Envoie les messages d’audit via l’infrastructure de journalisation de libvirt.

La valeur par défaut est ‘#f’.

paramètre de libvirt-configuration : optional-string host-uuid

Host UUID. UUID must not have all digits be the same.

La valeur par défaut est ‘""’.

paramètre de libvirt-configuration : string host-uuid-source

Source où lire l’UUID de l’hôte.

Si dmidecode ne fournit pas un UUID valide, un UUID temporaire sera généré.

La valeur par défaut est ‘"smbios"’.

paramètre de libvirt-configuration : integer keepalive-interval

Un message keepalive est envoyé au client après keepalive_interval secondes d’inactivité pour vérifier si le client répond toujours. Si la valeur est -1, libvirtd n’enverra jamais de requête keepalive ; cependant les clients peuvent toujours en envoyer et le démon y répondra.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer keepalive-count

Nombre maximum de messages keepalive qui peuvent être envoyés au client sans réponse avant que la connexion ne soit considérée comme cassée.

En d’autres termes, la connexion est approximativement fermée après keepalive_interval * (keepalive_count + 1) secondes après le dernier message reçu de la part du client. Lorsque keepalive-count est à 0, les connexions seront automatiquement fermées après keepalive-interval secondes d’inactivité sans envoyer le moindre message keepalive.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-keepalive-interval

Comme précédemment, mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer admin-keepalive-count

Comme précédemment, mais pour l’interface d’administration.

La valeur par défaut est ‘5’.

paramètre de libvirt-configuration : integer ovs-timeout

Délai d’attente pour les appels Open vSwitch.

L’utilitaire ovs-vsctl est utilisé pour la configuration et son option de délai d’attente est à 5 secondes pour éviter qu’une attente infinie ne bloque libvirt.

La valeur par défaut est ‘5’.

Démon Virrlog

Le service virtlogd est un démon côté serveur qui fait partie de libvirt, utilisé pour gérer les journaux des consoles des machines virtuelles.

This daemon is not used directly by libvirt client applications, rather it is called on their behalf by libvirtd. By maintaining the logs in a standalone daemon, the main libvirtd daemon can be restarted without risk of losing logs. The virtlogd daemon has the ability to re-exec() itself upon receiving SIGUSR1, to allow live upgrades without downtime.

Variable Scheme : virtlog-service-type

Le type de service pour le démon virtlogd. Sa valeur doit être un virtlog-configuration.

(service virtlog-service-type
         (virtlog-configuration
          (max-clients 1000)))
paramètre de virtlog-configuration : integer log-level

Niveau de journalisation. 4 : erreurs, 3 : avertissements, 2 : information, 1 : débogage.

La valeur par défaut est ‘3’.

paramètre de virtlog-configuration : string log-filters

Filtres de journalisation.

Un filtre qui permet de sélectionner plusieurs niveaux de journalisation pour une catégorie donnée. Le format d’un filtre est :

nom est une chaîne de caractères qui correspond à la catégorie donnée dans VIR_LOG_INIT() au début de chaque fichier source de libvirt, p. ex. « remote », « qemu » ou « util.json » (le nom dans le filtre peut être une sous-chaîne du nom complet de la catégorie, pour pouvoir correspondre à plusieurs catégories similaires), le préfixe facultatif « + » dit à libvirt d’enregistrer les traces de piles pour chaque message qui correspond au nom, et x est le niveau minimal des messages qui devraient être enregistrés :

On peut définir plusieurs filtres dans une seule déclaration de filtres, ils doivent juste être séparés par des espaces.

La valeur par défaut est ‘"3:remote 4:event"’.

paramètre de virtlog-configuration : string log-outputs

Sorties de débogage.

Une sortie est l’un des endroits où les journaux sont enregistrés. Le format d’une sortie peut être :

x:stderr

la sortie va vers stderr

x:syslog:nom

utilise syslog comme sortie et utilise le nom donné comme identifiant

x:file:chemin_fichier

la sortie va vers un fichier, avec le chemin donné

x:journald

la sortie va vers le système de journalisation journald

Dans tous les cas, le préfixe x est le niveau minimal, qui agit comme un filtre

Plusieurs sorties peuvent être définies, elles doivent juste être séparées par des espaces.

La valeur par défaut est ‘"3:stderr"’.

paramètre de virtlog-configuration : integer max-clients

Nombre maximum de connexions clientes en même temps sur tous les sockets.

La valeur par défaut est ‘1024’.

paramètre de virtlog-configuration : integer max-size

Taille de fichier maximale avant roulement.

La valeur par défaut est ‘2MB’.

paramètre de virtlog-configuration : integer max-backups

Nombre maximal de fichiers de sauvegardes à garder.

La valeur par défaut est ‘3’.

Émulation transparente avec QEMU

qemu-binfmt-service-type fournit le support de l’émulation transparente de binaires construits pour des architectures différentes — p. ex. il permet d’exécuter de manière transparente des programmes ARMv7 sur une machine x86_64. Cela se fait en combinant l’émulateur QEMU et la fonctionnalité binfmt_misc du noyau Linux. Cette fonctionnalité ne vous permet que d’émuler GNU/Linux sur une architecture différente, mais regardez plus bas pour GNU/Hurd.

Variable Scheme : qemu-binfmt-service-type

Le type du service QEMU/binfmt pour l’émulation transparente. Sa valeur doit être un objet qemu-binfmt-configuration, qui spécifie le paquet QEMU à utiliser ainsi que l’architecture que vous voulez émuler :

Dans cet exemple, on active l’émulation transparente pour les plateformes ARM et aarch64. Lancer herd stop qemu-binfmt l’éteint et lancer herd start qemu-binfmt le rallume (voir the herd command dans The GNU Shepherd Manual).

Type de données : qemu-binfmt-configuration

La configuration du service qemu-binfmt.

platforms (par défaut : '())

La liste des plates-formes émulées par QEMU. Chaque élément doit être un objet platform object tel que renvoyé par lookup-qemu-platforms (voir plus bas).

guix-support? (default: #t)

Lorsque la valeur est vraie, QEMU et toutes ses dépendances sont ajoutés à l’environnement de construction de guix-daemon (voir --chroot-directory option). Cela permet d’utiliser les gestionnaires binfmt_misc dans l’environnement de construction, ce qui signifie que vous pouvez construire des programmes pour d’autres architectures de manière transparente.

Par exemple, supposons que vous soyez sur une machine x86_64 et que vous avez ce services :

Vous pouvez lancer :

guix build -s armhf-linux inkscape

and it will build Inkscape for ARMv7 as if it were a native build, transparently using QEMU to emulate the ARMv7 CPU. Pretty handy if you’d like to test a package build for an architecture you don’t have access to!

When guix-support? is set to #f, programs for other architectures can still be executed transparently, but invoking commands like guix build -s armhf-linux … will fail.

qemu (par défaut : qemu)

Le paquet QEMU à utiliser.

Procédure Scheme : lookup-qemu-platforms platforms

Renvoie la liste des objets de plates-formes QEMU correspondant à platforms…. platforms doit être une liste de chaînes de caractères correspondant aux noms de plates-formes, comme "arm", "sparc", "mips64el" etc.

Procédure Scheme : qemu-platform? obj

Renvoie vrai s iobj est un objet de plate-forme.

Procédure Scheme : qemu-platform-name platform

Renvoie le nom de platform — une chaîne comme "arm".

Exécuter le Hurd dans une machine virtuelle

Le service hurd-vm permet de lancer GNU/Hurd dans une machine virtuelle (VM), un childhurd. Ce service est conçu pour être utilisé sur GNU/Linux et la configuration du système GNU/Hurd donné est compilée de manière croisée. La machine virtuelle est un service Shepherd qui a les noms hurd-vm et childhurd et qui peut être contrôlé avec les commandes suivantes :

herd start hurd-vm
herd stop childhurd

Lorsque le service est lancé, vous pouvez voir sa console en vous y connectant avec un client VNC, par exemple avec :

guix environment --ad-hoc tigervnc-client -- \
         vncviewer localhost:5900

La configuration par défaut (voir hurd-vm-configuration ci-dessous) crée un serveur secure shell (SSH) dans votre système GNU/Hurd, que QEMU (l’émulateur de machine virtuelle) redirige sur le port 10222 de l’hôte. Ainsi, vous pouvez vous connecter en SSH au childhurd avec :

ssh root@localhost -p 10022

Le childhurd est volatile et sans état . il démarre avec un nouveau système de fichier à chaque fois que vous le redémarrez. Par défaut cependant, tous les fichiers sous /etc/childhurd sur l’hôte sont copiés tels quels sur le système de fichiers racine du childhurd à son démarrage. Cela vous permet d’initialiser des « secrets » à l’intérieur de la VM : les clés hôtes SSH, les clés de substituts autorisés, etc — voir l’explication de secret-root ci-dessous.

Variable Scheme : hurd-vm-service-type

C’est le type du service du Hurd dans une machine virtuelle. Sa valeur doit être un objet hurd-vm-configuration, qui spécifie le système d’exploitation (voir référence de système d'exploitation) et la taille de disque pour la machine virtuelle du Hurd, le paquet QEMU à utiliser ainsi que les options pour le lancer.

Par exemple :

(service hurd-vm-service-type
         (hurd-vm-configuration
          (disk-size (* 5000 (expt 2 20))) ;5G
          (memory-size 1024)))             ;1024MiB

créerait une image disque assez grande pour construire GNU Hello, avec une peu de place en plus.

Type de données : hurd-vm-configuration

Type de données représentant la configuration de hurd-vm-service-type.

os (par défaut : %hurd-vm-operating-system)

Le système d’exploitation à instancier. La valeur par défaut est le système minimal avec un démon OpenSSH permissif en écoute sur le port 2222 (voir openssh-service-type).

qemu (par défaut : qemu-minimal)

Le paquet QEMU à utiliser.

image (par défaut : hurd-vm-disk-image)

La procédure utilisée pour construire l’image disque construite à partir de cette configuration.

disk-size (par défaut : 'guess)

La taille de l’image disque.

memory-size (par défaut : 512)

La taille de mémoire de la machine virtuelle en mébioctets.

options (par défaut : '("--snapshot"))

Options supplémentaires pour lancer QEMU.

id (par défaut : #f)

Si l’option est indiquée, c’est un entier strictement positif utilisé créer plusieurs instances de childhurd. Il est ajouté au nom du service, p. ex. childhurd1.

net-options (par défaut : hurd-vm-net-options)

La procédure utilisée pour produire une liste d’options réseau pour QEMU.

Par défaut, elle produit

'("--device" "rtl8139,netdev=net0"
  "--netdev" "user,id=net0\
              ,hostfwd=tcp:127.0.0.1:secrets-port-:1004\
              ,hostfwd=tcp:127.0.0.1:ssh-port-:2222\
              ,hostfwd=tcp:127.0.0.1:vnc-port-:5900")

avec les ports renvoyés :

secrets-port: (+ 11004 (* 1000 ID))
ssh-port: (+ 10022 (* 1000 ID))
vnc-port: (+ 15900 (* 1000 ID))
secret-root (par défaut : /etc/childhurd)

Le répertoire racine avec des secrets externes à installer dans le childhurd une fois lancé. Les childhurds sont volatile, ce qiu signifie qu’à chaque démarrage, les secrets comme les clés hôtes SSH et la clé de signature de Guix sont recréés.

Si le répertoire /etc/childhurd n’existe pas, le secret-service qui tourne dans le Childhurd recevra une liste vide de secrets.

Par défaut, le service rempli automatiquement /etc/childhurd avec les secrets non-volatiles suivants, à moins qu’ils existent déjà :

/etc/childhurd/etc/guix/acl
/etc/childhurd/etc/guix/signing-key.pub
/etc/childhurd/etc/guix/signing-key.sec
/etc/childhurd/etc/ssh/ssh_host_ed25519_key
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key
/etc/childhurd/etc/ssh/ssh_host_ed25519_key.pub
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key.pub

Ces fichiers sont automatiquement envoyés à la VM Hurd invitée au démarrage, avec les permissions.

Avec ces fichiers en place, il ne manque plus grand chose pour pouvoir permettre à l’hôte de décharger les constructions i586-gnu au childhurd :

  1. Autoriser la clé du childhurd sur l’hôte pour que l’hôte puisse accepter les constructions venant du childhurd, ce qui peut se faire de cette manière :
    guix archive --authorize < \
      /etc/childhurd/etc/guix/signing-key.pub
    
  2. Ajouter le childhurd à /etc/guix/machines.scm (voir Réglages du délestage du démon).

Nous travaillons à rendre cela automatique — contactez nous sur guix-devel@gnu.org pour en discuter !

Remarquez que par défaut l’image de la VM est volatile, c.-à-d. qu’une fois arrêtée le contenu est perdu. Si vous voulez une image avec état à la place, remplacez les champs image et options pour enlever le drapeau --snapshot avec quelque chose de ce style-là :

(service hurd-vm-service-type
         (hurd-vm-configuration
          (image   (const "/out/of/store/writable/hurd.img"))
          (options '())))

Ganeti

Remarque : Ce service est considéré comme étant expérimental. Les options de configuration peuvent changer de manière non compatible, et tous les paramètres n’ont pas été testés. Si vous utilisez ce service, nous vous encourageons à partager votre expérience avec guix-devel@gnu.org.

Ganeti est un système de gestion de machines virtuelles. Il est conçu pour faire tourner les machines virtuelles en continue sur une grappe de serveurs même dans le cas d’une erreur matérielle, et pour rendre les taches de maintenance et de récupération faciles. Il consisste en plusieurs services qui sont décrits plus loin dans cette section. En plus du service Ganeti, vous aurez besoin du service OpenSSH (voir openssh-service-type), et de mettre à jour le fichier /etc/hosts (voir hosts-file) avec le nom de la grappe et l’adresse (ou utiliser un serveur DNS).

Tous les nœuds participant dans une grappe Ganeti devraient avec la même configuration de Ganeti et /etc/hosts. voici un exemple de configuration pour un nœud d’une grappe Ganeti qui prend en charge plusieurs moteurs de stockage et installe les fournisseurs de systèmes debbotstrap et guix :

(use-package-modules virtualization)
(use-service-modules base ganeti networking ssh)
(operating-system
  ;; …
  (host-name "node1")
  (hosts-file (plain-file "hosts" (format #f "
127.0.0.1       localhost
::1             localhost

192.168.1.200   ganeti.example.com
192.168.1.201   node1.example.com node1
192.168.1.202   node2.example.com node2
")))

  ;; Installe QEMU pour pouvoir utiliser les instances KVM, ainsi que LVM, DRBD et Ceph
  ;; pour utiliser les moteurs de stockage « plain », « drbd » et « rbd ».
  (packages (append (map specification->package
                         '("qemu" "lvm2" "drbd-utils" "ceph"
                           ;; ajoute les fournisseurs de système debbotstrap et guix.
                           "ganeti-instance-guix" "ganeti-instance-debootstrap"))
                    %base-packages))
  (services
   (append (list (static-networking-service "eth0" "192.168.1.201"
                                            #:netmask "255.255.255.0"
                                            #:gateway "192.168.1.254"
                                            #:name-servers '("192.168.1.252"
                                                             "192.168.1.253"))

                 ;; Ganeti utilise SSH pour communiquer entre les nœuds.
                 (service openssh-service-type
                          (openssh-configuration
                           (permit-root-login 'without-password)))

                 (service ganeti-service-type
                          (ganeti-configuration
                           ;; cette liste spécifie les chemins du système de fichiers autorisés
                           ;; pour le stockage des images de machines virtuelles.
                           (file-storage-paths '("/srv/ganeti/file-storage"))
                           ;; Cette variable configure une « variante » pour
                           ;; Debootstrap et Guix qui fonctionne avec KVM.
                           (os %default-ganeti-os))))
           %base-services)))

Nous vous encourageons à lire le guide d’administration de Ganeti pour apprendre les diverse options de grappes et les opérations de base. Il y a aussi un billet de blog décrivant comment configurer et initialiser une petite grappe.

Variable Scheme : ganeti-service-type

C’est le type de service qui inclus tous les service dont les nœuds Ganeti ont besoin.

Sa valeur est un objet ganeti-configurtaion qui définie le paquet pour utiliser les opérations en ligne de commande, ainsi que pour les divers démons. Les chemins de stockage autorisés et les systèmes d’exploitation invités disponibles sont aussi configurés à travers ce type de données.

Type de données : ganeti-configuration

Le service ganeti prend les options de configuration suivante :

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser. Il sera installé sur le profil du système et rendra gnt-cluster, gnt-instance, etc disponibles. Remarquez que la valeur spécifiée ici n’affecte pas les autres services auxquels se réfère le paquet ganeti (voir plus bas).

noded-configuration (par défaut : (ganeti-noded-configuration))
confd-configuration (par défaut : (ganeti-confd-configuration))
wconfd-configuration (par défaut : (ganeti-wconfd-configuration))
luxid-configuration (par défaut : (ganeti-luxid-configuration))
rapi-configuration (par défaut : (ganeti-rapi-configuration))
kvmd-configuration (par défaut : (ganeti-kvmd-configuration))
mond-configuration (par défaut : (ganeti-mond-configuration))
metad-configuration (par défaut : (ganeti-metad-configuration))
watcher-configuration (par défaut : (ganeti-watcher-configuration))
cleaner-configuration (par défaut : (ganeti-cleaner-configuration))

Ces options contrôlent les divers démons et taches cron distribués avec Ganeti. Les valeurs possibles sont détaillées plus bas. Pour changer un paramètre, vous devez utiliser le type de configuration pour ce service :

(service ganeti-service-type
         (ganeti-configuration
          (rapi-configuration
           (ganeti-rapi-configuration
            (interface "eth1"))))
          (watcher-configuration
           (ganeti-watcher-configuration
            (rapi-ip "10.0.0.1"))))
file-storage-paths (par défaut : '())

Liste des répertoire autorisés pour le moteur de stockage de fichiers.

os (par défaut : %default-ganeti-os)

Liste des enregistrements <ganeti-os>.

En résumé ganeti-service-type est un raccourci pour la déclaration de chaque service individuel :

Plus une extension de service pour etc-service-type qui configure le moteur de stockage de fichiers et les variantes de systèmes.

Type de données : ganeti-os

Ce type de données peut être passé au paramètre os de ganeti-configuration. Il prend les paramètres suivants :

name

Le nom du fournisseur de système. Il est seulement utilisé pour spécifier où la configuration se trouve. Indiquer « debootstrap » créera /etc/ganeti/intance-debootstrap.

extension

Le fichier d’extension pour les variantes de ce type de système. Par exemple .conf ou .scm.

variants (par défaut : '())

Une liste d’objets ganeti-os-variant pour ce système.

Type de données : ganeti-os-variant

Type de données représentant une variante de système Ganeti. Il prend les paramètres suivants :

name

Le nom de cette variante.

configuration

Un fichier de configuration pour cette variante.

Variable Scheme : %default-debootstrap-hooks

Cette variable contient les crochet pour configurer le réseau et le chargeur d’amorçage GRUB.

variable Scheme : %default-debootstrap-extra-pkgs

Cette variable contient une liste de paquets requis pour un invité complètement virtualisé.

Type de données : debootstrap-configuration

Ce type de données crée des fichiers de configurations pour le fournisseur de système debootstrap.

hooks (par défaut : %default-debootstrap-hooks)

Lorsque la valeur n’est pas #f, cela doit être une G-expression qui spécifie un répertoire avec les scripts qui seront lancés à l’installation du système. Elle peut aussi être une liste de pairs de (nom, simili-fichier). Par exemple :

`((99-hello-world . ,(plain-file "#!/bin/sh\necho Hello, World")))

Cela va créer une répertoire avec un exécutable nommé 99-hello-world et le lancera à chaque fois que cette variante est installée. Si la valeur est #f, les crochets dans /etc/ganeti/instance-debootstrap/hooks seront utilisés, s’ils existent.

proxy (par défaut : #f)

Serveur mandataire HTTP facultatif à utiliser.

mirror (par défaut : #f)

Le miroir Debian. Habituellement quelque chose comme http://ftp.no.debian.org/debian. La valeur par défaut dépend de la distribution.

arch (par défaut : #f)

L’architecture pour dpkg. Indiquez armhf pour debootstrap pour une instnace ARMv7 sur un hôte AArch64. La valeur par défaut est l’architecture système actuelle.

suite (par défaut : "stable")

Lorsqu’il est indiqué, ce paramètre doit être une distribution Debian comme buster ou focal. Si la valeur est #f, la valeur par défaut du fournisseur de système est utilisée.

extra-pkgs (par défaut : %default-debootstrap-extra-pkgs)

Liste des paquets supplémentaires qui seront installés par dpkg en plus du système minimal.

components (par défaut : #f)

Lorsque la valeur est indiquée, doit être une liste de « composants » de répertoires Debian. Par exemple '("main" "contrib").

generate-cache? (par défaut : #t)

Indique s’il faut automatiquement mettre en cache l’archive debootstrap générée.

clean-cache (par défaut : 14)

Supprime le cache après ce nombre de jours. Utilisez #f pour ne jamais vider le cache.

partition-style (par défaut : 'msdos)

Le type de partition à créer. Lorsqu’il est indiqué, ce paramètre doit être 'msdos, 'none ou une chaine de caractères.

partition-alignment (par défaut : 2048)

Alignement des partitions en nombre de secteur.

Procédure Scheme : debootstrap-variant nom configuration

C’est une procédure auxiliaire qui crée un enregistrement ganeti-os-variant. Il prend deux paramètres . un nom et un objet debootstrap-configuration.

Procédure Scheme : debootstrap-os variants

C’est une procédure auxiliaire qui crée un enregistrement ganeti-os. Elle prend une liste de variantes créé avec debootstrap-variant.

Procédure Scheme : guix-variant name configuration

C’est une procédure auxiliaire qui crée un enregistrement ganeti-os-variant à utiliser avec le fournisseur de système Guix. Il prend un nom et une G-expression qui renvoie un objet simili-fichier (voir file-like objects) contenant une configuration Guix System.

Procédure Scheme : guix-os variants

C’est une procédure auxiliaire qui crée un enregistrement ganeti-os. Elle prend une liste de variantes produites par guix-variant.

Variable Scheme : %default-debootstrap-variants

C’est une variable pratique pour que le fournisseur debootstrap fonctionne directement sans avoir à déclarer des variantes manuellement. Elle contient une seule variante debootrstap avec la configuration par défaut :

Variable Scheme : %default-guix-variants

C’est une variable pratique pour que le fournisseur Guix fonctionne directement sans configuration supplémentaire. Elle crée une machine virtuelle qui a un serveur SSH, une console série et autorise les clés SSH des hôtes Ganeti.

(list (guix-variant
       "default"
       (file-append ganeti-instance-guix
                    "/share/doc/ganeti-instance-guix/examples/dynamic.scm")))

Les utilisateur·ice·s peuvent implémenter la prise en charge des fournisseurs de systèmes inconnus de Guix en étendant les enregistrement ganeti-os et ganeti-os-variant comme il faut. Par exemple :

(ganeti-os
 (name "custom")
 (extension ".conf")
 (variants
  (list (ganeti-os-variant
         (name "foo")
         (configuration (plain-file "bar" "this is fine"))))))

Cela crée /etc/ganeti/instance-custom/variants/foo.conf qui pointe vers un fichier dans le dépôt qui contient this is fine. Cela crée aussi /etc/ganeti/instance-custom/variants/variants.list qui contient foo.

Évidemment cela ne fonctionnera pas avec tous les fournisseurs d’OS disponibles. Si vous trouvez que cette interface est trop limitée, contactez-nous sur guix-devel@gnu.org.

Le reste de cette section documente les divers services inclus par ganeti-service-type.

Variable Scheme : ganeti-noded-service-type

ganeti-noded est le démon responsable des fonctions spécifiques au nœud dans le système Ganeti. La valeur de ce service doit être un objet ganeti-noded-configuration.

Type de données : ganeti-noded-configuration

La configuration du service ganeti-noded.

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

port (par défaut : 1811)

Port TCP sur lequel le démon de nœud écoute les requêtes réseaux.

address (par défaut : "0.0.0.0")

Adresse réseau sur laquelle le démon se lie. L’adresse par défaut signifie de se lier à toutes les adresse disponibles.

interface (par défaut : #f)

Si une valeur est indiquée, elle doit être une interface réseau spécifique (p. ex. eth0) à laquelle le démon se liera.

max-clients (par défaut : 20)

Cela indique une limite du nombre de connexions clientes simultanées que le démon pourra prendre en charge. Les connexions au delà de ce nombre sont acceptées, mais aucune réponse ne sera envoyée avant que suffisamment de connexions ne soient fermées.

ssl? (par défaut : #t)

Indique s’il faut utiliser SSL/TLS pour chiffrer les communications réseaux. Le certification est automatiquement intégré par la grappe et peut être modifié avec gnt-cluster renew-crypto.

ssl-key (par défaut : "/var/lib/ganeti/server.pem")

Cela peut être utilisé pour fournir une clé de chiffrement spécifique pour les communications TLS.

ssl-cert (par défaut : "/var/lib/ganeti/server.pem")

Cela peut être utilisé pour fournir un certification spécifique pour les communications TLS.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue plus de journalisation pour le débogage. Remarque que cela laissera fuiter des détails de chiffrement dans les journaux, utilisez cette option avec prudence.

Variable Scheme : ganeti-confd-service-type

ganeti-confd répond aux requêtes liées à la configuration de la grappe Ganeti. Le but de ce démon est d’avoir une manière rapide et très disponible de demander les valeurs de configuration de la grappe. Il est automatiquement activé sur tous les candidats maitres. La valeur de ce service doit être un objet ganeti-confd-configuration.

Type de données : ganeti-confd-configuration

La configuration du service ganeti-confd.

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

port (par défaut : 1814)

Le port UDP sur lequel écouter les requêtes réseaux.

address (par défaut : "0.0.0.0")

L’adresse réseau sur laquelle le démon se liera.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-wconfd-service-type

ganeti-wconfd est le démon qui fait autorité sur la configuration de la grappe et est la seule entité qui peut y accepter des changements. Tous les travaux qui ont besoin de modifier la configuration le feront en envoyant les requêtes appropriées à ce démon. Il ne tourne que sur le nœud maitre et sera automatiquement désactivé sur les autres nœuds.

La valeur de ce service est un objet ganeti-wconfd-configuration.

Type de données : ganeti-wconfd-configuration

La configuration du service ganeti-wconfd.

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

no-voting? (par défaut : #f)

Le démon refusera de démarrer si la majorité des nœuds de la grappe ne sont pas d’accord pour dire qu’il est le nœud maitre. Indiquez #t pour le démarre même si le quorum n’a pas été atteint (dangereux, utilisez avec prudence).

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-luxid-service-type

ganeti-luxid est un démon utilisé pour répondre aux requêtes liées à la configuration et à l’état actuel d’une grappe Ganeti. En plus, c’est le démon qui fait autorité pour la queue de travaux de Ganeti. les travaux peuvent être soumis via ce démon et il les programme et les démarre.

Il prend un objet ganeti-luxid-configuration.

Type de données : ganeti-luxid-configuration

La configuration du service ganeti-wconfd.

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

no-voting? (par défaut : #f)

Le démon refusera de démarrer s’il ne peut pas vérifier que la majorité des nœuds de la grappe pensent qu’il est le nœud maitre. Indiquez #t pour le démarre malgré tout (cela peut être dangereux).

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-rapi-service-type

ganeti-rapi fournit une API à distance pour les grappes Ganeti. Il est lancé sur le maitre et peut être utilisé pour effectuer des actions programmées sur la grappe via un protocole de RPC basé sur JSON.

La plupart des opérations de requêtes sont permises sans authentification (à moins que require-authentification? ne soit indiqué), alors que les opérations en écriture requièrent une autorisation explicite via le fichier /var/lib/ganeti/rapi/users. voir la documentation de l’API distante de Ganeti pour plus d’informations.

La valeur de ce service doit être un objet geneti-rapi-configuration.

Type de données : ganeti-rapi-configuration

La configuration du service ganeti-rapi.

ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

require-authentication? (par défaut : #f)

Indique s’il faut demander une authentification même pour les opérations en lecture-seule.

port (^: 5080)

Le port TCP sur lequel écouter les requêtes de l’API.

address (par défaut : "0.0.0.0")

L’adresse réseau sur laquelle le service de liera. Par défaut il écoute sur toutes les adresses.

interface (par défaut : #f)

Si une valeur est indiquée, elle doit spécifier une interface réseau spécifique comme eth0 sur laquelle le démon se liera.

max-clients (par défaut : 20)

Le nombre maximum de requêtes clientes simultanées à prendre en charge. Les connexions supplémentaires sont permises, mais aucune réponse ne sera envoyée tant qu’il n’y aura pas assez de connexions fermées.

ssl? (par défaut : #t)

Indique s’il faut utiliser le chiffrement SSL/TLS sur le port RAPI.

ssl-key (par défaut : "/var/lib/ganeti/server.pem")

Cela peut être utilisé pour fournir une clé de chiffrement spécifique pour les communications TLS.

ssl-cert (par défaut : "/var/lib/ganeti/server.pem")

Cela peut être utilisé pour fournir un certification spécifique pour les communications TLS.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue plus de journalisation pour le débogage. Remarque que cela laissera fuiter des détails de chiffrement dans les journaux, utilisez cette option avec prudence.

Variable Scheme : ganeti-kvmd-service-type

ganeti-kvmd doit déterminer si une instance KVM donnée a été éteinte par un administrateur ou un utilisateur. Normalement Ganeti redémarre une instance qui a été arrêtée par Ganeti lui-même. Si l’option de grappe user_shutdown est vraie, ce démon vérifie la socket QMP fournie par QEMU et écoute les évènements d’extinction, et marque l’instance USER down au lieu de ERROR down lorsqu’elle s’éteint correctement par elle-même.

Il prend un objet ganeti-kvmd-configuration.

Type de données : ganeti-kvmd-configuration
ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-mond-service-type

ganeti-mond est un démon facultatif qui propose des fonctionnalités de surveillance de Ganeti. Il est responsable des collecteurs de données et de la publication des informations récupérées sur une interface HTTP.

Il prend un objet ganeti-mond-configuration.

Type de données : ganeti-mond-configuration
ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

port (par défaut : 1815)

Le port sur lequel le démon écoutera.

address (par défaut : "0.0.0.0")

L’adresse réseau sur laquelle le démon se liera. Par défaut, il se lie à toutes les interfaces disponibles.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-metad-service-type

ganeti-metad est un démon facultatif qui peut être utilisé pour fournir des informations sur la grappe aux instance ou aux scripts d’installation de systèmes.

Il prend un objet ganeti-metad-configuration.

Type de données : ganeti-metad-configuration
ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

port (par défaut : 80)

Le port sur lequel le démon écoutera.

address (par défaut : #f)

Si la valeur est indiquée, le démon se liera à cette adresse uniquement. Si la valeur n’est pas indiquée, le comportement dépend de la configuration de la grappe.

debug? (par défaut : #f)

Lorsque la valeur est vraie, le démon effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-watcher-service-type

ganeti-watcher est un script conçu pour se lancer périodiquement et s’assurer de la santé de la grappe. Il redémarrera automatiquement les instances qui sont arrêtées sans le consentement de Ganeti, et réparera les liens DRBD au cas où un nœud a redémarré. Il archive aussi les anciennes tache de la grappe et redémarre les démons Ganeti qui ne sont pas lancés. Si le paramètres de grappe ensure_node_health est indiqué, le gardien éteindra aussi les instances et les périphériques DRBD si le nœud sur lequel il est lancé est déclaré hors-ligne par un candidat maitre.

Il peut être mis en pause sur tous les nœuds avec gnt-cluster watcher-pause.

Le service prend un objet ganeti-watcher-configuration.

Type de données : ganeti-watcher-configuration
ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour ce service.

schedule (par défaut : '(next-second-from (next-minute (range 0 60 5))))

Indique quand lancer le script. Par défaut, toutes les cinq minutes.

rapi-ip (par défaut : #f)

Cette option doit être spécifiée seulement si le démon RAPI est configuré pour utiliser une interface ou une adresse particulière. Par défaut l’adresse de grappe est utilisée.

job-age (par défaut : (* 6 3600))

Archive les taches de grappe plus vieilles que cela, en secondes. Par défaut c’est 6 heure. Cela permet de garder un gnt-job list gérable.

verify-disks? (par défaut : #t)

Si la valeur est #f, le gardien n’essaiera pas de réparer les liens DRBD cassés automatiquement. Les administrateur·ice·s devront utiliser gnt-cluster verify-disks manuellement à la place.

debug? (par défaut : #f)

Lorsque la valeur est #t, le script effectue des actions de journalisation supplémentaires pour le débogage.

Variable Scheme : ganeti-cleaner-service-type

ganeti-cleaner est un script conçu pour être lancé périodiquement et supprimer les anciens fichiers de la grappe. Ce type de service contrôle deux tache cron : l’une est conçue pour le nœud maitre et purge de manière permanente les ancienne taches de la grappe, et l’autre est conçue pour tous les nœuds et supprime les certificats X509, les clés et les informations ganeti-watcher périmées. Comme tous les services Ganeti, on peut l’ajouter même sur les nœuds non-maitres car il se désactive tout seul en cas de besoin.

Il prend un objet ganeti-cleaner-configuration.

Type de données : ganeti-cleaner-configuration
ganeti (par défaut : ganeti)

Le paquet ganeti à utiliser pour la commande gnt-cleaner.

master-schedule (par défaut : "45 1 * * *")

La périodicité à laquelle lancer la tache de nettoyage maitre. Par défaut c’est une fois par jour, à 01:45:00.

node-schedule (par défaut : "45 2 * * *")

La périodicité à laquelle lancer la tache de nettoyage des nœuds. Par défaut une fois par jour, à 02:45:00.


Suivant: , Précédent: , Monter: Services   [Table des matières][Index]