GNU/Linux auf einem ARM-Board von Grund auf starten (am Beispiel von Kali und iMX.6)

tl; dr: Ich erstelle im Programm ein Kali Linux-Image für einen ARM-Computer debootstrap, linux и u-boot.

GNU/Linux auf einem ARM-Board von Grund auf starten (am Beispiel von Kali und iMX.6)

Wenn Sie ein nicht sehr beliebtes Einzahler-Gerät gekauft haben, fehlt möglicherweise ein Bild Ihres bevorzugten Vertriebspakets dafür. Es ist so ziemlich das Gleiche passiert geplanter Flipper One. Es gibt einfach kein Kali Linux für IMX6 (ich koche), also muss ich es selbst zusammenbauen.

Der Downloadvorgang ist ganz einfach:

  1. Hardware wird initialisiert.
  2. Von einem bestimmten Bereich auf dem Speichergerät (SD-Karte/eMMC/usw.) wird der Bootloader gelesen und ausgeführt.
  3. Der Loader sucht nach dem Kernel des Betriebssystems, lädt ihn in einen Speicherbereich und führt ihn aus.
  4. Der Kernel lädt den Rest des Betriebssystems.

Für meine Aufgabe reicht dieser Detaillierungsgrad aus, Sie können die Details nachlesen in einem anderen Artikel. Die oben genannten „einigen“ Bereiche unterscheiden sich von Platine zu Platine, was zu einigen Installationsschwierigkeiten führt. Laden von Server-ARM-Plattformen versuche zu standardisieren mit UEFI, aber solange es nicht für alle verfügbar ist, müssen Sie alles separat sammeln.

Aufbau des Root-Dateisystems

Zuerst müssen Sie Abschnitte vorbereiten. Das U-Boot unterstützt verschiedene Dateisysteme, ich habe mich für FAT32 entschieden /boot und ext3 für root, dies ist das Standard-Bild-Markup für Kali unter ARM. Ich werde GNU Parted verwenden, aber Sie können es vertrauter machen fdisk. Sie werden auch brauchen dosfstools и e2fsprogs So erstellen Sie ein Dateisystem: apt install parted dosfstools e2fsprogs.

Partitionierung der SD-Karte:

  1. Markieren Sie die SD-Karte als MBR-Partitionierung verwendend: parted -s /dev/mmcblk0 mklabel msdos
  2. Erstellen Sie einen Abschnitt für /boot für 128 Megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Das erste verpasste Megabyte muss für das Markup selbst und für den Bootloader übrig bleiben.
  3. Erstellen Sie einen Root-FS für den Rest der Kapazität: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Wenn Sie plötzlich keine Partitionsdateien mehr erstellt oder geändert haben, müssen Sie „partprobe“ ausführen, dann wird die Partitionstabelle erneut gelesen.
  5. Erstellen Sie ein Boot-Partitionsdateisystem mit der Bezeichnung BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Erstellen Sie ein Root-Dateisystem mit einer Bezeichnung ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Großartig, jetzt können Sie es ausfüllen. Dies erfordert zusätzlich debootstrap, ein Dienstprogramm zum Erstellen von Root-FS auf Debian-ähnlichen Betriebssystemen: apt install debootstrap.

Wir sammeln FS:

  1. Hängen Sie die Partition ein /mnt/ (Verwenden Sie einen für Sie bequemeren Einhängepunkt): mount /dev/mmcblk0p2 /mnt
  2. Eigentlich füllen wir das Dateisystem: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include Gibt an, einige Pakete zusätzlich zu installieren. Ich habe einen statisch erstellten QEMU-Emulator angegeben. Es ermöglicht Ihnen, Leistung zu erbringen chroot in die ARM-Umgebung. Die Bedeutung der anderen Optionen finden Sie in man debootstrap. Vergessen Sie nicht, dass nicht jedes ARM-Board die Architektur unterstützt armhf.
  3. Aufgrund der unterschiedlichen Architekturen debootstrap wird in zwei Schritten durchgeführt, der zweite wird wie folgt durchgeführt: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Jetzt müssen Sie drehen: chroot /mnt /bin/bash
  5. füllen /etc/hosts и /etc/hostname Ziel-FS. Geben Sie dasselbe ein wie den Inhalt auf Ihrem lokalen Computer. Denken Sie daran, nur den Hostnamen zu ersetzen.
  6. Alles andere können Sie individuell anpassen. Insbesondere installiere ich locales (Repository-Schlüssel), Gebietsschemas und Zeitzone neu konfigurieren (dpkg-reconfigure locales tzdata). Vergessen Sie nicht, das Passwort mit dem Befehl festzulegen passwd.
  7. Legen Sie ein Passwort fest für root Team passwd.
  8. Die Vorbereitung des Bildes ist für mich mit dem Ausfüllen abgeschlossen /etc/fstab innen /mnt/.

