分类: 未分类
树莓派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模式
| 1 | sudo vim /etc/default/rpi-eeprom-update |
FIRMWARE_RELEASE_STATUS=”stable”
更新BOOTLOADER
| 1 | sudo 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
重启
| 1 | sudo 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
| 1 | sudo 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
debian安装imagick
sudo apt-get install php7.4 php7.4-common gcc sudo apt-get install imagemagick sudo apt-get install php-imagick service apache2 reload php -m | grep imagick
安装mbstring
sudo apt-get install php-mbstring
安装intl
sudo apt-get install php-intl
安装zip
sudo apt-get install php-zip
树莓派搜索包含特定字符的文件
grep -rn -R "about-banner-image-1.jpg" *
* : 表示当前目录所有文件,也可以是某个文件名 -r 是递归查找 -n 是显示行号 -R 查找所有文件包含子目录 -i 忽略大小写 下面是一些有意思的命令行参数: grep -i pattern files :不区分大小写地搜索。默认情况区分大小写, grep -l pattern files :只列出匹配的文件名, grep -L pattern files :列出不匹配的文件名, grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’), grep -C number pattern files :匹配的上下文分别显示[number]行, grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行, grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。 这里还有些用于搜索的特殊符号: \< 和 \> 分别标注单词的开始与结尾。 例如: grep man * 会匹配 ‘Batman’、‘manic’、‘man’等, grep '\<man' * 匹配‘manic’和‘man’,但不是‘Batman’, grep '\<man\>' 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。 '^':指匹配的字符串在行首, '$':指匹配的字符串在行尾,
wget下载时解决“证书不可信”无法下载问题
下载本站文件遇到“证书不可信”等提示无法下载时,可在命令行后加入–no-check-certificate 解决
wget https://www.mixdiy.com/file.zip --no-check-certificate
bollday ssl file
https://www.mixdiy.com/wp-content/uploads/2022/11/8739040_www.zip
密码保护:mixdiy ssl file
树莓派安装SSL证书
根据自己的网站服务器来选择下载不同的ssl证书包括:
1_root_bundle.crt # 证书文件
2_xxx.xxx.xxx.crt # 证书文件
3_xxx.xxx.xxx.key # 私钥文件
配置证书
在这里,我假设你已经会配置基本的/etc/apache2/sites-available/000-default.conf这个文件来达到已经可以通过 http 的方式来访问你的站点。
在/etc/apache2这个目录下,有两个有关的目录sites-available和sites-enabled,我们进入sites-enabled目录下可以发现,里面有一个文件000-default.conf
lrwxrwxrwx 1 root root 35 Dec 28 15:24 000-default.conf -> ../sites-available/000-default.conf
实质上这个文件是/etc/apache2/sites-available/000-default.conf这个文件的软链接。
我们要配置另 ssl 证书,要依靠另一个文件,也就是default-ssl.conf,首先我们需要设置一个软链接,把这个文件链接到sites-enabled这个文件夹中:
ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf
然后去修改这个文件000-default-ssl.conf,因为已经做了软链接,其实这时候修改000-default-ssl.conf或default-ssl.conf都一样。
nano /etc/apache2/sites-enabled/000-default-ssl.conf
这个文件没有做任何修改前长这样子(去除自带的注释之后):
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
然后把下载好的证书(3个文件)传到你自定义的目录中
然后我们需要修改一下,修改成这样:
DocumentRoot /var/www/你的目录
ServerName 你的域名
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
# 注意,需要添加这三行
SSLCertificateFile 你自定义的路径/2_xxx.xxx.xxx.crt
SSLCertificateKeyFile 你自定义的路径/3_xxx.xxx.xxx.key
SSLCertificateChainFile 你自定义的路径/1_root_bundle.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
重要的三个参数的作用如下表:
配置文件参数 说明
SSLEngine on 启用 SSL 功能
SSLCertificateFile 证书文件
SSLCertificateKeyFile 私钥文件
SSLCertificateChainFile 证书链文件
改好之后保存。
然后这时,我们加载一下 Apache2 的 SSL 模块:
sudo a2enmod ssl #加载模块 sudo service apache2 restart # 重启服务
这时,在浏览器输入https://你的域名应该已经可以通过 https 的方式来访问网站了,这时浏览器那里应该也已经有了一个绿色的小锁。
但是,但是…这还不够,因为我们如果不主动输入https://的话,直接输入域名,还是会直接跳转到 80 端口的普通的 http 方式访问,所以我们需要强制使用 https 来访问
强制使用https
我们只需要打开/etc/apache2/sites-available/000-default.conf这个文件,在你的VirtualHost*:80这个标签内随便一个地方加上三行: nano /etc/apache2/sites-available/000-default.conf
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
然后保存,然后启动 Apache2 的重定向:
sudo a2enmod rewrite
然后再重启 Apache2,至此大功告成:
sudo service apache2 restart
然后,打开浏览器直接输入域名,就会自动跳转到 https 的方式。

