Wir starten GNU/Linux auf einer ARM-Platine von Grund auf (am Beispiel von Kali und iMX.6)

tl;dr: Ich erstelle ein Kali Linux-Image für einen ARM-Computer in der Software debootstrap, linux und u-boot.

Wir starten GNU/Linux auf einer ARM-Platine von Grund auf (am Beispiel von Kali und iMX.6)

Wenn Sie ein nicht so populäres Einplatinencomputer-Board gekauft haben, könnten Sie auf das Fehlen eines Images für Ihre bevorzugte Distribution gestoßen sein. Eine ähnliche Situation ist bei dem geplanten Flipper One. Kali Linux für IMX6 gibt es einfach nicht (ich bereite es vor), daher muss ich es selbst zusammenstellen.

Der Bootprozess ist ziemlich einfach:

  1. Die Hardware wird initialisiert.
  2. Ein Bootloader wird aus einem bestimmten Bereich des Speichermediums (SD-Karte/eMMC/etc.) gelesen und ausgeführt.
  3. Der Bootloader sucht den Kernel des Betriebssystems und lädt ihn in einen bestimmten Speicherbereich und führt ihn aus.
  4. Der Kernel lädt das gesamte restliche OS.

Für meine Aufgabe reicht dieses Detailniveau, weitere Informationen können Sie in einem anderen Artikelnachlesen. Die zuvor genannten "bestimmten" Bereiche variieren von einem Board zum anderen, was einige Schwierigkeiten bei der Installation verursacht. Der Start von Server-ARM-Plattformen versucht man zu standardisieren mithilfe von UEFI, aber da dies noch nicht für alle verfügbar ist, muss ich alles separat zusammenstellen.

Die Erstellung des Root-Dateisystems

Zunächst müssen die Partitionen vorbereitet werden. Das U-Boot unterstützt verschiedene Dateisysteme; ich habe FAT32 für /boot und ext3 für den Root gewählt, das ist die Standardpartitionierung für Kali unter ARM. Ich werde GNU Parted verwenden, aber Sie können das gleiche auch mit dem gewohnten fdiskmachen. Es werden auch dosfstools und e2fsprogs für die Erstellung der Dateisysteme benötigt: apt install parted dosfstools e2fsprogs.

Wir partitionieren die SD-Karte:

  1. Wir markieren die SD-Karte so, dass sie das MBR-Partitionierungssystem verwendet: parted -s /dev/mmcblk0 mklabel msdos
  2. Wir erstellen eine Partition für /boot mit 128 Megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Der erste übersprungene Megabyte muss für die Partitionierung und den Bootloader reserviert bleiben.
  3. Wir erstellen ein Root-Dateisystem für den gesamten verbleibenden Speicher: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Falls sich Ihre Partitionen nicht erstellt oder geändert haben, muss `partprobe` ausgeführt werden, damit die Partitionstabelle neu eingelesen wird.
  5. Wir erstellen das Dateisystem der Bootpartition mit dem Label BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Wir erstellen das Root-Dateisystem mit dem Label ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Ausgezeichnet, jetzt können wir es füllen. Dafür benötigen wir zusätzlich debootstrap, ein Tool zum Erstellen von Root-Dateisystemen für Debian-ähnliche Betriebssysteme: apt install debootstrap.

Wir erstellen das Dateisystem:

  1. Wir mounten die Partition in /mnt/ (verwenden Sie einen für Sie bequemen Mountpunkt): mount /dev/mmcblk0p2 /mnt
  2. Wir füllen das Dateisystem aus: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Der Parameter --include gibt an, einige Pakete zusätzlich zu installieren, ich habe den statisch kompilierten Emulator QEMU angegeben. Er ermöglicht es, chroot in die ARM-Umgebung. Die Bedeutung der anderen Optionen kann in man debootstrapnachgesehen werden. Vergessen Sie nicht, dass nicht jede ARM-Platine die Architektur armhf.
  3. unterstützt. debootstrap Aufgrund der Unterschiede in den Architekturen wird das in zwei Schritten durchgeführt, der zweite erfolgt so:
  4. chroot /mnt/ /debootstrap/debootstrap --second-stage Jetzt müssen wir chrooten:
  5. Wir füllen /etc/hosts und /etc/hostname das Ziel-FS. Füllen Sie analog zum Inhalt auf Ihrem lokalen Computer aus, vergessen Sie dabei nicht, den Hostnamen zu ersetzen.
  6. Alles andere kann angepasst werden. Insbesondere installiere ich locales (Repository-Schlüssel), konfiguriere die Lokale und die Zeitzone neu (dpkg-reconfigure locales tzdata). Vergessen Sie nicht, ein Passwort mit dem Befehl zu setzen passwd.
  7. Wir setzen das Passwort für root Wir setzen ein eigenes Passwort für den Benutzer passwd.
  8. Die Vorbereitung des Images endet für mich mit der Ausfüllung /etc/fstab innerhalb /mnt/.

