USB 启动模式警告 | 默认情况下,Raspberry Pi 从 SD 卡启动。对于新用户和没有经验的用户,这是推荐的方法。 |
---|
|
USB 有两种单独的启动模式:USB 设备启动和 USB 主机启动。 两种启动模式之间的选择由固件在启动时读取 OTP 位时进行。有两个位来控制 USB 启动。第一个启用 USB 设备启动,默认启用;第二个启用 USB 主机启动。如果设置了 USB 主机启动模式位,则处理器读取 OTGID 引脚以决定是作为主机启动(像在任何 Raspberry Pi 型号 B/B+ 上一样驱动到零)还是作为设备(左浮动)。Raspberry Pi Zero可以通过USB连接器上的OTGID引脚访问此引脚,而计算模块可以访问边缘连接器上的此引脚。 还有一些 OTP 位允许使用某些 GPIO 引脚来选择 Raspberry Pi 应尝试使用的启动模式。 USB 设备启动模式注意 | 设备启动仅在 Raspberry Pi 计算模块、计算模块 3、Raspberry Pi Zero、Zero W、A、A+ 和 3A+ 上可用。 |
---|
|
激活此启动模式后(通常在从 SD 卡启动失败后),Raspberry Pi 将其 USB 端口置于设备模式并等待主机的 USB 重置。可以在 Github 上找到显示主机需要如何与 Raspberry Pi 通信的示例代码。 主机首先将结构发送到设备关闭控制端点 0。这包含启动的大小和签名(未启用安全性,因此不需要签名)。其次,代码沿端点 1 (bootcode.bin) 传输。最后,设备将回复以下成功代码: USB 主机启动模式注意 | 主机启动仅在 Raspberry Pi 3B、3B+、3A+ 和 2B v1.2 上可用。树莓派 3A+ 仅支持大容量存储启动,不支持网络启动。 |
---|
|
USB 主机启动模式遵循以下顺序: USB 大容量存储启动注意 | 仅适用于 Raspberry Pi 2B v1.2、3A+、3B、3B+、4B、400 和 Zero 2 W,以及 Raspberry Pi 计算模块 3、3+ 和 4。 |
---|
|
您可能希望从 USB 大容量存储设备(如闪存驱动器或 USB 硬盘)启动 Raspberry Pi。连接 USB 设备(尤其是硬盘和 SSD)时,请注意它们的电源要求。如果您计划将多个 SSD 或硬盘连接到 Raspberry Pi,这通常需要外部电源 - 供电硬盘盒或供电 USB 集线器。 注意 | Raspberry Pi 4B 之前的型号存在已知问题,这些问题会阻止使用某些 USB 设备启动。 |
---|
|
Raspberry Pi 4B 和 Raspberry Pi 400Raspberry Pi 400 和更新的 Raspberry Pi 4B 主板中的引导加载程序默认支持 USB 启动,但可能需要修改BOOT_ORDER引导加载程序配置。在早期的 Raspberry Pi 4B 主板上,或者要选择备用引导模式,必须更新引导加载程序。 看: 计算模块 4请参阅刷新计算模块 eMMC 以获取引导加载程序更新说明。 Raspberry Pi 3B+Raspberry Pi 3B+ 支持开箱即用的 USB 大容量存储启动。 Raspberry Pi 2B, 3A+, 3B, CM3, CM3+, Zero 2 W在树莓派 2B v1.2、3A+、3B、零 2 W 以及计算模块 3 和 3+ 上,您必须先启用 USB 主机启动模式。这是为了允许 USB 大容量存储启动和网络启动。 注意 | Raspberry Pi 3A+ 或 Zero 2 W 不支持网络启动。 |
---|
|
要启用 USB 主机启动模式,Raspberry Pi 需要从 SD 卡启动,并带有一个特殊选项,用于在一次性可编程 (OTP) 存储器中设置 USB 主机启动模式位。设置此位后,不再需要 SD 卡。 警告 | 您对 OTP 所做的任何更改都是永久性的,无法撤消。 |
---|
|
echo program_usb_boot_mode=1 | sudo tee -a /boot/firmware/config.txt
这会将program_usb_boot_mode=1添加到 /boot/firmware/config.txt 的末尾。 尽管该选项名为 program_usb_boot_mode,但它仅启用 USB 主机启动模式。USB 设备启动模式仅适用于某些型号的 Raspberry Pi - 请参阅 USB 设备启动模式。 使用 sudo reboot 重新启动 Raspberry Pi 并检查 OTP 是否已编程: vcgencmd otp_dump | grep 17:
17:3020000a
检查是否显示输出0x3020000a。如果不是,则OTP位未成功编程。在这种情况下,请再次执行编程过程。如果仍未设置该位,则可能表示 Raspberry Pi 硬件本身存在故障。 如果您愿意,您可以从config.txt中删除program_usb_boot_mode线,因此如果您将 SD 卡放入另一个 Raspberry Pi,它不会对 USB 主机启动模式进行编程。确保config.txt末尾没有空行。 您现在可以从 USB 大容量存储设备启动,其方式与从 SD 卡启动的方式相同。有关详细信息,请参阅以下部分。 从 USB 大容量存储引导该过程与 SD 卡相同 - 只需使用操作系统映像对 USB 存储设备进行映像即可。 准备好存储设备后,连接驱动器并打开 Raspberry Pi 的电源,同时了解外部驱动器的额外 USB 电源要求。 五到十秒后,Raspberry Pi 应该开始启动并在连接的显示器上显示彩虹闪屏。确保您没有在 Raspberry Pi 中插入 SD 卡,因为如果您这样做,它将首先从该卡启动。 有关启动顺序和备用启动模式(网络、USB 设备、GPIO 或 SD 启动),请参阅启动模式文档。 已知问题注意 | 这些不适用于 Raspberry Pi 4 Model B。 |
---|
|
特殊的仅bootcode.bin启动模式重要 | 这不适用于 Raspberry Pi 4 Model B。 |
---|
|
如果您无法使用特定的 USB 设备来启动 Raspberry Pi,另一种选择(可用于 Raspberry Pi 2B v1.2、3A+、3B 和 3B+)是使用特殊的仅限bootcode.bin启动模式。Raspberry Pi 仍将从 SD 卡启动,但 bootcode.bin 是唯一从中读取的文件。 硬件兼容性在尝试从 USB 大容量存储设备启动之前,建议验证设备在 Linux 下是否正常工作。使用 SD 卡启动并插入 USB 大容量存储设备。这应该显示为可移动驱动器。这对于 USB SATA 适配器尤其重要,在大容量存储模式下,引导加载程序可能支持该适配器,但如果 Linux 选择 USB 连接 SCSI-UAS 模式,则该适配器将失败。 旋转硬盘驱动器几乎总是需要有源的 USB 集线器。即使一切看起来都正常,如果没有有源的 USB 集线器,您也可能会遇到间歇性故障。 多个可启动驱动器在搜索可引导分区时,引导加载程序会并行扫描所有 USB 大容量存储设备,并选择第一个响应的 USB 大容量存储设备。如果引导分区不包含合适的 start.elf 文件,则选择下一个可用设备。没有根据 USB 拓扑指定启动设备的方法,因为这会减慢启动速度并增加不必要且难以支持的配置复杂性。 注意 | config.txt文件条件筛选器可用于在复杂设备配置中选择备用固件。 |
---|
|
网络引导本节介绍网络启动在 Raspberry Pi 3B、3B+ 和 2B v1.2 上的工作原理。 在 Pi 4 和 Pi 5 上,网络引导在 EEPROM 的第二级引导加载程序中实现。有关更多信息,请参阅 Raspberry Pi 4 引导加载程序配置。 我们还有一个关于设置网络引导系统的教程。 网络启动仅适用于上述型号的 Raspberry Pi 中内置的有线适配器。不支持通过无线局域网引导,也不支持从任何其他有线网络设备引导。 网络启动流要进行网络引导,引导 ROM 执行以下操作: 初始化板载以太网设备(Microchip LAN9500 或 LAN7500) 发送 DHCP 请求(供应商类标识符 DHCP 选项 60 设置为 PXEClient:Arch:00000:UNDI:002001) 接收 DHCP 回复 (可选)接收 DHCP 代理回复 ARP 到 tftpboot 服务器 ARP 回复包括 tftpboot 服务器以太网地址 TFTP RRQ bootcode.bin TFTP RRQ bootsig.bin
从此时开始,bootcode.bin代码将继续加载系统。它将尝试访问的第一个文件是 <serial_number>/start.elf。如果这不会导致错误,则要读取的任何其他文件都将在serial_number之前添加。这很有用,因为它使您能够为 Raspberry Pis 创建具有单独 start.elf / 内核的单独目录。 要获取设备的序列号,您可以尝试此启动模式并查看使用 tcpdump / wireshark 访问的文件,或者您可以运行标准的 Raspberry Pi OS SD 卡和 cat /proc/cpuinfo。 如果您将所有文件放入 TFTP 目录的根目录中,则将从那里访问以下所有文件。 调试网络启动模式首先要检查的是OTP位是否正确编程。为此,您需要将 program_usb_boot_mode=1 添加到 config.txt 并重新启动(使用正确引导到 Raspberry Pi OS 的标准 SD 卡)。完成此操作后,您应该能够执行以下操作: vcgencmd otp_dump | grep 17:
如果第 17 行包含 3020000a,则 OTP 已正确编程。您现在应该能够取出 SD 卡,插入以太网,然后以太网 LED 应该在 Raspberry Pi 通电后约 5 秒亮起。 要捕获服务器上的以太网数据包,请在 tftpboot 服务器(或 DHCP 服务器,如果它们不同)上使用 tcpdump。您将需要捕获那里的数据包,否则您将无法看到直接发送的数据包,因为网络交换机不是集线器! sudo tcpdump -i eth0 -w dump.pcap
这会将 eth0 中的所有内容写入名为 dump.pcap 的文件。然后,您可以对数据包进行后处理或上传到 cloudshark 进行通信。 DHCP 请求/回复至少,您应该看到如下所示的 DHCP 请求和回复: 6:44:38.717115 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 348)
0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from b8:27:eb:28:f6:6d, length 320, xid 0x26f30339, Flags [none] (0x0000)
Client-Ethernet-Address b8:27:eb:28:f6:6d
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
Parameter-Request Option 55, length 12:
Vendor-Option, Vendor-Class, BF, Option 128
Option 129, Option 130, Option 131, Option 132
Option 133, Option 134, Option 135, TFTP
ARCH Option 93, length 2: 0
NDI Option 94, length 3: 1.2.1
GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
END Option 255, length 0
16:44:41.224619 IP (tos 0x0, ttl 64, id 57713, offset 0, flags [none], proto UDP (17), length 372)
192.168.1.1.67 > 192.168.1.139.68: [udp sum ok] BOOTP/DHCP, Reply, length 344, xid 0x26f30339, Flags [none] (0x0000)
Your-IP 192.168.1.139
Server-IP 192.168.1.1
Client-Ethernet-Address b8:27:eb:28:f6:6d
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Server-ID Option 54, length 4: 192.168.1.1
Lease-Time Option 51, length 4: 43200
RN Option 58, length 4: 21600
RB Option 59, length 4: 37800
Subnet-Mask Option 1, length 4: 255.255.255.0
BR Option 28, length 4: 192.168.1.255
Vendor-Class Option 60, length 9: "PXEClient"
GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
Vendor-Option Option 43, length 32: 6.1.3.10.4.0.80.88.69.9.20.0.0.17.82.97.115.112.98.101.114.114.121.32.80.105.32.66.111.111.116.255
END Option 255, length 0
供应商选项选项 43 包含回复的重要部分。这必须包含字符串“Raspberry Pi Boot”。由于引导 ROM 中的错误,您可能需要在字符串末尾添加三个空格。 TFTP 文件读取正确指定供应商选项后,您将看到正在发送的后续 TFTP RRQ 数据包。 RRQ 可以通过第一个数据块或错误提示未找到文件来回复。在一些情况下,他们甚至会收到第一个数据包,然后Raspberry Pi中止传输(在检查文件是否存在时会发生这种情况)。下面的示例只有三个数据包:原始读取请求、第一个数据块(始终是 516 字节,包含标头和 512 字节的数据,尽管最后一个块始终小于 512 字节,长度可能为零)和第三个数据包(包含帧号以匹配数据块中的帧号的 ACK)。 16:44:41.224964 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 49)
192.168.1.139.49152 > 192.168.1.1.69: [no cksum] 21 RRQ "bootcode.bin" octet
16:44:41.227223 IP (tos 0x0, ttl 64, id 57714, offset 0, flags [none], proto UDP (17), length 544)
192.168.1.1.55985 > 192.168.1.139.49152: [udp sum ok] UDP, length 516
16:44:41.227418 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 32)
192.168.1.139.49152 > 192.168.1.1.55985: [no cksum] UDP, length 4
已知问题以太网引导模式存在许多已知问题。由于启动模式的实现是在芯片本身中实现的,因此除了仅使用带有bootcode.bin文件的SD卡外,没有其他解决方法。 DHCP 请求在五次尝试后超时Raspberry Pi 将尝试 DHCP 请求五次,中间间隔 5 秒,总周期为 25 秒。如果服务器在这段时间内无法响应,则 Raspberry Pi 将进入低功耗状态。除了在 SD 卡上bootcode.bin之外,没有其他解决方法。 不支持单独子网上的 TFTP 服务器已在 Raspberry Pi 3 型号 B+ (BCM2837B0) 中修复。 DHCP 中继断开DHCP 检查还检查跃点值是否为 1,DHCP 中继不会这样做。 已在 Raspberry Pi 3 型号 B+ 中修复。 Raspberry Pi 启动字符串DHCP 回复中的“Raspberry Pi Boot”字符串需要额外的三个空格,因为计算字符串长度时出错。 已在 Raspberry Pi 3 型号 B+ 中修复。 DHCP UUID 常量DHCP UUID 设置为常量值。 已修复 Raspberry Pi 3 型号 B+;该值设置为 32 位序列号。 ARP 检查在 TFTP 事务中途可能无法响应Raspberry Pi 仅在初始化阶段响应 ARP 请求;一旦它开始传输数据,它将无法继续响应。 已在 Raspberry Pi 3 型号 B+ 中修复。 DHCP 请求/应答/确认序列未正确实现在启动时,Raspberry Pi 广播 DHCPDISCOVER 数据包。DHCP 服务器回复 DHCPOFFER 数据包。然后,Raspberry Pi 继续启动,而无需执行 DHCPREQUEST 或等待 DHCPACK。这可能会导致两个单独的设备获得相同的 IP 地址,并在未将其正确分配给客户端的情况下使用它。 在这种情况下,不同的 DHCP 服务器具有不同的行为。dnsmasq(取决于设置)将对 MAC 地址进行哈希处理以确定 IP 地址,并对 IP 地址执行 ping 操作以确保它尚未被使用。这减少了发生这种情况的机会,因为它需要在哈希中发生冲突。 |