从头开始在 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 为例)

来源: habr.com