Ich werde gemäß den zuvor erstellten Bezeichnungen hochladen, daher wird der Inhalt wie folgt sein:

LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto defaults 0 0

Schließlich können wir die Boot-Partition einhängen, die wir für den Kernel benötigen: `mount /dev/mmcblk0p1 /mnt/boot/`

Linux-Bau

Um den Kernel (und später den Bootloader) auf Debian Testing zu bauen, müssen die grundlegenden Pakete wie GCC, GNU Make und die Header-Dateien der GNU C Library für die Zielarchitektur installiert werden (bei mir armhf), sowie die OpenSSL-Header, der Konsolenrechner bc, bison und flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Da der Bootloader standardmäßig nach der Datei zImage auf dem Dateisystem der Boot-Partition sucht, ist es Zeit, den USB-Stick zu partitionieren.

  1. Es ist zu lang, den Kernel zu klonen, daher lade ich ihn einfach herunter: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Lassen Sie uns entpacken und in das Verzeichnis mit den Quellcode wechseln: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurieren vor der Kompilierung: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Die Konfiguration befindet sich im Verzeichnis arch/arm/configs/. Falls nicht vorhanden, können Sie versuchen, eine fertige zu finden und den Dateinamen als Parameter KBUILD_DEFCONFIGzu übergeben. Im schlimmsten Fall fahren Sie direkt mit dem nächsten Punkt fort.
  3. Optional können Sie die Einstellungen anpassen: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Und wir cross-kompilieren das Image: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Jetzt können wir die Datei mit dem Kernel kopieren: cp arch/arm/boot/zImage /mnt/boot/
  6. Und Dateien mit DeviceTree (Beschreibung der auf der Platine vorhandenen Hardware): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Und installieren Sie die als separate Dateien vorliegenden Module: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Der Kernel ist bereit. Man kann alles aushängen: umount /mnt/boot/ /mnt/

Das U-Boot

Da der Bootloader interaktiv ist, genügt es zur Überprüfung seiner Arbeit, die Platine, das Speichermedium und optional ein USB-to-UART-Gerät zu haben. Das bedeutet, dass man den Kernel und das Betriebssystem später aufschieben kann.

Die überwiegende Mehrheit der Hersteller empfiehlt die Verwendung von Das U-Boot für den primären Bootvorgang. Vollständige Unterstützung wird in der Regel in einem eigenen Fork bereitgestellt, aber auch im Upstream wird nicht vergessen, beizutragen. In meinem Fall wird die Platine in Mainline, daher Fork habe ich ignoriert.

Wir bauen den Bootloader selbst:

  1. Wir klonen den stabilen Branch des Repositories: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Wir wechseln in das Verzeichnis: cd u-boot
  3. Wir bereiten die Build-Konfiguration vor: make mx6ull_14x14_evk_defconfig. Das funktioniert nur, wenn die Konfiguration im Das U-Boot vorhanden ist, andernfalls müssen Sie die Konfiguration des Herstellers finden und sie in die Wurzel des Repositories in die Datei .config, oder auf andere, vom Hersteller empfohlene Weise bauen.
  4. Wir erstellen das Image des Bootloaders mit dem Cross-Compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Das Ergebnis ist die Datei u-boot.imx, es ist ein fertiges Image, das auf einen USB-Stick geschrieben werden kann. Schreiben Sie auf die SD-Karte, wobei die ersten 1024 Byte übersprungen werden. Warum ich das Target gewählt habe u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в Dokumentation. Bei anderen Platinen kann der Prozess des Erstellens des Images und des Schreibens leicht abweichen.

Fertig, man kann booten. Der Bootloader sollte seine eigene Version, einige Informationen zur Platine anzeigen und versuchen, das Kernel-Image auf der Partition zu finden. Falls dies fehlschlägt, wird versucht, über das Netzwerk zu booten. Insgesamt ist die Ausgabe recht detailliert, man kann einen Fehler im Falle eines Problems finden.

Zum Abschluss

Wussten Sie, dass die Stirn eines Delfins nicht knöchern ist? Es ist buchstäblich das dritte Auge, eine Fetlinse zur Echolokation!

Wir starten GNU/Linux auf einer ARM-Platine von Grund auf (am Beispiel von Kali und iMX.6)

Wir starten GNU/Linux auf einer ARM-Platine von Grund auf (am Beispiel von Kali und iMX.6)

Quelle: habr.com

60GB SSD 8Gb DDR4