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

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

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

Wenn Sie ein weniger gängiges Einplatinen-Board gekauft haben, sind Sie möglicherweise auf die Abwesenheit eines Abbilds Ihrer bevorzugten Distribution gestoßen. Etwa das Gleiche ist mit dem geplanten Flipper One. Kali Linux für IMX6 gibt es einfach nicht (ich bereite es vor), daher muss ich es selbst erstellen.

Der Bootprozess ist recht 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 nach dem Kern des Betriebssystems, lädt ihn in einen bestimmten Bereich des Speichers und führt ihn aus.
  4. Der Kernel lädt das gesamte restliche OS.

Für meine Aufgabe genügt dieses Detailniveau; weitere Einzelheiten können Sie in einem anderen Artikel. Die oben genannten „einigen“ Bereiche unterscheiden sich von Platine zu Platine, was einige Schwierigkeiten bei der Installation verursacht. Das Booten von ARM-Serverplattformen wird versucht zu standardisieren durch UEFI, aber da dies noch nicht für alle verfügbar ist, muss alles separat zusammengestellt werden.

Aufbau 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, dies ist die Standardpartitionierung von Images für Kali auf ARM. Ich werde GNU Parted verwenden, aber Sie können das Gleiche mit einem vertrauteren fdisk. Auch werden benötigt dosfstools und e2fsprogs zur Erstellung des Dateisystems: apt install parted dosfstools e2fsprogs.

Wir partitionieren die SD-Karte:

  1. Wir kennzeichnen die SD-Karte als MBR-partitioniert: parted -s /dev/mmcblk0 mklabel msdos
  2. Erstellen wir eine Partition für /boot mit 128 Megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Der erste ungenutzte Megabyte muss für die Partitionierung und den Bootloader reserviert bleiben.
  3. Erstellen wir das Root-Dateisystem mit dem restlichen Speicher: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Falls die Dateien der Partitionen nicht erstellt oder geändert wurden, muss `partprobe` ausgeführt werden, dann wird die Partitionstabelle neu eingelesen.
  5. Erstellen wir das Dateisystem der Bootpartition mit der Bezeichnung BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Erstellen wir das Root-Dateisystem mit der Bezeichnung ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Ausgezeichnet, jetzt kann es gefüllt werden. Dazu benötigen wir zusätzlich debootstrap, ein Tool zur Erstellung von Root-Dateisystemen für Debian-basierte Betriebssysteme: apt install debootstrap.

Wir sammeln das Dateisystem:

  1. Wir mounten die Partition in /mnt/ (verwenden Sie einen für Sie bequemeren Mount-Punkt): mount /dev/mmcblk0p2 /mnt
  2. Füllen Sie das Dateisystem aus: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include gibt an, dass einige Pakete zusätzlich installiert werden, ich habe den statisch kompilierten QEMU-Emulator angegeben. Damit kann man chroot in die ARM-Umgebung wechseln. Die Bedeutung der anderen Optionen kann in man debootstrapeingesehen werden. Vergessen Sie nicht, dass nicht jede ARM-Platine die Architektur armhf.
  3. unterstützt. debootstrap Wegen der unterschiedlichen Architekturen wird in zwei Schritten durchgeführt, der zweite Schritt erfolgt wie folgt:
  4. chroot /mnt/ /debootstrap/debootstrap --second-stage Jetzt müssen wir chrooten:
  5. Wir füllen aus /etc/hosts und /etc/hostname chroot /mnt /bin/bash
  6. das Ziel-FS. Füllen Sie es analog zu den Inhalten Ihres lokalen Computers aus, vergessen Sie nicht, den Hostnamen zu ändern. Sie können alles andere weiter anpassen. Insbesondere installiere ich locales(Repository-Schlüssel), konfiguriere die Locales und die Zeitzone neu (dpkg-reconfigure locales tzdata passwd.
  7. ). Vergessen Sie nicht, ein Passwort mit dem Befehl festzulegen: root mit dem Befehl passwd.
  8. Setzen Sie ein Passwort für /etc/fstab innerhalb /mnt/.

