Obtenir GNU / Linux sur une carte ARM à partir de zéro (par exemple Kali et iMX.6)

tl; dr : construire une image Linux Kali pour un ordinateur ARM, dans un programme debootstrap, linux et u-boot. Si vous avez acheté un appareil monocarte peu populaire, vous pourriez être confronté à l'absence d'image de votre kit de distribution préféré. La même chose s'est produite avec le Flipper One prévu . Il n'y a simplement pas de Kali Linux pour IMX6 (je cuisine), donc je dois le construire moi-même.











Le processus de téléchargement est assez simple:



  1. Le fer est initialisé.
  2. À partir d'une zone du périphérique de stockage (carte SD / eMMC / etc.), le chargeur de démarrage est lu et exécuté.
  3. Le chargeur recherche le noyau du système d'exploitation et le charge dans une zone mémoire et s'exécute.
  4. Le noyau charge le reste du système d'exploitation.


Ce niveau de détail est suffisant pour ma tâche, vous pouvez lire les détails dans un autre article . Les «certaines» zones mentionnées ci-dessus diffèrent d'une carte à l'autre, ce qui crée des difficultés d'installation. Ils essaient de standardiser le chargement des plates-formes ARM de serveur en utilisant UEFI, mais tant que ce n'est pas disponible pour tout le monde, vous devrez tout collecter séparément.



Construire le système de fichiers racine



Vous devez d'abord préparer les sections. Das U-Boot prend en charge différents systèmes de fichiers, j'ai choisi FAT32 pour /bootet ext3 pour la racine, c'est le balisage d'image standard pour Kali sous ARM. J'utiliserai GNU Parted, mais vous pouvez rendre la même chose plus familière fdisk. En outre , il a besoin dosfstoolset e2fsprogsde créer un système de fichiers: apt install parted dosfstools e2fsprogs.



Nous marquons la carte SD:



  1. Marquez la carte SD comme utilisant le balisage MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Créer une section de /boot128 méga - octets: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Le premier mégaoctet manquant doit être laissé pour le balisage lui-même et pour le chargeur de démarrage.
  3. Nous créons un système de fichiers racine pour toute la capacité restante: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Si soudainement vos fichiers de partition n'ont pas été créés ou modifiés, vous devez exécuter `partprobe`, alors la table de partition sera relue.
  5. Créez un système de fichiers de partition de démarrage avec l'étiquette BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Créez un système de fichiers racine avec une étiquette ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2


Génial, maintenant vous pouvez le remplir. Pour ce faire, il faudra un debootstraputilitaire supplémentaire pour créer un système de fichiers racine des systèmes d'exploitation basés sur Debian apt install debootstrap.



Nous collectons FS:



  1. Montez la partition sur /mnt/(utilisez un point de montage plus pratique):mount /dev/mmcblk0p2 /mnt
  2. : debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. --include , QEMU. chroot ARM-. man debootstrap. , ARM- armhf.
  3. - debootstrap , : chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. : chroot /mnt /bin/bash
  5. /etc/hosts /etc/hostname . , .
  6. . locales ( ), (dpkg-reconfigure locales tzdata). passwd.
  7. Définissez un mot de passe pour la rootcommande passwd.
  8. La préparation de l'image pour moi se termine par le remplissage à l' /etc/fstabintérieur /mnt/.


Je chargerai conformément aux balises créées précédemment, le contenu sera donc comme ceci:

LABEL = ROOTFS / erreurs automatiques = remount-ro 0 1

LABEL = BOOT / boot auto par défaut 0 0


Enfin, vous pouvez monter la partition de démarrage, nous en avons besoin pour le noyau: `mount / dev / mmcblk0p1 / mnt / boot /`



Construire Linux



Pour construire le noyau (et le chargeur de démarrage) sur Debian Testing est nécessaire d'établir un ensemble standard de GCC, GNU Make et les fichiers d' en- tête GNU C Library pour l'architecture cible (I armhf), ainsi que les en- têtes de OpenSSL, calculatrice de la console bc, bisonet flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Étant donné que le chargeur de démarrage recherche par défaut un fichier zImagesur le système de fichiers de la partition de démarrage, il est temps de partitionner la clé USB.



  1. Noyau Clone trop long, il suffit de télécharger: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Décompressez-le et accédez au répertoire source:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Configurer avant la compilation: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. La configuration est dans le répertoire arch/arm/configs/. S'il n'y en a pas, vous pouvez essayer de trouver et de télécharger celui qui est prêt et de transmettre le nom du fichier dans ce répertoire au paramètre KBUILD_DEFCONFIG. En dernier recours, passez directement au point suivant.
  3. En option, vous pouvez ajuster les paramètres: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Et nous compilerons l'image: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Vous pouvez maintenant copier le fichier avec le noyau: cp arch/arm/boot/zImage /mnt/boot/
  6. Et les fichiers avec DeviceTree (description du matériel disponible sur la carte): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Et installez les modules assemblés sous forme de fichiers séparés: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install


Le noyau est prêt. Vous pouvez tout démonter:umount /mnt/boot/ /mnt/



Das U-Boot



Le chargeur de démarrage étant interactif, la carte elle-même, un périphérique de stockage et un périphérique USB-UART en option suffisent pour tester son fonctionnement. Autrement dit, vous pouvez reporter le noyau et le système d'exploitation pour plus tard.



La grande majorité des fabricants suggèrent d'utiliser Das U-Boot pour le démarrage initial. Le support complet est généralement fourni dans son propre fork, mais ils n'oublient pas de contribuer à l'amont. Dans mon cas, la planche est prise en charge dans la ligne principale , j'ai donc ignoré la fourche .



Nous collectons le bootloader lui-même:



  1. : git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. : cd u-boot
  3. : make mx6ull_14x14_evk_defconfig. Das U-Boot, .config, .
  4. - armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx


En conséquence, nous obtenons un fichier u-boot.imx, c'est une image prête à l'emploi qui peut être écrite sur une clé USB. Nous écrivons sur la carte SD en sautant les 1024 premiers octets. Pourquoi ai-je choisi la cible u-boot.imx? Pourquoi ai-je ignoré exactement 1024 octets? C'est ce que suggère la documentation . Pour les autres cartes, la création d'image et le processus de gravure peuvent être légèrement différents.



Terminé, vous pouvez démarrer. Le chargeur de démarrage doit signaler sa propre version, certaines informations sur la carte et essayer de trouver l'image du noyau sur la partition. En cas d'échec, il essaiera de démarrer sur le réseau. En général, la sortie est assez détaillée, vous pouvez trouver une erreur en cas de problème.



Au lieu d'une conclusion



Saviez-vous que le front d'un dauphin n'est pas osseux? C'est littéralement un troisième œil, un cristallin gras pour l'écholocation!










All Articles