树莓派4b外接硬盘启动

想用几台树莓派做一些微服务和集群的测试,但sd卡作为系统盘一直是树莓派的诟病和性能瓶颈,sd卡寿命短,传输速率慢,查了下资料,发现只要更新2020-09-03或更高版本的Bootloader,Raspberry Pi OS 2020-08-20或更高版本的系统,就可以原生支持从网络或硬盘启动。

如果你的系统早于2020-08-20安装,需要手动更新系统到最新。

1
2
sudo apt update
sudo apt full-upgrade

编辑/etc/default/rpi-eeprom-update,更改为stable模式

1sudo vim /etc/default/rpi-eeprom-update

FIRMWARE_RELEASE_STATUS=”stable”

更新BOOTLOADER

1sudo rpi-eeprom-update -a

截止到2021-03-04,最新的BOOTLOADER为

BCM2711 detected
Dedicated VL805 EEPROM detected
Checking for updates in /lib/firmware/raspberrypi/bootloader/stable
Use raspi-config to select either the default-production release or latest update.
BOOTLOADER: up-to-date
CURRENT: 2021年 02月 16日 星期二 13:23:36 UTC (1613481816)
LATEST: 2021年 02月 16日 星期二 13:23:36 UTC (1613481816)
RELEASE: stable
VL805: up-to-date
CURRENT: 000138a1
LATEST: 000138a1

重启

1sudo reboot

有文章说需要运行sudo raspi-config,设置第六项(Advanced Options)里的Boot Order,选择Usb Boot,但不是必须设置,只要不塞SD卡,系统会自动从USB启动。

以上完成后,可以将原sd卡的系统和文件全部迁移到SSD上,可以用系统自带的SD Card Copier

还可以使用命令

1
2
3
df -h #查看存储设备的名称
#/dev/mmcblk0为sd卡 /dev/mmcblk0为ssd
sudo dd if=/dev/mmcblk0 of=/dev/sda bs=4M

也可以使用读卡器直接克隆到ssd,自行发挥

然后拔掉sd卡,插上ssd,顺利的话,系统可以正常启动,从此告别sd卡。

但我的设备(奥睿科透明2.5硬盘盒+Samsung SSD)没法正常启动,屏幕卡在黑屏或提示:

mmc1:Controller never released inhibit bit(s)….

硬盘灯一秒钟闪烁一次,ssd硬盘不停读盘,换了一个有源硬盘盒可以顺利启动,以为是电压不足的原因,买了带供电的usb hub尝试后失败,换了带辅助供电的usb3.0硬盘线,但线材没做防倒流设计,直接给树莓派usb口反相供电,绕过了电压过载保护,容易烧坏主板,此方案也失败,查了资料说树莓派usb端口可以提供1.2A的电流,我的ssd功耗才0.9A,没道理供电不足,买了根micro hdmi线材接到显示器并没有出现电压不足的闪电标志,电源灯也没闪烁,排除了供电问题。

官方论坛里查到系统在启动时会延迟USB端口供电,默认为1秒,有人通过修改配置USB_MSD_PWR_OFF_TIME=0可以解决无法启动的问题

1
2
# BOOTLOADER在2021-01-11之前的版本可以尝试
sudo -E rpi-eeprom-config –edit

但在2021-01-11以后的BOOTLOADER版本中,这个问题已经不存在了。

那就是硬盘盒的问题了,果然官方文档上有描述:

This is especially important with USB SATA adapters which may be supported by the bootloader in mass storage mode but fail if Linux selects USB Attached SCSI – UAS mode.
See this forum thread about UAS and how to add usb-storage.quirks to workaround this issue.

大概意思是,如果硬盘盒厂商没有完全实现UAS协议或者系统内支持UAS设备列表里没有厂商发布的产品ID号,SSD访问速度就会变得奇慢或者无法访问。

需要手动修改/boot/cmdline.txt文件,添加设备信息

1
2
# 首先查看驱动器型号
lsusb

Bus 002 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

1sudo vim /boot/cmdline.txt

在文件的最前面添加usb-storage.quirks=152d:0578:u 152d:0578为你通过lsusb命令实际查询设备id号

usb-storage.quirks=152d:0578:u console=serial0,115200 console=tty1 root=PARTUUID=dc77c2e2-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

重启后可以从SSD正常启动了,可以放心折腾了。

进行速度对比测试

1
2
3
4
5
6
7
8
9
10
11
12
13
# sd卡启动
pi@raspberrypi:~ $ dd if=/dev/zero of=test bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出

1048576000 bytes (1.0 GB, 1000 MiB) copied, 39.5912 s, 26.5 MB/s

#ssd启动
pi@raspberrypi:~ $ dd if=/dev/zero of=test bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.63597 s, 186 MB/s

提升效果还是很明显的

起初以为树莓派ssd启动和windows进PE系统一样简单,草率google了下就以为是电源问题,买了两次供电设备都没效果,又尝试解决延迟usb供电的问题,原来那些文章都已经过时了,官方的文档和最新的论坛帖子才是正道,因此走了很多弯路,可能因为太冷门,对于硬盘无法启动树莓派的内容,国内几乎搜不到合适的文章,所以在这分享一下,看到的朋友不要在这浪费时间了。

总结:

如果电源灯间歇性闪烁,外接屏幕有闪电符号显示,启动的设备标注功耗超过1A,或使用普通硬盘或3.5英寸的硬盘,就需要使用外接硬盘供电。

官方电源说明
https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md

排除电源问题后系统还卡在启动画面或者系统检测时间很久,那可能是硬盘设备问题,可以使用上面的解决方案。

参考:
https://www.tomshardware.com/how-to/boot-raspberry-pi-4-usb
https://www.raspberrypi.org/forums/viewtopic.php?t=303260
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md
https://github.com/raspberrypi/firmware/issues/1515
https://www.raspberrypi.org/forums/viewtopic.php?t=245931
https://www.raspberrypi.org/forums/viewtopic.php?t=245348
https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=304255

https://www.fraee.com/2021/03/04/rpi-boot-from-ssd.html