從頭開始在 ARM 板上啟動 GNU/Linux(以 Kali 和 iMX.6 為例)

TL;博士:我正在為 ARM 計算機構建 Kali Linux 映像,在程序中 debootstrap, linux и u-boot.

從頭開始在 ARM 板上啟動 GNU/Linux(以 Kali 和 iMX.6 為例)

如果您購買了一些不太受歡迎的單一付款人,您可能會遇到缺少您最喜歡的分發包圖像的情況。 幾乎同樣的事情發生在 計劃中的鰭狀肢一號. 根本就沒有IMX6的Kali Linux(我在做飯),只好自己組裝了。

下載過程非常簡單:

  1. 硬件已初始化。
  2. 從存儲設備(SD 卡/eMMC/等)上的某個區域讀取並執行引導加載程序。
  3. 加載程序查找操作系統內核並將其加載到某個內存區域並執行它。
  4. 內核加載操作系統的其餘部分。

對於我的任務,這種詳細程度就足夠了,您可以閱讀詳細信息 在另一篇文章中. 上面提到的“一些”區域因板而異,這會造成一些安裝困難。 加載服務器 ARM 平台 試圖標準化 使用 UEFI,但只要不是對每個人都可用,您就必須單獨收集所有內容。

構建根文件系統

首先,您需要準備部分。 Das U-Boot支持不同的文件系統,我選擇的是FAT32 /boot ext3 代表 root,這是 ARM 下 Kali 的標準圖像標記。 我將使用 GNU Parted,但你可以使它更熟悉 fdisk. 您還需要 dosfstools и e2fsprogs 創建文件系統: apt install parted dosfstools e2fsprogs.

對SD卡進行分區:

  1. 將 SD 卡標記為使用 MBR 分區: parted -s /dev/mmcblk0 mklabel msdos
  2. 創建一個部分 /boot 對於 128 兆字節: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. 第一個丟失的兆字節必須留給標記本身和引導加載程序。
  3. 為其餘容量創建根 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,一個用於在類 Debian 操作系統上創建根 FS 的實用程序: 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/.

我會按照之前創建的標籤上傳,所以內容是這樣的:

標籤 = ROOTFS / 自動錯誤 = 重新安裝-ro 0 1
LABEL=BOOT /boot 自動預設值 0 0

最後,你可以掛載引導分區,我們需要它作為內核:`mount /dev/mmcblk0p1 /mnt/boot/`

構建 Linux

要在 Debian Testing 上構建內核(然後是引導加載程序),您需要為目標體系結構安裝標準的 GCC、GNU Make 和 GNU C 庫頭文件集(我有 armhf),以及 OpenSSL 標頭、控制台計算器 bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. 由於默認加載程序查找文件 zImage 在引導分區的文件系統上,是時候打破閃存驅動器了。

  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 引導

由於引導加載程序是交互式的,開發板本身、存儲設備和可選的 USB 轉 UART 設備足以測試其運行情況。 也就是說,您可以將內核和操作系統推遲到以後使用。

絕大多數廠商建議使用 Das U-Boot 進行主引導。 完全支持通常在其自己的分支中提供,但不要忘記在上游做出貢獻。 就我而言,董事會支持 主線, 這就是為什麼 我沒理。

我們收集引導加載程序本身:

  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. 我們使用交叉編譯器收集引導加載程序映像本身 armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

結果,我們得到了文件 u-boot.imx,這是一個現成的鏡像,可以寫入U盤。 我們寫入 SD 卡,跳過前 1024 個字節。 我為什麼選擇目標 u-boot.imx? 為什麼恰好錯過了 1024 個字節? 這就是他們打算在 文件. 對於其他板,圖像構建和刻錄過程可能略有不同。

完成了,可以下載了。 引導加載程序應該報告它自己的版本,一些關於主板的信息,並嘗試在分區上找到內核映像。 如果失敗,它將嘗試通過網絡啟動。 總的來說,輸出的還是比較詳細的,遇到問題可以找找錯誤。

取而代之的是結論

你知道海豚的前額不是骨頭嗎? 它實際上是第三隻眼,一個用於迴聲定位的脂肪晶狀體!

從頭開始在 ARM 板上啟動 GNU/Linux(以 Kali 和 iMX.6 為例)

從頭開始在 ARM 板上啟動 GNU/Linux(以 Kali 和 iMX.6 為例)

來源: www.habr.com