如何在树莓派上用 VS Code 优雅直连内部的 Ubuntu 子系统/容器用来访问容器内的文件和代码?


📌 背景情况

我的设备是一台树莓派,但在同一台机器上,我跑了两个完全独立的 Linux 环境。它们共享同一个局域网 IP(比如 192.168.10.2),但内部结构完全隔离:

  1. 宿主机(树莓派原生系统) :用户是 pi,正常的物理机,带 systemd,占用默认的 22 端口。
  2. 子系统/容器(Ubuntu) :用户是 ubuntu,极简版镜像,没有 systemd(非完整系统),没有独立 IP。

💥 遇到的问题

一开始我想在电脑上用 VS Code 直接连进去写代码,习惯性地用 原来的ip 登录,结果一直报错 invalid user ubuntu。
原因: 因为 IP 是共享的,默认的 22 端口连的是外层的"树莓派宿主机"。宿主机里根本没有 ubuntu 这个用户,所以直接被踢出来了。想要直连子系统,必须给子系统单独装 SSH,并错开端口。

在这个过程中,我又踩了几个极简版容器特有的坑:

  • 坑1:容器连不上网,apt update 报 DNS 解析错误(Temporary failure resolving)。
  • 坑2:镜像太纯净,没有 ping,也没有 nano 和 vim 等编辑器。
  • 坑3:没有 systemd 控制系统,没法用 systemctl 启动服务。

🛠️ 终极解决方案(Step by Step)

如果你也遇到了类似的环境(比如 WSL、LXC、Docker、Chroot 里的子系统),可以通过以下 5 步完美解决:

第一步:先进入子系统,修复网络(DNS)

由于宿主机和子系统网络隔离,极简版子系统经常没有配置 DNS,导致无法下载软件。

先在宿主机里通过终端进入子系统,然后强制写入 DNS:

bash 复制代码
# 强行给系统指定 DNS 服务器(由于极简环境限制,可能无法直接 rm 删除文件,直接覆盖写入即可)
sudo bash -c 'echo "nameserver 114.114.114.114" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 223.5.5.5" >> /etc/resolv.conf'

第二步:安装 SSH 服务和编辑器

网络通了之后,就可以愉快地安装需要的组件了:

bash 复制代码
sudo apt update
sudo apt install openssh-server vim -y

第三步:修改子系统的 SSH 端口(核心!)

为了避开宿主机的 22 端口,我们要把子系统的 SSH 端口改成别的,比如 2222。

bash 复制代码
sudo vim /etc/ssh/sshd_config

找到 #Port 22 这一行,去掉注释,改成:

text 复制代码
Port 2222

保存并退出。

第四步:手动启动 SSH 服务

因为精简版容器通常没有 systemd,不能用 systemctl 命令,必须用传统方式启动:

bash 复制代码
sudo service ssh start

验证一下:如果出现 [ OK ] 或者用 ps aux | grep sshd 能看到进程,说明启动成功了!

第五步:在电脑本地配置 VS Code 直连

回到你用来写代码的电脑,打开 ~/.ssh/config 文件,添加配置:

text 复制代码
Host Ubuntu-Subsystem
  HostName 192.168.10.2
  Port 2222
  User ubuntu

保存后,在 VS Code 的远程列表里找到 Ubuntu-Subsystem,一键连接,输入密码,搞定!🎉


💡 课后补充(防坑 Tips)

  1. 为什么刚连上 VS Code 时,它又要重新下载一遍 Server 端?
    因为 VS Code 的 Server 是装在用户家目录(~/.vscode-server)下的。之前连树莓派装在了 /home/pi/ 里,现在连的是全新的 Ubuntu 环境(/home/ubuntu/),物理空间隔离了,所以它会重新下载一次,属于正常现象,下完以后就可以秒进了。
  2. 每次宿主机(树莓派)重启后怎么办?
    由于子系统没有完整的开机自启能力(无 systemd),如果你的树莓派断电重启了,你需要先 SSH 连上外层树莓派,进入子系统,手动敲一句 sudo service ssh start,把远程通道唤醒,然后 VS Code 就能再次连上了。

希望这篇笔记能帮到同样在折腾开发环境的你!

相关推荐
无足鸟ICT2 小时前
【RHCA+】vmstat命令(监控系统资源)
linux·服务器
闪亮的路灯2 小时前
Linux 安装mqtt服务mosquitto
linux·运维·服务器
HideF2 小时前
nmcli
linux·服务器·网络
qetfw3 小时前
UOS DHCP Relay:跨网段分配与 IP、DNS、网关验证
linux·服务器·网络·tcp/ip·uos
szxinmai主板定制专家5 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
叼烟扛炮5 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
ynchyong5 小时前
Linux 有两个 “版本“
linux·发行版·内核版本
叼烟扛炮5 小时前
Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战
linux·服务器·学习
叼烟扛炮6 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
Decay__6 小时前
09_MySQL 闪回与时间点恢复 —— binlog 回放、mysqlbinlog、PITR 与误删恢复
运维·数据库·sql·mysql·架构