WSL2配置安装KVM

查看CPU是否支持硬件虚拟化

  使用命令:

egrep -c '(vmx|svm)' /proc/cpuinfo

  如果返回0则说明不支持,大于零则支持。支持可以直接进行下一步。
若不支持首先查看是否开启了硬件虚拟化,在任务管理器->性能中查看虚拟化是否已开启,如下图所示:
在这里插入图片描述

  若没有开启则需要重启进入BIOS将Intel® Virtualization Technology选为Enabled、Intel® VT-d Feature选为Enabled。
  当开启以上两个后,若WSL仍反映没有硬件虚拟化,则需要执行如下步骤,我们把这个步骤称为WinDbg步骤,请记住这个,因为这意味着,当你的WSL被shutdown后你每次都要执行该步骤以确保WSL下CPU硬件虚拟化的开启:
  在Microsoft shop下载这个:
在这里插入图片描述
  下载后将以下两个文件放在同一个目录下(这里感谢Steffengy):
run-start.bat

REM Ensure vmcompute.exe is running
wsl.exe -e true
REM Listen for and Intercept utility vm creation
start Windbgx.exe -pn vmcompute.exe -c "bp vmcompute!Marshal::JsonParser::JsonParser;g;.scriptrun %CD%\script.js;.scriptrun %CD%\script.js;.scriptrun %CD%\script.js;.detach;qq"
REM Ensure WSL Utility VM is not running (hopefully windb starts up fast enough...)
net stop LxssManager
net start LxssManager
echo "Press Enter if the debugger is running"
pause
REM Start WSL
start wsl.exe

script.js

"use strict";

function initializeScript()
{
    return [new host.apiVersionSupport(1, 3)];
}

function continueExecution() {
    var cmd = "g";
    host.diagnostics.debugLog(cmd);
    var lines = host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    for (var line of lines) host.diagnostics.debugLog("  ", line, "\n");
}

function invokeScript()
{
    /* bp vmcompute!Marshal::JsonParser::JsonParser */

    var cmd;
    var lines;

    // 1. Check if WSL
    var magic = host.memory.readWideString(host.currentThread.Registers.User.rdx, 14);
    if (magic == '{"Owner":"WSL"') {
        host.diagnostics.debugLog("IS WSL\n");
    } else {
        host.diagnostics.debugLog("IS NOT WSL request\n");
        return continueExecution();
    }

    // dump length and read machine spec json
    var len = host.currentThread.Registers.User.r8;
    host.diagnostics.debugLog("String length: ", len, " dumping memory: ", host.currentThread.Registers.User.rdx, "\n");
    var jsonString = host.memory.readWideString(host.currentThread.Registers.User.rdx, len);
    host.diagnostics.debugLog("Before: ", jsonString, "\n");

    // parse and modify machine spec json
    var machineSpec = JSON.parse(jsonString);
    machineSpec.VirtualMachine.ComputeTopology.Processor.ExposeVirtualizationExtensions = true;
    // machineSpec.VirtualMachine.Chipset.LinuxKernelDirect.KernelFilePath = "D:\\temp\\vmlinux.bin";

    var machineSpecJson = JSON.stringify(machineSpec);
    host.diagnostics.debugLog("After:  ", JSON.stringify(machineSpec), "\n");
    var newLen = "0x" + machineSpecJson.length.toString(16);

    // allocate memory
    cmd = ".dvalloc 4096"
    lines = host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    var addr = lines[0];
    var addrParts = addr.split(" ");
    var freeMem = addrParts[addrParts.length-1].replace("`", "");
    host.diagnostics.debugLog("Allocated ", freeMem, "\n");
    
    // write memory
    host.diagnostics.debugLog("Writing memory ", freeMem, " length: ", newLen, "\n");
    cmd = "eu " + freeMem + ' "' + machineSpecJson.split("\\").join("\\\\").split('"').join('\\"') + '"';
    lines = host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    for (var line of lines) host.diagnostics.debugLog("  ", line, "\n");

    // patch rdx with new memory address
    var cmd = "r @rdx = " + freeMem;
    host.diagnostics.debugLog(cmd);
    var lines = host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    for (var line of lines) host.diagnostics.debugLog("  ", line, "\n");

    // patch r8 with new memory size
    var cmd = "r @r8 = " + newLen;
    host.diagnostics.debugLog(cmd);
    var lines = host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    for (var line of lines) host.diagnostics.debugLog("  ", line, "\n");

    return continueExecution();
}

  接着在这两个文件所在的目录下以管理员身份执行run-start.bat文件,此时会跳出WinDbg.exe执行,并且bat文件会出现按任意键继续的字样,此时按任意键,会弹出WSL执行。此时若输入命令查看,则WSL的硬件CPU虚拟化被开启,即使用egrep -c '(vmx|svm)' /proc/cpuinfo得到的值为正值,如下图所示:
