tl;dr: je prépare une image de Kali Linux pour un ordinateur ARM dans le programme debootstrap, linux et u-boot.
Si vous avez acheté une carte simple peu populaire, vous avez pu vous heurter à l'absence d'une image de votre distribution préférée. En gros, il en est à peu près de même avec . Il n'existe tout simplement pas de Kali Linux pour IMX6 (que je prépare), donc il faut tout assembler soi-même.
Le processus de démarrage est assez simple :
- Le matériel s'initialise.
- Un chargeur de démarrage est lu et exécuté à partir d'une certaine zone du support de stockage (carte SD/eMMC/etc).
- Le chargeur de démarrage recherche le noyau du système d'exploitation et le charge dans une certaine zone de la mémoire et l'exécute.
- Le noyau charge tout le reste du système d'exploitation.
Pour ma tâche, ce niveau de détail est suffisant, vous pouvez lire plus de détails . Les « certaines » zones mentionnées ci-dessus varient d'une carte à l'autre, ce qui crée des difficultés pour l'installation. Le démarrage des plateformes ARM serveur avec UEFI, mais pour l'instant ce n'est pas disponible pour tout le monde, il faudra tout assembler séparément.
Construction du système de fichiers racine
Pour commencer, il est nécessaire de préparer les partitions. Das U-Boot prend en charge différents systèmes de fichiers, j'ai choisi FAT32 pour /boot et ext3 pour la racine, c'est la mise en page standard des images de Kali pour ARM. J'utiliserai GNU Parted, mais vous pouvez faire la même chose avec un outil plus familier fdisk. Vous aurez également besoin de dosfstools et e2fsprogs pour créer le système de fichiers : apt install parted dosfstools e2fsprogs.
Nous partitionnons la carte SD :
- Nous marquons la carte SD comme utilisant la mise en page MBR :
parted -s /dev/mmcblk0 mklabel msdos - Créons une partition pour
/bootde 128 mégaoctets :parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Le premier mégaoctet manquant doit être laissé pour la mise en page et le chargeur de démarrage. - Créons le système de fichiers racine sur toute la capacité restante :
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Si jamais vos fichiers de partition ne se sont pas créés ou modifiés, vous devez exécuter `partprobe`, cela permettra de relire la table des partitions.
- Créons le système de fichiers de la partition de démarrage avec l'étiquette
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - Créons le système de fichiers racine avec l'étiquette
ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Super, maintenant nous pouvons le remplir. Pour cela, nous aurons également besoin de debootstrap, un utilitaire pour créer des systèmes de fichiers pour les systèmes d'exploitation de type Debian : apt install debootstrap.
Assemblons le système de fichiers :
- Montez la partition dans
/mnt/(utilisez un point de montage qui vous convient mieux) :mount /dev/mmcblk0p2 /mnt - Nous remplissons en fait le système de fichiers :
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Le paramètre--includeindique d'installer des paquets supplémentaires, j'ai spécifié l'émulateur QEMU compilé statiquement. Il permet d'exécuterchrootdans un environnement ARM. Le sens des autres options peut être consulté dansman debootstrap. N'oubliez pas que toutes les cartes ARM ne prennent pas en charge l'architecturearmhf. - En raison de la différence d'architectures
debootstrapcela se fait en deux étapes, la deuxième se fait comme suit :chroot /mnt/ /debootstrap/debootstrap --second-stage - Maintenant, il faut faire un chroot :
chroot /mnt /bin/bash - Nous remplissons
/etc/hostset/etc/hostnameFS cible. Remplissez par analogie avec le contenu de votre ordinateur local, n'oubliez pas de remplacer le nom d'hôte. - Vous pouvez peaufiner tout le reste. En particulier, j'installe
locales(clés du dépôt), je reconfigure les locales et le fuseau horaire (dpkg-reconfigure locales tzdata). N'oubliez pas de définir le mot de passe avec la commandepasswd. - Définissons le mot de passe pour
rootla commandepasswd. - La préparation de l'image pour moi se termine par le remplissage
/etc/fstabà l'intérieur/mnt/.
Je vais télécharge en fonction des étiquettes créées précédemment, donc le contenu sera le suivant :
LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto defaults 0 0
Enfin, nous pouvons monter la partition de démarrage, elle nous sera nécessaire pour le noyau : `mount /dev/mmcblk0p1 /mnt/boot/`
Compilation de Linux
Pour compiler le noyau (et le démarreur par la suite) sur Debian Testing, il faut installer le jeu standard de GCC, GNU Make et les fichiers d'en-tête de la GNU C Library pour l'architecture cible (pour moi armhf), ainsi que les en-têtes OpenSSL, la calculatrice en ligne de commande bc, bison et flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Comme le chargeur cherche par défaut le fichier zImage sur le système de fichiers de la partition de démarrage, il est temps de diviser la clé USB.
- Cloner le noyau prend trop de temps, donc je vais juste le télécharger :
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Décompressons et passons au répertoire des sources :tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1 - Configurons avant la compilation :
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. La configuration se trouve dans le répertoirearch/arm/configs/. Si cela n'existe pas, vous pouvez essayer de trouver et de télécharger un fichier prêt et de transmettre le nom du fichier dans ce répertoire comme paramètreKBUILD_DEFCONFIG. En dernier recours, passez directement à l'étape suivante. - Optionnellement, vous pouvez ajuster les paramètres :
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - Et nous croisons le compile l'image :
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Maintenant, vous pouvez copier le fichier avec le noyau :
cp arch/arm/boot/zImage /mnt/boot/ - Et les fichiers avec DeviceTree (description du matériel sur la carte) :
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - Et pour installer les modules compilés sous forme de fichiers distincts :
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
Le noyau est prêt. On peut tout démonter : umount /mnt/boot/ /mnt/
Das U-Boot
Comme le chargeur est interactif, il suffit d’avoir la carte, le périphérique de stockage et éventuellement un dispositif USB-to-UART pour tester son fonctionnement. Cela signifie que le noyau et le système d’exploitation peuvent attendre.
La grande majorité des fabricants proposent d'utiliser Das U-Boot pour le démarrage initial. Un support complet est généralement assuré dans leur propre fork, mais ils n’oublient pas non plus de contribuer à l’upstream. Dans mon cas, la carte est supportée dans , donc que j'ai ignoré.
Nous construisons le chargeur lui-même :
- Nous clonons la branche stable du dépôt :
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - Nous allons dans le répertoire :
cd u-boot - Préparons la configuration de la compilation :
make mx6ull_14x14_evk_defconfig. Cela ne fonctionne que si la configuration est disponible dans Das U-Boot lui-même, sinon vous devrez trouver la configuration du fabricant et la placer à la racine du dépôt dans le fichier.config, ou la construire d'une autre manière recommandée par le fabricant. - Nous construisons l'image du chargeur avec un cross-compilateur
armhf:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
En conséquence, nous obtenons le fichier u-boot.imx, c'est une image prête à être écrite sur une clé USB. Écrivons sur la carte SD, en passant les premiers 1024 octets. Pourquoi ai-je choisi cette cible u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в . Pour d'autres cartes, le processus de construction de l'image et d'écriture peut varier légèrement.
C'est prêt, on peut démarrer. Le chargeur doit indiquer sa propre version, quelques informations sur la carte et tenter de trouver l'image du noyau sur la partition. En cas d'échec, il essaiera de démarrer par le réseau. Au total, la sortie est assez détaillée, ce qui permet de trouver une erreur en cas de problème.
En conclusion
Et saviez-vous que le front d'un dauphin n'est pas osseux ? C'est littéralement un troisième œil, une lentille graisseuse pour l'écholocation !
Source : habr.com
