记录一次WSL2远程连接的问题

xieshuoshuo 发布于 2024-06-12 827 次阅读 预计阅读时间: 8 分钟


首先是配置:Windows 11, version 23H2 专业版,安装的是Ubuntu 20.04版本,远程SSH工具为XTerminal

首先在Microsort Store上安装Ubuntu 20.04(WSL2的安装就不赘述了),安装好后,默认是C盘,所以需要进行迁移,我这里是迁移到E盘。

WSL2迁移

参考文档:Windows启用WSL2并完成默认安装位置变更

首先查看当前安装的版本

wsl -l -v 
  NAME              STATE           VERSION
* Ubuntu-20.04    Running         2
# 版本号            状态            wsl版本

停止WSL及相关发行版:

wsl --shutdown  
# wsl --shutdown  版本号 
# 例如 wsl --shutdown/wsl --shutdown Ubuntu-20.04

导出需要迁移的发行版,默认为tar包:

wsl --export Ubuntu-20.04 E:\Hyper-V\Ubuntu20.04.06LTS\Ubuntu-20.04.tar
# wsl --export 版本号 tar包的路径

取消注册分发版并删除根文件系统:

wsl --unregister Ubuntu-20.04
# wsl --unregister 版本号

从备份恢复、导入发行版:

wsl --import Ubuntu-20.04 E:\Hyper-V\Ubuntu20.04.06LTS E:\Hyper-V\Ubuntu20.04.06LTS\Ubuntu-20.04.tar --version 2
# wsl --import 版本号 要迁移的路径 tar包的路径

如果中间没出什么问题的话,就算是成功迁移到E盘了。

WSL2卸载

参考文档:win11卸载Ubuntu 20.04 WSL

Ubuntu 20.04 LTS可以通过Microsoft Store进行安装,但是不能通过Microsoft Store卸载。现列举两种卸载方式。

1.通过应用与功能卸载

1、查找到安装的ubuntu

2、卸载

2.通过Windows终端卸载

1、查看当前环境安装的wsl

wsl --list

2、注销(卸载)当前安装的Linux的Windows子系统(名称要与list获取的一致)

wsl --unregister Ubuntu-20.04

3、卸载成功,查看当前安装的Linux的Windows子系统

wsl --list

注意:一旦注销,与该发行版相关的所有数据、设置和软件都将永久丢失,三思而后行

WSL2卸载重装问题

错误代码:

Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND

参考文档:Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND

Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND@TOC
windows11上安装了个ubuntu系统,然后因为各种原因重置了一下,再打开就报错了

解决:

# 1:列出安装的系统。
wsl -l

#2:注销分发
wsl --unregister Ubuntu【你的版本】

WSL2远程连接

以上种种做好后,我开始远程连接,但是终究不是一帆风顺的,期间经历了防火墙开启问题、SSH连接问题、密钥配置问题等。

不知道是不是安装的问题,安装好后的Ubuntu的防火墙是存在问题的,所以首先需要更新UFW。

1.更新防火墙

sudo apt update  
sudo apt upgrade ufw

更新好后,使用 sudo ufw enable 命令进行查看

sudo ufw enable
Firewall is active and enabled on system startup

当运行 sudo ufw enable 命令时,并且收到消息 "Firewall is active and enabled on system startup",这意味着已经成功启用了 ufw(Uncomplicated Firewall)防火墙,并且它将在系统启动时自动启用。

2.启用SSH

默认情况下,当 Ubuntu 最初被安装的时候,通过 SSH 进行远程访问是不被允许的。在 Ubuntu 上启用 SSH 非常的简单直接。

以 root 或者其他 sudo 用户身份执行下面的步骤,在你的 Ubuntu 系统上安装并且启用 SSH。

2.1.使用Ctrl+Alt+T打开终端,并且安装openssh-server软件包:

sudo apt update
sudo apt install openssh-server

当被提示时,输入你的密码并且按 Enter,继续安装。

