Khởi động GNU/Linux trên bo mạch ARM từ đầu (sử dụng Kali và iMX.6 làm ví dụ)

tl; dr: Mình đang build image Kali Linux cho máy tính ARM, trong chương trình debootstrap, linux и u-boot.

Khởi động GNU/Linux trên bo mạch ARM từ đầu (sử dụng Kali và iMX.6 làm ví dụ)

Nếu bạn mua một số phần mềm bảng mạch đơn không phổ biến lắm, bạn có thể phải đối mặt với việc thiếu hình ảnh về bản phân phối yêu thích của bạn cho phần mềm đó. Gần như điều tương tự đã xảy ra với kế hoạch Flipper One. Đơn giản là không có Kali Linux cho IMX6 (tôi đang chuẩn bị) nên tôi phải tự lắp ráp.

Quá trình tải xuống khá đơn giản:

  1. Phần cứng được khởi tạo.
  2. Từ một số khu vực trên thiết bị lưu trữ (thẻ SD/eMMC/vv), bộ nạp khởi động được đọc và thực thi.
  3. Bộ nạp khởi động tìm kiếm nhân hệ điều hành và tải nó vào một vùng bộ nhớ nào đó rồi thực thi nó.
  4. Kernel tải phần còn lại của hệ điều hành.

Mức độ chi tiết này đủ cho nhiệm vụ của tôi, bạn có thể đọc chi tiết trong một bài báo khác. Các khu vực “một số” được đề cập ở trên khác nhau giữa các bo mạch, điều này gây ra một số khó khăn khi lắp đặt. Đang tải nền tảng máy chủ ARM cố gắng tiêu chuẩn hóa sử dụng UEFI, nhưng mặc dù điều này không có sẵn cho tất cả mọi người, bạn sẽ phải tập hợp mọi thứ một cách riêng biệt.

Xây dựng hệ thống tập tin gốc

Đầu tiên bạn cần chuẩn bị các phần. Das U-Boot hỗ trợ nhiều hệ thống tập tin khác nhau, tôi chọn FAT32 cho /boot và ext3 cho root, đây là bố cục hình ảnh tiêu chuẩn cho Kali trên ARM. Tôi sẽ sử dụng GNU Parted, nhưng bạn có thể làm tương tự theo cách quen thuộc hơn fdisk. Bạn cũng sẽ cần dosfstools и e2fsprogs để tạo một hệ thống tập tin: apt install parted dosfstools e2fsprogs.

Chúng tôi đánh dấu thẻ SD:

  1. Đánh dấu thẻ SD đang sử dụng phân vùng MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Tạo một phần dưới /boot cho 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Megabyte đầu tiên bị bỏ lỡ phải được để lại cho chính bản đánh dấu và cho bộ nạp khởi động.
  3. Chúng tôi tạo một hệ thống tập tin gốc cho toàn bộ dung lượng còn lại: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Nếu đột nhiên các tập tin phân vùng của bạn chưa được tạo hoặc chưa thay đổi, bạn cần chạy `partprobe`, khi đó bảng phân vùng sẽ được đọc lại.
  5. Tạo hệ thống file cho phân vùng khởi động có nhãn BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Tạo một hệ thống tập tin gốc có nhãn ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Tuyệt vời, bây giờ bạn có thể điền vào nó. Đối với điều này, bạn cũng sẽ cần debootstrap, một tiện ích để tạo hệ thống tệp gốc cho các hệ điều hành giống Debian: apt install debootstrap.

Chúng tôi thu thập FS:

  1. Gắn phân vùng vào /mnt/ (sử dụng điểm gắn kết thuận tiện hơn): mount /dev/mmcblk0p2 /mnt
  2. Chúng tôi thực sự điền vào hệ thống tập tin: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali... Tham số --include chỉ định cài đặt thêm một số gói, tôi đã chỉ định trình giả lập QEMU được xây dựng tĩnh. Nó cho phép bạn thực hiện chroot trong môi trường ARM. Ý nghĩa của các lựa chọn còn lại có thể được tìm thấy trong man debootstrap. Đừng quên rằng không phải bo mạch ARM nào cũng hỗ trợ kiến ​​trúc armhf.
  3. Do sự khác biệt về kiến ​​trúc debootstrap được thực hiện theo hai giai đoạn, giai đoạn thứ hai được thực hiện như sau: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Bây giờ bạn cần vặn nó lại: chroot /mnt /bin/bash
  5. Chúng tôi điền /etc/hosts и /etc/hostname mục tiêu FS. Điền giống như nội dung trên máy tính cục bộ của bạn, chỉ cần nhớ thay thế tên máy chủ.
  6. Bạn có thể tùy chỉnh mọi thứ khác. Đặc biệt, tôi cài đặt locales (khóa lưu trữ), cấu hình lại ngôn ngữ và múi giờ (dpkg-reconfigure locales tzdata). Đừng quên đặt mật khẩu bằng lệnh passwd.
  7. Đặt mật khẩu cho root đội passwd.
  8. Việc chuẩn bị hình ảnh đối với tôi kết thúc bằng việc điền vào /etc/fstab bên trong /mnt/.