Ich werde gemäß den zuvor erstellten Tags hochladen, sodass der Inhalt wie folgt aussieht:

LABEL=ROOTFS / autoerrors=remount-ro 0 1
LABEL=BOOT /boot auto ist standardmäßig 0 0

Schließlich können Sie die Boot-Partition mounten, wir benötigen sie für den Kernel: „mount /dev/mmcblk0p1 /mnt/boot/“.

Linux bauen

Um den Kernel (und dann den Bootloader) auf Debian Testing zu erstellen, müssen Sie den Standardsatz von GCC, GNU Make und die GNU C Library-Header-Dateien für die Zielarchitektur installieren (ich habe armhf), sowie OpenSSL-Header, Konsolenrechner bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Da der Standardlader nach einer Datei sucht zImage Im Dateisystem der Startpartition ist es an der Zeit, das Flash-Laufwerk zu beschädigen.

  1. Das Klonen des Kernels dauert zu lange, deshalb lade ich einfach Folgendes herunter: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Entpacken und in das Quellverzeichnis gehen: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Vor dem Kompilieren konfigurieren: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Die Konfiguration befindet sich im Verzeichnis arch/arm/configs/. Wenn keine vorhanden ist, können Sie versuchen, eine fertige Datei zu finden und herunterzuladen und den Namen der Datei in diesem Verzeichnis an den Parameter zu übergeben KBUILD_DEFCONFIG. Fahren Sie im Extremfall sofort mit dem nächsten Absatz fort.
  3. Sie können die Einstellungen optional anpassen: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Und kompilieren Sie das Bild: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Jetzt können Sie die Kerneldatei kopieren: cp arch/arm/boot/zImage /mnt/boot/
  6. Und Dateien von DeviceTree (Beschreibung der auf der Platine verfügbaren Hardware): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Und installieren Sie die als separate Dateien zusammengestellten Module: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Der Kernel ist fertig. Sie können alles aushängen: umount /mnt/boot/ /mnt/

Das U-Boot

Da der Bootloader interaktiv ist, reichen das Board selbst, ein Speichergerät und ein optionales USB-zu-UART-Gerät aus, um seine Funktion zu testen. Das heißt, Sie können den Kernel und das Betriebssystem auf später verschieben.

Die überwiegende Mehrheit der Hersteller empfiehlt die Verwendung von Das U-Boot für den Primärstart. Vollständiger Support wird normalerweise in einem eigenen Fork bereitgestellt, aber vergessen Sie nicht, im Upstream einen Beitrag zu leisten. In meinem Fall wird das Board unterstützt HauptlinieSo Gabel Ich ignorierte.

Wir sammeln den Bootloader selbst:

  1. Klonen Sie den stabilen Zweig des Repositorys: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Gehen wir zum Verzeichnis selbst: cd u-boot
  3. Vorbereiten der Build-Konfiguration: make mx6ull_14x14_evk_defconfig. Dies funktioniert nur, wenn sich die Konfiguration in Das U-Boot selbst befindet. Andernfalls müssen Sie die Konfiguration des Herstellers finden und sie im Stammverzeichnis des Repositorys in der Datei ablegen .configoder auf eine andere vom Hersteller empfohlene Weise zusammengebaut werden.
  4. Das Bootloader-Image selbst sammeln wir mit einem Cross-Compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Als Ergebnis erhalten wir die Datei u-boot.imxDies ist ein vorgefertigtes Image, das auf einen USB-Stick geschrieben werden kann. Wir schreiben auf die SD-Karte und überspringen dabei die ersten 1024 Bytes. Warum habe ich das Ziel gewählt? u-boot.imx? Warum genau 1024 Bytes verpasst? Dies ist, was sie vorschlagen Dokumentation. Bei anderen Boards kann der Image-Erstellungs- und Brennvorgang etwas anders sein.

Fertig, Sie können es herunterladen. Der Bootloader sollte seine eigene Version und einige Informationen über das Board melden und versuchen, das Kernel-Image auf der Partition zu finden. Wenn dies fehlschlägt, wird versucht, über das Netzwerk zu booten. Generell ist die Ausgabe recht detailliert, im Problemfall kann man einen Fehler finden.

Statt einer Schlussfolgerung

Wussten Sie, dass die Stirn eines Delfins nicht aus Knochen besteht? Es ist buchstäblich ein drittes Auge, eine Fettlinse zur Echoortung!

GNU/Linux auf einem ARM-Board von Grund auf starten (am Beispiel von Kali und iMX.6)

GNU/Linux auf einem ARM-Board von Grund auf starten (am Beispiel von Kali und iMX.6)

Source: habr.com