Ist es möglich, Software vor dem Flashen eines Images zu aktualisieren, zu aktualisieren und zu installieren?

28

Es erscheint uns dumm, unsere begrenzten SD-Schreibzyklen zu verwenden, um die auf den Images enthaltene Software zu aktualisieren. Können wir die Software aktualisieren und neue Software installieren, bevor wir ein Image auf die SD-Karte flashen?

Alex Chamberlain
quelle

Antworten:

31

Ja

Die Antwort lautet immer ja, richtig, es dauert nur eine Weile, bis Sie herausgefunden haben, wie!

Der harte Weg

Ich werde dies auf einem von Brightbox.com bereitgestellten VPS ausführen . Ich habe einen Nano-Server (2 CPUs, 512 MB RAM, 20 GB Festplattenspeicher) und ein Ubuntu Precise 12.04 LTS-Server-Image verwendet. Es sollte auf EC2- oder Linode-Entsprechungen und natürlich auf Ihrem Linux-Heimcomputer funktionieren. Ich habe es jetzt auf meiner (x86) Arch-Installation getestet, weiß aber, dass es auf Ubuntu 10.04 LTS nicht funktioniert, da einige der Pakete zu alt sind.

Vorbereiten Ihres Systems - Debian / Ubuntu

Stellen Sie sicher, dass Ihr eigenes System auf dem neuesten Stand ist.

$ sudo apt-get update
$ sudo apt-get upgrade

Installieren Sie eine neue Software

$ sudo apt-get install binfmt-support qemu qemu-user-static unzip

qemuist ein ARM - Emulator, und qemu-user-staticund binfmt-supportermöglicht es uns , ARM ausführbare Dateien ohne Emulation des ARM - Kernel zu laufen. (Wie cool ist das!?!)

System vorbereiten - Arch

Ich kann keine statisch verknüpften Dateien qemuin den Arch-Repositorys finden, daher müssen wir sie aus dem Quellcode kompilieren.

  1. Laden Sie die neueste Version von http://git.savannah.gnu.org/cgit/qemu.git herunter
  2. Entpacken und ausführen

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

  3. Bauen mit makeund installieren mit sudo make install.

  4. Führen Sie Folgendes aus als 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

Warnung Sie sollten keine willkürlichen Befehle ausführen, die Sie online finden, da rootdiese vom qemu-binfmt-conf.shARM-CPU-Typ stammen. Bitte extrahieren Sie die Befehle aus dieser Datei und führen Sie diese aus.

Lade das Bild herunter und entpacke es

Gehen Sie zu raspberrypi.org und laden Sie das gewünschte Bild herunter. Entpacke es und speichere die .imgDatei an einem nützlichen Ort.

$ 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

Suchen Sie die richtige Partition

Die .imgwird 3 Partitionen enthalten, einschließlich der Boot-Partition.

$ 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

Wir müssen den Offset der Linux-Partition kennen, in diesem Fall sind es 157696Sektoren und die Boot-Partition, die sich in 2048Sektoren befindet. Jeder Sektor hat 512 Bytes, der Root-Offset ist also 157696*512=80740352Bytes und der Boot-Offset ist 2048*512=1048576.

Hängen Sie das Image als Loopback-Gerät ein

Als Nächstes müssen wir das Image als Dateisystem bereitstellen. Dies kann mit einem Loopback-Gerät erfolgen. Wir verwenden den Versatz aus dem vorherigen Abschnitt, um zu bestimmen, mountwelche Partitionen eingehängt werden sollen und wo. Die Reihenfolge dieser Befehle ist wichtig.

$ 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

Dateisystem vorbereiten.

Wir sind fast bereit, chrootin unser Dateisystem einzusteigen und neue Software zu installieren. Zunächst müssen wir den Emulator in unser Image installieren, da er bei Verwendung nicht mehr verfügbar ist 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/

Alle Hostsysteme

Wir müssen auch Zugriff auf bestimmte andere Teile des Systems gewähren.

$ sudo mount --rbind /dev     /mnt/dev
$ sudo mount -t proc none     /mnt/proc
$ sudo mount -o bind /sys     /mnt/sys

Chroot

Wir sind fertig! chrootWeg...

$ sudo chroot /mnt

Sie befinden sich jetzt in Ihrem Raspberry Pi, aber die Dienste werden nicht ausgeführt usw. Seien Sie vorsichtig, Sie sind root!

Software aktualisieren / installieren - Debian Image

Zur Aktualisierung der Software verwenden wir apt-get.

 # apt-get update
 # apt-get upgrade

Sie können die Software auch apt-get installwie gewohnt installieren .

Software aktualisieren / installieren - Arch Image

Zur Aktualisierung der Software verwenden wir pacman.

 # pacman -Syu

Sie können die Software auch pacman -Swie gewohnt installieren .

HINWEIS Sie können pacmannativ ausgeführt werden, indem Sie den Anweisungen unter Wie führe ich mein natives pacmanImage für ein bereitgestelltes Image aus? Folgen . .

Verlassen

Sie können das beenden , chrootindem Sie Ctrl+ Dund Aushängen des Systems , indem Sie sudo umount /mnt- Sie jeden Punkt einzeln montieren aushängen müssen ..

Sie sollten qemu-user-staticvon /usr/binoder qemu-armvon /usr/local/binauf dem RPi entfernen, dann ist das Bild bereit, geflasht zu werden.

Letzte Worte

