ISO to IMG
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?