WSL2嵌套虚拟化
-
VMware里面运行ubuntu虚拟机感觉用的有点难受,还是WSL用的舒服,但是WSL不能嵌套虚拟化用不了qemu和kvm,之前看到一篇博客重新编译内核,现在试一下能不能启用开启嵌套虚拟化
-
参考博客:在 WSL2 上获得近乎完整的 Linux 体验 - Pan Xiao’s Blog (ddupan.top)
安装基本工具
- 使用如下命令安装
1 | sudo apt update && sudo apt -y upgrade |
- 在这里出现一个报错,请看问题一
编译内核
- 先查看正在使用的wsl2是的内核版本是哪个版本
- 使用
win + R
,然后输入wsl
,进入wsl
后输入uname -r
,就会出现相应的内核版本,比如我的版本就是5.15.146.1
的内核版本,即5.15
版本
- 然后使用git命令拉取微软官方修改的wsl2内核的仓库这里建议直接去官网下载压缩包,github拉取太大的文件老是会出现一些状况
1 | git clone https://github.com/microsoft/WSL2-Linux-Kernel.git |
- 由于拉取的仓库太大,所以我选择拉取相应内核的分支,可以省下不少时间和存储空间,拉取时间较长,干点别的事情,拉取的时候还出现了一个问题,详细请看问题2
1 | git clone --branch linux-msft-wsl-5.15.y --single-branch https://github.com/microsoft/WSL2-Linux-Kernel.git |
- 进入相应版本的内核,我这边是下载zip压缩包后解压,这边直接cd进入即可
1 | cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.y/ |
- 然后使用如下命令将当前内核配置复制一份到所在目录文件下
1 | zcat /proc/config.gz > .config |
- 使用
make menuconfig
,查看和修改.config
文件中的配置选项。这边使用该命令出现一个问题,详细请看问题3 - 进入如下界面,选择
Virtualization
回车键进去
- 进入后按照如下设置
virtio-net
也被选中 ( 如果有 )- 可以编译成模块再加载,但我选择直接编译进内核,同时可以编译 Multipath 依赖的支持,以便后续 systemd 可以少一个报错
- 按两次 ESC,再导航至
Processor type and features -> Linux guest support
,确定KVM Guest support
已被选中
- 之后保存并退出
- 开始编译
1 | make -j 8 |
- 编译时出现脚本没有执行权限,直接一键给执行权限,然后再编译
1 | chmod +x scripts/*.sh |
-
编译要一步一步找错误了,编译时出错找错就不详细说明了,编译需要点时间,直接干别的事情
-
出现这个就算是编译好了
- 在d盘新建文件夹
bzImage
- 然后使用wsl2下的命令行输入,复制的目标路径为Windows文件目录,注意:内核不要保存在有中文路径的目录、
- 由于我c盘的用户名是中文,所以后来我放在了D盘
1 | cp arch/x86/boot/bzImage /mnt/d/bzImage |
- 然后修改配置,配置文件在C盘这个目录下,配置才会起作用
1 | vim /mnt/c/Users/<username>/.wslconfig |
- 然后写入
1 | [wsl2] |
- 然后重启wsl2,打开Powershell,输入命令
1 | wsl --shutdown Ubuntu |
-
然后再打开新的wsl窗口即可
-
验证:打开wsl后输入,这个时间会出现你编译内核的时间
1 | uname -ar |
- 验证支不支持虚拟化
kvm-ok
问题
问题1
- 安装基本工具的时候出现了如下问题
- 一个是关于
ldconfig.real
的警告,另一个是关于libvirt
包无法定位的问题。
1 | Reading package lists... Done |
- 解决如下:关于
libvirt
包无法定位的问题- 安装以下包来替代
libvirtd
- 安装以下包来替代
1 | sudo apt install libvirt-daemon-system libvirt-clients |
- 这样就可以在wsl上使用qemu了,比在VMware上使用流畅很多,而且打pwn的动调也可以使用wsl了,不用两边切换了
- 用qemu开虚拟机已经非常流畅不会卡了
问题2
- 在拉取仓库的时候遇到如下问题:通常是由于网络问题、服务器响应超时或者存储空间不足等问题导致的。
1 | RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function 和 fetch-pack: unexpected disconnect while reading sideband packet |
- 增加缓存容量
1 | git config --global http.postBuffer 3000000000 |
- 最后还是出错,直接上github官网上下载对应内核版本的zip压缩包
问题3
- 使用
make menuconfig
命令出现报错。
1 | * |
- 问题是缺少
ncurses
包,使用如下命令解决
1 | sudo apt update |
- 安装完包后再运行,仍出现错误
1 | UPD scripts/kconfig/mconf-cfg |
- 问题是:
flex
工具没有安装,使用如下命令安装
1 | sudo apt update |
- 再次运行还是错误
bison
工具没有安装
1 | sudo apt update |
- 仍然出现报错
1 | YACC scripts/kconfig/parser.tab.[ch] |
./scripts/cc-version.sh: Permission denied
表示./scripts/cc-version.sh
脚本没有执行权限。修改权限即可
1 | chmod +x ./scripts/cc-version.sh |
Sorry, this compiler is not supported
:这个错误表示当前的编译器版本不被支持。对于内核编译,推荐使用较新的 GCC 版本,通常是 GCC 7 或更高版本。你可以通过以下命令安装
1 | sudo apt update |
- 确认你的系统上安装了适合的汇编器版本。对于内核编译,推荐使用较新的汇编器版本。通常,
binutils
包含了所需的汇编器工具。你可以通过以下命令安装或更新binutils
:
1 | sudo apt update |
- 问题解决:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论