
背景情况我的设备是一台树莓派但在同一台机器上我跑了两个完全独立的 Linux 环境。它们共享同一个局域网 IP比如 192.168.10.2但内部结构完全隔离宿主机树莓派原生系统用户是pi正常的物理机带 systemd占用默认的 22 端口。子系统/容器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# 强行给系统指定 DNS 服务器由于极简环境限制可能无法直接 rm 删除文件直接覆盖写入即可sudobash-cecho nameserver 114.114.114.114 /etc/resolv.confsudobash-cecho nameserver 223.5.5.5 /etc/resolv.conf第二步安装 SSH 服务和编辑器网络通了之后就可以愉快地安装需要的组件了sudoaptupdatesudoaptinstallopenssh-servervim-y第三步修改子系统的 SSH 端口核心为了避开宿主机的 22 端口我们要把子系统的 SSH 端口改成别的比如2222。sudovim/etc/ssh/sshd_config找到#Port 22这一行去掉注释改成Port 2222保存并退出。第四步手动启动 SSH 服务因为精简版容器通常没有systemd不能用systemctl命令必须用传统方式启动sudoservicesshstart验证一下如果出现[ OK ]或者用ps aux | grep sshd能看到进程说明启动成功了第五步在电脑本地配置 VS Code 直连回到你用来写代码的电脑打开~/.ssh/config文件添加配置Host Ubuntu-Subsystem HostName 192.168.10.2 Port 2222 User ubuntu保存后在 VS Code 的远程列表里找到Ubuntu-Subsystem一键连接输入密码搞定 课后补充防坑 Tips为什么刚连上 VS Code 时它又要重新下载一遍 Server 端因为 VS Code 的 Server 是装在用户家目录~/.vscode-server下的。之前连树莓派装在了/home/pi/里现在连的是全新的 Ubuntu 环境/home/ubuntu/物理空间隔离了所以它会重新下载一次属于正常现象下完以后就可以秒进了。每次宿主机树莓派重启后怎么办由于子系统没有完整的开机自启能力无 systemd如果你的树莓派断电重启了你需要先 SSH 连上外层树莓派进入子系统手动敲一句sudo service ssh start把远程通道唤醒然后 VS Code 就能再次连上了。希望这篇笔记能帮到同样在折腾开发环境的你