Die Vorbereitung des Images wird für mich mit dem Ausfüllen abgeschlossen.

Ich werde entsprechend den zuvor erstellten Labels hochladen, daher wird der Inhalt wie folgt aussehen:
LABEL=ROOTFS / auto errors=remount-ro 0 1

LABEL=BOOT /boot auto defaults 0 0

Linux-Bau

Für den Bau des Kernels (und des Loaders später) auf Debian Testing müssen wir ein Standardpaket mit GCC, GNU Make und den Header-Dateien der GNU C Library für die Zielarchitektur installieren (bei mir armhf), sowie die Header von OpenSSL, den Konsolenrechner bc, bison und flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Da der Bootloader standardmäßig die Datei zImage im Dateisystem der Boot-Partition sucht, ist es Zeit, den USB-Stick zu partitionieren.

  1. Das Klonen des Kernels dauert zu lange, also lade ich ihn einfach herunter: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Wir entpacken es und wechseln in das Verzeichnis mit den Quellcodes: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Wir konfigurieren vor der Kompilierung: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Die Konfiguration befindet sich im Verzeichnis arch/arm/configs/. Wenn dies nicht der Fall ist, können Sie versuchen, eine vorhandene Konfiguration zu finden und deren Dateiname als Parameter anzugeben KBUILD_DEFCONFIG. Im schlimmsten Fall fahren Sie direkt mit dem nächsten Punkt fort.
  3. Optional können die Einstellungen angepasst werden: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Und wir crosskompilieren das Image: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Jetzt können Sie die Datei mit dem Kern kopieren: cp arch/arm/boot/zImage /mnt/boot/
  6. Und die Dateien mit DeviceTree (Beschreibung der vorhandenen Hardware auf der Platine): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Und installieren Sie die als separate Dateien erstellten Module: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

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

Das U-Boot

Da der Bootloader interaktiv ist, reicht es aus, nur die Platine, das Speichermedium und optional ein USB-to-UART-Gerät zur Überprüfung dessen Funktion zu verwenden. Das bedeutet, dass Sie den Kernel und das Betriebssystem später erledigen können.

Die überwiegende Mehrheit der Hersteller empfiehlt die Verwendung von Das U-Boot für den Erststart. Volle Unterstützung wird normalerweise in einem eigenen Fork gewährleistet, aber auch im Upstream wird nicht vergessen, beizutragen. In meinem Fall wird die Platine in dem Mainline, daher Fork 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. Dies funktioniert nur, wenn die Konfiguration im Das U-Boot vorhanden ist, andernfalls müssen Sie die Konfiguration des Herstellers finden und sie in das Wurzelverzeichnis des Repositories in eine Datei ablegen. .config, oder auf eine andere vom Hersteller empfohlene Art und Weise erstellen.
  4. Wir erstellen das Abbild des Bootloaders mit einem Cross-Compiler. armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Das Ergebnis ist die Datei u-boot.imx, dies ist das fertige Abbild, das auf einen USB-Stick geschrieben werden kann. Schreiben Sie es auf die SD-Karte, wobei Sie die ersten 1024 Bytes überspringen. Warum ich dieses Ziel gewählt habe u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в Dokumentation.. Bei anderen Boards kann der Prozess der Erstellung des Abbilds und des Schreibens leicht variieren.

Fertig, Sie können booten. Der Bootloader sollte seine eigene Version anzeigen, einige Informationen über das Board bereitstellen und versuchen, das Abbild des Kernels auf der Partition zu finden. Im Falle eines Misserfolgs wird er versuchen, über das Netzwerk zu booten. Insgesamt ist die Ausgabe ziemlich detailliert; Sie können einen Fehler im Falle eines Problems finden.

Abschließend

Wussten Sie, dass die Stirn eines Delfins nicht knöchernd ist? Es ist buchstäblich das dritte Auge, eine Fettlinse für die Echolokalisierung!

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

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

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster