WSL 及常用环境配置

WSL(Windows Subsystem for Linux)即:开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(本质上是 Hyper-V 虚拟机,且多个 WSL 发行版实际运行在同一个 Linux 内核之上),微软官方中文文档 中有非常详细的说明及安装使用步骤。

运行要求:对于 x64 系统:Windows 10 / 11 的 1903 或更高版本,建议安装 Windows Terminal。

官方文档有详细的安装说明,因 Windows Store 存在网络问题及默认安装路径问题,笔者选择手动安装。参考 手动安装WSL 中的步骤 1 至步骤 5,启用功能,下载内核包等。从步骤 6 开始,通过手动下载发行版并自定义安装位置。通过 下载发行版 中提供的链接,选择一个发行版(如Ubuntu 24.04),点击对应 URL 下载 .AppxBundle 文件。

注:若不介意安装至C盘,可以直接双击运行 .AppxBundle 文件安装对应发行版,无需参考后续过程。

下载文件拓展名为 .AppxBundle 的 Windows 商店程序离线安装包 (笔者下载的是 Ubuntu2404-240425.AppxBundle)后,直接使用解压软件(如7zip等)对其解压,得到目录如下:

bash

PS D:\Downloads\Ubuntu2404-240425> ls

目录: D:\Downloads\Ubuntu2404-240425

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/12/8     15:21                AppxMetadata
------         2024/4/24     13:03            338 AppxBlockMap.xml
------         2024/4/24     13:03          12148 AppxSignature.p7x
------         2024/4/24     13:02      342315241 Ubuntu_2404.0.5.0_ARM64.appx
------         2024/4/24     13:03          42278 Ubuntu_2404.0.5.0_scale-100.appx
------         2024/4/24     13:03          49662 Ubuntu_2404.0.5.0_scale-125.appx
------         2024/4/24     13:03          56958 Ubuntu_2404.0.5.0_scale-150.appx
------         2024/4/24     13:03         130895 Ubuntu_2404.0.5.0_scale-400.appx
------         2024/4/24     13:03      357224321 Ubuntu_2404.0.5.0_x64.appx
------         2024/4/24     13:03            469 [Content_Types].xml

根据CPU架构(笔者使用的是x64),选择对应的.appx文件,再次使用解压软件进行解压,得到的目录结构如下

bash

PS D:\Downloads\Ubuntu2404-240425\Ubuntu_2404.0.5.0_x64> ls

目录: D:\Downloads\Ubuntu2404-240425\Ubuntu_2404.0.5.0_x64


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/12/8     15:25                AppxMetadata
d-----         2024/12/8     15:25                Assets
d-----         2024/12/8     15:25                Terminal
------         2024/4/24     13:02         330541 AppxBlockMap.xml
------         2024/4/24     13:02           3668 AppxManifest.xml
------         2024/4/24     13:03          12190 AppxSignature.p7x
------         2024/4/24     13:02      356736729 install.tar.gz
------         2024/4/24     13:02           3648 resources.pri
------         2024/4/24     13:02         342016 ubuntu2404.exe
------         2024/4/24     13:02            802 [Content_Types].xml

可以将上述解压后的文件移动至自定义目录下(如 D:\WSL\Ubuntu),避免WSL默认安装到C盘中。

在对应路径打开PowerShell,运行.exe程序安装发行版,其中可选的参数如下

cmd

# install --root 即:不创建其他linux用户,只创建root用户,后续可以通过useradd自行创建
# --default-user root 即:设置root用户为默认登录用户,后续可以通过修改配置文件自行调整

.\ubuntu2404.exe install --root config --default-user root

# 若需要创建非root用户,直接运行 ubuntu2404.exe 即可
.\ubuntu2404.exe

安装好后即可在 PowerShell 中使用 wsl 命令管理WSL,可使用 wsl --help 命令查看命令参数。

powershell

# 列出安装的所有 wsl 发实例及运行状态
PS D:\WSL\Ubuntu> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-24.04    Running         2
  kali-linux      Stopped         2
  fedoraremix     Running         2

# 对特定的 wsl 实例执行关机操作
PS D:\WSL\Ubuntu> wsl -t fedoraremix
操作成功完成

# 关闭所有实例
PS D:\WSL\Ubuntu> wsl --shutdown

默认情况下,Windows 所有文件被挂载到所有 WSL 实例 /mnt/ 目录下,如 WSL 中 /mnt/c/Users/Admin/Desktop 目录对应 Windows 下 C:\Users\Admin\Desktop ,可以使用 Linux 的文件管理命令(如cp、mv)进行文件操作,若需关闭该项配置或挂载到其他目录下,请参考 WSL高级配置。Windows 在资源管理器的地址栏输入 Linux ,即可查看各 WSL 实例的文件。

注意:

  • Windows 下的文件名和目录名可能存在空格符,但 Linux 文件名和目录名不应使用空格。

  • Linux 和 Windows 下的文本文件的行尾符不同,Linux为 \n ,Windows 为 \r\n ,在编写某些配置文件时需注意。

