debootstrap
,linux
然后u-boot
。
如果您购买了一些不是很流行的单板设备,那么可能会缺少自己喜欢的分发工具包的图像。计划中的Flipper One发生了很多相同的事情。根本没有用于IMX6的Kali Linux(我在做饭),所以我必须自己构建它。
下载过程非常简单:
- 铁已初始化。
- 从存储设备的某些区域(SD卡/ eMMC等)读取并执行引导加载程序。
- 加载程序查找操作系统内核,并将其加载到某些内存区域中并执行。
- 内核将加载其余的操作系统。
这种详细程度足以满足我的任务,您可以阅读另一篇文章中的详细信息。上面提到的“某些”区域因板而异,这给安装带来了一些困难。他们正在尝试使用UEFI标准化服务器ARM平台的加载,但是由于并非所有人都可以使用,因此您将不得不分别收集所有内容。
构建根文件系统
首先,您需要准备这些部分。Das U-Boot支持不同的文件系统,我选择了FAT32
/boot
和ext3作为根,这是ARM下Kali的标准图像标记。我将使用GNU Parted,但是您可以使同一件事更加熟悉fdisk
。它还需要dosfstools
并e2fsprogs
创建一个文件系统:apt install parted dosfstools e2fsprogs
。
我们标记SD卡:
- 将SD卡标记为使用MBR标记:
parted -s /dev/mmcblk0 mklabel msdos
- 创建一个
/boot
128 MB的分区:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
。必须将第一个丢失的兆字节留给标记本身和引导加载程序。 - 我们为所有剩余容量创建一个根文件系统:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- 如果突然没有创建或更改您的分区文件,则需要执行“ partprobe”,然后将重新读取分区表。
- 创建带有标签的引导分区文件系统
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- 创建一个带有标签的根文件系统
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
太好了,现在您可以填写它了。为此,将需要一个附加的
debootstrap
实用程序来创建基于Debian的根文件系统操作系统apt install debootstrap
。
我们收集FS:
- 将分区安装到
/mnt/
(使用更方便的安装点):mount /dev/mmcblk0p2 /mnt
- :
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
.--include
, QEMU.chroot
ARM-.man debootstrap
. , ARM-armhf
. - -
debootstrap
, :chroot /mnt/ /debootstrap/debootstrap --second-stage
- :
chroot /mnt /bin/bash
-
/etc/hosts
/etc/hostname
. , . - .
locales
( ), (dpkg-reconfigure locales tzdata
).passwd
. - 为
root
命令设置密码passwd
。 - 为我准备图像的过程以
/etc/fstab
内部填充结束/mnt/
。
我将按照之前创建的标签进行加载,因此内容将如下所示:
标签= ROOTFS /自动错误=重新安装-RO 0 1
标签= BOOT /引导自动默认0 0
最后,您可以挂载引导分区,内核需要它:`mount / dev / mmcblk0p1 / mnt / boot /`
构建Linux
要建立对Debian的测试内核(然后启动加载器)有必要建立一套标准的GCC,GNU Make和GNU C库头文件的目标架构(我
armhf
),以及OpenSSL的头,操作台计算器bc
,bison
和flex
:apt install crossbuild-essential-armhf bison flex libssl-dev bc
。由于默认情况下,引导加载程序会zImage
在引导分区的文件系统中查找文件,因此该对USB闪存驱动器进行分区了。
- 克隆核心太长,因此只需下载:
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
- 编译前配置:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
。配置位于目录中arch/arm/configs/
。如果没有,则可以尝试查找并下载已准备好的文件,然后将该目录中的文件名传递给parameterKBUILD_DEFCONFIG
。作为最后的选择,直接进入下一点。 - (可选)您可以调整设置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- 我们将编译图像:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- 现在,您可以使用内核复制文件:
cp arch/arm/boot/zImage /mnt/boot/
- 以及带有DeviceTree的文件(板上可用硬件的描述):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- 并安装组装成单独文件的模块:
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。
我们收集引导加载程序本身:
- :
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- :
cd u-boot
- :
make mx6ull_14x14_evk_defconfig
. Das U-Boot,.config
, . - -
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
结果,我们得到一个文件
u-boot.imx
,这是一个现成的图像,可以写入USB闪存驱动器。我们写入SD卡,跳过前1024个字节。为什么选择目标u-boot.imx
?为什么我恰好跳过了1024个字节?这就是文档所建议的。对于其他板,图像生成和刻录过程可能会略有不同。
完成,您可以启动。引导加载程序应报告自己的版本,一些主板信息,并尝试在分区上找到内核映像。如果不成功,它将尝试通过网络引导。通常,输出非常详细,如果出现问题,您可以找到错误。
而不是结论
您知道海豚的额头不是骨头吗?从字面上看,这是第三只眼,是回声定位的肥大镜片!