7777 exit 1
7878fi
7979
80- # --- Montage partitions & extraction ---
8180echo " [*] Attache l'image en loop et scanne les partitions…"
8281LOOPDEV=" $( losetup -f --show -P " ${IMG_PATH} " ) "
8382cleanup_loop () {
8483 sync || true
8584 umount /mnt/boot 2> /dev/null || true
8685 umount /mnt/root 2> /dev/null || true
86+ # démonte les mappings device-mapper si créés
8787 kpartx -d " ${LOOPDEV} " 2> /dev/null || true
8888 losetup -d " ${LOOPDEV} " 2> /dev/null || true
8989}
@@ -92,19 +92,73 @@ trap 'cleanup_loop; rm -rf "${TMP_DIR}"' EXIT
9292echo " [*] Loop device: ${LOOPDEV} "
9393lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT " ${LOOPDEV} " || true
9494
95- # Hypothèse standard Raspberry Pi OS : p1 = boot (FAT), p2 = root (ext4)
96- BOOT_PART=" ${LOOPDEV} p1 "
97- ROOT_PART=" ${LOOPDEV} p2 "
95+ # --- Détermine les devices de partition de manière robuste ---
96+ BOOT_PART=" "
97+ ROOT_PART=" "
9898
99- # Validation basique des partitions
100- if ! lsblk -no FSTYPE " ${ROOT_PART} " | grep -q ' ext' ; then
101- echo " Attention: ${ROOT_PART} n'est pas ext*. Vérifie le partitionnement."
99+ # 1) Essayer directement /dev/loopXp1/p2 (losetup -P)
100+ if [[ -b " ${LOOPDEV} p1" && -b " ${LOOPDEV} p2" ]]; then
101+ BOOT_PART=" ${LOOPDEV} p1"
102+ ROOT_PART=" ${LOOPDEV} p2"
103+ else
104+ # 2) Essayer via kpartx -> /dev/mapper/loopXp1/p2
105+ echo " [*] Création des mappages de partition via kpartx…"
106+ # -s: silencieux ; -a: add ; certains environnements requièrent -v pour forcer
107+ kpartx -as " ${LOOPDEV} " || kpartx -av " ${LOOPDEV} "
108+ base=" $( basename " ${LOOPDEV} " ) "
109+ if [[ -b " /dev/mapper/${base} p1" && -b " /dev/mapper/${base} p2" ]]; then
110+ BOOT_PART=" /dev/mapper/${base} p1"
111+ ROOT_PART=" /dev/mapper/${base} p2"
112+ fi
102113fi
103114
104- # Montage en lecture seule
115+ # 3) Si toujours rien, dernier recours: montage par offset
116+ mount_by_offset () {
117+ local dev=" $1 " partnum=" $2 " mnt=" $3 " fstype_hint=" $4 "
118+ # Récupère le start sector via fdisk
119+ local start
120+ start=" $( fdisk -l " $dev " | awk -v p=" $partnum " ' $0 ~ "^"dev".*\\*" {next} $0 ~ "^"dev"p"p {print $2}' dev=" $dev " p=" $partnum " ) "
121+ if [[ -z " $start " ]]; then
122+ # autre format fdisk: lignes qui listent partnum en 2e colonne
123+ start=" $( fdisk -l " $dev " | awk -v p=" $partnum " ' $0 ~ "^"dev {next} $0 ~ " "p" " {print $2}' dev=" $( basename " $dev " ) " p=" $partnum " ) "
124+ fi
125+ if [[ -z " $start " ]]; then
126+ echo " Impossible de déterminer l'offset pour ${dev} partition ${partnum} "
127+ return 1
128+ fi
129+ local offset=$(( start * 512 ))
130+ echo " [*] Montage par offset (part${partnum} ) offset=${offset} "
131+ mkdir -p " $mnt "
132+ # on laisse le noyau auto-détecter le fs si possible, sinon hint
133+ if [[ -n " $fstype_hint " ]]; then
134+ mount -o ro,offset=" $offset " -t " $fstype_hint " " $dev " " $mnt "
135+ else
136+ mount -o ro,offset=" $offset " " $dev " " $mnt "
137+ fi
138+ }
139+
140+ echo " [*] Résolution des partitions:"
141+ echo " BOOT_PART=${BOOT_PART:- <offset>} "
142+ echo " ROOT_PART=${ROOT_PART:- <offset>} "
143+
144+ # --- Montage en lecture seule ---
105145echo " [*] Montage des partitions (ro)…"
106- mount -o ro " ${ROOT_PART} " /mnt/root
107- mount -o ro " ${BOOT_PART} " /mnt/boot 2> /dev/null || true # FAT peut ne pas exister selon l’image
146+ mkdir -p /mnt/root /mnt/boot
147+
148+ if [[ -n " ${ROOT_PART} " && -b " ${ROOT_PART} " ]]; then
149+ mount -o ro " ${ROOT_PART} " /mnt/root
150+ else
151+ # ext4 attendu pour root
152+ mount_by_offset " ${LOOPDEV} " 2 /mnt/root ext4
153+ fi
154+
155+ # /boot peut être FAT ou absent selon image
156+ if [[ -n " ${BOOT_PART} " && -b " ${BOOT_PART} " ]]; then
157+ mount -o ro " ${BOOT_PART} " /mnt/boot || true
158+ else
159+ # essaie offset part1, sans forcer le type (auto-détection vfat)
160+ mount_by_offset " ${LOOPDEV} " 1 /mnt/boot " " || true
161+ fi
108162
109163# Copie du rootfs + /boot dans le sysroot
110164echo " [*] Copie du rootfs -> ${OUT} "
0 commit comments