最近本来是计划下厨一篇 WSL ArchLinux Gnome 的博文的,可惜自己太菜了,尝试了无数次还是没能从坑里爬起来,我想如果我写出来了大家一定会夸我的,遗憾。搜索了很多,ArchLinux 一来本身对不了解 Linux 的人来说就不太友好(nano 编辑器还是很友好的),二来 WSL 之所以诞生并不是为了给大家尝试 GUI 的,而是为了方便熟悉 Linux 的用户在 Windows 下运行 Bash 和核心 Linux 命令行工具以开发更多更棒的作品的。

所以如果大家和我一样没有成功为 WSL 安装上华丽的桌面环境也不要沮丧,在 VSCode 中安装插件学习 Linux 下开发比浪费大把时间在无用的 WSL Linux 桌面环境上要有价值得多。(什么?你问我干嘛装 Gnome ?对不起,我闲的、开发不会。

在 VSCode 中使用 WSL

安装一个的 WSL Linux

打开 控制面板 > 程序 > 程序和功能 > 启用或关闭 Windows 功能 。勾选 适用于 Linux 的 Windows 子系统 项目,确定后重新启动。接下来直接从 Microsoft Store 搜索 WSL 选择你喜欢的系统安装,像装任何一个 UWP 应用一样简单。点击图标打开 WSL 享受你的 WSL 命令行。

但是 ,像这样简单的方法我一般都不用,我这人就喜欢麻烦的,时间?时间有的是。

说到麻烦,这个系统的选择我首先就排除了 Ubuntu ,什么坑多?那应该是 Arch 系的了(bushi。这里写了一段又臭又长的 WSL Arch 安装和初始化,仅供参考,安装时 根据自己的报错检查调试

本地环境:Windows 10 Pro for Workstations Build 18363 x64-based


LxRunOffline 安装 ArchLinux

Github/DDoSolitary/LxRunOffline Releases 下载最新的安装包 LxRunOffline-v3.4.1-mingw.zip ,应该是依赖 Mingw 的,这个东西我在 《VS Code 配置 C 语言调试环境》的时候安装过了。将下载后的 LxRunOffline ZIP 包解压缩到一个文件夹下,使得进入这个文件夹就能看到 LxRunOffline.exe 文件,将这个文件夹添加到 PATH 中。运行一下 .exe ,这样 LxRunOffline 就算安装完了。

下载一个已经受支持的 Linux WSL 安装包,可以在 Microsoft Docs 或者 LxRunOffline Wiki 中找到。bootstrap.tar.gz 包可以直接用,.Appx 包需要改后缀为 zip 解压后使用其中的 install.tar.gz

网上有一种替换内核以安装 ArchLinux 的办法,但是 LxRunOffline 也可以直接安装 ArchLinux ,下载官网 最新bootstrap .tar.gz 启动引导包或者 Github/yuk7/ArchWSL 的打包版本(Release ZIP 包,可以看到 4 月 3 日作者就更新了 ArchLinux 4 月最新内核,赞!(也可以根据 Wiki 配套下载 .appx.cer 文件进行安装)) 。 注意 通过 LxRunOffline 安装 ArchLinux 都需要在安装命令后面添加 -r root.x86_64

这里推荐直接用 Github/yuk7/ArchWSL 的打包版本安装,官网的启动引导包可能是太精简了,安装完要啥没啥我都不知道咋整了。将下载好的 WSL 系统安装包、给 WSL 系统分配的文件夹准备好,进入 Windows 命令行安装 WSL:

lxrunoffline i -n <WSL名称> -d <安装路径> -f <安装包路径>.tar.gz [-r root.x86_64] [-s] 

最后一个 -s 参数自选,用来在桌面创建快捷方式。其他参数可在命令行键入 lxrunoffline 查看。推一篇《LxRunOffline 管理 WSL - Sky_Dream》。

ArchLinux 初始化

安装完 WSL 进系统第一件事是设置 root 用户密码,输入 passwd 开始修改密码,强度太低会修改失败。

然后使用 nano 编辑“默认用户”,自从上次玩过一段时间 Manjaro 之后 nano 的操作都快忘的一干二净了,这里回顾一下,上下左右键盘控制, Ctrl + O 回车保存, Ctrl + X 退出。好在 nano 编辑器界面下面都有提示(逃)。

设置完“默认用户”之后,根据 ArchWSL 的 Wiki 可以设置切换到“默认用户”,这里先跳过,因为还有一些需要管理员权限的操作,所以这里先不切换用户,省去 sudo 。运行中需要切换用户就在 WSL 命令行使用 su {username} 切换,等一切完成初始化之后在 Windows 命令行中使用 .\Arch.exe config --default-user {username} 设置 WSL 默认登陆用户。

之后是设置国内镜像,编辑 /etc/pacman.d/mirrorlist 文件,选一些 China 列出的镜像地址(应该不需要全部开启,推荐将中科大和清华的镜像源开启)前面 # 注释删掉,然后保存退出。在 /etc/pacman.conf 中添加 ArchLinux 中文社区仓库地址来拓展可用的软件包仓库,这里使用了清华大学的镜像源,可自行选用中科大镜像源和浙大镜像源等。

接下来开始更新系统,一些初始化的安装。跑完之后 ArchLinux 就可以交付生产了!

[[email protected] ~]# passwd
[[email protected] ~]# EDITOR=nano visudo
# 进入文件编辑界面,向下翻到这一行去掉前面的 # 注释并保存退出
%wheel ALL=(ALL) ALL

# 添加一般用户并设置这个用户的密码,强度不检测
[[email protected] ~]# useradd -m -G wheel -s /bin/bash {username}
[[email protected] ~]# passwd {username}

[[email protected] ~]# nano /etc/pacman.d/mirrorlist
# 进入文件编辑界面,按首字母向下翻到 China 去掉中科大、清华镜像源前面的 # 注释并保存退出
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch

[[email protected] ~]# nano /etc/pacman.conf
# 进入文件编辑界面,在末尾添加中文社区仓库并保存退出
[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
# Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
# Server = https://mirrors.zju.edu.cn/archlinuxcn/$arch

# 初始化 keyring ,更新
[[email protected] ~]# pacman -Sy archlinuxcn-keyring
[[email protected] ~]# pacman-key --init
[[email protected] ~]# pacman-key --populate
[[email protected] ~]# pacman-key --populate archlinuxcn
[[email protected] ~]# pacman -S archlinuxcn-mirrorlist-git

[[email protected] ~]# pacman -Syyu base base-devel yaourt

替换内核 Arch.exe 安装
替换内核 Arch.exe 安装
替换内核 root 文件夹
替换内核 root 文件夹
Arch in WSL
Arch in WSL

忠告 :如果不是特别闲就不要折腾 ArchLinux 了,直接从商店装个就行,不会影响你戴劳力士的,更不要去尝试在 WSL 中安装 Gnome Xfce 什么的。看了过时的教程导致安装失败也不看报错,还骂别人写博文的是帅比的更是要不得的。

启用 VSCode WSL 插件

安装完了 WSL ,接下来的工作就简单多了,在 VSCode 中安装 Remote - WSL 插件。

如果没有特意在 WSL 中关闭 Windows PATH 的话,那么登录 WSL 后直接用命令行在项目文件夹下运行 code . ,即可打开 VSCode 窗口在这里开发。如果关闭了也可以在 Windows PowerShell 下运行 code --remote wsl+<distro name> <path in WSL> 。最不极客的方法可能就是手动打开 VSCode 然后 Click Click Click 手动运行插件了。

Windows 下的文件夹都被挂载在 WSL 系统 /mnt 对应小写盘符的文件夹下,比如 Windows 下 D 盘的一层文件夹 Projects 在 WSL 中对应的地址就是 /mnt/d/Project 。格外注意 Linux 下大小写敏感。

终端、编辑器、运行环境,现在一应俱全!

Remote WSL in VSCode
Remote WSL in VSCode
WSL Readme
WSL Readme

当然,除了 WSL 我还尝鲜了 Windows 沙盒、Hyper-V、Docker Desktop 这些有趣的东西。你要问我为什么会突发奇想玩一玩这个,一切都要从一只蝙…… 不是,从 VSCode 说起。之前用 VSCode 写代码的时候经常有 Remote - WSL 插件的推送出来,在设置启用或关闭 Windows 功能的时候看到还有关于 Hyper-V 、虚拟化、沙盒等的设置就顺便一起开启了。

跑会题先,安利一下 Hyper-V ,微软的产品可真香,从被收购的 Github 、新版的 Windows Terminal 、到 WSL、Hyper-V 无一不是诚意之作。Hyper-V 对于在 Windows 上初尝虚拟机的我来说真是方便极了,不需要再费心下载激活 VM Workstations ,只需要启动一个内置功能,就能实现虚拟机的功能。当然啦,我只是作为门外汉的角度推荐 Hyper-V ,具体优劣我并不知道。

VSCode 中使用 SSH

今天在我正因反反复复的安装 WSL 而烦躁的时候注意到 VSCode 的 Remote Development 系列插件,在 VSCode 中不仅可以操作 WSL 文件,还可以通过 SSH 连接操作远程服务器上的文件。这岂不是极大的方便了我修改 Typecho 模板吗?Typecho 后台编辑主题文件高亮完全没有不说,还不能显示主题文件夹子文件夹下的文件。(虽然后台实现高亮的插件前段时间也有人发布了,但是我并不感冒)这种好东西当然要写下来!

在 VSCode 中安装好 Remote - SSH 插件,然后检查本地机器和远程服务器的环境是否开启了受支持的 OpenSSH Cilent,做服务器的机子 SSH 应该都是没什么问题了,本地配置好就问题不大了。(微软在 Win10 中内置了 SSH Server For Windows 并占用了默认的 22 端口,本地应该也没什么大问题)

SSH 密钥与授权

检查完毕后在 Windows 命令行使用 ssh-keygen -t rsa -b 4096 创建本地 SSH 密钥对,像我这种菜狗不用查看 ~/.ssh/id_rsa.pub .ssh C:\Users\your-user\.ssh\id_rsa.pub 文件夹就知道我肯定是没有创建过这种东西了。创建时需要输入 passphrase 应该是随便填一串字符记住别忘了就好了(建议为空,否则每次换文件夹都需要输入验证)。

然后授权 Windows 本地机器访问远程 Linux 服务器,只需要在 PowerShell 命令行执行下面的命令就可以了,使用你自己的主机名和远程服务器的用户名来替换其中第一行的部分字段。命令如下

ssh-keygen -t rsa -b 4096

$USER_AT_HOST="[email protected]"
$PUBKEYPATH="$HOME\.ssh\id_rsa.pub"

$pubKey=(Get-Content "$PUBKEYPATH" | Out-String); ssh "$USER_AT_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '${pubKey}' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
创建 SSH 密钥对并获取授权
创建 SSH 密钥对并获取授权
使用 SSH 专有密钥
使用 SSH 专有密钥

或者你也可以使用安全性更高的 separate SSH key 专有密钥。跟前面的命令类似,如下:

ssh-keygen -t rsa -b 4096 -f "$HOME\.ssh\id_rsa-remote-ssh"

$USER_AT_HOST="[email protected]"
$PUBKEYPATH="$HOME\.ssh\id_rsa-remote-ssh.pub"

$pubKey=(Get-Content "$PUBKEYPATH" | Out-String); ssh "$USER_AT_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '${pubKey}' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

SSH 连接服务器

密钥搞定之后在 VSCode 的 Remote SSH 插件设置(也就是 ~/.ssh/config)中按照自己的信息写入 SSH 连接的信息(或者自己点左下角图标 ssh [email protected] 手动创建也行):

Host configName
  HostName ssh-ip
  Port ssh-port-default-22
  User ssh-name-like-root
  IdentityFile ~/.ssh/id_rsa-remote-ssh

之后再创建 SSH 连接的时候就可以看到自己的 configName 名字的 SSH 连接了。创建密钥时没有设置 passphrase 的话现在就可以随意的切换目录了。哦,对了,也可以在命令行使用 code --folder-uri "vscode-remote://ssh-remote+configName/code/my_project" 来通过终端进入 configName 配置的远程服务器对应 /code/my_project 文件夹下。还可以在 PowerShell 中使用 ssh [email protected] 登录远程服务器,只需要验证登录密码和 passparser 。这样一来还用什么 XShell 啊,直接上 VSCode / PowerShell 撸服务器,香!

每切换文件夹时均验证
每切换文件夹时均验证
SSH 连接远程服务器
SSH 连接远程服务器

SSH 端口转发

连接到远程服务器后如果需要使用远程服务器的端口来调试,请参考官方说明仔细配置。

远程资源管理器创建端口转发
远程资源管理器创建端口转发

临时的转发端口可以按 F1 搜索转发端口然后按说明输入 <远程端口><本地主机端口> 即可实现 localhost:本地主机端口 访问 remotehost:远程端口 这样的端口转发。也可以通过打开“远程资源管理器”的“未转发端口”处右键新建转发端口。

始终转发的端口则在之前的 config 文件中写入 LocalForward 配置,开启 始终 转发远程服务器 3000 端口(到本地 3000 端口,我猜的)的配置可以像这样写:

Host configName
  LocalForward 127.0.0.1:3000 127.0.0.1:3000

推荐阅读

Remote Developing 的系列还有一个 Container 的插件,了解不多,有空可以折腾一下。更多好玩的可以仔细读官方的文档,VSCode 赛高!我真的是太爱微软了!

mua(づ ̄3 ̄)づ╭❤~

No! WSL is a tool aimed at enabling users who need them to run Bash and core Linux command-line tools on Windows.
WSL does not aim to support GUI desktops or applications (e.g. Gnome, KDE, etc.)
Also, even though you will be able to run many popular server applications (e.g. Redis), we do not recommend WSL for hosting production services – Microsoft offers a variety of solutions for running production Linux workloads in Azure, Hyper-V, and Docker.