bash

xxd Readme_Linux.md
00000000: 4c69 6e75 780a                           Linux.
xxd Readme_Win.txt
00000000: 4c69 6e75 780d 0a                        Linux..

参考 官方文档 ,微软商店提供的 Ubuntu 24.04 LTS 发行版默认配置并启用了systemd,无需配置。其他实例:

创建该实例的配置文件 /etc/wsl.conf ,添加如下内容

bash

[boot]
systemd=true

重启WSL实例:在宿主机 PowerShell 中运行

powershell

wsl --shutdown

可参考 微软官方文档 安装 Nautilus、Chrome 等相关应用

默认情况下,WSL 实例会将 Windows 的环境变量也添加到当前实例的环境变量中,可以使用 echo $PATH 查看环境变量,因为在 WSL 实例中使用 Tab 键补全命令时经常会提示出 Windows 环境变量中的命令,故笔者习惯关闭。

修改实例的配置文件 /etc/wsl.conf ,添加如下内容

bash

[interop]
enabled = false
appendWindowsPath = false

重启 WSL 实例,再次使用 echo $PATH 查看环境变量,已不存在 Windows 的环境变量。

默认情况下,WSL 实例获取到的是 B 类私有地址(Hyper-V 的 NAT模式),如果通过 WSL 搭建服务,只有宿主机可以访问,与宿主机同网段的其他主机无法访问,可以在 Windows 宿主机配置端口映射,将 WSL 的端口映射至宿主机端口:

NAT模式:使用管理员权限打开 Windows PowerShell 运行如下命令:

powershell

# 端口映射:将 WSL IPv4的 172.29.155.233:80 映射至 宿主机的8888端口
netsh interface portproxy add v4tov4 listenport=8888 connectport=80 connectaddress=172.29.155.233
# 查看端口映射状态:
netsh interface portproxy show all
# 关闭映射
netsh interface portproxy delete v4tov4 listenport=8888

注:如果存在网络访问问题,请排查 Windows 防火墙 wf.msc 中的入站策略。

镜像模式:镜像模式下,WSL 和 Windows 宿主机为同一个 IP地址,WSL 的服务可以被宿主机同网段的其他主机访问。

需要参考 WSL全局配置文档 ,修改全局配置。在 Windows 的 %UserProfile% (一般是当前用户家目录)下,创建 .wslconfig 配置文件。详细参数及配置可参考 WSL网络文档Hyper-V防火墙 文档。

bash

[wsl2]

# 镜像模式
networkingMode=mirrored

# WSL流量是否经过 Windows 防火墙和 Hyper-V 防火墙过滤
firewall=true

[experimental]

# 仅当网络为镜像模式时使用,允许同网段的其他主机通过 Windows 宿主机 IP 访问 WSL 服务
hostAddressLoopback=true

使用管理员权限在 PowerShell 窗口中运行以下命令,允许入站连接:

powershell

Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow

注:Windows中 %UserProfile% 下的 .wslconfig 配置文件,针对的是当前Windows主机中的所有 WSL 实例的配置;WSL 实例中的 /etc/wsl.conf 仅针对当前 WSL 实例

Zsh 是一个功能强大的命令行 Shell,比传统的 Bash 具有更多的自定义选项和增强功能。OhMyZsh 是 Zsh 配置的一个集合,包含了大量预设的插件和主题。用户可通过 OhMyZsh 安装各种插件和主题来增强 Zsh 的功能,实现改变命令提示符的外观、启用如 Git 状态显示、命令自动修正等各种特性。

检查更新并进行更新,安装 zsh、curl

bash

apt update
apt upgrade
apt install zsh curl

设置 zsh 作为当前用户默认 Shell,重新登陆后生效

bash

chsh -s /usr/bin/zsh

可参考:OhMyZsh 的 Github 仓库

bash

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装插件 zsh-autosuggestions ,用于从历史记录中提示命令

bash

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

安装插件 zsh-syntax-highlighting ,用于命令行代码高亮显示

bash

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

修改当前用户 zsh 配置文件 .zshrc

bash

vim ~/.zshrc

在.zshrc 的 plugins 配置项 ( 约第 75 行 ) 中启用上述插件

bash

plugins=(
        git
        zsh-autosuggestions
        zsh-syntax-highlighting
)

更换主题:修改当前用户 zsh 配置文件 .zshrc,在.zshrc 的 ZSH_THEME 配置项 ( 约第 11 行 ) ,自行选择 Zsh主题 ,笔者配置如下:

bash

ZSH_THEME="agnoster"

修改完成后注销用户并重新登录,上述配置被应用。

应用完成后,上述 agnoster 主题的字体颜色及字体的背景颜色视觉效果不是很好,可自行修改主题配置文件 ~/.oh-my-zsh/themes/agnoster.zsh-theme 进行自定义。关于颜色可参考 Wiki

且也可通过自定义 prompt 实现显示其他内容,如笔者通过在上述主题配置文件中,自定义 prompt 实现在 Shell 中显示本机 IP 。

bash