在这里插入图片描述

将KVM加入内核模块

下载WSL内核

  由于直接从Microsoft Shop安装的WSL默认没有配置KVM模块,因此需要重新编译WSL的内核。
  首先去GitHub上下载最新的内核文件:链接
在这里插入图片描述
  也可以直接使用如下命令下载:

cd ~
aria2c -x 10 https://github.com/microsoft/WSL2-Linux-Kernel/archive/4.19.128-microsoft-standard.tar.gz

  下载后解压进入该目录下:

tar zxf WSL2-Linux-Kernel-4.19.128-microsoft-standard.tar.gz
cd WSL2-Linux-Kernel-4.19.128-microsoft-standard

编译WSL内核

  进入WSL2-Linux-Kernel-4.19.128-microsoft-standard目录后执行如下命令:

cp Microsoft/config-wsl .config
make menuconfig

  此时会进入BIOS配置,进入Virtualization
在这里插入图片描述
  在KVM support上点击Y打开kvm支持,并在KVM for Intel上点击M将其添加至模块(如果你不需要调整该模块,可以直接将其存入内核中,而不是以模块形式进行编译,这样避免了每次使用sudo modprobe kvm_intel命令装载):
在这里插入图片描述
  返回上一级后进入Processor中:
  然后进入Linux guest support
在这里插入图片描述
  然后将KVM Guest support打开:
在这里插入图片描述
  最后退出并保存即可。退出后正式进行编译:

make -j4

在这里插入图片描述

安装KVM模块

  如果你把KVM当作模块编译的话执行如下命令,若直接作为内核一部分则直接跳过:

sudo make modules_install

在这里插入图片描述

添加WSL在Windows下的配置文件

  将arch/x86/boot/bzImage移入C盘你的用户目录下:

cp arch/x86/boot/bzImage /mnt/c/Users/lyg/

  然后在/mnt/c/Users/lyg目录下创建配置文件.wslconfig如下:

[wsl2]
nestedVirtualization=true
kernel=C:\\Users\\lyg\\bzImage
pageReporting=true
kernelCommandLine=intel_iommu=on iommu=pt kvm.ignore_msrs=1 kvm-intel.nested=1 kvm-intel.ept=1 kvm-intel.emulate_invalid_guest_state=0 kvm-intel.enable_shadow_vmcs=1 kvm-intel.enable_apicv=1

  然后在CMD执行wsl --shutdown将WSL关闭后再打开,此时使用uname -r命令查看内核版本应该变为4.19.128
在这里插入图片描述

配置KVM-Intel

sudo vim /etc/modprobe.d/kvm-nested.conf

# 将如下配置信息放入上述文件即可
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1

加载内核模块

  如果你在执行make menuconfig过程中中KVM for Intel选择的是*而不是M,则忽略装载直接测试即可:

sudo modprobe kvm_intel

  为保证每次启动WSL都能自动装载该模块,请把它写入~/.bashrc中(但更好的方式时编译内核时直接将该模块固定在内核中),如下:

sudo modprobe kvm_intel
sudo chmod 666 /dev/kvm

测试

  如果你曾执行过WinDbg步骤,则在测试前请再次执行后用下述命令测试。如果你没有执行过,则直接使用如下命令测试:

