
前言
之前在手机上实现了通过QEMU运行完整Alpine,进而可以在手机上运行Docker以跑一些容器服务,例如本站点及其它个人项目的代码托管及数据等其实是跟着本人的终端设备在随身移动的,但之前一直是通过git、scp等方式来同步数据,非常的麻烦;
正好以前玩树莓派打比赛的时候玩过一手VsCode的远程连接功能,可以直接通过ssh在远程设备上很方便的编辑文件,只要打通这个链路,只要随便来一台能够运行VsCode的设备就可以通过这个功能远程连接到移动终端的工作区,随时开始编辑;
NOTE如果你对如何在手机上完整运行Docker感兴趣,可以看这篇文章
QEMU 环境及 Alpine 配置
这里先简单描述下我这里的环境配置情况,以及进行一些简单的前期准备;
仅针对Alpine且运行在QEMU的特殊情况,如果是其它Linux发行版之类的情况,可以部分参考;
QEMU启动脚本
情况基本跟上述提到的文章一致,只不过我将环境运行在了较新的设备上而已,以下是QEMU启动Alpine镜像的启动脚本:
qemu-system-aarch64 \ -m 2G \ -cpu cortex-a72 \ -smp cpus=2 \ -boot order=cd \ -M virt \ -bios QEMU_EFI.fd \ -nographic \ -drive file=virt-alpine-50G.img,if=virtio,format=qcow2 \ -device e1000,netdev=nde1,id=d-net1 \ -netdev user,id=nde1,hostfwd=tcp::2222-:22 \
如果你看不懂也没有关系,只需要关注最后一行的端口转发部分,其指出将QEMU虚拟机内部的22端口转发到外部的2222端口,原因是ssh默认22端口在物理设备上不可用,所以将其转发到2222以让外部设备可以通过这个端口进行ssh连接;
OpenSSH 配置
CAUTION如果你的ssh服务并非由OpenSSH提供,可能需要自行寻找配置方法,或换用OpenSSH
一般来说除非刻意配置,各个发行版的ssh服务均由OpenSSH服务提供
VsCode需要通过ssh建立连接,且需要使用一些ssh的高级功能,这一部分在Alpine默认是关闭的,需要手动进行配置:
...AllowTcpForwarding noAllowTcpForwarding yes...#PermitTunnel noPermitTunnel yes...
这两个配置项的功能如下:
-
AllowTcpForwarding
控制是否允许 SSH 客户端通过 SSH 连接建立 TCP 端口转发,这一项必须设置为 yes
VS Code Remote-SSH 依赖 TCP 端口转发来传输数据
在建立 SSH 连接后,VS Code 会在后台创建多个端口转发通道用于传输文件、终端数据、扩展通信等 -
PermitTunnel
控制是否允许通过 SSH 连接建立隧道,此项可选
通常不需要隧道功能,只有在使用高级网络功能时才需要启用
如果你的系统只有Root用户的话,还需要检查以下两个条目:
···PermitRootLogin yes # 允许Root用户通过SSH登录···PasswordAuthentication yes # 允许SSH通过密码登录···
完成配置后使用如下指令重启SSH服务或者直接重启Alpine
rc-service sshd restart
安装必要的软件包
apk updateapk add gcompat libstdc++ procps
gcompat
和libstdc++
VsCode的远程服务端是使用glibc
编译的,而Alpine默认使用musl libc
,这两个包提供了兼容层;procps
Alpine Linux作为轻量级发行版,使用BusyBox
提供的精简版工具替代了完整的GNU工具链;
当VSCode Remote-SSH尝试执行带有GNU风格参数(如ps -p)的命令时,BusyBox
的简化实现无法识别这些参数,导致连接过程失败;
这个包提供了VsCode可用的指令合集;
如果使用了其它的Linux发行版,这些步骤并不是必要的,仅针对Alpine需要安装这些软件包
VsCode RemoteSSH 远程连接
扩展安装
现在远程连接功能已经集成到VsCode中了,你可以在VsCode的左下角找到这个图标,点击它以建立一个远程SSH连接,VsCode会自动安装相关扩展:
如果你的VsCode找不到这个图标,建议先更新一下VsCode
配置连接
扩展安装完成后,会在左侧出现RemoteSSH远程资源管理器选项卡,我们在SSH栏位下添加一条远程连接:
填充内容如下格式:
<UserName>@<Addr>:<Port>
例如在我当前的网络环境下,Alpine用户名为root
,物理设备IP地址为192.168.1.8
,QEMU配置将其SSH端口映射到物理设备的2222
端口,则此处需要填入root@192.168.1.8:2222
更新的配置文件选择当前用户的.ssh即可:
完成后可以在远程资源管理器选项卡中看到刚才的配置,你可以点击直接修改这个配置文件:
其中第一行Host为显示在远程资源管理器选项卡中的名称,你也可以修改为物理设备名称,例如这里物理设备是一台小米15,我就将这个连接名称改为XiaoMi-15
,然后点击连接:
选择连接目标的平台,VsCode会根据目标平台在对应设备进行配置,这里我们选择Linux:
点击信任目标指纹:
输入root用户的密码:
可以看到右下角VsCode完成连接,并开始在Alpine上下载部署VsCode服务器:
这个步骤需要花一些时间,等待服务器部署完成后,VsCode会进行一系列配置,等到连接完成后即可在远程资源管理器选项卡中看到已连接状态:
之后回到资源管理器选项卡打开工作区文件夹即可,当然这里建议先在Alpine中创建好对应的文件夹再使用VsCode打开:
每次打开新的文件夹或建立连接都需要再次输入密码;
远程工作区扩展
远程服务器的扩展组件是独立于本地扩展组件的,除了某些不影响远程服务器的组件如VsCode语言包、客户端主题等,各类功能性扩展需要额外安装,例如语言支持类扩展,如果要在远程工作区使用语言支持类扩展提供的代码格式化功能,则需要单独为其安装对应的插件。
VsCode 服务器相关
在Alpine的Root用户目录下可以找到VsCode的服务端文件:
alpine:~# ls -all -h ↵total 56Kdrwx------ 9 root root 4.0K Oct 9 20:13 .drwxr-xr-x 22 root root 4.0K Oct 8 14:33 ..-rw------- 1 root root 6.0K Oct 11 01:59 .ash_historydrwxr-xr-x 3 root root 4.0K Oct 8 14:34 .cachedrwxr-xr-x 3 root root 4.0K Oct 9 14:06 .configdrwxr-xr-x 3 root root 4.0K Oct 8 17:02 .dotnet-rw-r--r-- 1 root root 53 Oct 8 14:43 .gitconfigdrwx------ 2 root root 4.0K Oct 8 17:23 .ssh-rw------- 1 root root 4.9K Oct 9 20:13 .viminfodrwxr-x--- 5 root root 4.0K Oct 11 01:47 .vscode-serverdrwxr-xr-x 2 root root 4.0K Oct 9 14:07 download_packagesdrwxr-xr-x 3 root root 4.0K Oct 8 14:37 vscode_workspacealpine:~#
进入.vscode-server
这个目录,里面的内容如下:
alpine:~/.vscode-server# ls -all -h ↵total 36Mdrwxr-x--- 5 root root 4.0K Oct 11 01:47 .drwx------ 9 root root 4.0K Oct 9 20:13 ..-rw------- 1 root root 428 Oct 11 01:47 .cli.03c265b1adee71ac88f833e065f7bb956b60550a.log-rw------- 1 root root 468 Oct 9 20:42 .cli.17baf841131aa23349f217ca7c570c76ee87b957.logdrwxr-xr-x 3 root root 4.0K Oct 8 14:18 cli-rwxrwxr-x 1 root root 19.2M Oct 8 22:17 code-03c265b1adee71ac88f833e065f7bb956b60550a-rwxr-xr-x 1 root root 16.7M Apr 16 07:29 code-17baf841131aa23349f217ca7c570c76ee87b957drwx------ 8 root root 4.0K Oct 9 09:23 datadrwx------ 6 root root 4.0K Oct 11 01:48 extensionsalpine:~/.vscode-server#
其中cli
与data
存储了VsCode服务端组件,extensions
中存储了VsCode服务端的扩展组件,我们安装的远程扩展会被存储在这里;
除此之外还有一个重要的文件code-03c265b1adee71ac88f833e065f7bb956b60550a
,不同版本以及以及安装在不同位置的的VsCode客户端都有对应的识别码,每一个不同识别码的VsCode客户端连接到远程服务器时都会在这个目录下创建对应的服务端文件,你可以在你运行VsCode终端上运行以下指令查看对应的识别码:
如果后续出现连接不上的问题且检查其余环境配置均无果,可以试试清除对应的服务端文件及其.log
日志文件后重新尝试连接,极端情况下可以移除整个.vscode-server
;