基于WSL搭建Ubuntu 22.04.x LTS开发环境
运行环境
Microsoft Windows 10.0.26100.4652 x64 专业工作站版 24H2测试通过。
WSL概述
- 安装偏好的Linux分发版,Ubuntu/Red Hat/CentOS/Debian。
- 运行常用的命令行工具(例如grep、sed、awk等)。
- 运行Bash shell脚本和Linux命令行应用程序。
- 使用Linux分发包管理器安装其他软件。
- 使用类似于Unix的命令行shell调用Windows应用程序。
- 在Windows上调用Linux应用程序。
简而言之,使用WSL相当于在Windows中内嵌了一个Linux系统,它与所属的Windows系统可以互相访问本地系统,可以使用Windows的网络访问互联网,继承Windows中配置的hosts等,除了Linux GUI操作以外的其他操作,都可以在wsl中使用。
WSL当前有两个版本,WSL 1和WSL 2,目前的最新版本是2,相对于版本1,WSL 2主要的区别是提高了文件系统的性能和系统调用的兼容性。推荐使用WSL 2。
WSL 2和1的区别和新增功能详情参考:比较 WSL 1 和 WSL 2 | Microsoft Docs
文章目录
- 一、安装Ubuntu
- 1. WSL安装及配置
- 1.1 更新WSL
- 1.2 安装Linux分发版
- 1.3 启动SubLinux
- 1.4 更新APT下载源
- 1.5 迁移SubLinux
- 2. 启用镜像网络(宿主机网络互通)
- 参考文档
- 3. 安装GNOME桌面
- 3.1 远程GUI登录支持
- 3.2 XRDP远程服务
- 3.2.1 安装XRDP
- 3.2.2 远程配置
- 3.2.3 远程连接测试
- 3.3 安装OpenSSH服务
- 参考文档
一、安装Ubuntu
Ubuntu是一个以桌面应用为主的Linux发行版操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu"一词,意思是"人性”我的存在是因为大家的存在",是非洲传统的一种价值观。Ubuntu基于Debian发行版和GNOME桌面环境,而从11.04版起,Ubuntu发行版放弃了GNOME桌面环境,改为Unity。此前人们认为Linux难以安装、难以使用,在Ubuntu出现后这些都成为了历史。Ubuntu也拥有庞大的社区力量,用户可以方便地从社区获得帮助。自Ubuntu 18.04 LTS起,Ubuntu发行版重新开始使用GNOME3桌面环境。
1. WSL安装及配置
打开“控制面板”->“程序和功能”,在左侧栏选择“启用或关闭Windows功能”,在打开的对话框中找到“适用于Linux的Windows子系统”并打勾,点击【确定】关闭对话框,等待系统安装新功能完成,并按提示重启电脑。
也可以通过命令行来启用该功能:
# 启用适用于Linux的Windows子系统
Dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart# 启用虚拟机平台
Dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart# Windows 虚拟机监控程序平台
## 当遇到Ubuntu安装完成,无法启动时,则需要安装(二选一)。笔者没有发现该问题
Enable-WindowsOptionalFeature -Online -FeatureName HypervisorPlatform
Dism /online /enable-feature /featurename:HypervisorPlatform /all /norestart# 启用Hyper-V所有组件
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
“虚拟机平台”和“虚拟机监控程序平台”有什么区别
虚拟机平台
主要用于支持 WSL2 以及 Windows 沙盒等 Windows 自身的虚拟化功能。WSL2 是一个轻量级的 Hyper-V 虚拟机,通过开启 “虚拟机平台” 功能来调用底层的 Hyper-V 虚拟化支持,从而在 Windows 上运行 Linux 发行版,为开发者提供更高效和兼容的 Linux 环境。
当你需要使用 WSL2 或 Windows 沙盒时,需要启用该功能。例如,很多开发者在 Windows 系统上使用 WSL2 来运行 Linux 环境进行开发、测试等工作,此时 “虚拟机平台” 就是必不可少的。虚拟机监控程序平台
是一个相对底层的虚拟化支持功能,为其他虚拟机软件与 Hyper-V 的兼容性提供支持,相当于一个接口或桥梁,使得第三方虚拟机软件能够利用 Hyper-V 的虚拟化功能。
在使用某些第三方虚拟机软件,如旧版本的 VMware Workstation、VirtualBox 等时,可能需要开启 “虚拟机监控程序平台” 功能,以确保这些软件能够正常运行并充分利用硬件虚拟化加速等特性。不过,现在很多新版的虚拟机软件已经自行解决了与 Hyper-V 的兼容问题,即使不启用此功能也能正常工作。
涉及到 WSL,主要是因为 WSL2 的底层架构依赖于 Hyper-V 的虚拟化技术,而 “虚拟机平台” 功能就是用来开启这种虚拟化的支持。当需要使用 WSL2 时,必须启用 “虚拟机平台” 功能,这样才能让 WSL2 正常运行并发挥其高性能和高兼容性的优势。需要注意的是,Win10 家庭版不支持 Hyper-V,但在 “启用和关闭 Windows 功能” 中有 “Windows 虚拟机监控程序平台” 和 “虚拟机平台” 选项,不过开启了这些选项并不能让家庭版 Windows 支持完整的 Hyper-V 功能。
1.1 更新WSL
建议参考以下执行语句顺利执行安装、更新以及配置
提醒
如果是Windows 10版本,则下载并安装 适用于 x64 计算机的 WSL2 Linux 内核更新包
# 更新WSL内核版本(前提是能连接上github.com)
wsl --update# 将WSL 2设置为默认版本
wsl --set-default-version 2# 查看分发版本信息
wsl -l -v
## message info(笔者的)
WSL 版本: 2.5.9.0
内核版本: 6.6.87.2-1
WSLg 版本: 1.0.66
MSRDC 版本: 1.2.6074
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows: 10.0.26100.4652
1.2 安装Linux分发版
打开“Microsoft Store”,在搜索框中输入“linux”,选择偏好的Linux分发版并下载安装。
目前商店内的Linux分发版众多,Ubuntu 22.04.06 LTS是一个不错的选择。
也可以通过命令行来安装子系统:
# 可安装的os列表
wsl --list --online# 安装Ubuntu指定版本
wsl --install Ubuntu-22.04# 安装到指定路径(未测试)
wsl --install Ubuntu-22.04 --root D:\SubLinux-Ubuntu
1.3 启动SubLinux
安装分发版后,在命令提示符或Power Shell中输入“wsl”命令可以直接启动默认的分发版,启动后即进入分发版的shell中,shell的当前工作目录为启动时的windows命令提示符或Power Shell的当前工作目录在Linux中的表示形式,如下图(前提已安装Windows Terminal):
如果没有安装的话,直接在PowerShell直接运行WSL命令也能直接登录到GNU/Linux bash环境。
提示
有时候进程管理器中会发现一个“Vmmem”的进程占用比较多的内存,且不能通过进程管理器结束。这个进程是wsl的一个内存管理进程,通常关闭了wsl的窗口后会自动终止,如果没有终止,可以通过wsl --shutdown指令来结束该进程。
# Ubuntu日常运维指令# 创建或修改root密码
sudo passwd root
New password:
Retype new password:
passwd: password updated successfully# 切换到root管理员身份,便于后续命令不用再加sudo指令头)
su root
Password:
root@CNDGSNDD0194:## 正常关机
sudo shutdown now
1.4 更新APT下载源
APT源是为Ubuntu系统提供软件包的存储库。正确配置这些源可以确保更快地下载和访问更新的软件。以下是修改APT源的步骤和示例,包括在特定区域使用国内镜像以获得更好的性能。
编辑APT源配置文件
sudo vim /etc/apt/sources.list
下载源内容如下
## 阿里22.04-jammy软件源
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse## 清华22.04-jammy软件源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse## 中科大22.04-jammy软件源[推荐]
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
在vim编辑器中,可通过直接按ggVG进行全选,再按delete
进行清空。复制后直接在内容区域处右键粘贴,再直接按**:wq**回车,保存关闭。执行如下语句进行更新下载源缓存列表
sudo apt update && sudo apt upgrade
1.5 迁移SubLinux
比如迁移后的位置是D:\SubLinux-Ubuntu
,则需创建好该目录。然后执行如下语句
# 检查并确保wsl系统已关机
wsl --shutdown# 导出分发版本到指定位置
wsl --export Ubuntu-22.04 E:\Ubuntu-20.04.LTS.tar# 注销分发系统
wsl --unregister Ubuntu-22.04# 导入分发版本到指定位置
wsl --import Ubuntu-22.04 D:\SubLinux-Ubuntu E:\Ubuntu-22.04.LTS.tar --version 2
2. 启用镜像网络(宿主机网络互通)
首先需要创建或编辑%UserProfile%\.wslconfig
文件,也就是C:\Users\<UserName>\.wslconfig
位置。内容如下
[wsl2]
memory=8GB # WSL2 VM 的内存量
processors=4 # WSL 2 VM 的逻辑处理器数量
# 要为 WSL 2 VM 添加多少交换空间,若不需要交换文件,请使用 0。
# 交换存储是当内存需求超过硬件设备上的限制时使用的基于磁盘的 RAM。
swap=8GB
swapFile=D:\\SubLinux-Ubuntu\\wsl-swap.vhdxnetworkingMode=mirrored # 启用镜像网络模式(缺省为NAT网络)
firewall=true # 开启 Windows 防火墙
# dnsTunneling=true # DNS请求更改为Windows代理(缺省)
# autoProxy=true # 使用Windows的HTTP代理信息(缺省)# 打开默认连接,将wsl2 localhost绑定到Windows localhost。当networkingMode=mirrored时,忽略该设置
# localhostForwarding=true# 禁用嵌套虚拟化
nestedVirtualization=false# 用于在 WSL 2 发行版实例启动时,打开显示debug内容的输出控制台。仅适用于Windows 11。
# debugConsole=true[experimental]
autoMemoryReclaim=gradual # 开启自动回收内存,可在 gradual, dropcache(缺省), disabled 之间选择
sparseVhd=true # 开启自动释放 WSL2 虚拟硬盘空间# 启用镜像网络模式时,应用程序能够仅侦听 Linux 中的流量端口,因此即使该端口在 Windows 上用于其他用途,这些应用程序也不会被阻止。
# ignoredPorts=3000,9000,9090# 启用镜像网络模式,允许容器通过分配给主机的 IP 地址连接到主机,或允许主机通过该地址连接到容器。
# 始终可以使用127.0.0.1 环回地址,此选项还允许使用所有额外分配的本地 IP 地址。 仅支持分配给主机的 IPv4 地址。
hostAddressLoopback=true
镜像网络模式类似bridge网桥模式,唯一的区别它没有独立的公网IP(采用的是宿主机IP)。保存成功后,需要重启wsl系统
# 在PowerShell或CMD环境
wsl --shutdown# 直接在Linux环境
logout
shutdown now
提示
在wsl 2.0新版本中mirrored模式下,需特别注意宿主机如果占用的端口,需避开于其在wsl系统中仍继续使用。当然,开启
ignoredPorts
可以忽略宿主机端口的使用,仍以wsl系统配置的服务端口进行工作。
做到此步骤时,发现仅能在宿主机通过IP或localhost进行访问,但仍无法在局域网中访问。需配置Hyper-V防火墙策略
# 开启所有wsl所有服务端口(方法一)
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
# 查看yper-V防火墙配置规则
Get-NetFirewallHyperVRule -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}'
# 重置所有wsl所有服务端口(也可恢复默认值None或NotConfigured)
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Block# 仅开启指定端口(方法二)
## -Name:起服务名,-DisplayName:服务显示名
New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
当测试在宿主机网络客户端上仍无法连接时,则需要在宿主机防火墙配置如下
如果需要允许PING宿主机IP,则可以开启入站规则:
- 核心网络诊断 - ICMP 回显请求(ICMPv4-In)
- 核心网络诊断 - ICMP 回显请求(ICMPv6-In)【支持TCP6】可忽略
参考文档
使用 WSL 访问网络应用程序
WSL 中的高级设置配置
在 WSL2 上安装 Ubuntu
3. 安装GNOME桌面
由于SubSystem没有集成桌面GUI包,而GNOME 42.0 是默认的 Ubuntu 22.04 Jammy Jellyfish Desktop版本。
温馨提示
- Ubuntu-desktop
GNOME桌面(要求性能较高) 提供现代化的外观和丰富的功能,界面较为复杂- Xubuntu-desktop
Xfce桌面环境(轻量级性能) 界面简洁、操作简单- Kubuntu-desktop
KDE桌面环境(要求性能高) 界面炫目且功能强大,适合追求视觉效果和功能丰富的用户
本文笔者就采用它来安装
sudo apt-get update & sudo apt upgrade
# 启用 acpid hold 支持
sudo apt-mark hold acpid acpi-support
# 解决软件包依赖关系问题
sudo apt-get install aptitude# 通过aptitude安装GNOME GUI
sudo aptitude install ubuntu-desktop# 选择zh_CN.UTF-8即可
sudo dpkg-reconfigure locales# 安装中文字体
sudo apt-get install -y ttf-wqy-zenhei xfonts-intl-chinese wqy*# 安装net-tools网络工具包
sudo apt install net-tools# 卸载(维护使用)
sudo apt-get remove ubuntu-desktop
sudo apt-get remove gnome-shell
sudo apt upgrade
3.1 远程GUI登录支持
# 开启root账号远程GUI登录支持(可选)
sudo vim /etc/pam.d/gdm-password
sudo vim /etc/pam.d/gdm-autologin
## 注释文件内容行
auth required pam_succeed_if.so user != root quiet_success
3.2 XRDP远程服务
xrdp 是一个开源的远程桌面协议(RDP)服务器,允许用户从远程计算机访问和控制 Linux 系统的图形用户界面。它在客户端-服务器模型上工作,客户端安装在本地计算机上,服务器安装在远程计算机上。本文采用Window RDP 客户端连接
3.2.1 安装XRDP
# 安装
sudo apt-get install xrdp# 卸载
sudo systemctl disable xrdp
sudo systemctl stop xrdp
sudo apt purge xrdp# 将xrdp用户添加到ssl-cert用户组
sudo adduser xrdp ssl-cert# 检查服务状态
sudo systemctl status xrdp
sudo systemctl status xrdp-sesman# 查看服务列表
sudo ps aux | grep 'xrdp*'
# 查看服务日志
journalctl -xe | grep 'xrdp*'
3.2.2 远程配置
当启用镜像网络时,XRDP默认远程端口3389则突然引发**宿主机远程桌面(启用时)**端口冲突,可调整如下
# 打开配置文件
sudo vim /etc/xrdp/xrdp.ini# 修改下面这一行,将默认的3389改成其他端口即可
port=3390# 同时启用如下几条注释,并修改值
max_bpp=128
xserverbpp=128# 免输用户密码登录(可选)
# 找到[Xorg]代码块,将username和password填充如下,其它不变
[Xorg]
name=Xorg
lib=libxup.so
username=[ubuntu username]
password=[pwd]
#按ESC,:wq!保存。# 第一次运行
echo "gnome-session" > ~/.xsession# 注意,如果XRDP服务已经运行,则重要进行重启该服务以保证配置生效。
sudo systemctl restart xrdp
3.2.3 远程连接测试
当在宿主机桌面通过mstsc远程桌面连接时,发现会闪退或连接上一直黑屏时则调整如下
# 打开配置文件
sudo vim /etc/xrdp/startwm.sh## 将以下内容复制到下图位置,按:wq!保存
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIRgnome-session# :wq!保存后重启服务
sudo systemctl restart xrdp# 检查服务状态
sudo service xrdp status
sudo service xrdp-sesman status
完成后可再次回到宿主机运行mstsc远程桌面工具,进行连接测试
由于连接进去界面还是英文,顺便按上图操作打开settings(设置)位置添加**中文(简体)**语言包,并将它顺序调为首行位置,应用到整个系统即可。
3.3 安装OpenSSH服务
OpenSSH是使用SSH协议远程登录的首要连接工具。它对所有流量进行加密,以消除窃听、连接劫持和其他攻击。此外,OpenSSH还提供了大量的安全隧道功能、几种身份验证方法和复杂的配置选项。
sudo apt update && sudo apt upgrade
# 检查并卸载原SSH服务
sudo apt-get remove openssh-server# 安装
sudo apt-get install openssh-server## 重启服务
sudo systemctl restart ssh
## 检查状态
sudo systemctl status ssh
配置SSH服务,调整如下
# 打开配置文件
sudo vim /etc/ssh/sshd_config# 调整内容## 官方推荐将如下参数,写入/etc/ssh/sshd_config.d子目录中,起任意名称指定扩展名为conf即可
## 当然,直接在sshd_config中修改也可以
Include /etc/ssh/sshd_config.d/*.conf## 默认SSH协议端口
Port 22# 监听IP,比如系统存在多个公网IP时,只开放指定的则配置(可选)。不设定则接受所有接口IP接入
# ListenAddress 0.0.0.0# 是否启用登录日志(可选)
SyslogFacility AUTH## 是否允许root登入
#PermitRootLogin prohibit-password修改为
PermitRootLogin yes# 密码认证(方式1)
PasswordAuthentication yes
# 秘钥认证(方式2)
## 当采用该方式时,需要在客户端生成公私秘钥对,然后将.pub公钥拷贝到SubLinux服务端【~/.ssh】位置
## 同时移除PermitRootLogin yes(密码认证)方式、PermitRootLogin yes(root远程登录)
#PubkeyAuthentication yes# 更改为yes以启用质询-响应密码(注意某些PAM模块和线程的问题)
KbdInteractiveAuthentication yes# 以下是可选项# 是否使用压缩指令
Compression yes# 如果60秒之内没有接收到客户端的消息,就通过加密通道发送一条信息。
ClientAliveInterval 60
# 当没有接收到响应时能够发送client-alive消息的条数,到上限数时断开连接
ClientAliveCountMax 3
当配置调整保存且重启服务后,就完全可以在宿主机网络中任意客户端采用SSH方式进行远程登录了。下面笔者将采用**MobaXterm Personal**【密码:36v1】远端工具进行测试,配置如下
参考文档
SSH配置文件 /etc/ssh/sshd_conf参数详细说明
wsl安装ubuntu并设置gnome图形界面详细步骤
[待续]