前進!Raspberry Pi OS 64 位元

Raspberry Pi OS 原先稱為 Raspbian,是樹梅派基金會基於 Debian 開發的樹梅派官方作業系統。一開始只有 32 為原版本,所以我自己購買的 4 代 8GB 版本(話說現在好像大缺貨,到處都買不到)可以分配使用的效能大幅受限,某種程度上來說和 4GB RAM 的差不多。一直到前年才有 64 位元的 beta 版,去年才推出正式版本。

因為一開始其實小問題不少,所以當時我並沒有馬上升級,一直觀望。直到現在過了一年了,想說應該都修得差不多了吧,沒想到我還是太天真了。這邊會記錄一下我這次升級碰到的各種問題,希望能增加一些中文資料和減少大家在 debug 上的時間。

本人使用的硬體設備:

  • Raspberry Pi 4 8GB
  • Samsung EVO Plus 64GB

安裝

之前安裝的時候,我是使用第三方工具來對記憶卡進行格式化(FAT32),同樣也是使用第三方工具直接燒錄 RPi OS;但這次發現之前格式化的工具連結已經失效了,所以這次我採用官方的映像檔工具來進行記憶卡的格式化(原先的資料都清除了,相當於是乾淨的全新安裝)及 ISO 燒錄。此工具同時提供預先設定使用者密碼、Wi-Fi 連線等設定,會在燒錄過程中也幫你弄好,就不需要再自己想辦法弄進去。

裝完之後反正就把記憶卡插上樹梅派後接上電開機,這邊就不多做說明。不過這邊花費我不少時間,原因有二:我螢幕輸出從樹梅派接出來後,另外一端根本沒接到電腦螢幕上,害我在那邊 debug 半天(「你電腦有插插頭嗎」原來都是真的);其二是那時候換了一條線,殊不知那條線其實不夠力,導致開機到一半就沒力了(燈號熄滅)。

問題

無法遠端桌面

通常視需求,我會用 ssh 或是 Windows 的遠端桌面來操作樹梅派。安裝好之後,當然是先安裝 xrdp 來準備遠端(ssh 的部分已經在燒錄的時候在工具設定先開啟好了)沒想到卻在登入階段一直發生問題:

1
2
3
4
5
6
7
connecttng t0 sesman ip 127.0.0.1 port 3350
sesman connect Ok
sending login info to session manager, please wait...
login successful for display 10
started connecting
connection problem, giving up
some problem

再三確認我的帳號密碼,因為可以 ssh 進去,代表絕對是正確的。最後查到樹梅派論壇上這篇文章:https://forums.raspberrypi.com/viewtopic.php?t=323471

看起來好像還沒辦法靠更新解決,但推文中有人提到可以修改設定檔(相關 GitHub issue:https://github.com/neutrinolabs/xrdp/issues/2060#issuecomment-979958020 ),我測試有效的方式:

  1. 編輯 /etc/X11/xrdp/xorg.conf

  2. Section "Device" 區塊中,註解 Option "DRMDevice" "/dev/dri/renderD128" 並新增 Option "DRMDevice" ""。也就是這個區塊會變成:

    1
    2
    3
    4
    5
    6
    7
    Section "Device"
    Identifier "Video Card (xrdpdev)"
    Driver "xrdpdev"
    #Option "DRMDevice" "/dev/dri/renderD128"
    Option "DRMDevice" ""
    Option "DRI3" "1"
    EndSection

重開之後就可以使用 Windows 遠端桌面來連接樹梅派了。

rc.local 行為不同?

可以連接之後,就是開始把之前放在樹梅派上的專案和小工具安裝回來。首先是我的樹梅派 IP 機器人小幫手:https://github.com/hms5232/get-LAN-IP-telegram-bot

沒想到設定之後居然沒反應?查了下日誌,發現是連線 Telegram bot 失敗。有人提到說這是因為使用者登入時,還沒連上網路,只要把「在確保網路連線之前不要完成開機程序」啟用就好。我看了半天實在不知道在哪裡,直到我點來點去的時候剛好滑鼠游標移動到上面彈出 tooltip:

在網路連線建立前不要完成開機

嗯……雖然我很努力地想理解這個中文,但選項文字實在讓我難以理解。總之我打開後……還是沒用啊啊啊。

按照道理,rc.local 應該是使用者登入時會執行,如果剛剛的選項有作用,開機程序完成時應該早就連好網路了,那到底是為什麼還是一樣連線失敗?

最後查到了一招雖然爛但只能暫時先將就的招數:設定 sleep 後再執行。

發現暫時有用之後,當天的 debug 之旅就先到這邊,放去旁邊休息了。

結語

原本想說初步這樣至少能用了,直到今天開始記錄上禮拜做的事情時,發現睡覺大法又沒用了。我的老天,這到底是在幹嘛啊啊啊。目前還在思考有沒有其他解決方案,之後如果有的話,再上來更新。說不定會直接重發一篇教學文。沒想到 32 和 64 位元之間的鴻溝這麼大QQ

後來這問題已經解決,請參考另外一篇文〈讓 Telegram bot 告訴你樹莓派的 IP 吧!(Rust version)