kvm-ok

在这里插入图片描述
  然后执行如下命令应返回结果Y

cat /sys/module/kvm_intel/parameters/nested

在这里插入图片描述
  至此完成安装,当然你可以使用qemu虚拟机进行测试,具体测试不赘述。笔者用syzkaller测试得到如下结果:
在这里插入图片描述
  观察到成功运行qemu。

参考资料

[1]. https://boxofcables.dev/accelerated-kvm-guests-on-wsl-2/
[2]. https://sugeul.github.io/2020-06-21-MacOS-on-WSL2/

### 在 Windows 11 WSL2安装和运行 Docker 镜像 #### 环境准备 为了在 Windows 11 的 WSL2 子系统上成功安装并运行 Docker 镜像,需完成以下几项配置: 1. **确认 CPU 虚拟化已开启** 开启 BIOS 中的虚拟化支持功能是必要的前提条件之一。如果未启用此选项,则后续操作可能会失败。 2. **启用 Linux 子系统 (WSL)** 使用 PowerShell 或命令提示符执行以下命令以启动 WSL 功能: ```powershell wsl --install ``` 此外,可以通过 `wsl --set-default-version 2` 设置默认版本为 WSL2[^2]。 3. **安装 Linux 发行版** 推荐选择 Ubuntu(建议至少为 18.04 版本)。可通过 Microsoft Store 下载最新稳定版本,并将其设置为默认发行版: ```powershell wsl --setdefault Ubuntu ``` 4. **更新包管理器并安装必要组件** 登录到新安装的 Ubuntu 并更新软件源列表: ```bash sudo apt update && sudo apt upgrade -y ``` 安装一些基础依赖库以便于后续步骤顺利进行: ```bash sudo apt install curl wget gnupg lsb-release ca-certificates software-properties-common -y ``` 5. **配置 WSL2 虚拟机嵌套** 编辑 `/etc/wsl.conf` 文件,确保其中包含以下内容来优化性能表现以及允许进一步扩展功能如 kvm 支持等: ```ini [boot] command="systemctl enable systemd-logind" [automount] enabled=true [network] generateResolvConf=false ``` 修改完成后重启 WSL 实例使更改生效: ```powershell wsl --shutdown ``` 6. **安装 Docker Engine** 添加官方 GPG 密钥及存储库地址至 APT 源列表中去获取最新的 docker-ce 包文件;接着按照常规流程完成整个服务端程序部署工作即可正常使用容器技术了。 ```bash # Add the official repository key. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |\ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update # Install Docker CE and CLI tools. sudo apt-get install -y docker-ce docker-ce-cli containerd.io ``` 7. **验证 Docker 是否正常运作** 测试当前环境能否拉取公共镜像并创建简单实例来进行初步检验其可用状态。 ```bash sudo docker run hello-world ``` 8. **可选:安装 KVM 和 X11 工具用于高级用途** 如果计划模拟其他操作系统或者图形界面应用程序的话还需要额外增加这些模块的支持才行哦!比如 macOS 的案例就需要它们配合才能实现预期效果呢。 ```bash sudo apt install qemu-kvm libvirt-daemon-system virt-manager bridge-utils cpu-checker -y sudo apt install xfce4 tightvncserver tigervnc-viewer -y ``` 9. **加载自定义镜像(例如 macOS)** 根据具体需求寻找合适的第三方项目资源链接下载对应压缩包形式的数据集之后解压导入本地仓库再启动相应进程就可以了呀~记得遵循相关法律法规合理合法地运用此类技术手段哈~ ```bash git clone https://github.com/sickcodes/Docker-OSX.git ~/docker-osx cd ~/docker-osx/ ./build.sh ``` 通过上述一系列操作后应该就能够顺利完成目标啦! --- ### 注意事项 - 若遇到任何错误消息,请仔细阅读日志信息尝试定位原因所在位置后再采取针对性措施加以修复处理。 - 对于某些特殊场景可能还需调整更多参数设定值才能够达到最佳体验感度哟~
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-A-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值