5.1. 在 64-bit ARM 上引导安装程序

5.1.1. 控制台配置

stretch 上的 arm64 debian-installer 映像未启用图形安装程序,所以会使用串行控制台。从固件中应该会自动检测出控制台设备,但如果没有,则从 GRUB 菜单启动 linux 后,您将看到一个 Booting Linux 的消息,然后就没了。

如果您遇到此问题,您需要在内核命令行上设置特定的控制台配置。在 GRUB 菜单中按 e,以编辑内核命令行,然后将

--- quiet

更改为

console=<device>,<speed>

,例如

console=ttyAMA0,115200n8

。完成后,按 Control+x 使用新设置继续进行引导。

5.1.2. Juno 安装

Juno 有 UEFI,所以安装很简单。最直接的方法是从 U 盘安装。您需要最新的固件以从 USB 启动。在 2015 年 3 月后的 http://releases.linaro.org/latest/members/arm/ 上测试成功。请参见有关文档更新 Juno 固件。

在 U 盘上准备一个标准的 arm64 CD 映像。将其插入背板 USB 口的其中之一。将串行电缆插入背板上的 9 针串行端口。如果您需要网络连接(网络启动映像),请将以太网电缆插入机器正面的接口中。

运行串行控制台,波特率 115200,8 位,无奇偶校验位,并启动 Juno。它应会从 U 盘启动到 GRUB 菜单。在 Juno 上检测不到正确的控制台配置,所以只是按下 Enter 将显示不了内核输出。将控制台设为

console=ttyAMA0,115200n8

(如第 5.1.1 节 “控制台配置”中所述)。Control+x 启动应该会显示 debian-installer 屏幕,然后您可以继续进行标准安装。

5.1.3. Applied Micro Mustang 安装

UEFI 可用于此机器,但通常随 U-Boot 一起提供,因此您首先需要安装 UEFI 固件,然后使用标准的引导/安装方法,或使用 U-Boot 引导方法。您必须使用串行控制台来控制安装,因为 arm64 架构上未启用图形安装程序。

推荐的安装方法是使用随机附带的 openembedded 系统,将 debian-installer 内核和 initrd 复制到硬盘驱动器上,然后从中启动以运行安装程序。或者使用 TFTP 复制 kernel/dtb/initrd 并启动(第 5.1.4.1 节 “在 U-Boot 中启动 TFTP”)。安装后,需要进行手动更改,取消从安装映像引导。

运行串行控制台,波特率 115200,8 位,无奇偶校验位,并启动机器。重启机器,当您看到 Hit any key to stop autoboot: 时,按下任意键,获得 Mustang# 提示符。然后使用 U-Boot 命令加载并引导内核、dtb 及 initrd。

5.1.4. 从 TFTP 引导

从网络引导需要网络连接和一台 TFTP 网络引导服务器 (也可能是 DHCP、RARP 或 BOOTP 服务器,以进行自动网络配置)。

参见第 4.3 节 “为使用 TFTP 网络引导准备文件”设置用于支持网络引导的服务器端。

5.1.4.1. 在 U-Boot 中启动 TFTP

使用 U-Boot 固件上的网络引导需要三个步骤:a)配置网络,b)将映像(内核/初始化内存盘/dtb)加载到内存中,c)执行预加载的代码。

首先,您必须运行

setenv autoload no
dhcp

使用 DHCP 自动配置网络,或者手动设置环境变量

setenv ipaddr <ip address of the client>
setenv netmask <netmask>
setenv serverip <ip address of the tftp server>
setenv dnsip <ip address of the nameserver>
setenv gatewayip <ip address of the default gateway>

如果您愿意,可以运行

saveenv

命令,保存这些设置。之后,您需要将映像(内核/初始化内存盘/dtb)加载到内存中。这可以通过 tftpboot 命令来完成,但该命令必须提供内存地址,然后将映像存储于此。不幸的是,内存映射因系统而异,所以没有一般规则可以预测哪些地址可用。

在某些系统上, U-Boot 预定义了一组环境变量,其中存有适当的加载地址:kernel_addr_r、ramdisk_addr_r和fdt_addr_r。您可以运行

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

,来检查它们是否已定义。如果未定义,则必须查看系统文档以获取适当的值并手动设置。对于基于 Allwinner SunXi SOC 的系统(例如Allwinner A10,架构名 sun4i 或 Allwinner A20,架构名 sun7i),您可以使用以下值:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

定义加载地址后,将映像加载到内存中,可以使用之前定义的 tftp 服务器

tftpboot ${kernel_addr_r} <内核映像文件名>
tftpboot ${fdt_addr_r} <dtb 文件名>
tftpboot ${ramdisk_addr_r} <初始化内存盘映像文件名>

第三部分是设置内核命令行并实际执行加载的代码。U-Boot 将 bootargs 环境变量的内容作为命令行传递给内核,因此内核和安装程序的任何参数(如控制台设备)(请参见第 5.3.1 节 “启动控制台”)或预设选项(请参见第 5.3.2 节 “Debian 安装程序的参数” >和附录 B, 使用预置自动进行安装) - 可以使用命令,如

setenv bootargs console=ttyS0,115200 rootwait panic=10

执行先前加载的代码的确切命令取决于所使用的映像格式。要使用 uImage/uInitrd,命令是

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

,若要使用原生 Linux 映像,则是

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

注意:引导标准的 linux 映像时,重要的是在内核和 dtb 之后加载初始化内存盘映像,因为 U-Boot 将 filesize 变量设置为最后一个加载文件的大小,并且 bootz 命令需要 ramdisk 映像的大小才能正常工作。在引导特定平台的内核时,即没有设备树的内核,省略 ${fdt_addr_r} 参数即可。