使用VSCode在本地電腦上對樹莓派遠程開發

目的及原理

有時身邊沒有額外的顯示器和鍵盤,或者有時樹莓派在另一個屋子連接著路由器,那麼當我們想在樹莓派上做開發時就可以使用VS Code的遠程開發能力。下面一張圖顯而易見地說明了遠程開發的工作原理(來自Klaas (khz)):

VS Code遠程開發樹莓派的工作原理

該功能允許我們在本地系統(Windows、Mac或者Linux)上使用VS Code遠程開發樹莓派上的程式。完成該功能我們僅需要在樹莓派上安裝VS Code Server,剩餘其他工作都是在本地系統完成的。

前期準備

這裡的一步工作如果你都已經準備好了,則可以直接跳過該小節。

一塊具有SSH主機端的樹莓派

樹莓派發展至今已經有很多型號了,我手頭的版本還是很老的Raspberry Pi 2B版本。如果你的版本更高級則更應該沒有問題了。

關於樹莓派系統鏡像的安裝,我使用的是官方的Raspberry Pi Imager來寫入的。由於我們最終是在本地桌面系統給開發,因此無需安裝帶有桌面的OS。這裡我安裝的是Ubuntu Server 21.10(RPI 2/3/4/400),如圖:

VS Code遠程開發樹莓派的工作原理

確定自己的樹莓派是否具有SSH host,如果你像我一樣安裝的是Ubuntu Server鏡像,那麼該系統是自帶並開啟了ssh host的。如果你不確定,可以在樹莓派上ssh到本地試試:

$ ssh ubuntu@localhost

如果提示輸入密碼則系統已經具有ssh host功能,否則需要安裝openssh-server

在樹莓派端新建一個開發用戶

此步非必須,但為了安全起見,我推薦在Raspberry Pi上單獨建一個用戶作為VS Code的遠程開發賬戶。

在樹莓派端使用以下命令添加一個新用戶,並將該用戶添加到sudo許可權組。這裡我新建的用戶名是pi_dev,你可以任意編寫一個名字。

$ sudo useradd -m pi_dev
$ sudo usermod -aG sudo pi_dev

為用戶指定命令解釋程式(通常為/bin/bash):

sudo usermod -s /bin/bash pi_dev

並創建密碼:

$ sudo passwd pi_dev

切換到新建的pi_dev用戶,並在/home/pi_dev目錄下創建.ssh目錄

$ su pi_dev
$ mkdir ~/.ssh

使用ssh key登陸到樹莓派

非必須,同樣為了安全起見(也避免每次連接樹莓派輸入密碼),我推薦按將本地系統的SSH公鑰配置到樹莓派。

若你的本地系統沒有創建過SSH公鑰,可按以下步驟設置:

$ ssh-keygen -t rsa -b 4096

如果你的本地系統是macOS或者Linux,生成的公鑰文件位於 ~/.ssh/id_rsa.pub,如果是Win系統則位於:C:\Users\你的用戶名\.ssh\id_rsa.pub

將該.pub文件的全部內容複製到樹莓派的authorized_keys文件內,該文件位於/home/pi_dev/.ssh/authorized_keys,如果沒有則新建一個。

至此,便可以在本地系統的終端直接ssh到樹莓派了。

安裝遠程擴展包(Remote Development extension pack)

本步在本地桌面系統進行,即你實際用來運行VSCode介面開發的系統。

假設你在本地系統已經安裝了Visual Studio Code,接下來只需要打開VSCode並在Extensions中搜索安裝Remote Development即可。

在擴展中搜索並安裝Remote Development

用VSCode遠程連接到樹莓派

確保之前已經測試過你的本地系統可以成功ssh到樹莓派。

安裝完擴展後,按F1鍵或者Ctrl+Shift+P組合鍵調出命令面板,然後選擇 Remote-SSH: Connect to Host… 命令。

這裡輸入樹莓派的登陸用戶名和主機IP,即準備工作中新建的pi_dev用戶,務必替換你的實際IP地址。

輸入遠程主機用戶和地址

連接到遠程主機時,首先會要求我們選擇系統類型(Windows/Linux/macOS),根據實際情況選擇即可。稍等片刻,等本地系統遠程配置好VS Code Server後便完成連接了。

選擇遠程系統類型

在等待遠程連接的過程中,可以點擊details來查看日誌輸出,以便查看安裝進程。有時候進程不會順利,我們就需要在這裡具體分析出錯原因了(見下文)。

查看VSCode Server安裝進程

連接成功後,會在VS Code介面的左下角顯示當前遠程開發的主機地址:

連接成功後的狀態

連接成功之後

打開樹莓派上的工程目錄

成功連接到目標樹莓派後,可以像在本地開發一樣打開遠程伺服器的任何文件夾。可以直接Get Started頁面選擇新建文件打開文件打開文件夾或者克隆一個Git倉庫;如果沒有打開Start頁面,也可以直接在邊欄的Explore功能中進行上述操作。

打開遠程終端上的文件或文件夾

Terminal

遠程連接狀態下的所有操作都相當於在樹莓派上,比如打開一個終端Terminal。相當於直接在樹莓派的系統上使用bash。

管理擴展Extensions

正如在本地安裝擴展一樣,在遠程狀態下的Extensions介面中,你可以直接將擴展安裝到遠程主機(樹莓派端)。例如,在LOCAL – INSTALLED組別下,這裡顯示了我已經在本地安裝Extension Pack for Java這個擴展,也可以馬上安裝到遠程主機上。

安裝擴展到遠程主機

SSH: x.x.x.x INSTALLED組別下顯示的是已經在遠程主機上安裝的擴展,也可以點擊旁邊的Install Local Extensions in ‘Remote’按鈕直接將所有本地擴展遠程安裝的樹莓派端。

安裝本地擴展到遠程主機

遇到的問題

提示啟動VS Code Server失敗

該問題是在首次連接樹莓派並自動安裝Server時出現的。提示以下錯誤:

error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory

缺少libatomic.so.1文件

解決方案是嘗試在樹莓派系統上安裝libatomic1,重新在VS Code連接到遠程主機即可。

$ sudo apt-get install libatomic1

本文參考