Sembra sciocco usare i nostri cicli di scrittura SD limitati per aggiornare il software distribuito sulle immagini. È possibile aggiornare il software e installare il nuovo software prima di eseguire il flashing di un'immagine sulla scheda SD?
Sembra sciocco usare i nostri cicli di scrittura SD limitati per aggiornare il software distribuito sulle immagini. È possibile aggiornare il software e installare il nuovo software prima di eseguire il flashing di un'immagine sulla scheda SD?
Risposte:
La risposta è sempre sì, giusto, ci vuole solo un po 'per capire come!
Lo eseguirò su un VPS, fornito da Brightbox.com . Ho usato un Nano Server (2 CPU, 512 MB di RAM, 20 GB di spazio su disco) e un'immagine del server Ubuntu Precise 12.04 LTS. Dovrebbe funzionare su EC2 o equivalenti di Linode e, naturalmente, sulla tua macchina Linux domestica. L'ho ora testato sulla mia installazione di Arch (x86), ma so che non funziona su Ubuntu 10.04 LTS perché alcuni pacchetti sono troppo vecchi.
Assicurati che il tuo sistema sia aggiornato.
$ sudo apt-get update
$ sudo apt-get upgrade
Installa del nuovo software
$ sudo apt-get install binfmt-support qemu qemu-user-static unzip
qemu
è un emulatore ARM qemu-user-static
e binfmt-support
ci consente di eseguire eseguibili ARM senza emulare il kernel ARM. (Quant'è fico!?!)
Non riesco a trovare un collegamento statico qemu
nei repository Arch, quindi dovremo compilare dal sorgente.
Decomprimi ed esegui
./configure --disable-kvm --target-list=arm-linux-user --static
Compilare usando make
e installare usando sudo make install
.
Eseguire quanto segue come root
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register
echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register
Avvertenza Non dovresti eseguire comandi arbitrari che trovi online come
root
- questi sono stati presi dalqemu-binfmt-conf.sh
tipo di CPU ARM. Estrarre i comandi da questo file ed eseguirli.
Vai su raspberrypi.org e scarica l'immagine che desideri. Decomprimilo e salva il .img
file da qualche parte utile.
$ sudo mkdir -p /images/debian-squeeze
$ sudo wget "http://files.velocix.com/c1410/images/debian/6/debian6-19-04-2012/debian6-19-04-2012.zip" -O "/images/debian-squeeze.zip"
$ sudo unzip "/images/debian-squeeze.zip" -d /images/debian-squeeze
$ sudo rm /images/debian-squeeze.zip
Il .img
conterrà 3 partizioni, compresa la partizione di avvio.
$ cd /images/debian-squeeze/debian6-19-04-2012/
$ fdisk -lu debian6-19-04-2012.img
Disk debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
4 heads, 32 sectors/track, 29754 cylinders, total 3808593 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ee283
Device Boot Start End Blocks Id System
debian6-19-04-2012.img1 2048 155647 76800 c W95 FAT32 (LBA)
debian6-19-04-2012.img2 157696 3414015 1628160 83 Linux
debian6-19-04-2012.img3 3416064 3807231 195584 82 Linux swap / Solaris
Dobbiamo conoscere l'offset della partizione Linux, in questo caso sono i 157696
settori e la partizione di avvio, che si trova nei 2048
settori. Ogni settore è di 512 byte, quindi l'offset di root è 157696*512=80740352
byte e l'offset di avvio è 2048*512=1048576
.
Successivamente, dobbiamo montare l'immagine come file system. Questo può essere fatto usando un dispositivo di loopback. Usiamo l'offset della sezione precedente per dire mount
quali partizioni montare e dove. L'ordine di questi comandi è importante.
$ sudo mount -o loop,offset=80740352 "/images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img" /mnt
$ sudo mount -o loop,offset=1048576 "/images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img" /mnt/boot
Siamo quasi pronti per chroot
entrare nel nostro file system e iniziare l'installazione di nuovo software. Innanzitutto, dobbiamo installare l'emulatore nella nostra immagine, poiché non sarà disponibile dopo l'uso chroot
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
Dobbiamo anche fornire l'accesso ad alcune altre parti del sistema.
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Abbiamo chiuso! chroot
lontano...
$ sudo chroot /mnt
Ora sei nel tuo Raspberry Pi, ma i servizi non sono in esecuzione ecc. Fai attenzione, sei root!
Per aggiornare il software, utilizziamo apt-get
.
# apt-get update
# apt-get upgrade
È inoltre possibile installare il software utilizzando apt-get install
come al solito.
Per aggiornare il software, utilizziamo pacman
.
# pacman -Syu
È inoltre possibile installare il software utilizzando pacman -S
come al solito.
NOTA È possibile eseguire in
pacman
modo nativo seguendo le istruzioni su Come eseguire il mio nativopacman
su un'immagine montata? .
Puoi uscire chroot
usando Ctrl+ De smontare il sistema eseguendo sudo umount /mnt
- dovrai smontare ogni punto di montaggio separatamente.
È necessario rimuovere qemu-user-static
dalla /usr/bin
o qemu-arm
dalle /usr/local/bin
sul RPI, allora l'immagine è pronta per essere balenato.
Questo è un po 'lungo e noioso, ma fallo una volta e imparerai un sacco su come tutto questo funziona!
Quando si tenta di eseguire, eseguire ciò sulle ultime immagini, verrà visualizzato un errore
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)
Per correggere questo errore, è sufficiente commentare il contenuto del /etc/ld.so.preload
file
piimg
Ho iniziato a lavorare su un'utilità per fare molto di questo per te. Si chiama piimg e può essere trovato su github.com/alexchamberlain/piimg .
Finora, può montare la scheda SD per te eseguendo
piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt
e smontarli di nuovo correndo
piimg umount /mnt
Hai solo bisogno di installare qemu
e chroot
via.
DISCLAIMER I, Alex Chamberlain, sono lo sviluppatore principale di
piimg
. Come tale, potrei essere di partepiimg
riguardo all'uso di in relazione ad altri metodi.
sudo kpartx -av rpi_pisces_mate_r1.img
, che mostrerà le partizioni. Usa il più grande e montalo, ad es sudo mount /dev/mapper/loop0p3 /mnt/tmp
.
Qui uno script veloce che ho messo insieme mentre stavo montando monta la prima partizione Linux di un file di immagine Utilizzare a proprio rischio. Non ha errori nella gestione / convalida dell'input
#!/bin/bash
# This script is designed to mount
# the first Linux filesystem
# in the partition table of the
# image handed to it
USAGE="$0 <image name> <mount point>"
IMAGE=$1
MOUNTPT=$2
OFFSET=`fdisk -lu $IMAGE | grep -m 1 Linux$ | awk '{ print $2 *512 }'`
echo "Executing as $USER: mount -o loop,offset=$OFFSET $IMAGE $MOUNTPT"
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPT
Ho seguito le istruzioni alla ricerca di un metodo per creare roba per il PI tramite il mio PC principale, si scopre che è stato molto semplice, una volta chroot puoi trattare l'immagine come se fosse un sistema live e usare tutto il app native. sul pi, quindi non è necessario installare un compilatore incrociato :)
Ho una domanda però, durante l'installazione del chroot, dobbiamo montare alcune partizioni affinché il chroot funzioni correttamente:
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Come possiamo smontare questi correttamente? lasciandoli montati, che ti impedisce di smontare il file .img, qualsiasi aiuto qui sarebbe apprezzato. Ho provato l'opzione -f, non sono sicuro che ci sia qualcos'altro sottostante che è montato.
rispondendo alla mia domanda, https://bugzilla.redhat.com/show_bug.cgi?id=194342 il secondo metodo alla fine del post ha funzionato per me con una modifica sudo.
cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount
Ovviamente cambia $ MOUNTPOINT nel percorso del tuo mount point chroot (seconda partizione contenente i rootfs sul file immagine, che è / mnt nel tutorial sopra). Usando questo metodo si smonta completamente il file img dai dispositivi di loopback e qualsiasi altro dispositivo che è stato montato tramite il chroot.
cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT