Memulai GNU/Linux di papan ARM dari awal (menggunakan Kali dan iMX.6 sebagai contoh)

tl; dr: Saya sedang membangun citra Kali Linux untuk komputer ARM, dalam program debootstrap, linux ΠΈ u-boot.

Memulai GNU/Linux di papan ARM dari awal (menggunakan Kali dan iMX.6 sebagai contoh)

Jika Anda membeli beberapa pembayar tunggal yang tidak terlalu populer, Anda mungkin menemukan kekurangan gambar kit distribusi favorit Anda untuk itu. Hal yang hampir sama terjadi pada direncanakan Flipper One. Tidak ada Kali Linux untuk IMX6 (saya sedang memasak), jadi saya harus merakitnya sendiri.

Proses pengunduhan cukup sederhana:

  1. Perangkat keras diinisialisasi.
  2. Dari beberapa area di perangkat penyimpanan (kartu SD/eMMC/dll), bootloader dibaca dan dijalankan.
  3. Pemuat mencari kernel sistem operasi dan memuatnya ke beberapa area memori dan menjalankannya.
  4. Kernel memuat sisa OS.

Untuk tugas saya, level detail ini sudah cukup, Anda bisa membaca detailnya di artikel lain. Area "beberapa" yang disebutkan di atas berbeda dari papan ke papan, yang menimbulkan beberapa kesulitan pemasangan. Memuat platform ARM server mencoba untuk standarisasi menggunakan UEFI, tetapi selama tidak tersedia untuk semua orang, Anda harus mengumpulkan semuanya secara terpisah.

Membangun sistem file root

Pertama, Anda perlu menyiapkan bagian. Das U-Boot mendukung sistem file yang berbeda, saya memilih FAT32 /boot dan ext3 untuk root, ini adalah markup gambar standar untuk Kali di bawah ARM. Saya akan menggunakan GNU Parted, tetapi Anda dapat membuatnya lebih familiar fdisk. Anda juga akan membutuhkan dosfstools ΠΈ e2fsprogs untuk membuat sistem file: apt install parted dosfstools e2fsprogs.

Mempartisi kartu SD:

  1. Tandai kartu SD sebagai menggunakan partisi MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Buat bagian untuk /boot untuk 128 megabita: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Megabyte pertama yang terlewatkan harus dibiarkan untuk markup itu sendiri dan untuk bootloader.
  3. Buat root FS untuk sisa kapasitas: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Jika tiba-tiba Anda belum membuat atau mengubah file partisi, Anda perlu menjalankan `partprobe`, kemudian tabel partisi akan dibaca ulang.
  5. Buat sistem file partisi boot berlabel BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Buat sistem file root dengan label ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Bagus, sekarang Anda bisa mengisinya. Ini juga akan membutuhkan debootstrap, utilitas untuk membuat root FS pada sistem operasi seperti Debian: apt install debootstrap.

Kami mengumpulkan FS:

  1. Pasang partisi ke /mnt/ (gunakan titik pemasangan yang lebih nyaman untuk Anda sendiri): mount /dev/mmcblk0p2 /mnt
  2. Sebenarnya kami mengisi sistem file: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include menentukan untuk menginstal beberapa paket tambahan, saya menentukan emulator QEMU yang dibuat secara statis. Ini memungkinkan Anda untuk tampil chroot ke lingkungan ARM. Arti dari opsi lain dapat ditemukan di man debootstrap. Jangan lupa bahwa tidak semua papan ARM mendukung arsitekturnya armhf.
  3. Karena perbedaan arsitektur debootstrap dilakukan dalam dua tahap, yang kedua dilakukan sebagai berikut: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Sekarang Anda perlu memutar: chroot /mnt /bin/bash
  5. Mengisi /etc/hosts ΠΈ /etc/hostname sasaran FS. Isikan sama dengan isi di komputer lokal anda, ingat ganti hostname saja.
  6. Anda dapat menyesuaikan yang lainnya. Secara khusus, saya menginstal locales (kunci repositori), mengkonfigurasi ulang lokal dan zona waktu (dpkg-reconfigure locales tzdata). Jangan lupa untuk mengatur kata sandi dengan perintah passwd.
  7. Tetapkan kata sandi untuk root tim passwd.
  8. Persiapan gambar untuk saya selesaikan dengan mengisi /etc/fstab dalam /mnt/.