Mình sẽ upload theo đúng tag đã tạo trước đó nên nội dung sẽ như thế này:

LABEL=ROOTFS / lỗi tự động=remount-ro 0 1
LABEL=BOOT /mặc định tự động khởi động 0 0

Cuối cùng, bạn có thể mount phân vùng khởi động, chúng ta sẽ cần nó cho kernel: `mount /dev/mmcblk0p1 /mnt/boot/`

Bản dựng Linux

Để xây dựng kernel (và sau đó là bộ nạp khởi động) trong Kiểm tra Debian, bạn cần cài đặt một bộ tiêu đề GCC, GNU Make và GNU C Library tiêu chuẩn cho kiến ​​trúc đích (đối với tôi armhf), cũng như các tiêu đề OpenSSL, máy tính bảng điều khiển bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Vì trình tải mặc định sẽ tìm tệp zImage trên hệ thống tập tin của phân vùng khởi động, đã đến lúc chia ổ đĩa flash.

  1. Sao chép kernel mất quá nhiều thời gian nên tôi chỉ tải xuống: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Hãy giải nén và đi đến thư mục nguồn: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Cấu hình trước khi biên dịch: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Cấu hình nằm trong thư mục arch/arm/configs/. Nếu không có, bạn có thể thử tìm và tải xuống một cái làm sẵn và chuyển tên của tệp trong thư mục này làm tham số KBUILD_DEFCONFIG. Phương án cuối cùng là chuyển ngay sang điểm tiếp theo.
  3. Tùy chọn bạn có thể điều chỉnh các cài đặt: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Và biên dịch chéo hình ảnh: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Bây giờ bạn có thể sao chép tệp kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. Và các tệp từ DeviceTree (mô tả phần cứng trên bo mạch): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Và cài đặt các module được thu thập dưới dạng file riêng biệt: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Hạt nhân đã sẵn sàng. Bạn có thể ngắt kết nối mọi thứ: umount /mnt/boot/ /mnt/

Das U-Boot

Vì bộ nạp khởi động có tính tương tác nên tất cả những gì bạn cần để kiểm tra hoạt động của nó là chính bo mạch, thiết bị lưu trữ và tùy chọn thiết bị USB-to-UART. Tức là bạn có thể hoãn kernel và OS lại sau.

Phần lớn các nhà sản xuất đề nghị sử dụng Das U-Boot cho lần khởi động đầu tiên. Hỗ trợ đầy đủ thường được cung cấp trong fork riêng của họ, nhưng họ không quên đóng góp cho thượng nguồn. Trong trường hợp của tôi, hội đồng quản trị được hỗ trợ trong đường chínhVì vậy, cái nĩa Tôi phớt lờ nó.

Hãy tự lắp ráp bootloader:

  1. Chúng tôi sao chép nhánh ổn định của kho lưu trữ: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Chúng ta hãy đi đến thư mục chính nó: cd u-boot
  3. Chuẩn bị cấu hình xây dựng: make mx6ull_14x14_evk_defconfig. Điều này chỉ hoạt động nếu cấu hình nằm trong chính Das U-Boot, nếu không, bạn sẽ cần tìm cấu hình của nhà sản xuất và đặt nó vào thư mục gốc của kho lưu trữ trong một tệp .confighoặc lắp ráp theo bất kỳ cách nào khác do nhà sản xuất khuyến nghị.
  4. Chúng tôi tự lắp ráp hình ảnh bộ nạp khởi động bằng trình biên dịch chéo armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Kết quả là chúng ta nhận được file u-boot.imx, đây là hình ảnh làm sẵn có thể được ghi vào ổ đĩa flash. Chúng tôi ghi vào thẻ SD, bỏ qua 1024 byte đầu tiên. Tại sao tôi chọn Target u-boot.imx? Tại sao tôi lại bỏ lỡ chính xác 1024 byte? Đây là những gì họ đề xuất làm trong tài liệu. Đối với các bảng khác, quá trình xây dựng và ghi hình ảnh có thể hơi khác một chút.

Xong, bạn có thể khởi động. Bộ nạp khởi động phải báo cáo phiên bản riêng của nó, một số thông tin về bo mạch và cố gắng tìm hình ảnh kernel trên phân vùng. Nếu không thành công, nó sẽ cố gắng khởi động qua mạng. Nhìn chung, đầu ra khá chi tiết, bạn có thể tìm ra lỗi nếu có vấn đề.

Thay vì một kết luận

Bạn có biết trán của cá heo không có xương? Đó thực sự là con mắt thứ ba, một thấu kính béo để định vị bằng tiếng vang!

Khởi động GNU/Linux trên bo mạch ARM từ đầu (sử dụng Kali và iMX.6 làm ví dụ)

Khởi động GNU/Linux trên bo mạch ARM từ đầu (sử dụng Kali và iMX.6 làm ví dụ)

Nguồn: www.habr.com