For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/hosted-private-cloud/opcp/how-to-create-centos-image.md.

Construction d'images CentOS Stream avec Disk Image Builder pour OPCP

Voir en Markdown

Découvrez comment construire des images OpenStack CentOS Stream 8 et 9 personnalisées avec diskimage-builder (DiB) pour On-Prem Cloud Platform

Objectif

Disk Image Builder (DiB) est l'outil OpenStack utilisé pour construire des images disque de systèmes d'exploitation personnalisées. Ce guide explique comment construire des images CentOS Stream 8 et CentOS Stream 9 prêtes à être importées dans OpenStack Glance et utilisées sur votre On-Prem Cloud Platform (OPCP).

Ce guide explique comment installer DiB, préparer des éléments personnalisés qui contournent un problème connu de CentOS, puis lancer la construction pour CentOS Stream 8 et CentOS Stream 9.

Pour un autre exemple basé sur Debian avec une personnalisation via Ansible, consultez le guide Création d'une image Debian personnalisée pour OPCP.

Info

Dans ce guide, nous utilisons Debian 12 comme hôte de construction pour produire des images CentOS, mais vous pouvez utiliser une autre distribution Linux (des ajustements peuvent être nécessaires). Vous pouvez également adapter les chemins et les commandes présentés ici en fonction de vos besoins.

Prérequis

  • Disposer des permissions root sur l'hôte de construction
  • Au moins 10 Go d'espace disque libre
  • Un environnement Linux Debian 12 (ou compatible) pour lancer la construction
  • Un accès à internet pour télécharger les paquets et les miroirs CentOS amont

En pratique

Étape 1 : Installer les prérequis de construction

Installez les composants requis par DiB pour construire des images basées sur CentOS, Debian et Ubuntu :

apt update
apt install -y \
  dosfstools \
  python3 \
  python3-venv \
  python3-pip \
  virtualenv \
  kpartx \
  debootstrap \
  lvm2 \
  squashfs-tools \
  git \
  qemu-utils \
  qemu-system-x86 \
  curl
Info

git est nécessaire pour cloner le dépôt DiB, qemu-utils fournit l'outillage qemu-img utilisé pour manipuler les images qcow2, qemu-system-x86 fournit qemu-system-x86_64 utilisé à l'étape 7 pour tester le résultat, et curl sert à télécharger les paquets et le contenu des miroirs durant la construction.

Étape 2 : Installer Disk Image Builder

Créez et activez un environnement virtuel Python :

virtualenv ~/env-diskimage-builder
source ~/env-diskimage-builder/bin/activate

Clonez le dépôt DiB sur un tag spécifique et installez-le. Dans cet exemple, nous utilisons la version 3.42.0 :

git clone --depth 1 --branch 3.42.0 https://opendev.org/openstack/diskimage-builder ~/diskimage-builder
pip install -e ~/diskimage-builder

Vérifiez que disk-image-create est disponible :

disk-image-create --version

Étape 3 : Créer l'arborescence de dossiers

Créez les répertoires de travail utilisés par la construction :

mkdir -p ~/dib                  # dossier principal
mkdir -p ~/dib/tmp-build-dir    # dossier temporaire utilisé pendant la construction
mkdir -p ~/dib/elements         # dossier stockant les éléments personnalisés utilisés par DiB
mkdir -p ~/dib/env              # dossier stockant les variables personnalisées par distribution

Étape 4 : Définir les éléments personnalisés

La construction CentOS nécessite deux éléments personnalisés qui contournent des limitations actuelles des éléments DiB amont.

Élément personnalisé : block-device-efi-custom

L'élément block-device-efi par défaut crée une partition ESP (EFI System Partition) plus grande que nécessaire. Créez un élément personnalisé basé sur celui-ci et redimensionnez la partition de 550 Mio à 512 Mio :

cp -pR ~/diskimage-builder/diskimage_builder/elements/block-device-efi ~/dib/elements/block-device-efi-custom
sed -i -e 's/550/512/' ~/dib/elements/block-device-efi-custom/block-device-default.yaml

Élément personnalisé : centos-custom

L'élément centos par défaut présente un problème qui n'est pas encore corrigé. Créez un élément personnalisé basé sur celui-ci pour appliquer le correctif requis :

cp -pR ~/diskimage-builder/diskimage_builder/elements/centos ~/dib/elements/centos-custom

sed -i \
  -e 's/centos.repo/*.repo/' \
  -e 's/centos-addons.repo/*.repo/' \
  -e 's/CentOS-Stream-BaseOS.repo/*.repo/' \
  -e 's/CentOS-Stream-AppStream.repo/*.repo/' \
  -e 's/CentOS-Stream-Extras.repo/*.repo/' \
  -e 's/CentOS-Stream-PowerTools.repo/*.repo/' \
  -e 's/CentOS-Linux-BaseOS.repo/*.repo/' \
  -e 's/CentOS-Linux-AppStream.repo/*.repo/' \
  -e 's/CentOS-Linux-Extras.repo/*.repo/' \
  -e 's/CentOS-Linux-PowerTools.repo/*.repo/' \
  -e 's/CentOS-Linux-Plus.repo/*.repo/' \
  ~/dib/elements/centos-custom/pre-install.d/00-02-set-centos-mirror

Étape 5 : Construire une image CentOS Stream 8

Info

Pour CentOS Stream 8, l'utilisateur par défaut créé par cloud-init est centos.

Créer les variables d'environnement

mkdir -p ~/dib/env/centos8

