Il semble stupide d'utiliser nos cycles d'écriture SD limités pour mettre à niveau le logiciel livré sur les images. Pouvons-nous mettre à niveau le logiciel et installer un nouveau logiciel avant de flasher une image sur la carte SD?
Il semble stupide d'utiliser nos cycles d'écriture SD limités pour mettre à niveau le logiciel livré sur les images. Pouvons-nous mettre à niveau le logiciel et installer un nouveau logiciel avant de flasher une image sur la carte SD?
Réponses:
La réponse est toujours oui, c'est vrai, il faut juste un certain temps pour savoir comment!
Je l'exécuterai sur un VPS, fourni par Brightbox.com . J'ai utilisé un Nano Server (2 CPU, 512 Mo de RAM, 20 Go d'espace disque) et une image de serveur Ubuntu Precise 12.04 LTS. Il devrait fonctionner sur les équivalents EC2 ou Linode, et bien sûr, sur votre machine Linux domestique. Je l'ai maintenant testé sur mon installation (x86) Arch, mais sachez que cela ne fonctionne pas sur Ubuntu 10.04 LTS car certains packages sont trop anciens.
Assurez-vous que votre propre système est à jour.
$ sudo apt-get update
$ sudo apt-get upgrade
Installez de nouveaux logiciels
$ sudo apt-get install binfmt-support qemu qemu-user-static unzip
qemu
est un émulateur ARM qemu-user-static
et binfmt-support
nous permet d'exécuter des exécutables ARM sans émuler le noyau ARM. (À quel point cela est cool!?!)
Je ne trouve pas de lien statique qemu
dans les référentiels Arch, nous devrons donc compiler à partir des sources.
Décompressez et exécutez
./configure --disable-kvm --target-list=arm-linux-user --static
Construisez en utilisant make
et installez en utilisant sudo make install
.
Exécutez ce qui suit en tant que 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
Avertissement Vous ne devez pas exécuter de commandes arbitraires que vous trouvez en ligne car
root
- elles proviennent duqemu-binfmt-conf.sh
type de processeur ARM. Veuillez extraire les commandes de ce fichier et exécutez-les.
Allez sur raspberrypi.org et téléchargez l'image que vous voulez. Décompressez-le et enregistrez le .img
fichier dans un endroit 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
Le .img
contient 3 partitions, dont la partition de démarrage.
$ 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
Nous devons connaître l'offset de la partition Linux, dans ce cas ce sont les 157696
secteurs, et la partition de démarrage, qui est au niveau des 2048
secteurs. Chaque secteur fait 512 octets, donc l'offset racine est 157696*512=80740352
octet et l'offset de démarrage est 2048*512=1048576
.
Ensuite, nous devons monter l'image en tant que système de fichiers. Cela peut être fait en utilisant un périphérique de bouclage. Nous utilisons le décalage de la section précédente pour dire mount
quelles partitions monter et où. L'ordre de ces commandes est important.
$ 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
Nous sommes presque prêts à chroot
intégrer notre système de fichiers et à commencer l'installation de nouveaux logiciels. Tout d'abord, nous devons installer l'émulateur dans notre image, car il ne sera plus disponible une fois que nous l'aurons utilisé chroot
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
Nous devons également donner accès à certaines autres parties du système.
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Nous avons fini! chroot
une façon...
$ sudo chroot /mnt
Vous êtes maintenant dans votre Raspberry Pi, mais les services ne fonctionnent pas, etc. Attention, vous êtes root!
Pour mettre à jour le logiciel, nous utilisons apt-get
.
# apt-get update
# apt-get upgrade
Vous pouvez également installer des logiciels en utilisant apt-get install
comme d'habitude.
Pour mettre à jour le logiciel, nous utilisons pacman
.
# pacman -Syu
Vous pouvez également installer des logiciels en utilisant pacman -S
comme d'habitude.
REMARQUE Vous pouvez exécuter
pacman
nativement en suivant les instructions sur Comment exécuter mon natifpacman
sur une image montée? .
Vous pouvez quitter le chroot
en utilisant Ctrl+ Det démonter le système en exécutant sudo umount /mnt
- vous devrez démonter chaque point de montage séparément.
Vous devez retirer qemu-user-static
de /usr/bin
ou à qemu-arm
partir /usr/local/bin
de l'IPD, l'image est prête à être flashé.
C'est un peu long et fastidieux, mais faites-le une fois et vous en apprendrez beaucoup sur la façon dont tout cela fonctionne!
Lorsque vous essayez de le faire sur les dernières images, vous obtiendrez une erreur
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)
Pour corriger cette erreur, commentez simplement le contenu du /etc/ld.so.preload
fichier
piimg
J'ai commencé à travailler sur un utilitaire pour faire beaucoup de choses pour vous. Il s'appelle piimg et peut être trouvé sur github.com/alexchamberlain/piimg .
Jusqu'à présent, il peut monter la carte SD pour vous en exécutant
piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt
et les démonter à nouveau en exécutant
piimg umount /mnt
Vous avez juste besoin d'installer qemu
et de chroot
partir.
AVERTISSEMENT Je, Alex Chamberlain, suis le développeur principal de
piimg
. En tant que tel, je peux être partisan de l'utilisation depiimg
par rapport à d'autres méthodes.
sudo kpartx -av rpi_pisces_mate_r1.img
, qui affichera les partitions. Utilisez le plus grand et montez-le, par exemple sudo mount /dev/mapper/loop0p3 /mnt/tmp
.
Voici un script rapide que j'ai assemblé pendant que je roulais, il monte la première partition Linux d'un fichier image Utilisez à vos risques et périls. Il n'a aucune gestion d'erreur / validation d'entrée
#!/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
J'ai suivi les instructions à la recherche d'une méthode pour simplement construire des trucs pour le PI via mon PC principal, il s'est avéré que c'était très facile, une fois que vous êtes chrooté, vous pouvez traiter l'image comme s'il s'agissait d'un système en direct et utiliser tous les applications natives. sur teh pi, donc pas besoin d'installer un compilateur croisé :)
J'ai une question cependant, pendant la configuration du chroot, nous devons monter quelques partitions pour que le chroot fonctionne correctement:
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Comment les démonter correctement? en les laissant montés, ce qui vous empêche de démonter le fichier .img, toute aide ici serait appréciée. J'ai essayé l'option -f, je ne sais pas s'il y a quelque chose d'autre sous-jacent qui est monté.
répondant à ma propre question, https://bugzilla.redhat.com/show_bug.cgi?id=194342 la 2ème méthode à la fin du post a fonctionné pour moi avec une modification sudo.
cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount
Modifiez évidemment $ MOUNTPOINT sur le chemin de votre point de montage chroot (2ème partition contenant les rootfs sur le fichier image, qui est / mnt dans le tutoriel ci-dessus). En utilisant cette méthode, vous démontez complètement le fichier img des périphériques de bouclage et de tout autre périphérique monté via le chroot.
cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT