Εκκίνηση του GNU/Linux σε μια πλακέτα ARM από την αρχή (χρησιμοποιώντας το Kali και το iMX.6 ως παράδειγμα)

tl? dr: Κατασκευάζω μια εικόνα Kali Linux για έναν υπολογιστή ARM, στο πρόγραμμα debootstrap, linux и u-boot.

Εκκίνηση του GNU/Linux σε μια πλακέτα ARM από την αρχή (χρησιμοποιώντας το Kali και το iMX.6 ως παράδειγμα)

Εάν αγοράσατε κάποιο όχι πολύ δημοφιλές μεμονωμένο πληρωτή, μπορεί να αντιμετωπίσετε την έλλειψη εικόνας του αγαπημένου σας κιτ διανομής για αυτό. Σχεδόν το ίδιο συνέβη προγραμματισμένο Flipper One. Απλώς δεν υπάρχει Kali Linux για IMX6 (μαγειρεύω), οπότε πρέπει να το συναρμολογήσω μόνος μου.

Η διαδικασία λήψης είναι αρκετά απλή:

  1. Το υλικό προετοιμάζεται.
  2. Από κάποια περιοχή της συσκευής αποθήκευσης (κάρτα SD/eMMC/κ.λπ.) διαβάζεται και εκτελείται ο bootloader.
  3. Ο φορτωτής αναζητά τον πυρήνα του λειτουργικού συστήματος και τον φορτώνει σε κάποια περιοχή μνήμης και τον εκτελεί.
  4. Ο πυρήνας φορτώνει το υπόλοιπο λειτουργικό σύστημα.

Για την εργασία μου, αυτό το επίπεδο λεπτομέρειας είναι αρκετό, μπορείτε να διαβάσετε τις λεπτομέρειες σε άλλο άρθρο. Οι "κάποιες" περιοχές που αναφέρονται παραπάνω διαφέρουν από σανίδα σε σανίδα, γεγονός που δημιουργεί κάποιες δυσκολίες εγκατάστασης. Φόρτωση πλατφορμών διακομιστή ARM προσπαθώντας να τυποποιηθεί χρησιμοποιώντας το UEFI, αλλά εφόσον δεν είναι διαθέσιμο για όλους, θα πρέπει να συλλέξετε τα πάντα ξεχωριστά.

Δημιουργία του ριζικού συστήματος αρχείων

Πρώτα πρέπει να προετοιμάσετε τμήματα. Το Das U-Boot υποστηρίζει διαφορετικά συστήματα αρχείων, επέλεξα το FAT32 /boot και ext3 για root, αυτή είναι η τυπική σήμανση εικόνας για το Kali στο ARM. Θα χρησιμοποιήσω το GNU Parted, αλλά μπορείτε να κάνετε το ίδιο πιο οικείο fdisk. Θα χρειαστείτε επίσης dosfstools и e2fsprogs για να δημιουργήσετε ένα σύστημα αρχείων: apt install parted dosfstools e2fsprogs.

Διαμερισμός της κάρτας SD:

  1. Επισημάνετε την κάρτα SD ότι χρησιμοποιεί κατάτμηση MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Δημιουργήστε μια ενότητα για /boot για 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Το πρώτο megabyte που χάθηκε πρέπει να αφεθεί για την ίδια τη σήμανση και για το bootloader.
  3. Δημιουργήστε ένα root FS για την υπόλοιπη χωρητικότητα: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Εάν ξαφνικά δεν έχετε δημιουργήσει ή αλλάξει αρχεία διαμερισμάτων, πρέπει να εκτελέσετε το «partprobe» και τότε ο πίνακας διαμερισμάτων θα ξαναδιαβαστεί.
  5. Δημιουργήστε ένα σύστημα αρχείων διαμερίσματος εκκίνησης με ετικέτα BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Δημιουργήστε ένα ριζικό σύστημα αρχείων με ετικέτα ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Τέλεια, τώρα μπορείτε να το συμπληρώσετε. Αυτό θα απαιτήσει επιπλέον debootstrap, ένα βοηθητικό πρόγραμμα για τη δημιουργία root FS σε λειτουργικά συστήματα τύπου Debian: apt install debootstrap.

Συλλέγουμε FS:

  1. Τοποθετήστε το διαμέρισμα σε /mnt/ (χρησιμοποιήστε ένα πιο βολικό σημείο στήριξης για τον εαυτό σας): mount /dev/mmcblk0p2 /mnt
  2. Στην πραγματικότητα συμπληρώνουμε το σύστημα αρχείων: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Παράμετρος --include καθορίζει να εγκαταστήσετε επιπλέον ορισμένα πακέτα, καθόρισα έναν στατικά κατασκευασμένο εξομοιωτή QEMU. Σας επιτρέπει να εκτελέσετε chroot στο περιβάλλον ARM. Το νόημα των άλλων επιλογών βρίσκεται στο man debootstrap. Μην ξεχνάτε ότι δεν υποστηρίζει την αρχιτεκτονική κάθε πλακέτα ARM armhf.
  3. Λόγω της διαφοράς στις αρχιτεκτονικές debootstrap εκτελείται σε δύο στάδια, το δεύτερο εκτελείται ως εξής: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Τώρα πρέπει να περιστρέψετε: chroot /mnt /bin/bash
  5. γέμισμα /etc/hosts и /etc/hostname στόχος FS. Συμπληρώστε το ίδιο με το περιεχόμενο στον τοπικό σας υπολογιστή, θυμηθείτε να αντικαταστήσετε μόνο το όνομα κεντρικού υπολογιστή.
  6. Μπορείτε να προσαρμόσετε όλα τα άλλα. Συγκεκριμένα, εγκαθιστώ locales (κλειδιά αποθήκης), επαναδιαμόρφωση τοπικών ρυθμίσεων και ζώνης ώρας (dpkg-reconfigure locales tzdata). Μην ξεχάσετε να ορίσετε τον κωδικό πρόσβασης με την εντολή passwd.
  7. Ορίστε έναν κωδικό πρόσβασης για root ομάδα passwd.
  8. Η προετοιμασία της εικόνας για μένα ολοκληρώνεται με το γέμισμα /etc/fstab μέσα /mnt/.

Θα ανεβάσω σύμφωνα με τις ετικέτες που δημιουργήθηκαν νωρίτερα, οπότε το περιεχόμενο θα είναι ως εξής:

LABEL=ROOTFS / αυτόματα σφάλματα=remount-ro 0 1
LABEL=BOOT /Αυτόματη εκκίνηση προεπιλογές 0 0

Τέλος, μπορείτε να προσαρτήσετε το διαμέρισμα εκκίνησης, θα το χρειαστούμε για τον πυρήνα: `mount /dev/mmcblk0p1 /mnt/boot/`

Κατασκευή Linux

Για να δημιουργήσετε τον πυρήνα (και στη συνέχεια τον φορτωτή εκκίνησης) στο Debian Testing, πρέπει να εγκαταστήσετε το τυπικό σύνολο αρχείων κεφαλίδας GCC, GNU Make και GNU C Library για την αρχιτεκτονική προορισμού (έχω armhf), καθώς και κεφαλίδες OpenSSL, αριθμομηχανή κονσόλας bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Δεδομένου ότι το προεπιλεγμένο πρόγραμμα φόρτωσης αναζητά ένα αρχείο zImage στο σύστημα αρχείων του διαμερίσματος εκκίνησης, ήρθε η ώρα να σπάσετε τη μονάδα flash.

  1. Η κλωνοποίηση του πυρήνα είναι πολύ μεγάλη, οπότε θα κατεβάσω απλώς: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Αποσυσκευάστε και μεταβείτε στον κατάλογο πηγής: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Ρύθμιση παραμέτρων πριν από τη μεταγλώττιση: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Η διαμόρφωση βρίσκεται στον κατάλογο arch/arm/configs/. Εάν δεν υπάρχει, μπορείτε να προσπαθήσετε να βρείτε και να κατεβάσετε ένα έτοιμο και να περάσετε το όνομα του αρχείου σε αυτόν τον κατάλογο στην παράμετρο KBUILD_DEFCONFIG. Σε ακραίες περιπτώσεις, προχωρήστε αμέσως στην επόμενη παράγραφο.
  3. Μπορείτε προαιρετικά να τροποποιήσετε τις ρυθμίσεις: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Και διασταυρώστε την εικόνα: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Τώρα μπορείτε να αντιγράψετε το αρχείο πυρήνα: cp arch/arm/boot/zImage /mnt/boot/
  6. Και αρχεία από το DeviceTree (περιγραφή του υλικού που είναι διαθέσιμο στον πίνακα): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Και εγκαταστήστε τις μονάδες που έχουν συναρμολογηθεί ως ξεχωριστά αρχεία: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Ο πυρήνας είναι έτοιμος. Μπορείτε να αποσυνδέσετε τα πάντα: umount /mnt/boot/ /mnt/

Das U Boot

Δεδομένου ότι ο bootloader είναι διαδραστικός, η ίδια η πλακέτα, μια συσκευή αποθήκευσης και μια προαιρετική συσκευή USB-to-UART αρκούν για να δοκιμάσουν τη λειτουργία του. Δηλαδή, μπορείτε να αναβάλετε τον πυρήνα και το λειτουργικό σύστημα για αργότερα.

Η συντριπτική πλειοψηφία των κατασκευαστών προτείνει τη χρήση του Das U-Boot για κύρια εκκίνηση. Η πλήρης υποστήριξη παρέχεται συνήθως στο δικό του πιρούνι, αλλά μην ξεχάσετε να συνεισφέρετε στο upstream. Στην περίπτωσή μου, η πλακέτα υποστηρίζεται κύρια γραμμήΈτσι πιρούνι αγνόησα.

Συλλέγουμε τον ίδιο τον bootloader:

  1. Κλωνοποιήστε τον σταθερό κλάδο του αποθετηρίου: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Ας πάμε στον ίδιο τον κατάλογο: cd u-boot
  3. Προετοιμασία της διαμόρφωσης κατασκευής: make mx6ull_14x14_evk_defconfig. Αυτό λειτουργεί μόνο εάν η διαμόρφωση είναι στο ίδιο το Das U-Boot, διαφορετικά θα χρειαστεί να βρείτε τη ρύθμιση παραμέτρων του κατασκευαστή και να την τοποθετήσετε στη ρίζα του αποθετηρίου στο αρχείο .config, ή συναρμολογημένο με άλλο τρόπο που προτείνει ο κατασκευαστής.
  4. Συλλέγουμε την ίδια την εικόνα του bootloader με ένα cross-compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Ως αποτέλεσμα, παίρνουμε το αρχείο u-boot.imx, αυτή είναι μια έτοιμη εικόνα που μπορεί να γραφτεί σε μια μονάδα flash USB. Γράφουμε στην κάρτα SD, παρακάμπτοντας τα πρώτα 1024 byte. Γιατί επέλεξα στόχο u-boot.imx? Γιατί χάσατε ακριβώς 1024 byte; Αυτό προτείνουν να κάνουν τεκμηρίωση. Για άλλους πίνακες, η διαδικασία δημιουργίας και εγγραφής εικόνας μπορεί να είναι ελαφρώς διαφορετική.

Έγινε, μπορείτε να κάνετε λήψη. Ο bootloader θα πρέπει να αναφέρει τη δική του έκδοση, κάποιες πληροφορίες για τον πίνακα και να προσπαθήσει να βρει την εικόνα του πυρήνα στο διαμέρισμα. Εάν αποτύχει, θα προσπαθήσει να εκκινήσει μέσω του δικτύου. Σε γενικές γραμμές, η έξοδος είναι αρκετά λεπτομερής, μπορείτε να βρείτε ένα σφάλμα σε περίπτωση προβλήματος.

Αντί για ένα συμπέρασμα

Γνωρίζατε ότι το μέτωπο ενός δελφινιού δεν είναι αποστεωμένο; Είναι κυριολεκτικά ένα τρίτο μάτι, ένας λιπαρός φακός για ηχοεντοπισμό!

Εκκίνηση του GNU/Linux σε μια πλακέτα ARM από την αρχή (χρησιμοποιώντας το Kali και το iMX.6 ως παράδειγμα)

Εκκίνηση του GNU/Linux σε μια πλακέτα ARM από την αρχή (χρησιμοποιώντας το Kali και το iMX.6 ως παράδειγμα)

Πηγή: www.habr.com