Licence CC BY-NC

Faire un chroot d'un système ARM sur un ordinateur x86_64

Archlinux/ArchlinuxARM

Chroot un ARM système est un moyen simple d’avoir un accès à un système sans avoir de matériel spécifique, donc nous permettre de construire des paquets pour les appareils ARM. Cela peut être une alternative au "cross-compiling" où nous sommes limités à mettre en relation (linking) uniquement avec les librairies du compilateur.

PS : le guide est aussi disponible sous forme de PDF avec une meilleur coloration syntaxique : ici

Configuration du système de fichiers

Utilisation d’une carte SD

Dans cette partie je suppose que vous avez déjà installé ArchlinuxARM sur la carte SD. Si ce n’est pas le cas, il faudra télécharger la dernière version du système et utiliser Etcher pour écrire le système sur la carte SD ou créer un disque virtuel (voir ci-dessous).

/dev/sdbX représente le chemin d’accès à la carte SD.

1
2
$ mkdir arm-chroot
$ mount /dev/sdbX arm-chroot
Créer et utiliser un disque virtuel

Si vous ne disposer pas de carte SD avec ArchlinuxARM vous pouvez créer un disque virtuel pour disposer d’une image d’ArchlinuxARM. J’ai décidé de créer un disque virtuel d’une taille de 4 Gio que je monte dans mon système de fichiers.

Premièrement, il faut créer un disque vierge.

1
$ dd of=archlinuxarm.img bs=1 seek=4G count=0

Deuxièmement, introduire le système de fichiers ext4 sur le disque vierge.

1
$ mkfs.ext4 -F archlinuxarm.img

Troisièmement, monter le disque virtuel dans l’ordinateur.

1
2
$ mkdir arm-chroot
$ mount archlinuxarm.img arm-chroot

Puis en dernier lieu, installer la dernière version d’ArchlinuxARM (version ARMv7) dans le disque virtuel. Si vous souhaitez changer la version d’ArchlinuxARM, remplacer ci-dessous "armv7" par la version désirée. Liste des versions d’ArchlinuxARM disponible ici.

1
2
$ wget http://archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
$ tar -xf ArchLinuxArm-armv7-latest.tar.gz -C arm-chroot

Installation des paquets requis

Pour la suite du guide nous avons besoin des paquets ci-dessous  :

  • qemu-user-static [AUR] : interpréter les instructions ARM dans the chroot
  • arch-install-scripts : utilisation plus simple de chroot

J’utilise yaourt pour AUR mais vous pouvez aussi utiliser pacaur, pamac, ou autres.

1
2
$ yaourt -S qemu-user-static
$ pacman -S arch-install-scripts

Chroot avec QEMU

Pour réaliser ce chroot nous devons dans un premier temps copier le fichier binaire qemu-arm-static dans le chroot (dossier bin du disque virtuel).

1
$ cp /usr/bin/qemu-arm-static arm-chroot/usr/bin

Dans un second temps nous devons enregistrer qemu-arm-static comme ARM interpréteur dans le kernel. Je conseille l’utilisation de su pour la prochaine commande plutôt que sudo.

1
$ 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/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register

Si vous voulez créer votre propre code, il existe un outil pour vous facilitez la vie, binfmt-manager

Dernière étape pour chroot ArchlinuxARM : utiliser le script arch-chroot qui provient du paquet arch-install-scripts qui va monter, bind tous ce qui est neccesaire.

1
$ arch-chroot arm-chroot /bin/bash

Une fois dans le chroot vous pourrez tester le système avec uname.

1
2
[chroot]$ uname -a
Linux saturn 3.14.6-1-ARCH #1 SMP PREEMPT Sun Jun 8 10:08:38 CEST 2014 armv7l GNU/Linux

Cela dépend du système de fichiers que vous utilisez mais il peut être nécessaire de définir le nameserver avec l’adresse d’un DNS par exemple ceux de google 8.8.8.8 dans /etc/resolv.conf pour avoir la résolution des adresses internet.

Quand vous aurez fini, quitter le chroot et démonter le disque virtuel ou la carte SD.