Saya akan upload sesuai dengan tag yang dibuat tadi, jadi isinya akan seperti ini:

LABEL=ROOTFS / kesalahan otomatis=remount-ro 0 1
LABEL=BOOT /boot otomatis default 0 0

Terakhir, Anda dapat memasang partisi boot, kami memerlukannya untuk kernel: `mount /dev/mmcblk0p1 /mnt/boot/`

Membangun Linux

Untuk membangun kernel (dan kemudian bootloader) pada Debian Testing, Anda perlu menginstal set standar GCC, GNU Make, dan file header GNU C Library untuk arsitektur target (saya punya armhf), serta header OpenSSL, kalkulator konsol bc, bison ΠΈ flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Karena loader default mencari file zImage pada sistem file partisi boot, saatnya untuk merusak flash drive.

  1. Mengkloning kernel terlalu lama, jadi saya unduh saja: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Buka paket dan buka direktori sumber: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurasikan sebelum kompilasi: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Konfigurasi ada di direktori arch/arm/configs/. Jika tidak ada, Anda dapat mencoba mencari dan mengunduh yang sudah jadi dan meneruskan nama file di direktori ini ke parameter KBUILD_DEFCONFIG. Dalam kasus ekstrim, segera lanjutkan ke paragraf berikutnya.
  3. Secara opsional, Anda dapat men-tweak pengaturan: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Dan kompilasi silang gambar: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Sekarang Anda dapat menyalin file kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. Dan file dari DeviceTree (deskripsi perangkat keras tersedia di papan): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Dan instal modul yang dirangkai sebagai file terpisah: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Kernel sudah siap. Anda dapat melepas semuanya: umount /mnt/boot/ /mnt/

Das U Boot

Karena bootloader bersifat interaktif, board itu sendiri, perangkat penyimpanan, dan perangkat USB-ke-UART opsional sudah cukup untuk menguji operasinya. Artinya, Anda bisa menunda kernel dan OS untuk nanti.

Sebagian besar pabrikan menyarankan penggunaan Das U-Boot untuk boot utama. Dukungan penuh biasanya diberikan di cabangnya sendiri, tetapi jangan lupa untuk berkontribusi di hulu. Dalam kasus saya, papan didukung di garis utamaJadi garpu saya abaikan.

Kami mengumpulkan bootloader itu sendiri:

  1. Kloning cabang stabil dari repositori: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Mari kita pergi ke direktori itu sendiri: cd u-boot
  3. Mempersiapkan konfigurasi build: make mx6ull_14x14_evk_defconfig. Ini hanya berfungsi jika konfigurasi ada di Das U-Boot itu sendiri, jika tidak, Anda perlu menemukan konfigurasi pabrikan dan meletakkannya di root repositori di file .config, atau dirakit dengan cara lain yang direkomendasikan oleh pabrikan.
  4. Kami mengumpulkan image bootloader itu sendiri dengan cross-compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Hasilnya, kami mendapatkan file tersebut u-boot.imx, ini adalah gambar siap pakai yang dapat ditulis ke flash drive USB. Kami menulis ke kartu SD, melewatkan 1024 byte pertama. Mengapa saya memilih target u-boot.imx? Mengapa melewatkan tepat 1024 byte? Inilah yang mereka usulkan untuk dilakukan dokumentasi. Untuk papan lain, proses pembuatan dan pembakaran gambar mungkin sedikit berbeda.

Selesai, Anda dapat mengunduh. Pemuat boot harus melaporkan versinya sendiri, beberapa informasi tentang papan, dan mencoba menemukan imej kernel pada partisi. Jika gagal, ia akan mencoba melakukan booting melalui jaringan. Secara umum, keluarannya cukup detail, Anda dapat menemukan kesalahan jika terjadi masalah.

Alih-alih sebuah kesimpulan

Tahukah Anda bahwa dahi lumba-lumba tidak bertulang? Ini benar-benar mata ketiga, lensa gemuk untuk ekolokasi!

Memulai GNU/Linux di papan ARM dari awal (menggunakan Kali dan iMX.6 sebagai contoh)

Memulai GNU/Linux di papan ARM dari awal (menggunakan Kali dan iMX.6 sebagai contoh)

Sumber: www.habr.com