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?
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?
Antworten:
Die Antwort lautet immer ja, richtig, es dauert nur eine Weile, bis Sie herausgefunden haben, wie!
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.
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
qemu
ist ein ARM - Emulator, und qemu-user-static
und binfmt-support
ermöglicht es uns , ARM ausführbare Dateien ohne Emulation des ARM - Kernel zu laufen. (Wie cool ist das!?!)
Ich kann keine statisch verknüpften Dateien qemu
in den Arch-Repositorys finden, daher müssen wir sie aus dem Quellcode kompilieren.
Entpacken und ausführen
./configure --disable-kvm --target-list=arm-linux-user --static
Bauen mit make
und installieren mit sudo make install
.
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
root
diese vomqemu-binfmt-conf.sh
ARM-CPU-Typ stammen. Bitte extrahieren Sie die Befehle aus dieser Datei und führen Sie diese aus.
Gehen Sie zu raspberrypi.org und laden Sie das gewünschte Bild herunter. Entpacke es und speichere die .img
Datei 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
Die .img
wird 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 157696
Sektoren und die Boot-Partition, die sich in 2048
Sektoren befindet. Jeder Sektor hat 512 Bytes, der Root-Offset ist also 157696*512=80740352
Bytes und der Boot-Offset ist 2048*512=1048576
.
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, mount
welche 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
Wir sind fast bereit, chroot
in 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
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
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
Wir sind fertig! chroot
Weg...
$ 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!
Zur Aktualisierung der Software verwenden wir apt-get
.
# apt-get update
# apt-get upgrade
Sie können die Software auch apt-get install
wie gewohnt installieren .
Zur Aktualisierung der Software verwenden wir pacman
.
# pacman -Syu
Sie können die Software auch pacman -S
wie gewohnt installieren .
HINWEIS Sie können
pacman
nativ ausgeführt werden, indem Sie den Anweisungen unter Wie führe ich mein nativespacman
Image für ein bereitgestelltes Image aus? Folgen . .
Sie können das beenden , chroot
indem 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-static
von /usr/bin
oder qemu-arm
von /usr/local/bin
auf dem RPi entfernen, dann ist das Bild bereit, geflasht zu werden.
Das ist etwas langwierig und langwierig, aber wenn Sie es einmal tun, werden Sie eine Menge darüber erfahren, wie das alles funktioniert!
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.preload
Datei aus
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 qemu
und chroot
loslegen.
HAFTUNGSAUSSCHLUSS Ich, Alex Chamberlain, bin der Hauptentwickler von
piimg
. Als solches bin ich möglicherweise voreingenommen gegenüberpiimg
anderen Methoden.
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
.
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
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