Est-il possible de mettre à jour, mettre à niveau et installer un logiciel avant de flasher une image?

28

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?

Alex Chamberlain
la source

Réponses:

31

Oui

La réponse est toujours oui, c'est vrai, il faut juste un certain temps pour savoir comment!

À la dure

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.

Préparer votre système - Debian / Ubuntu

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

qemuest un émulateur ARM qemu-user-staticet binfmt-supportnous permet d'exécuter des exécutables ARM sans émuler le noyau ARM. (À quel point cela est cool!?!)

Préparer votre système - Arch

Je ne trouve pas de lien statique qemudans les référentiels Arch, nous devrons donc compiler à partir des sources.

  1. Téléchargez la dernière version sur http://git.savannah.gnu.org/cgit/qemu.git
  2. Décompressez et exécutez

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

  3. Construisez en utilisant makeet installez en utilisant sudo make install.

  4. 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 du qemu-binfmt-conf.shtype de processeur ARM. Veuillez extraire les commandes de ce fichier et exécutez-les.

Téléchargez et décompressez l'image

Allez sur raspberrypi.org et téléchargez l'image que vous voulez. Décompressez-le et enregistrez le .imgfichier 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

Trouvez la bonne partition

Le .imgcontient 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 157696secteurs, et la partition de démarrage, qui est au niveau des 2048secteurs. Chaque secteur fait 512 octets, donc l'offset racine est 157696*512=80740352octet et l'offset de démarrage est 2048*512=1048576.

Montez l'image comme un périphérique de bouclage

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

Préparation du système de fichiers.

Nous sommes presque prêts à chrootinté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.

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/

Tous les systèmes hôtes

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

chroot

Nous avons fini! chrootune façon...

$ sudo chroot /mnt

Vous êtes maintenant dans votre Raspberry Pi, mais les services ne fonctionnent pas, etc. Attention, vous êtes root!

Mettre à jour / installer le logiciel - Image Debian

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 installcomme d'habitude.

Mise à jour / installation du logiciel - Arch Image

Pour mettre à jour le logiciel, nous utilisons pacman.

 # pacman -Syu

Vous pouvez également installer des logiciels en utilisant pacman -Scomme d'habitude.

REMARQUE Vous pouvez exécuter pacmannativement en suivant les instructions sur Comment exécuter mon natif pacmansur une image montée? .

Quitter

Vous pouvez quitter le chrooten 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-staticde /usr/binou à qemu-armpartir /usr/local/binde l'IPD, l'image est prête à être flashé.

Mots finaux

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!

Remarque sur les dernières images

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

La voie facile - 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 qemuet de chrootpartir.

AVERTISSEMENT Je, Alex Chamberlain, suis le développeur principal de piimg. En tant que tel, je peux être partisan de l'utilisation de piimgpar rapport à d'autres méthodes.

Les références

  1. Exécuter ARM Linux sur votre PC de bureau: la voie du chroot étranger

  2. Obtenir une «instruction illégale» en essayant de chrooter

Alex Chamberlain
la source
Alors, quelqu'un a-t-il réellement testé cela?
finnw
@finnw Je pense que Jivings a maintenant testé cela.
Alex Chamberlain
1
Vous pouvez également utiliser 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.
elmicha
@AlexChamberlain: avez-vous réellement fait fonctionner cela sur le serveur Brightbox? J'ai testé cela avec succès sur mon PC à la maison, mais quand je l'ai essayé sur Brightbox, je ne pouvais pas chrooter et je voulais que ce soit parce que j'essayais d'obtenir efficacement la virtualisation en plus de la virtualisation. Bien sûr, j'aurais peut-être aussi fait quelque chose de mal, mais j'ai pensé que cela valait la peine d'être interrogé avant d'abandonner complètement! Merci pour un excellent tutoriel.
DrAl
Est-il possible de mettre à jour ceci pour inclure comment chrooter Noobs Distro? Juste pour apprendre à chrooter dans une telle distribution
Suhaib
0

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
Art
la source
Malheureusement, comme les images sont toutes basées sur ARM, vous ne pouvez en fait rien exécuter directement sur elles. Les mettre à jour est un peu plus délicat ... Cela pourrait être possible si votre système hôte est bien basé.
Fred
-2

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
Reggie
la source
Je ne suis pas sûr que cela réponde vraiment à la question. Vous ne décrivez pas comment vous chrootez dans l'image, ni comment vous y installez un logiciel. Ce n'est pas non plus l'endroit pour poser de nouvelles questions.
Jivings
J'utilise la même méthode que la réponse oui originale que le PO a faite à sa question. Comme j'ai eu un problème pour démonter l'image, c'est vraiment le meilleur endroit pour cette question et ma propre réponse éventuelle.
Reggie