2.2.一旦安装完成,SSH 服务将会被自动启动。你可以验证 SSH 是否正在运行,输入:

sudo systemctl status ssh

输出将会告诉你服务正在运行,并且启用开机启动:

● ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    Active: active (running) since Mon 2020-06-01 12:34:00 CEST; 9h ago
...

按q返回命令行。

2.3.Ubuntu 自带一个配置防火墙配置工具,称为 UFW。如果防火墙在你的系统上被启用,请确保打开了 SSH 端口:

sudo ufw allow ssh

保险起见,在开放一下22端口

ubuntu开放22端口的操作步骤:

1.打开终端命令行模式。

2.依次输入以下命令进行开放22端口即可。

输入以下命令打开22端口。

sudo ufw allow 22

重启防火墙使其生效即可。

sudo ufw reload

接下来就是非常奇怪的情况了,在IP可以ping通,端口可以telnet通,账号与密码都正确的情况下,使用XTerminal工具远程连接不上

Handshake completed
Outbound: Sending SERVICE_REQUEST (ssh-userauth)
Inbound: Received EXT_INFO
Inbound: Received SERVICE_ACCEPT (ssh-userauth)
Outbound: Sending USERAUTH_REQUEST (none)
Inbound: Received USERAUTH_FAILURE (publickey)
Client: none auth failed
Outbound: Sending USERAUTH_REQUEST (password)
Inbound: Received USERAUTH_FAILURE (publickey)
Client: password auth failed
Outbound: Sending USERAUTH_REQUEST (keyboard-interactive)
Inbound: Received USERAUTH_FAILURE (publickey)
Client: keyboard-interactive auth failed
All configured authentication methods failed

然后在命令行中使用 ssh root@ip 命令也连不上,折腾了很久,于是我选择使用密钥连接。

3. 密钥连接

首先使用 ssh-keygen -t rsa 命令生成一个RSA公私钥对

选项一般保持默认即可,也可按需修改

* **保存位置**:默认情况下,密钥对将保存在 `~/.ssh/` 目录下。你可以通过输入一个新的路径来更改保存位置。  
* **密钥文件名**:默认情况下,私钥名为 `id_rsa`,公钥名为 `id_rsa.pub`。你可以输入一个新的文件名来更改它。  
* **密钥长度**:对于 RSA,默认长度是 2048 位。但你可以通过 `-b` 选项(例如 `-b 4096`)来指定更长的密钥长度,以增加安全性。  
* **密码短语**:你还可以选择为私钥添加一个密码短语,以增加额外的安全层。但是,请注意,如果你丢失了密码短语,你将无法访问私钥。

密钥生成后,通过下面命令进行查看

cat ~/.ssh/id_rsa.pub
# 如果你更改了默认的文件名或位置,请使用相应的路径和文件名。

然后把密钥添加到远程连接主机上,有两种方式,一种自动添加,一种手动添加

1.自动添加

使用 ssh-copy-id 命令将你的公钥复制到远程主机上。该命令会自动将公钥添加到远程主机的 ~/.ssh/authorized_keys 文件中。运行以下命令:

ssh-copy-id root@IP

你需要输入远程主机 root 用户的密码来进行认证。

2.手动添加

  • 首先,查看并复制公钥内容
cat ~/.ssh/id_rsa.pub

然后,通过SSH连接到远程主机(需要密码)

ssh root@IP
  • 在远程主机上,编辑或创建 ~/.ssh/authorized_keys 文件,并将公钥内容粘贴到文件中
mkdir -p ~/.ssh 
chmod 700 ~/.ssh 
echo "your-public-key-content" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

检查SSH配置: 确保本地 ~/.ssh/config 文件(如果存在)没有配置错误。你可以添加以下配置以明确指定使用的密钥文件:

Host IP
    IdentityFile ~/.ssh/id_rsa
    User root

重新连接: 尝试重新连接到远程主机:

ssh root@IP

终于是远程连接上了,真不容易!