Skip to main content

ISO to IMG

· 4 min read
Piero Proietti
penguins-eggs author
Deutsch  •  English  •  Español  •  Français  •  Italiano  •  Polska  •  Portuguese  •  Български  •  Русский  •  Українська  •  やまと  •  中国  •  فارsi

Nella puntata precedente abbiamo visto come rimasterizzare una MicroSD per RaspberriPi, creando una immagine .img.

Possiamo fare questo a partire da una immagine ISO per arm64 creata con eggs su una VM arm64?

Proviamo

Ho scaricato egg-of_debian-bookworm-naked_arm64_2024-04-14_1821.iso, la monto ed estraggo i file.

Sulla ISO ci sono 4 cartelle:

  • grub
  • efi
  • isolinux
  • live

Isolinux, qua non serve proprio, le altre due non sono sicuro. Quello che ci occorre è il contenuto di live:

  • filesystem.squashfs
  • initrd.img-6.1.0-20-arm64
  • vmlinuz-6.1.0-20-arm64

In soldoni dalla partizione bootfs dovremmo far partire vmlinux che a sua volta utilizzerà initrd-img, questo dovrebbe montare quindi filesystem.squashfs come in effetti succede su una VM.

filesystem.squashfs è 469M, diciamo che con una immagina da 1G dovremmo avere spazio a sufficienza.

Andiamo a creare un raspi.img da 1G, suddiviso in due partizioni: bootfs e rootfs.

Per non sbagliare, partiremo da una immagine esistente e sicuramente funzionante.

Scaricare immagine raspi 2024-07-04-raspios-bookworm-arm64-lite.img.xz

decomprimere l'immagine

unxz 2024-07-04-raspios-bookworm-arm64-lite.img.xz -k

Ridenominazione dell'immagine

mv 2024-07-04-raspios-bookworm-arm64-lite.img raspi.img

La nostra immagine root=PARTUUID=a3f161f3-02

sudo losetup -fP raspi.img
sudo losetup -a

Ridimensionare la partizione

sudo kpartx -av /dev/loop1 # loop0 è usato dall'immagine ISO

troviamo:

add map loop1p1 (252:5): 0 1048576 linear 7:1 8192
add map loop1p2 (252:6): 0 4481024 linear 7:1 1056768

montiamo rootfs

sudo mount /dev/mapper/loop1p2 /mnt/rootfs

copiamo il tutto

sudo rsync -aAXv   /media/artisan/naked/live/ /mnt/rootfs/

Andiamo a montare bootfs

sudo mount /dev/mapper/loop1p1 /mnt/bootfs

La configurazione su ISO

Queste sono le linee di configurazione di grub.cfg nella ISO live

linux /live/vmlinuz-6.1.0-20-arm64
append initrd=/live/initrd.img-6.1.0-20-arm64 boot=live components locales=en_US.UTF-8 cow_spacesize=4G

e questo è il cmdline.txt funzionante, della chiavetta precedente:

console=serial0,115200 console=tty1 root=PARTUUID=a3f161f3-02 rootfstype=ext4 fsck.repair=yes rootwait initrd=/live/initrd.img-6.1.0-20-arm64 boot=live components locales=en_US.UTF-8 cow_spacesize=2G

Qui non abbiamo /live/, quindi dovremmo, forse, aggiungere a cmdline:

initrd=/initrd.img-6.1.0-20-arm64 boot=live components locales=en_US.UTF-8 cow_spacesize=2G

semplificando, riscrivo in questo modo:

initrd=/initrd.img-6.1.0-20-arm64 console=serial0,115200 console=tty1 root=PARTUUID=a3f161f3-02 rootfstype=ext4 fsck.repair=yes rootwait boot=live locales=en_US.UTF-8

smontiamo tutto

sudo umount /mnt/bootfs
sudo umount /mnt/rootfs
sudo kpartx -d /dev/loop1

A questo punto raspi.img dovrebbe essere pronta per essere registrata su usb.

Questo è il boot dell'immagine prodotta

Noto che in init line 246 segnala l'assenza di /scripts/live... Ma in effetti questo file è presente, difatti facendo l'analisi di initrd.img-6.1.0-20-arm64 lo troviamo.

Analisi initrd.img-6.1.0-20-arm64

Il nostro file initrd.img-6.1.0-20-arm64 è compresso con zstd, possiamo rilevarlo con il comando:

file initrd.img-6.1.0-20-arm64

A questo punto possiamo decomprimerlo:

zstd -d -k  initrd.img-6.1.0-20-arm64 -o initrd.img

Quindi creiamo una directory content per riversare i dati:

mkdir contents
cd contents
cpio -id < ../initrd.img

contenuto di initrd.img-6.1.0-20-arm64

ls 
bin conf etc init lib run sbin scripts usr

ls scripts
bin conf etc init lib run sbin scripts usr

quindi, il file /scripts/live esiste...

Perchè non lo trova?

file /scripts/live

Il file /scripts/live esiste ed esiste /bin/live-boot

# Live system filesystem mounting			-*- shell-script -*-

. /bin/live-boot

live_top()
{
if [ "${live_top_used}" != "yes" ]; then
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-top"
run_scripts /scripts/live-top
[ "$quiet" != "y" ] && log_end_msg
fi
live_top_used=yes
}

live_premount()
{
if [ "${live_premount_used}" != "yes" ]; then
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
run_scripts /scripts/live-premount
[ "$quiet" != "y" ] && log_end_msg
fi
live_premount_used=yes
}

live_bottom()
{
if [ "${live_premount_used}" = "yes" ] || [ "${live_top_used}" = "yes" ]; then
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-bottom"
run_scripts /scripts/live-bottom
[ "$quiet" != "y" ] && log_end_msg
fi
live_premount_used=no
live_top_used=no
}


mountroot()
{
# initramfs-tools entry point for live-boot is mountroot(); function
Live
}

mount_top()
{
# Note, also called directly in case it's overridden.
live_top
}

mount_premount()
{
# Note, also called directly in case it's overridden.
live_premount
}

mount_bottom()
{
# Note, also called directly in case it's overridden.
live_bottom
}

L'initrd è corretto, ho usato lo stesso della chiavetta usb, il file /script/live esiste purtroppo non riesco a superare questo scoglio.

Suggerimenti?