# display ip address
prompt_ip() {
  local ip
  ip=$(hostname -I | awk '{print $1}')
  [[ -n "$ip" ]] && prompt_segment 039 233 "$ip"
}

## 注意:自定义 prompt 后需要在 build_prompt() 中引用,引用的相对位置关系即为在 Shell 的显示位置关系。
## Main prompt
build_prompt() {
  RETVAL=$?
  prompt_status
  prompt_virtualenv
  prompt_aws
  prompt_context
  prompt_dir
  #  prompt_ip 这行是笔者自行添加的,用于显示 IP
  prompt_ip
  prompt_git
  prompt_bzr
  prompt_hg
  prompt_end
}

调整一下配色,附上 花里胡哨的 效果图,Shell 中可以显示当前路径、IP 地址、Git 状态等信息。

image-20241208162814879

安装 Docker 可参考官方文档,此处简单记录

  • 卸载旧版本

bash

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
  • 添加 Docker 的 apt 源仓库:

bash

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
  • 安装 Docker 及其他工具包

bash

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 为 Docker 设置 HTTP 代理(docker pull 和 docker run 等命令无法通过 proxychains 进行代理,只能手动修改配置文件)

bash

vim /usr/lib/systemd/system/docker.service

# 在 [Service] 配置块下添加如下配置
Environment=HTTP_PROXY=http://127.0.0.1:7898
Environment=HTTPS_PROXY=http://127.0.0.1:7898

# 重载 docker 配置并重启 docker 服务
systemctl daemon-reload
systemctl restart docker

# 查看代理是否已配置,输出刚刚的配置证明配置正确
systemctl show --property=Environment docker
  • 运行 Docker 实例

bash

# 运行 Docker Hello World(本地无镜像则直接从 DockerHub pull)
docker run hello-world

# 运行 NGINX(映射到本机8080端口)
docker run --name my_nginx -d -p 8080:80 nginx

# 滚动查看实例日志
docker logs my_nginx -f

部分文档描述中需要重新编译 WSL2 内核,笔者环境如下,未编译内核可成功安装使用。

WSL 版本: 2.3.24.0

内核版本: 5.15.153.1-2

WSL 发行版:Ubuntu 22.04.5 LTS

KVM+QEMU+libvirt 可以类比理解为 VirtualBox 或者 VMware Workstation

  • KVM:提供 CPU 虚拟化

  • QEMU:模拟网络设备、存储设备、其他硬件设备(USB、显示)等

  • libvirt:提供统一的管理接口(API、命令行:virsh 、GUI:virt-manager),用于管理虚拟机

注意:安装前请确保 WSL 发行版已启用了 systemd

更新系统包,安装 KVM 及相关组件:

bash

sudo apt update && sudo apt upgrade
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst

启动 KVM 虚拟机管理服务:

bash

sudo systemctl enable --now libvirtd

将当前登录用户加入 kvmlibvirt 用户组,以便能够创建和管理虚拟机。

bash

sudo usermod -aG libvirt,kvm $USER

$USER 环境变量引用的即为当前登录的用户名。需要重新登录才能使得配置生效(wsl --shutdown 或者 wsl -t 发行版名称

使用 virt-manager(图形化工具)或者 virsh(命令行工具)来创建和管理虚拟机,使用图形化工具操作简单,此处不再赘述。

在 QEMU/KVM 中安装 Windows 虚拟机后,参考 该Github Repo ,安装 Latest virtio-win-guest-tools.exe 即可实现剪切板文本共享与屏幕大小自适应(类似于 VMware Tools ),屏幕自适应选项为 ViewScale DisplayAuto resize VM with window

默认NAT网络下的虚拟机IP地址段为 192.168.122.0/24 ,为避免地址段冲突可自行修改。

首先,可以使用 virsh 命令查看当前配置的虚拟网络,确认默认网络的名称。

bash

sudo virsh net-list --all

上述命令会列出所有的虚拟网络。默认情况下,网络名称为 default

使用如下命令编辑当前网络配置文件(首次执行该命令,会让用户选择默认编辑器):

bash

sudo virsh net-edit default

将会打开一个 XML 配置文件,里面包含了网络的详细信息。默认情况如下:

xml

<network>
  <name>default</name>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:11:22:33'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

在配置文件中,找到 <ip> 标签,修改 address (网关地址)和 netmask (子网掩码)、<range> 来更改网络地址段,<range> 标签定义了可以分配给虚拟机的 IP 地址范围。修改完成后,保存并关闭编辑器。

应用修改后,需要重新启动虚拟网络才能生效:

bash

sudo virsh net-destroy default
sudo virsh net-start default
  • net-destroy 命令会销毁当前的虚拟网络(不会删除网络配置,只是停止网络)。
  • net-start 命令会重新启动网络,使新的配置生效。

可以使用 virsh net-dhcp-leases default 命令查看当前 DHCP 租约,确保虚拟机获得了新的 IP 地址段。

bash

sudo virsh net-dhcp-leases default

若配置无误,虚拟机应该会在新的 IP 地址段内获得地址。