1
2
[chroot]$ exit
$ umount arm-chroot

J’espère que cette petite tribune vous aura plus. :)

Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale 4.0 International.

7 commentaires

J’ai eu besoin de faire ça aujourd’hui. Sur une ARMbian. Ça marche impect, c’est super. Merci.

Par-contre, je décommande totalement l’utilisation de yaourt. Je recommande plus yay. Yaourt is dead.

PS: Ah j’oubliais, dans le chroot, PATH n’était plus valide alors j’ai du le redéfinir. PATH="/bin:/usr/bin:/usr/sbin". Certainement une très légère incompatibilité entre Arch Linux et Debian.

+0 -0

Merci pour le tuto!

J’ai eu un soucis avec le sudo qui ne fonctionnait pas à l’intérieur du chroot avec le message :

sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?

Cela venait d’une mauvaise permission avec le binmft.

j’ai créer le fichier /etc/binfmt.d/arm.conf pour corriger mon probleme (La partie importante sont les flags en fin de ligne.) à faire sur la machine Hôte.

sudo  bash -c 'echo ":arm:M:0:\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/bin/qemu-arm-static:OC"  >  /etc/binfmt.d/arm.conf'

sudo systemctl restart systemd-binfmt.service

La source : https://bbs.archlinux.org/viewtopic.php?id=242708

My 2 cents,

EDIT: À noter que les fonctionnalitées PTRACE ne sont pas disponibles via les binaires qemu-ARCH-static.

+1 -0

Aujourd’hui j’ai eu du mal à adapter le tutoriel pour arm8 (aarch64).
J’ai abandonné.

Si quelqu’un à réussi qu’il le dise. Basiquement, j’ai adapté le echo "arm"... avec la ligne correspondante dans le script binfmt. Le message d’erreur obtenu était Fichier introuvable lequel ? Nul ne le sait. J’ai tenté de le faire sans le chroot mais j’avais pas l’envie de déplacer toutes les lib nécessaires, j’ai fais les 2 premières seulement.

Mon problème était potentiellement un problème de corruption de fichier.

+0 -0

Aujourd’hui j’ai eu du mal à adapter le tutoriel pour arm8 (aarch64).
J’ai abandonné.

Si quelqu’un à réussi qu’il le dise. Basiquement, j’ai adapté le echo "arm"... avec la ligne correspondante dans le script binfmt. Le message d’erreur obtenu était Fichier introuvable lequel ? Nul ne le sait. J’ai tenté de le faire sans le chroot mais j’avais pas l’envie de déplacer toutes les lib nécessaires, j’ai fais les 2 premières seulement.

Mon problème était potentiellement un problème de corruption de fichier.

ache

Bonjour,

Je viens de réutiliser ce tutoriel pour me chrooter depuis un système 64bits dans un "squashfs" ARM32 avec succès. Le tuto fonctionne à ce jour!

Tu utilises peut être un autre système/noyau où le fichier est à un autre endroit et se nomme autrement, tu peux essayer la commande suivante pour valider le bon "path":

\find /proc/ -type f -name register 2>/dev/null |\grep binfmt

Il faut aussi adapater ta commande de "chroot" avec ton système "emulé", par exemple le "/bin/bash" n’existe pas dans mon cas et la commande correcte est:

sudo arch-chroot ./squashfs-root /bin/bash.bash

My 20cents,

+0 -0

Je t’avoue que je ne sais plus trop.
J’ai abandonné la version arm8 et je suis retourné à une version arm7 qui marchait bien mieux.

C’est quoi les anti-slash dans ta commande ? Non les paths étaient tous bons. Enfin je peux pas le garantir mais j’ai bien /proc/sys/fs/binfmt_misc/register comme interpréteur et pour l’emplacement de bash 🤷. J’imagine qu’à l’époque j’y ai forcément pensé. Surtout qu’au final j’avais essayé de le lancer à la main sans le chroot.

Ce que je comprends pas c’est pourquoi j’avais pas redéfinie LD_LIBRARY_PATH.


Je précise que je l’ai fais également hier sur un arm7. Ça marche toujours aussi bien.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte