From ae8140ccff87bf2806dfc70b0fb35b6ebcb08344 Mon Sep 17 00:00:00 2001 From: nocode Date: Wed, 8 Jul 2026 02:03:54 +0200 Subject: [PATCH] fix(anaconda): use firmware-dependent disklabel for bootable installs Replace hardcoded msdos disklabel with firmware-aware configuration: - UEFI systems now use GPT, allowing ESP creation for grub-install EFI - BIOS systems continue using MBR/msdos where core.img fits in post-MBR space This fixes the bug where forcing msdos on UEFI prevented ESP creation, resulting in non-bootable installations. The disklabel is now dynamically generated by a %pre script that detects firmware type and writes the appropriate clearpart command to /tmp/fws-clearpart.ks for inclusion. Clarifies that clearpart --all only affects GUI-selected disks, addressing multi-disk scenarios where users may not want all disks wiped. --- .../share/anaconda/interactive-defaults.ks | 48 +++++++++++++------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks index 1ee884c..f327cfb 100644 --- a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks +++ b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks @@ -45,24 +45,25 @@ # zerombr : réinitialise toute table de partitions invalide # (répond « oui » au lieu de bloquer sur un disque # non reconnu). -# clearpart --all : supprime TOUTES les partitions de TOUS les disques. +# clearpart --all : supprime TOUTES les partitions des disques +# SÉLECTIONNÉS dans le GUI (l'utilisateur choisit le +# disque cible — les autres, ex. disques de jeux, ne +# sont pas touchés s'il ne les sélectionne pas). # --initlabel : réécrit une étiquette de disque neuve. -# --disklabel=msdos : force une table MBR (et non GPT). CRUCIAL en BIOS : -# en BIOS+GPT, GRUB i386-pc exige une partition « BIOS -# Boot » (~1 Mo, type EF02) pour embarquer core.img, -# qu'Anaconda NE crée PAS avec « bootloader --disabled -# » → « this GPT partition label contains no BIOS Boot -# Partition; embedding won't be possible » → -# grub-install échoue. En MBR, core.img se loge dans -# l'espace post-MBR, aucune partition dédiée requise. -# ⚠ Ce choix vise le BIOS (cas VMware actuel). Pour l'UEFI il faudra du GPT -# (+ ESP) — à rendre dépendant du firmware (%pre) le jour où on cible l'UEFI. +# --disklabel : type de table CHOISI SELON LE FIRMWARE par le %pre +# plus bas (ne surtout PAS coder en dur) : +# • UEFI → gpt : l'ESP peut être créée → grub-install +# EFI fonctionne. Forcer « msdos » en UEFI empêchait +# l'ESP (→ install NON bootable) et réécrivait la +# table pour rien : c'est LE bug corrigé ici. +# • BIOS → msdos : core.img se loge dans l'espace +# post-MBR (pas de partition BIOS Boot EF02 requise, +# qu'Anaconda ne crée pas avec « bootloader --disabled »). # L'utilisateur garde la main dans le GUI (il peut repasser en manuel), mais le -# DÉFAUT est désormais un disque net → réinstall fiable à chaque fois. -# ⚠ VM mono-disque : « --all » efface le seul disque, c'est voulu. Sur une -# machine multi-disques il faudrait cibler avec « --drives=sda ». +# DÉFAUT est un disque net → réinstall fiable à chaque fois. zerombr -clearpart --all --initlabel --disklabel=msdos +# Table de partitions injectée par le %pre (GPT en UEFI, MBR en BIOS). +%include /tmp/fws-clearpart.ks # --- Bootloader : géré à la main en %post ------------------------------------ # Anaconda lancerait « grub2-install » / « grub2-mkconfig » (binaires Fedora, @@ -88,6 +89,23 @@ bootloader --disabled # poweroff en plein install au 1er test réel). +# ============================================================================ +# %pre — TABLE DE PARTITIONS SELON LE FIRMWARE +# Génère /tmp/fws-clearpart.ks (inclus dans la section commandes ci-dessus) : +# GPT en UEFI (→ ESP créable → grub-install EFI fonctionne), MBR/msdos en BIOS. +# Les scripts %pre s'exécutent AVANT l'application des commandes du kickstart, +# donc le %include voit toujours le fichier généré ici. +# ============================================================================ +%pre --log=/tmp/fws-pre.log +if [ -d /sys/firmware/efi ]; then + disklabel=gpt +else + disklabel=msdos +fi +echo "clearpart --all --initlabel --disklabel=$disklabel" > /tmp/fws-clearpart.ks +%end + + # ============================================================================ # %post --nochroot — s'exécute dans le LIVE, la cible montée sous /mnt/sysroot # But : déposer dans la cible ce dont le %post chrooté aura besoin (DNS pour