才发现树莓派4B明明是64位的机器,原来装的却是32位的系统,于是进行升级。虽然可以通过修改 /boot/config.txt 载入64位内核,但是也仅仅是内核是64位的,其他所有程序都还是32位的,设成64位的源也无法升级。于是只能重做64位系统。本来以为很简单的事,结果却踩了好多坑!
无法启动
心想直接从官网 https://www.raspberrypi.com/software/ 下载烧录程序和镜像,应该没问题啊。于是下载了最新的64位系统(基于 Debian 11,bullseye,https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit),镜像文件是xz压缩的,近800M。然后使用官方的烧录程序,选择这个 .img.xz 镜像文件烧录。进过烧录完兴冲冲插到派上开机,七寸LCD屏幕一直灰屏并闪来闪去,过了很久也没有进入系统。烧录时我设置了wifi热点和密码以及启用了ssh,升级前的IP是192.168.0.105,于是ping这个IP怎么也不通,查看路由器的联网设备也没有派。于是认定新的64位系统可能有问题,没法正常启动。以为是烧录不正确,于是把 .img.xz 文件解压为 .img 后重新烧录了一下,结果症状还是一样,问题依旧。
因为升级前我执行过 sudo rpi-update 命令,网上说最好不要执行这个命令,这是升级固件的,弄不好可能损坏固件导致无法启动。于是又搜关于固件的问题,看了修复EEPROM的视频,重做了一下,但其实固件应该没问题,因为并没有视频中所说的绿灯不亮的症状。更新完固件后再尝试启动系统,还是不行。于是想会不会是这个64位的系统有问题?便又从官方下载了较早版本的32位镜像,再次烧录,结果还是不行。又尝试在win10上烧录,之前都是在linux上烧录的,但win10上的官方软件用法和烧录过程和linux下也完全一样,结果自然也没有什么不同。
后来又问商家客服,他们说烧录前得用 SDFormater 正确格式化才行,然后再用 Win32 Disk Image Writer 进行烧录,网上找到的教程也基本上都是这么说的。但我觉得很奇怪,官方的提供的烧录工具没道理不行啊,为什么非要用第三方的工具呢?官方烧录后,TF卡被分成了两个区,一个是 fat32 的 256MB 的boot分区,另一个是linux格式分区。尝试用 SDFormater 格式化之后,果然不太一样,因为那个fat32的分区只有六七十MB,但依然是有一个linux分区。这么看来也没什么不同,只是分区大小的区别。于是我先没有用 win32 那个进行烧录,而是还用官方的烧录了一次最新的64位系统。再次启动,发现问题依旧!
屏幕问题
虽然之前所有的尝试过程中,屏幕都是灰的并啥都不显示,但是接上的鼠标点右键时屏幕上相应位置却出现了一个模糊的矩形区域。于是想到会不会系统其实已经启动了,只是显示不正常,否则不应该对鼠标右键有响应的啊。可是既然启动了为什么网络连不上呢?我明明设了wifi啊!干脆直接查网线!于是用网线直接把树莓派连到路由器上,查看路由器管理界面找到了新出现的树莓派IP,变成了 192.168.0.106,尝试ssh登录,进去了!看来确实是屏幕问题,其实折腾半天都被屏幕误导了,系统镜像一开始烧录的就没问题,能够正确进入系统,只是屏幕啥都没显示而已!其实回想一下,因为对电源指示灯不太熟悉,并不清楚之前的指示灯是否正常,之前都是启动时红灯亮绿灯闪,之后绿灯灭红灯常亮,其实系统正常启动后就是绿灯灭红灯常亮的。由此可见,如果用官方工具烧录,它自动就格式化了,所谓SDFormater根本没必要!
WIFI问题
既然系统启动了,网络也是通的,那通过vnc连接到图形界面,尝试连接无线网,那个5G的网络选了以后总是连不上,而且有时根本就不显示那个5G的网络,而是先连上2.5G的后才会出现5G的,但连又连不上。一查,原来才知道是因为wifi的国家/地区设置不对,因为不同国家/地区用的5G频段不同,没设置正确的话就可能无法正确连接,于是正确设置国家后就能连接5G的wifi了。于是才明白,为什么明明在烧录之前设了wifi却在启动时一直没有网络,原来是因为我设的是那个5G的wifi,它默认设置下连不上!于是网络连不上和屏幕不显示两个问题让我误以为是镜像没烧录正确,折腾了好半天!
尝试解决屏幕问题
这个7寸屏是1024x600分辨率的电容式触摸屏,必须以这个分辨率显示时才能正常进行触摸,否则摸的位置和实际响应的位置不匹配,几乎没法使用。但现在的问题是根本不显示,先让它显示了再说。问客服,说是要装驱动,从 GitHub - waveshare/LCD-show 上 clone 代码下来,进入 LCD-show 目录,以root运行 ./LCD7C-show 命令安装驱动,于是照做,运行完以后派就自动重启了,结果重启后屏幕依然不显示。一搜发现有好多人说64位系统里这个驱动不管用了,问客服他们也暂时无法解决,说之前都是在32位系统上用的没问题。看了一下,发现所谓的驱动其实只是一个脚本,主要是备份了一些文件并主要修改 /boot/config.txt 文件,加了如下设置
[all]
#dtoverlay=vc4-fkms-v3d
hdmi_force_hotplug=1
dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
display_rotate=0
max_usb_current=1
config_hdmi_boost=7
hdmi_group=2
hdmi_mode=87
hdmi_drive=1
hdmi_cvt 1024 600 60 6 0 0 0
于是尝试修改这些设置,主要是注释掉某些看管不管用,结果一系列的修改重启,最后发现,只要把 hdmi_force_hotplug=1
注释掉,重启后屏幕就能显示,但分辨率不对,进入系统运行 xrandr 命令可查看当前的分辨率,是 1366x768。vnc显示的是完整的 1366x768 的分辨率而屏幕上只显示了左上的一部分,并不完全,而且触摸也显然是不准确的。其他几个参数好像没什么效果,只要保留如下几个就都是屏幕能显示但分辨率不对的结果
max_usb_current=1
hdmi_group=2
hdmi_mode=87
hdmi_drive=1
hdmi_cvt 1024 600 60 6 0 0 0
其中 hdmi_drive
是1只传画面,是2是传画面和声音;hdmi_group=2
指定使用 DMI 的分辨率方式指定,该模式预定义的 hdmi_mode
只到 86(86的分辨率就是1366x768),87及之后的我猜应该是用户自定义的模式了。而hdmi_cvt
设置的分辨率应该是没有生效。而hdmi_force_hotplug
是强制假设hdmi是热插拔的,所以当不接屏幕时也能获取分辨率,否则就只能在真接了hdmi屏幕后才能获取分辨率。这个对vnc是有影响的,后面提。经过一系列瞎尝试,也没有找到合适设置能是屏幕正常显示。比如,如果启用 hdmi_ignore_edid=1
则虽然 vnc 的屏幕分辨率变成了设置的 1024x600 但屏幕却又不显示了。
其实屏幕官方的资料显示,这个 7inch HDMI LCD(C) 的显示器是不需要驱动的,见 https://www.waveshare.com/w/index.php?title=7inch_HDMI_LCD_(C)&oldid=13959 需要的只是合适的配置。当然也不排除64位系统本身的不完善导致的一些bug。比如 cat /proc/cpuinfo 查看cpu信息时得到是 BCM2835,但该款cpu实为BCM2711(虽然2835编号高,但却是性能较低的老款)。
vnc
树莓派上预装的是realvnc,默认只启用了其 :0 通道,即与屏幕上显示的(假设屏幕正常显示的话)内容一样。但如果要让屏幕有显示,就得注释掉hdmi_force_hotplug=1
,但平时使用又用不到屏幕,把屏幕拔掉以后,结果 :0 通道 vnc 啥都不显示了(注:启用hdmi_force_hotplug=1
是可以正常显示 :0 通道的)!于是想到要不日常用 :1 通道。本来想通过服务自动启动 :1 通道,结果 realvnc 的 vncserver-virtuald 服务无法正常启动,说是没有许可证。原来 realvnc 的服务端是商业软件,要启用 :0 之外的通道需要许可,即使 :0 通道也是有限制的,可能是和树莓派有合作才许可开启本地服务(5900端口),自己在ubuntu上装根本不会开启5900端口,而是只能云连接,不过需要到他们官网注册账号,免费用户可建5个链接,这倒也不错,提供了一个远程访问的方案,虽然有时候用着很卡。
于是只能手动运行 vncserver :1 -geometry 1280x800 来启动 :1 通道。不过进入 :1 桌面后发现桌面不完整,没有面板和菜单,就只有一个光秃秃的桌面,但默认的 :0 通道则一切正常。虽然在 :1 中运行 lxpanel 可以在屏幕底下出现菜单,但是显示的不是很完整,也不好看。如果运行 :0 中类似的命令 lxpanel -p LXDE-pi 却提示什么终端功能有限无法运行之类的。于是安装 mate-session,在 :1 中手动运行 mate-session 则会出现 mate 桌面,除了鼠标是个x以外别的倒还行。不过好像 ~/.vnc/xstartup 似乎没用,其中指定了 mate-session 并没有效果。
vim无法复制的问题
树莓派下默认vim汇总的内容如果用鼠标选择则显示为“可视”状态,并无法复制,很是烦人。其实只需要修改 /usr/share/vim/vim82/defaults.vim
文件,将下面代码中的 set mouse=a
改为 set mouse-=a
即可。
if has('mouse')
if &term =~ 'xterm'
set mouse=a
else
set mouse=nvi
endif
endif