把笔记本的系统从windows11切换到了Ubuntu24,但是又有些软件只提供windows系统的版本,不得已只能寻找虚拟机方案来运行这类应用程序。
要是在以往,我是不敢贸然从windows系统切换到Ubuntu系统的,只是恰好现在AI发展的比较智能了、我也恰好比较空闲。想着有问题就请教请教以下各大AI嘛,实在是缺什么功能还能让AI来写一个,就大胆的去做系统的切换了。
官网下载这个 VMware 安装也挺麻烦的,应该很多友友找不到下载的地方,有机会再写一篇文章说说怎么找到下载的页面。
我的系统环境:
操作系统:Ubuntu 24.04 LTS
桌面环境:GNOME + Wayland
CPU:AMD Ryzen™ AI 9 H 365 w/ Radeon™ 880M × 20
当前内核:7.0.0-28-generic
VMware版本:Mware Workstation 17.6.4 build-24832109
官网下载得到的文件:VMware-Workstation-Full-17.6.4-24832109.x86_64.bundle
bundle 安装程序启动后,成功生成安装图标。点击 VMware 安装程序后报错。
截图发给AI后,AI已经推测出可能是我的 7.0.0-28-generic 内核版本的问题,说 Ubuntu 24 通常是 6.8.0-28-generic 这个内核版本,可能是软件还没有对较新的内核版本进行适配 。
其实AI这里的判断已经完全正确了。
我使用的是清华大学镜像站下载的 Ubuntu 24 安装镜像装的系统,装好就是这个内核版本。
于是AI推荐我使用命令行的方式执行安装,这样能方便看报错信息分析问题:
# 确认内核版本
uname -r
# 安装编译环境和内核头文件
sudo apt install build-essential linux-headers-$(uname -r)
# 编译 VMware 模块
sudo vmware-modconfig --console --install-all
编译 VMware 模块时,出现一长串的错误信息,里面主要的错误是:
fatal error: driver-config.h: 没有那个文件或目录
fatal error: vm_basic_types.h: 没有那个文件或目录
fatal error: includeCheck.h: 没有那个文件或目录
VMware Linux 版依赖两个核心内核模块:
下载的 bundle 文件里,执行后释放出来的安装程序是包含有源码的,错误是编译源码时出的。
释放出来的源码在这个位置:
/usr/lib/vmware/modules/source/
包含 vmmon.tar 和 vmnet.tar 这两个源码包。
难道官方安装包自带的源码就是齐全不完整的吗?通过 tar tf 命令看以下这个 vmmon.tar 源码包里都有些什么。
可以发现,在这一长串的文件清单里,是有 vmmon-only/include/driver-config.h 这么个文件的。这个安装编译是报错,报找不到的文件,明明是存在的。
拉取官方github仓库的源码看看:
发现官方仓库里的版本只到 17.5.1 的 VMware ,后续版本的没能找到源码。
于是放弃直接从官方github仓库的源码进行编译。
既然官方仓库的源码是 17.5.1 的,那么我改用这个版本的不就行了吗?当时我是这么想的,于是我和AI提出切换到安装 17.5.1 版本,毕竟这个版本官方github有源码。
这时候还以为是源码的缺失,没有认定是内核版本差异问题。
但是官网的下载列表,最低也只提供到 17.5.2 版本的安装包下载。这又把我卡住了,一通搜索后,发现原来是因为从 VMware Workstation Pro 17.5.2 这个版本后才开始对个人用户免费的。
估计也是这个原因官网才没有提供 17.5.2 之前版本的下载吧。
于是放弃 VMware 版本的降级。
既然 Ubuntu 官方内核版本是 6.8.0-136-generic ,而 VMware 也是针对这个内核版本进行开发测试的,那么我把电脑上的系统内核切换成 6.8.0-136-generic 岂不是万事大吉了?
使用命令安装完整通用内核包
sudo apt install linux-generic
然后重启电脑,在开机时的 GRUB 界面,选择 Advanced options for Ubuntu ,然后选择 Ubuntu, with Linux 6.8.0-136-generic 以 6.8.0 内核版本来启动系统。
结果:
好家伙,直接给我卡在开机界面了,进不去系统了。还好原本的 7.0 内核没有删除,我强制关机再开机把就能使用回 7.0 内核版本了。
与AI讨论一通,判断是我的CPU太新了,AMD Ryzen™ AI 9 H 365 。这个 6.8 的内核还没做这款 CPU 的支持,需要 7.0 的内核才能支持到我的CPU。
于是放弃 Ubuntu 内核版本的降级。
和AI来来回回的讨论和尝试后,还是觉得应当相信官方安装包提供的源码。
决定直接把源码包里的文件解压出来看看,看看是怎么个回事。
最终,也是靠官方安装包里的源码解决了安装问题。
创建并前往临时目录:
mkdir /tmp/test-vmmon
cd /tmp/test-vmmon
把两个源码包解压到这个临时目录:
tar xf /usr/lib/vmware/modules/source/vmmon.tar
tar xf /usr/lib/vmware/modules/source/vmnet.tar
文件:vmmon-only/Makefile.kernel
由于 Linux 7.0 新的 Kbuild 已经逐渐淘汰 EXTRA_CFLAGS 这种方式,所以将其修改掉。
# 旧的方式
EXTRA_CFLAGS := ...
# 新的方式
ccflags-y := ...
修改 Makefile.kernel 后编译后出现新的错误信息:
implicit declaration of function ‘del_timer_sync’
这是因为 Linux 7.0 不再自动包含 timer 定义。
打开文件:vmmon-only/linux/driver.c,增加一个头文件 \ 的引入。
修改前:
#include
#include
#include
修改后:
#include
#include
#include
#include
添加正确的头文件后,仍然报错:implicit declaration of function ‘del_timer_sync’
这是因为 Linux 7.0 已经删除了 del_timer_sync 这个 API。
继续修改这个 driver.c 文件。
# 旧的 API
del_timer_sync(&tscTimer);
# 替换成新的 API
timer_delete_sync(&tscTimer);
del_timer_sync 这个函数还有一个地方使用到, 就是同目录下的 hostif.c 文件,把里面的 del_timer_sync 也替换成新的 timer_delete_sync 。
这个 hostif.c 还有一处 API 的变更问题,就是 rdmsrl_safe 这个函数,这个在 7.0 也被改名了。
# 旧的 API
del_timer_sync(&tscTimer);
rdmsrl_safe(msr, &v);
# 替换成新的 API
rdmsrq_safe(msr, &v);
timer_delete_sync(&tscTimer);
进入:
cd vmmon-only
执行:
make
成功:
LD [M] vmmon.ko
cp -f vmmon.ko ../vmmon.o
进入:
cd vmnet-only
执行:
make
成功:
LD [M] vmnet.ko
cp -f vmnet.ko ../vmnet.o
稳健一手,先对原本的代码进行备份:
sudo cp /usr/lib/vmware/modules/source/vmmon.tar ~/vmmon.tar.backup
sudo cp /usr/lib/vmware/modules/source/vmnet.tar ~/vmnet.tar.backup
然后回到我们创建的临时目录进行打包:
cd /tmp/test-vmmon
sudo tar cf /usr/lib/vmware/modules/source/vmmon.tar vmmon-only
sudo tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only
此时,已经用我们修改后的源码包替换掉了原本的,我们可以执行编译安装指令:
sudo vmware-modconfig --console --install-all
看到信息里面是这样的:
Stopping VMware services:
VMware Authentication Daemon done
Virtual machine monitor done
Building module:
...
Using kernel build system
...
就是安装成功了。
从系统的应用列表里也能看到多了三个图标。
执行指令:
lsmod | grep vm
看到输出信息:
vmnet
vmmon
vmw_vsock_vmci_transport
vmw_vmci
这样就是完成了,VMware 核心模块加载成功、网络模块正常、虚拟机可以启动。
Ubuntu 24.04 + Linux 7.0 + VMware Workstation Pro 17.6.4 完全可用。
这次折腾实际上完成了一次 VMware Linux 内核模块移植适配。
如果是在windows下的话,我会选择使用最新版本的软件。
这个习惯在 Ubuntu 下其实是不适应的,因为新的意味着这适配还没有完善,意味着更多的问题。
我会调整自己的使用习惯,从使用较新版本改为使用较稳定版本。