Passa al contenuto principale

ISO to IMG

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

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?