tl;dr: Ich erstelle ein Abbild von Kali Linux für einen ARM-Computer in der Software debootstrap, Linux und u-boot.
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 . Kali Linux für IMX6 gibt es einfach nicht (ich bereite es vor), daher muss ich es selbst erstellen.
Der Bootprozess ist recht einfach:
- Die Hardware wird initialisiert.
- Ein Bootloader wird aus einem bestimmten Bereich des Speichermediums (SD-Karte/eMMC/etc.) gelesen und ausgeführt.
- Der Bootloader sucht nach dem Kern des Betriebssystems, lädt ihn in einen bestimmten Bereich des Speichers und führt ihn aus.
- Der Kernel lädt das gesamte restliche OS.
Für meine Aufgabe genügt dieses Detailniveau; weitere Einzelheiten können Sie . Die oben genannten „einigen“ Bereiche unterscheiden sich von Platine zu Platine, was einige Schwierigkeiten bei der Installation verursacht. Das Booten von ARM-Serverplattformen 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:
- Wir kennzeichnen die SD-Karte als MBR-partitioniert:
parted -s /dev/mmcblk0 mklabel msdos - Erstellen wir eine Partition für
/bootmit 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. - Erstellen wir das Root-Dateisystem mit dem restlichen Speicher:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Falls die Dateien der Partitionen nicht erstellt oder geändert wurden, muss `partprobe` ausgeführt werden, dann wird die Partitionstabelle neu eingelesen.
- Erstellen wir das Dateisystem der Bootpartition mit der Bezeichnung
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - 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:
- Wir mounten die Partition in
/mnt/(verwenden Sie einen für Sie bequemeren Mount-Punkt):mount /dev/mmcblk0p2 /mnt - Füllen Sie das Dateisystem aus:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter--includegibt an, dass einige Pakete zusätzlich installiert werden, ich habe den statisch kompilierten QEMU-Emulator angegeben. Damit kann manchrootin die ARM-Umgebung wechseln. Die Bedeutung der anderen Optionen kann inman debootstrapeingesehen werden. Vergessen Sie nicht, dass nicht jede ARM-Platine die Architekturarmhf. - unterstützt.
debootstrapWegen der unterschiedlichen Architekturenwird in zwei Schritten durchgeführt, der zweite Schritt erfolgt wie folgt: - chroot /mnt/ /debootstrap/debootstrap --second-stage
Jetzt müssen wir chrooten: - Wir füllen aus
/etc/hostsund/etc/hostnamechroot /mnt /bin/bash - 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 ichlocales(Repository-Schlüssel), konfiguriere die Locales und die Zeitzone neu (dpkg-reconfigure locales tzdatapasswd. - ). Vergessen Sie nicht, ein Passwort mit dem Befehl festzulegen:
rootmit dem Befehlpasswd. - Setzen Sie ein Passwort für
/etc/fstabinnerhalb/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.
- 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 - Wir konfigurieren vor der Kompilierung:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Die Konfiguration befindet sich im Verzeichnisarch/arm/configs/. Wenn dies nicht der Fall ist, können Sie versuchen, eine vorhandene Konfiguration zu finden und deren Dateiname als Parameter anzugebenKBUILD_DEFCONFIG. Im schlimmsten Fall fahren Sie direkt mit dem nächsten Punkt fort. - Optional können die Einstellungen angepasst werden:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - Und wir crosskompilieren das Image:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Jetzt können Sie die Datei mit dem Kern kopieren:
cp arch/arm/boot/zImage /mnt/boot/ - Und die Dateien mit DeviceTree (Beschreibung der vorhandenen Hardware auf der Platine):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - 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 , daher ignoriert.
Wir bauen den Bootloader selbst:
- Wir klonen den stabilen Branch des Repositories:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - Wir wechseln in das Verzeichnis:
cd u-boot - 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. - 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 байта? Так предлагают сделать в . 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!
Quelle: habr.com