cat <<EOF > ~/dib/env/centos8/main.env
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"
export DIB_GRUB_TIMEOUT=10
export DIB_DISTRIBUTION_MIRROR=http://vault.centos.org/centos
export DIB_RELEASE=8-stream
export DIB_BOOTLOADER_DEFAULT_CMDLINE="nofb nomodeset gfxpayload=text rd.auto"
export DIB_DRACUT_ENABLED_MODULES="
- name: crypt
  packages:
    - cryptsetup
- name: lvm
  packages:
    - lvm2
- name: mdraid
  packages:
    - mdadm
"
EOF

Lancer la construction

Réinitialisez toute variable précédemment définie, sourcez le fichier d'environnement, puis lancez la construction :

unset DIB_CLOUD_INIT_DATASOURCES
unset DIB_GRUB_TIMEOUT
unset DIB_DISTRIBUTION_MIRROR
unset DIB_RELEASE
unset DIB_BOOTLOADER_DEFAULT_CMDLINE
unset DIB_DRACUT_ENABLED_MODULES

source ~/dib/env/centos8/main.env

cd ~/dib

export TMPDIR="$(pwd)/tmp-build-dir"
export ELEMENTS_PATH="$(pwd)/elements"

disk-image-create --no-tmpfs -t qcow2 --image-size 16GB -a amd64 \
  dracut-regenerate block-device-efi-custom bootloader \
  cloud-init-datasources centos-custom \
  -o my-centos8-image

Une fois la construction terminée, vérifiez les fichiers générés :

ls my-centos8-image*
my-centos8-image.qcow2

my-centos8-image.d:
dib-manifests

Étape 6 : Construire une image CentOS Stream 9

Info

Pour CentOS Stream 9, l'utilisateur par défaut créé par cloud-init est cloud-user.

Créer les variables d'environnement

mkdir -p ~/dib/env/centos9

cat <<EOF > ~/dib/env/centos9/main.env
export DIB_GRUB_TIMEOUT=10
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"
export DIB_RELEASE=9-stream
export DIB_BOOTLOADER_DEFAULT_CMDLINE="nofb nomodeset gfxpayload=text rd.auto"
export DIB_DRACUT_ENABLED_MODULES="
- name: crypt
  packages:
    - cryptsetup
- name: lvm
  packages:
    - lvm2
- name: mdraid
  packages:
    - mdadm
"
EOF

Lancer la construction

unset DIB_CLOUD_INIT_DATASOURCES
unset DIB_GRUB_TIMEOUT
unset DIB_DISTRIBUTION_MIRROR
unset DIB_RELEASE
unset DIB_BOOTLOADER_DEFAULT_CMDLINE
unset DIB_DRACUT_ENABLED_MODULES

source ~/dib/env/centos9/main.env

cd ~/dib

export TMPDIR="$(pwd)/tmp-build-dir"
export ELEMENTS_PATH="$(pwd)/elements"

disk-image-create --no-tmpfs -t qcow2 --image-size 16GB -a amd64 \
  dracut-regenerate block-device-efi-custom bootloader \
  cloud-init-datasources centos-custom \
  -o my-centos9-image

Une fois la construction terminée, vérifiez les fichiers générés :

ls my-centos9-image*
my-centos9-image.qcow2

my-centos9-image.d:
dib-manifests

Étape 7 (optionnel) : Tester l'image localement

Avant d'importer l'image, vous pouvez la démarrer localement avec QEMU pour vérifier qu'elle démarre correctement :

qemu-system-x86_64 -nographic \
  -m 2048 \
  -drive file=my-centos9-image.qcow2,if=virtio,format=qcow2

Étape 8 : Importer l'image dans OpenStack

Importez l'image qcow2 générée dans Glance :

openstack image create \
  --disk-format qcow2 \
  --container-format bare \
  --file my-centos9-image.qcow2 \
  my-centos9-image

Vous pouvez désormais créer une instance Bare Metal (Ironic) ou Compute (Nova) à partir de l'image nouvellement créée.

Dépannage

L'image ne démarre pas (emergency mode) ou le build échoue sur grub2-probe

Symptômes

L'erreur peut apparaître à deux endroits différents :

Lors du build, sur l'étape grub :

/usr/sbin/grub2-probe: error: ../grub-core/kern/fs.c:120:unknown filesystem.

Au démarrage d'une instance, le boot ne va pas jusqu'au bout et s'arrête en mode « emergency ». journalctl montre des erreurs sur le système de fichiers :

/dev/vda3 has unsupported feature(s): FEATURE_C12
e2fsck: Get a newer version of e2fsck!
fsck failed with exit status 12

Cause

Le problème est lié à la version d'e2fsprogs, utilisé par les commandes mke2fs, e2fsck, grub2-probe.

disk-image-builder formate la partition root avec le mkfs.ext4 de la machine de construction, pas celui de l'image cible. Si l'hôte de construction utilise un e2fsprogs récent (version supérieure à 1.47), certaines fonctionnalités ext4 sont activées par défaut à la création du système de fichiers :

  • metadata_csum_seed
  • orphan_file

Ces fonctionnalités sont trop récentes pour l'e2fsprogs/grub2 embarqué dans CentOS 8 ou 9, ce qui cause les erreurs observées.

Solution

Désactivez ces fonctionnalités à la création du système de fichiers via l'option --mkfs-options de disk-image-create :

disk-image-create --no-tmpfs -t qcow2 --image-size 16GB -a amd64 \
  --mkfs-options "-O ^metadata_csum_seed,^orphan_file" \
  dracut-regenerate block-device-efi-custom bootloader \
  cloud-init-datasources centos-custom \
  -o my-centos-image

Aller plus loin

Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en place de nos solutions, contactez votre commercial ou cliquez sur ce lien afin d'obtenir un devis et demandez une analyse à nos experts Professional Services sur le cas d'usage spécifique de votre projet.

Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?