从头开始在ARM板上获得GNU / Linux(例如,Kali和iMX.6)

tl; dr:在程序中为ARM计算机构建Kali Linux映像debootstraplinux 然后u-boot 如果您购买了一些不是很流行的单板设备,那么可能会缺少自己喜欢的分发工具包的图像。计划中的Flipper One发生了很多相同的事情根本没有用于IMX6的Kali Linux(我在做饭),所以我必须自己构建它。











下载过程非常简单:



  1. 铁已初始化。
  2. 从存储设备的某些区域(SD卡/ eMMC等)读取并执行引导加载程序。
  3. 加载程序查找操作系统内核,并将其加载到某些内存区域中并执行。
  4. 内核将加载其余的操作系统。


这种详细程度足以满足我的任务,您可以阅读另一篇文章中的详细信息上面提到的“某些”区域因板而异,这给安装带来了一些困难。他们正在尝试使用UEFI标准化服务器ARM平台加载,但是由于并非所有人都可以使用,因此您将不得不分别收集所有内容。



构建根文件系统



首先,您需要准备这些部分。Das U-Boot支持不同的文件系统,我选择了FAT32/boot和ext3作为根,这是ARM下Kali的标准图像标记。我将使用GNU Parted,但是您可以使同一件事更加熟悉fdisk它还需要dosfstoolse2fsprogs创建一个文件系统:apt install parted dosfstools e2fsprogs



我们标记SD卡:



  1. 将SD卡标记为使用MBR标记: parted -s /dev/mmcblk0 mklabel msdos
  2. 创建一个/boot128 MB的分区:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB必须将第一个丢失的兆字节留给标记本身和引导加载程序。
  3. 我们为所有剩余容量创建一个根文件系统: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. 如果突然没有创建或更改您的分区文件,则需要执行“ partprobe”,然后将重新读取分区表。
  5. 创建带有标签的引导分区文件系统BOOTmkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. 创建一个带有标签的根文件系统ROOTFSmkfs.ext3 -L ROOTFS /dev/mmcblk0p2


太好了,现在您可以填写它了。为此,将需要一个附加的debootstrap实用程序来创建基于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 . , .
  6. . locales ( ), (dpkg-reconfigure locales tzdata). passwd.
  7. root命令设置密码passwd
  8. 为我准备图像的过程以/etc/fstab内部填充结束/mnt/


我将按照之前创建的标签进行加载,因此内容将如下所示:

标签= ROOTFS /自动错误=重新安装-RO 0 1

标签= BOOT /引导自动默认0 0


最后,您可以挂载引导分区,内核需要它:`mount / dev / mmcblk0p1 / mnt / boot /`



构建Linux



要建立对Debian的测试内核(然后启动加载器)有必要建立一套标准的GCC,GNU Make和GNU C库头文件的目标架构(我armhf),以及OpenSSL的头,操作台计算器bcbisonflexapt install crossbuild-essential-armhf bison flex libssl-dev bc由于默认情况下,引导加载程序会zImage在引导分区的文件系统中查找文件,因此该对USB闪存驱动器进行分区了。



  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/如果没有,则可以尝试查找并下载已准备好的文件,然后将该目录中的文件名传递给parameter 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



由于引导加载程序是交互式的,因此板本身,存储设备以及可选的USB-to-UART设备足以测试其运行情况。也就是说,您可以将内核和操作系统推迟到以后。



绝大多数制造商建议使用Das U-Boot进行初始引导。通常会在自己的分支中提供全面的支持,但他们不要忘记为上游做出贡献。就我而言,主板在主线中受支持,因此我忽略了fork



我们收集引导加载程序本身:



  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,这是一个现成的图像,可以写入USB闪存驱动器。我们写入SD卡,跳过前1024个字节。为什么选择目标u-boot.imx为什么我恰好跳过了1024个字节?这就是文档所建议的对于其他板,图像生成和刻录过程可能会略有不同。



完成,您可以启动。引导加载程序应报告自己的版本,一些主板信息,并尝试在分区上找到内核映像。如果不成功,它将尝试通过网络引导。通常,输出非常详细,如果出现问题,您可以找到错误。



而不是结论



您知道海豚的额头不是骨头吗?从字面上看,这是第三只眼,是回声定位的肥大镜片!










All Articles