11月在实验室发现了树莓派4B,一种arm处理器的微型开发板。在此之前在多个地方均已见过"树莓派"这个名词,但一直不知道是什么玩意儿。且早已听闻arm架构大有可为,吹得牛哔的都快把x86干下来了。于是兴趣来了,便折腾折腾一下这玩意儿。至今已有两个月了,便总结一下捣鼓树莓派至今的经验,与遇到的问题,以及solution。
本文图片较少,因为本该需要图片的前半部分并不是总结的重点,只是记叙;后半部分才是重点。
使用
我拿到的树莓派型号是4B,在此先记录一下如何安装系统,让其正常使用起来。
首先需要进行软硬件准备。
软件准备
其一,系统镜像。推荐使用官方的Raspberry Pi OS,基于debian的11和12两个版本。为什么推荐使用官方系统,在下文会解释
其二,刷写软件,用于将系统镜像写入存储器(tf卡)。推荐使用官方的Raspberry Pi Imager。需要注意的是,该软件的1.8.x版本最低支持Ubuntu22。网络上存在各种奇葩逆天的刷写工具和方式,将镜像写入TF卡的,但既然官方都有提供,为何不用呢。另外官方工具还提供了一些简单配置功能,例如配置用户,配置连接的wifi,在写入系统时就能将这些配置好。
硬件准备
其一,TF卡。又叫内存卡,或者micro SD卡。树莓派提供的存储介质接口之一便是tf卡槽,在板子的背面。因此一张内存卡是必要的,用来装启动分区以及系统等。虽说树莓派还提供了USB和RJ45接口,但能否通过这两种接口来启动,我并未尝试过,不清楚是否有可行性
其二,读卡器(或者其他能使电脑读写TF卡的介质)。用于使电脑与TF卡数据互通
其三,树莓派本身,以及5V-3A的电源,接口Type-C。
此外还可以准备一些散热类工具,比如金属散热片,小风扇,盒子之类的。这些不是必须的,没有也无妨
树莓派,启动
首先下载RaspberryPiOS的镜像,在清华源中科大源均能下载。
将内存卡插入读卡器,读卡器插入电脑。通过Raspberry Pi Imager将系统镜像写入内存卡中(具体操作官方有文档),在写入之前,可以通过该软件进行主机名、用户、无线网络、ssh的配置。写入并校验的过程最多不会超过10分钟,如果太久了,可能是内存卡本身读写速度慢,或者读卡器出问题了。
将内存卡插入树莓派背部的卡槽里,接通电源,然后等待即可。首次开机需要进行大量初始化操作,因此时间长是正常的。
接通电源后,红灯会亮起,红灯是电源指示灯,亮了表示通电。绿灯会常亮或者不规则闪烁,绿灯相当于硬盘灯,在进行内存卡的读写操作时会亮起。如果绿灯有规律地闪烁,则需要去网上查一下,闪烁是什么意思,是否出了什么问题。
一段时间过后,绿灯熄灭,或者从常亮变为无规则闪烁状态,说明系统开机完成了,此时电脑就可以通过网络与ssh跟树莓派建立连接了。无线网络在写入镜像时就进行了配置。要得到树莓派的IP,有两种方法:其一是arp扫描,其二是进入无线路由器的后台,找到连接的设备,再从中找到树莓派的IP。
总结
开机
首次开机时,如果有条件,树莓派最好是通过网线与路由器连接。因为wifi有时"不可知" "不可控",即不知道目前是个什么状态,等了很久都连接不上可能是什么问题。但网线连接的话,树莓派的RJ45网口上是有指示灯的,可以通过指示灯判断目前的网络连接状态,出现连接问题也能更好地缩小问题范围。
我第一次启动树莓派时,等了10分钟左右,不见其启动完毕,绿灯一直亮着,我以为是镜像写入出问题了,便直接断电,重写。
如此反复了几次...不对劲啊。然后再等久一些,吃了顿饭回来,才在路由器后台发现它的IP,随即成功用SSH连接上。
总之因为TF卡读写速度慢,树莓派处理器性能较低,因此首次开机,甚至之后每次开机,花的时间都比较长,因此要有耐心。
操作系统
在上文中,我推荐使用官方的树莓派系统,而不推荐ubuntu,尽管我是个ubuntu吹。原因在于我尝试使用ubuntu镜像时出现了若干异常问题。
适用于树莓派的ubuntu有两个版本,一个是ubuntu本图,一直提供有arm的镜像。自20版本开始,在架构后还备注了树莓派。另一个是ubuntu core,官方说是针对IoT和边缘设备设计和优化的系统。这两个版本在实际使用中都有很大问题,以至于严重影响使用
首先是ubuntu,在此只谈server版,不提desktop版。开机是能开机,但反应速度极慢,响应时间极长。我初步判断为IO慢所导致的,因为用官方的系统时也存在这种问题,随着越来越多的数据从外存加载入内存和缓存,这种问题会缓解。
但ubuntu在很长的使用时间内依然卡慢。通过top查看cpu占用情况,跟使用hdparm查询IO读速度。我人傻了。
看到top顶部的load average,可以看到板子的处理器在15分钟内平均负载皆是满载。hdparm查询外存数据读取速度,只有200多KB/s,相比之下官方系统的读取速度有14MB/s (这个跟tf卡本身质量有关)。这么一对比下来,ubuntu这个系统有大问题,断不可留。
ubuntu core的初始化必须要外接显示器和键盘来进行,无法在写入镜像时配置好。此外,ubuntu core貌似跟snap有关。在首次启动,初始化系统时,配置好网络后,便提示找不到snap指令,然后卡着,进行不下去。
最后,还是换回官方系统, Raspberry Pi OS。还是官方的用着舒服。
网络
关于网络的配置,有线网络就不说了,插个网线谁不会。
问题在于无线。具体配置文件是/etc/wpa_supplicant/wpa_supplicant.conf
其文件形式如下
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
#一个记录的wifi接入点信息
network={
ssid="wifi1"
#不加引号的话,是通过wpa_passphrase算出的密码哈希值(具体什么哈希算法看官方文档)
psk=cf775070160f7014738d4a3ae8853945b79779fa28a9c150e361083c54706f1f
#优先级,越大越优先
priority=5
}
network={
ssid="wifi2"
#加引号的话,是密码明文
psk="12345678"
priority=10
}
network={
ssid="wifi3"
psk="12345678"
priority=20
}
理论上,未配置优先级的情况下,其会按照顺序作为优先级进行连接。
但是,在未配置优先级,且同时周围同时存在多个已保存的wifi时,它会奇怪地,每一个都不连...
所以,设置优先级是必要的,尽管这个属性可选
软件生态
arm架构的软件生态跟x86还有很大的差距,这一点是客观事实。
但好在大部分编程语言都支持arm,哪怕有不支持的软件,自己用点工夫从源码编译一下即可,麻烦一点。
这又扯出另一个话题了,编译。
在一个硬件架构平台,或者系统上,编译另一个硬件架构或者系统的程序,这个过程,叫作交叉编译。当需要运行程序的平台,不具备编译程序的能力(例如性能、内存不足),就需要另一个平台来为自己编译软件了。树莓派是arm64架构的处理器,而我用的机子是x86_64的,在我的x86机子上编译出arm64的程序,就是一个交叉编译的过程。
交叉编译需要配置复杂的工具链,写好大量的配置文件和编译参数。
麻烦!!!
看我另辟蹊径解决交叉编译问题(下一篇博文)