WSL kick start

什么是WSL?

WSL 2(Windows Subsystem for Linux 2)是微软推出的Windows 10操作系统中的一个功能,它允许用户在Windows环境中运行一个完整的Linux内核虚拟机。与之前的WSL相比,WSL 2采用了全新的架构,带来了一系列改进和优势。

  1. **更好的性能: **WSL 2使用了完整的Linux内核虚拟机(VM),而不仅仅是简单的系统调用转换。这使得WSL 2的性能比WSL更好,特别是对于CPU密集型任务和文件系统性能。
  2. 支持Docker: WSL 2支持在Linux容器内运行Docker,而WSL无法直接运行Docker。这使得WSL 2成为开发者进行Docker容器开发和测试的理想环境。
  3. 更好的兼容性: WSL 2使用Linux内核虚拟机,因此与WSL相比,更多的Linux应用和工具能够无缝运行,减少了由于系统调用不完全支持导致的兼容性问题。
  4. 更好的文件系统: WSL 2支持与Windows文件系统直接集成,使得文件的读写操作更加高效,同时也可以通过Windows文件资源管理器直接访问Linux文件系统。
  5. **更好的网络支持: **WSL 2使用虚拟网络适配器,使得网络性能得到改进,可以在WSL 2中直接访问Windows主机上的网络服务。

总的来说,WSL 2是对WSL的重要升级,提供了更好的性能、更广泛的应用兼容性和更方便的开发体验,使得在Windows平台上进行Linux开发变得更加高效和便捷。

refer to:
什么是适用于 Linux 的 Windows 子系统
比较 WSL 版本

功能 WSL 1 WSL 2
Windows 和 Linux 之间的集成
启动时间短
与传统虚拟机相比,占用的资源量少
可以与当前版本的 VMware 和 VirtualBox 一起运行
托管 VM
完整的 Linux 内核
完全的系统调用兼容性
跨 OS 文件系统的性能

完整的Linux内核

**WSL 2中的Linux内核是Microsoft根据最新的稳定版分支(基于kernel.org上提供的源代码)构建的。**此内核已专门针对WSL 2进行了调整,针对大小和性能进行了优化,以便在Windows上提供良好的Linux体验。内核将由Windows更新提供服务,这意味着你将获得最新的安全修补程序和内核改进功能,而无需自行管理它。

完全的系统调用兼容性

Linux二进制文件使用系统调用来执行访问文件、请求内存、创建进程等功能。虽然WSL1使用的是由WSL团队构建的转换层,但WSL 2包括了自己的Linux内核,具有完全的系统调用兼容性。优点包括:

  • 可以在WSL内部运行的一组全新应用,例如Docker等。
  • 对Linux内核的任何更新都立即可供使用。(无需等待WSL团队实现更新并添加更改)。

WSL 2安装

# 自动下载并安装WSL所需的组件和文件。
wsl --install

# 启用WSL和虚拟机平台功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# 默认情况下,WSL的版本是1,但我们想要使用更高性能的WSL 2版本。
wsl --set-default-version 2

# 如需卸载,则输入wsl --unregister Ubuntu

基础环境配置

打开开始菜单,并搜索并选择“Ubuntu”应用程序。点击它,将打开一个新的命令行窗口,开始初始化Ubuntu WSL。
在第一次启动时,系统会提示你设置一个新的用户名和密码。首先,输入你想要的新用户名,然后按下“Enter”键。

cat > /etc/apt/sources.list << EOF
# 默认注释了源码镜像以提高 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 http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
EOF

sudo apt update
sudo apt upgrade

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py311_23.5.0-3-Linux-x86_64.sh
bash Miniconda3-py311_23.5.0-3-Linux-x86_64.sh
# Do you accept the license terms? [yes|no]
# yes
# yes

WSL kernel update

首先,进入WSL,使用命令uname -r查看当前内核版本,发现版本为5.15.90.3-microsoft-standard-WSL 2,不符合后续的需求,因此需要手动升级内核。
在尝试使用apt install linux-image安装内核时,发现该方法无法正常启动。因此,我们需要从The Linux Kernel Archives下载所需版本,并配合微软的配置进行编译;或者直接从https://github.com/microsoft/WSL 2-Linux-Kernel拉取对应的版本进行编译。

refer to: 如何更新 Win10 WSL2 的 Linux 内核

这里我们以从https://github.com/microsoft/WSL 2-Linux-Kernel拉取对应分支进行编译为例。

# Clone 仓库并切换到指定分支
git clone --branch linux-msft-wsl-6.1.y https://github.com/microsoft/WSL2-Linux-Kernel.git
# 安装编译所需的工具和依赖
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc
# 进入仓库目录
cd WSL2-Linux-Kernel
# 使用指定的配置文件进行编译
make KCONFIG_CONFIG=Microsoft/config-wsl

编译完成后,将编译好的内核文件bzImage复制到宿主机的目录,这里我们复制到D盘下的VMs/WSL目录中(根据自己的实际情况调整)。

cp arch/x86_64/boot/bzImage /mnt/d/VMs/WSL

接下来,在宿主机的%UserProfile%目录下,创建.wslconfig文件,并修改其中kernel对应的目录。

[wsl2]
kernel=D:\\VMs\\WSL\\bzImage

打开 PowerShell,立即终止所有 WSL 虚拟机,从而实现虚拟机的重启。

wsl --shutdown

重新打开 WSL 虚拟机,并再次查看内核版本。

uname -r
# 6.1.21.2-microsoft-standard-WSL2+

通过以上步骤,我们成功升级了 WSL 的内核版本。

你可能感兴趣的:(Docker,WSL,Windows,WSL,Docker)