# 引言

树莓派4B在2020年中支持了从USB存储设备引导启动,这意味着给树莓派提供了更多的可玩性和更强大的存储性能,毕竟SD卡(TF卡)的读写速度太拉跨了,使用USB引导,我们就可以将系统从SSD或者HDD中启动。 由于部分出厂较早的树莓派是不支持USB引导的,原因并不是硬件不支持,而是EEPROM固件不支持,此时我们需要手动将EEPROM固件升级到2020-09-03版本,当然,得益于社区支持,以及树莓派4B目前是Ubuntu认证设备,升级EEPROM固件并不是一个复杂的工作,接下来我将会提供两个升级方式供大家选择。

如果你有一张TF卡,并且已经写入了Ubuntu Server 20.04 (20.10)系统,我建议你采用方式1,如果手头的SD卡(TF)卡是空卡,则也可以使用方式2,如果是刚接触小板子的萌新,建议选择方式2。

# 方式1:使用rpi-eeprom

  1. 安装rpi-eeprom,如果已安装,建议先更新一下。
sudo apt install -y rpi-eeprom
  1. 将当前引导加载程序配置写入到文本。
sudo vcgencmd bootloader_config > bootconf.txt

此时通过cat命令你如果看到如下格式的内容,说明引导配置成功导出了。

root@Raspberry-Pi4:/home# cat bootconf.txt 
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0xf41
  1. 修改引导模式的优先级,通过sed命令,将BOOT_ORDER选项的值改为0xf41,如果你喜欢nano或者vim也可以使用nano和vim对选项进行修改。
sed -i -e '/^BOOT_ORDER=/ s/=.*$/=0xf41/' bootconf.txt

ps:其实2020-09-03版本的EEPROMbootloader配置默认的BOOT_ORDER值就是0xf41,如果走到这一步你发现这个值已经是0xf41了 ,可以使用sudo vcgencmd bootloader_version命令确认下bootloader版本,如果是2020-09-03版本则无需再更新EEPROM了。命令输出的内容大致长下面这个样

root@Raspberry-Pi4:/home# sudo vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103
update-time 0
capabilities 0x00000000

也可以使用sudo rpi-eeprom-update命令查看EEPROM固件版本。

root@Raspberry-Pi4:/home# sudo rpi-eeprom-update
BCM2711 detected
VL805 firmware in bootloader EEPROM
BOOTLOADER: up-to-date
CURRENT: Thu Sep  3 12:11:43 UTC 2020 (1599135103)
 LATEST: Thu Sep  3 12:11:43 UTC 2020 (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/default
VL805: up-to-date
CURRENT: 000138a1
 LATEST: 000138a1

这里插入点刘同学的碎碎念:这里我来解释下0xf41是个啥意思,毕竟啃了好大一会英文文档,如果不分享给大家,有点点不太好,哈哈哈。

首先是0xf前缀,也就是RESTART模式,他会重复尝试配置的引导顺序,1代表从SD卡启动,4代表从USB存储设备上启动,启动顺序由启动代码从右到左开始尝试,0xf41意味着会优先尝试从SD卡启动,如果没插卡,或者卡上没有系统则尝试从USB存储设备启动,并且按照这个顺序持续尝试。

附表

Value Mode Description
0x1 SD CARD SD card (or eMMC on Compute Module 4)
0x2 NETWORK Network boot
0x3 RPIBOOT RPIBOOT - See usbboot (since 2020-09-03)
0x4 USB-MSD USB mass storage boot (since 2020-09-03)
0x5 BCM-USB-MSD USB 2.0 boot from USB Type-C socket or USB Type-A socket on CM4 IO board. (since 2020-12-14)
0xe STOP Stop and display error pattern (since 2020-09-03). A power cycle is required to exit this state.
0xf RESTART Start again with the first boot order field. (since 2020-09-03)

在树莓派基金会官网上,提供了详细的bootloader config文档,如果你有兴趣可以去阅读一下。

Raspberry Pi 4 bootloader configuration

  1. 使用修改后的文本配置生成新的EEPROM副本。
rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt /lib/firmware/raspberrypi/bootloader/critical/pieeprom-2020-09-03.bin
  1. 配置下次重启时输入新的EEPROM固件。
sudo rpi-eeprom-update -d -f ./pieeprom-new.bin
  1. 重启以应用更改
sudo reboot

# 方式2:使用Raspberry Pi Imager

Raspberry Pi Imager 可在树莓派基金会官网获取

  1. 打开Raspberry Pi Imager,点击CHOOSE OS选择Misc Utillty images

选择Misc Utillty images

  1. 选择2020-9-14版本的EEPROM固件(实际就是2020-09-3版本)

选择固件

3.选择要写入的存储设备(必须是SD/TF卡),刷入,将卡插入树莓派,给树莓派通电即可,大约60s就能完成刷入,之后断电拔卡就行了。

# 哪些系统支持直接从USB存储设备启动?

首先Raspberry PI OS 是肯定支持的。

Ubuntu 系列,目前直接确认支持的有Ubuntu Server 20.10Ubuntu Desktop 20.10

至于Ubuntu Server 20.04.1则需要通过一些特殊的方式使其支持,至于这两天要发布的Ubuntu Server 20.04.2我还没测试过,不过大概率的会支持.

# 目前兼容的USB适配器有哪些?

James A. Chambers测试并维护了一个支持列表,里面包含了目前已知工作良好以及无法工作的设备列表,我就不直接放列表了,放了页面地址,大家可以自行查看。

兼容的usb适配器列表