tl; dr: Ich erstelle im Programm ein Kali Linux-Image für einen ARM-Computer debootstrap
, linux
и u-boot
.
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
Der Downloadvorgang ist ganz einfach:
- Hardware wird initialisiert.
- Von einem bestimmten Bereich auf dem Speichergerät (SD-Karte/eMMC/usw.) wird der Bootloader gelesen und ausgeführt.
- Der Loader sucht nach dem Kernel des Betriebssystems, lädt ihn in einen Speicherbereich und führt ihn aus.
- Der Kernel lädt den Rest des Betriebssystems.
Für meine Aufgabe reicht dieser Detaillierungsgrad aus, Sie können die Details nachlesen
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:
- Markieren Sie die SD-Karte als MBR-Partitionierung verwendend:
parted -s /dev/mmcblk0 mklabel msdos
- 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. - Erstellen Sie einen Root-FS für den Rest der Kapazität:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Wenn Sie plötzlich keine Partitionsdateien mehr erstellt oder geändert haben, müssen Sie „partprobe“ ausführen, dann wird die Partitionstabelle erneut gelesen.
- Erstellen Sie ein Boot-Partitionsdateisystem mit der Bezeichnung
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- 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:
- Hängen Sie die Partition ein
/mnt/
(Verwenden Sie einen für Sie bequemeren Einhängepunkt):mount /dev/mmcblk0p2 /mnt
- 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 erbringenchroot
in die ARM-Umgebung. Die Bedeutung der anderen Optionen finden Sie inman debootstrap
. Vergessen Sie nicht, dass nicht jedes ARM-Board die Architektur unterstütztarmhf
. - Aufgrund der unterschiedlichen Architekturen
debootstrap
wird in zwei Schritten durchgeführt, der zweite wird wie folgt durchgeführt:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Jetzt müssen Sie drehen:
chroot /mnt /bin/bash
- 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. - 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 festzulegenpasswd
. - Legen Sie ein Passwort fest für
root
Teampasswd
. - 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.
- 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
- Vor dem Kompilieren konfigurieren:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. Die Konfiguration befindet sich im Verzeichnisarch/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 übergebenKBUILD_DEFCONFIG
. Fahren Sie im Extremfall sofort mit dem nächsten Absatz fort. - Sie können die Einstellungen optional anpassen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- Und kompilieren Sie das Bild:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Jetzt können Sie die Kerneldatei kopieren:
cp arch/arm/boot/zImage /mnt/boot/
- Und Dateien von DeviceTree (Beschreibung der auf der Platine verfügbaren Hardware):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- 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
Wir sammeln den Bootloader selbst:
- Klonen Sie den stabilen Zweig des Repositorys:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Gehen wir zum Verzeichnis selbst:
cd u-boot
- 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.config
oder auf eine andere vom Hersteller empfohlene Weise zusammengebaut werden. - 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.imx
Dies 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
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!
Source: habr.com