tl;dr: Ich erstelle ein Kali Linux-Image für einen ARM-Computer in der Software debootstrap, linux und u-boot.
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 . Kali Linux für IMX6 gibt es einfach nicht (ich bereite es vor), daher muss ich es selbst zusammenstellen.
Der Bootprozess ist ziemlich 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 den Kernel des Betriebssystems und lädt ihn in einen bestimmten Speicherbereich und führt ihn aus.
- Der Kernel lädt das gesamte restliche OS.
Für meine Aufgabe reicht dieses Detailniveau, weitere Informationen können Sie nachlesen. Die zuvor genannten "bestimmten" Bereiche variieren von einem Board zum anderen, was einige Schwierigkeiten bei der Installation verursacht. Der Start von Server-ARM-Plattformen 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:
- Wir markieren die SD-Karte so, dass sie das MBR-Partitionierungssystem verwendet:
parted -s /dev/mmcblk0 mklabel msdos - Wir erstellen eine Partition für
/bootmit 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. - Wir erstellen ein Root-Dateisystem für den gesamten verbleibenden Speicher:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Falls sich Ihre Partitionen nicht erstellt oder geändert haben, muss `partprobe` ausgeführt werden, damit die Partitionstabelle neu eingelesen wird.
- Wir erstellen das Dateisystem der Bootpartition mit dem Label
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - 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:
- Wir mounten die Partition in
/mnt/(verwenden Sie einen für Sie bequemen Mountpunkt):mount /dev/mmcblk0p2 /mnt - Wir füllen das Dateisystem aus:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Der Parameter--includegibt an, einige Pakete zusätzlich zu installieren, ich habe den statisch kompilierten Emulator QEMU angegeben. Er ermöglicht es,chrootin die ARM-Umgebung. Die Bedeutung der anderen Optionen kann inman debootstrapnachgesehen werden. Vergessen Sie nicht, dass nicht jede ARM-Platine die Architekturarmhf. - unterstützt.
debootstrapAufgrund der Unterschiede in den Architekturenwird das in zwei Schritten durchgeführt, der zweite erfolgt so: - chroot /mnt/ /debootstrap/debootstrap --second-stage
Jetzt müssen wir chrooten: - Wir füllen
/etc/hostsund/etc/hostnamedas Ziel-FS. Füllen Sie analog zum Inhalt auf Ihrem lokalen Computer aus, vergessen Sie dabei nicht, den Hostnamen zu ersetzen. - 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 setzenpasswd. - Wir setzen das Passwort für
rootWir setzen ein eigenes Passwort für den Benutzerpasswd. - Die Vorbereitung des Images endet für mich mit der Ausfüllung
/etc/fstabinnerhalb/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.
- 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 - Konfigurieren vor der Kompilierung:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Die Konfiguration befindet sich im Verzeichnisarch/arm/configs/. Falls nicht vorhanden, können Sie versuchen, eine fertige zu finden und den Dateinamen als ParameterKBUILD_DEFCONFIGzu übergeben. Im schlimmsten Fall fahren Sie direkt mit dem nächsten Punkt fort. - Optional können Sie die Einstellungen anpassen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - Und wir cross-kompilieren das Image:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Jetzt können wir die Datei mit dem Kernel kopieren:
cp arch/arm/boot/zImage /mnt/boot/ - Und Dateien mit DeviceTree (Beschreibung der auf der Platine vorhandenen Hardware):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - 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 , daher habe ich 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. 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. - 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 байта? Так предлагают сделать в . 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!
Quelle: habr.com