Das ist etwas langwierig und langwierig, aber wenn Sie es einmal tun, werden Sie eine Menge darüber erfahren, wie das alles funktioniert!

Hinweis zu den neuesten Bildern

Wenn Sie versuchen, dies auf den neuesten Bildern auszuführen, wird eine Fehlermeldung angezeigt

qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)

Um diesen Fehler zu beheben, kommentieren Sie einfach den Inhalt der /etc/ld.so.preloadDatei aus

Der einfache Weg - piimg

Ich habe angefangen, an einem Hilfsprogramm zu arbeiten, um eine Menge davon für Sie zu erledigen. Es heißt piimg und ist unter github.com/alexchamberlain/piimg zu finden .

Bisher kann es die SD-Karte für Sie bereitstellen, indem es ausgeführt wird

piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt

und hänge sie wieder ab, indem du rennst

piimg umount /mnt

Sie müssen nur installieren qemuund chrootloslegen.

HAFTUNGSAUSSCHLUSS Ich, Alex Chamberlain, bin der Hauptentwickler von piimg. Als solches bin ich möglicherweise voreingenommen gegenüber piimganderen Methoden.

Verweise

  1. Ausführen von ARM Linux auf Ihrem Desktop-PC: Die fremde Chroot-Methode

  2. 'Illegale Anweisung' erhalten, wenn versucht wird, zu chrooten

Alex Chamberlain
quelle
Hat das also tatsächlich jemand getestet?
3.
@finnw Ich denke, Jivings hat dies jetzt getestet.
Alex Chamberlain
1
Sie können auch verwenden sudo kpartx -av rpi_pisces_mate_r1.img, um die Partitionen anzuzeigen. Verwenden Sie die größte und montieren Sie sie, z sudo mount /dev/mapper/loop0p3 /mnt/tmp.
Elmicha
@AlexChamberlain: Hast du das tatsächlich auf dem Brightbox-Server zum Laufen gebracht? Ich habe dies erfolgreich auf meinem Heim-PC getestet, aber als ich es auf Brightbox ausprobierte, konnte ich nicht chroot und ich wollte, dass dies darauf zurückzuführen ist, dass versucht wurde, Virtualisierung zusätzlich zur Virtualisierung effektiv zu nutzen. Natürlich hätte ich auch etwas falsch gemacht, aber ich dachte, es lohnt sich nachzufragen, bevor ich komplett aufgab! Vielen Dank für ein exzellentes Tutorial.
DrAl
Ist es möglich, dies zu aktualisieren, um einzuschließen, wie Noobs Distro chroot wird? Nur um zu lernen, wie man in einer solchen Distribution chroot
Suhaib
0

Hier ein kurzes Skript, das ich zusammengestellt habe, als ich es rollte, um die erste Linux-Partition einer Image-Datei zu mounten. Die Verwendung erfolgt auf eigenes Risiko. Es gibt keine Fehlerbehandlung / Eingabevalidierung

#!/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
Kunst
quelle
Da die Images alle auf ARM basieren, können Sie auf ihnen leider nichts direkt ausführen. Die Aktualisierung ist etwas umständlich ... Könnte jedoch möglich sein, wenn Ihr Host-System auf apt basiert.
Fred
-2

Ich habe die Anweisungen befolgt und nach einer Methode gesucht, mit der ich einfach über meinen Haupt-PC Dinge für den PI erstellen kann. Es stellte sich heraus, dass dies sehr einfach war. Wenn Sie einmal in der Chroot-Phase sind, können Sie das Image so behandeln, als wäre es ein Live-System, und Sie können das gesamte Image verwenden native Apps. auf dem pi muss also kein cross compiler installiert werden :)

Ich habe jedoch eine Frage, während der Einrichtung der Chroot müssen wir einige Partitionen bereitstellen, damit die Chroot ordnungsgemäß funktioniert:

$ sudo mount --rbind /dev     /mnt/dev
$ sudo mount -t proc none     /mnt/proc
$ sudo mount -o bind /sys     /mnt/sys

Wie hängen wir diese richtig aus? Wenn Sie sie aktiviert lassen, sodass Sie die IMG-Datei nicht deaktivieren können, ist jede Hilfe hier willkommen. Ich habe die Option -f ausprobiert und bin mir nicht sicher, ob etwas anderes darunter liegt, das gemountet ist.

Die zweite Methode am Ende des Beitrags hat bei mir mit einer Sudo-Modifikation funktioniert : https://bugzilla.redhat.com/show_bug.cgi?id=194342 .

cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount

Offensichtlich ändern Sie $ MOUNTPOINT in den Pfad Ihres Chroot-Mount-Punkts (2. Partition mit den Rootfs in der Image-Datei, die im obigen Tutorial / mnt ist). Mit dieser Methode entladen Sie die IMG-Datei vollständig von den Loopback-Geräten und allen anderen Geräten, die über die Chroot gemountet wurden.

cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT
Reggie
quelle
Ich bin mir nicht sicher, ob dies die Frage wirklich beantwortet. Sie beschreiben nicht, wie Sie in das Image chrooten oder wie Sie Software darin installieren. Auch hier kann man keine neuen Fragen stellen.
Jivings
Ich verwende die gleiche Methode wie die ursprüngliche Ja-Antwort, die der OP auf seine Frage gegeben hat. Da ich ein Problem hatte, bei dem das Image entfernt wurde, ist dies wirklich der beste Ort für diese Frage und meine eigene Antwort.
Reggie