È possibile aggiornare, aggiornare e installare il software prima di eseguire il flashing di un'immagine?


28

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:


31

La risposta è sempre sì, giusto, ci vuole solo un po 'per capire come!

The Hard Way

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.

Preparare il tuo sistema - Debian / Ubuntu

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-statice binfmt-supportci consente di eseguire eseguibili ARM senza emulare il kernel ARM. (Quant'è fico!?!)

Preparazione del sistema - Arch

Non riesco a trovare un collegamento statico qemunei repository Arch, quindi dovremo compilare dal sorgente.

  1. Scarica l'ultima versione da http://git.savannah.gnu.org/cgit/qemu.git
  2. Decomprimi ed esegui

    ./configure --disable-kvm --target-list=arm-linux-user --static

  3. Compilare usando makee installare usando sudo make install.

  4. 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 dal qemu-binfmt-conf.shtipo di CPU ARM. Estrarre i comandi da questo file ed eseguirli.

Scarica e decomprimi l'immagine

Vai su raspberrypi.org e scarica l'immagine che desideri. Decomprimilo e salva il .imgfile 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

Trova la partizione corretta

Il .imgconterrà 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 157696settori e la partizione di avvio, che si trova nei 2048settori. Ogni settore è di 512 byte, quindi l'offset di root è 157696*512=80740352byte e l'offset di avvio è 2048*512=1048576.

Montare l'immagine come dispositivo di loopback

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 mountquali 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

Preparare il filesystem.

Siamo quasi pronti per chrootentrare 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.

Debian / Ubuntu

$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/

Arch Linux

$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/

Tutti i sistemi host

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

chroot

Abbiamo chiuso! chrootlontano...

$ sudo chroot /mnt

Ora sei nel tuo Raspberry Pi, ma i servizi non sono in esecuzione ecc. Fai attenzione, sei root!

Aggiorna / Installa software - Debian Image

Per aggiornare il software, utilizziamo apt-get.

 # apt-get update
 # apt-get upgrade

È inoltre possibile installare il software utilizzando apt-get installcome al solito.

Aggiorna / Installa software - Arch Image

Per aggiornare il software, utilizziamo pacman.

 # pacman -Syu

È inoltre possibile installare il software utilizzando pacman -Scome al solito.

NOTA È possibile eseguire in pacmanmodo nativo seguendo le istruzioni su Come eseguire il mio nativo pacmansu un'immagine montata? .

Uscita

Puoi uscire chrootusando Ctrl+ De smontare il sistema eseguendo sudo umount /mnt- dovrai smontare ogni punto di montaggio separatamente.

È necessario rimuovere qemu-user-staticdalla /usr/bino qemu-armdalle /usr/local/binsul RPI, allora l'immagine è pronta per essere balenato.

Parole finali

Questo è un po 'lungo e noioso, ma fallo una volta e imparerai un sacco su come tutto questo funziona!

Nota sulle ultime immagini

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.preloadfile

The Easy Way - 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 qemue chrootvia.

DISCLAIMER I, Alex Chamberlain, sono lo sviluppatore principale di piimg. Come tale, potrei essere di parte piimgriguardo all'uso di in relazione ad altri metodi.

Riferimenti

  1. Esecuzione di ARM Linux sul PC desktop: il modo chroot straniero

  2. Ottenere "istruzioni illegali" quando si tenta di chroot


Qualcuno lo ha davvero provato?
Finnw

@finnw Penso che Jivings ora abbia provato questo.
Alex Chamberlain,

1
Puoi anche usare 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.
elmicha,

@AlexChamberlain: hai effettivamente funzionato sul server Brightbox? Ho provato con successo questo sul mio PC di casa ma quando l'ho provato su Brightbox non sono riuscito a chroot e volevo che fosse perché cercavo di ottenere effettivamente la virtualizzazione sopra la virtualizzazione. Ovviamente avrei potuto fare anche qualcosa di sbagliato, ma ho pensato che valesse la pena interrogarlo prima di arrendersi completamente! Grazie per un eccellente tutorial.
DrAl,

È possibile aggiornare questo per includere come chroot Noobs Distro? Solo per il gusto di imparare a chroot in una tale distro
Suhaib

0

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

Sfortunatamente poiché le immagini sono tutte basate su ARM, non è possibile eseguire direttamente nulla su di esse. Aggiornarli è un po 'più complicato ... Potrebbe essere possibile se il tuo sistema host è basato su apt.
Fred,

-2

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

Non sono sicuro che questo risponda davvero alla domanda. Non descrivi come stai eseguendo il chrooting nell'immagine o come installi il software al suo interno. Inoltre questo non è il posto giusto per fare nuove domande.
Jivings,

Sto usando lo stesso metodo della risposta sì originale che l'OP ha fatto alla sua domanda. Dato che ho avuto un problema di smontaggio dell'immagine, questo è davvero il posto migliore per quella domanda e la mia eventuale risposta.
Reggie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.