使用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

本文参考

发表评论

您的电子邮箱地址不会被公开。