我们有一个系统:
- 在 Windows 10 上运行的 VirtualBox 虚拟机管理程序 v7.0.18,
- RHEL9 的客户操作系统,“uname -r”显示其内核版本是“5.14.0-503.14.1.el9_5.x86_64”。
通过“dnf update”升级到上述内核版本后,我们尝试重建 VirtualBox GuestAdditions,并在日志文件中收到以下错误/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1447:39: error: assignment of read-only member ‘vm_flags’
。
日志文件中有趣部分的更多详细信息:
Building the main Guest Additions 7.0.18 module for kernel 5.14.0-503.14.1.el9_5.x86_64.
Error building the module. Build output follows.
make V=1 CONFIG_MODULE_SIG= CONFIG_MODULE_SIG_ALL= -C /lib/modules/5.14.0-503.14.1.el9_5.x86_64/build M=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j1 modules
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo >&2; \
echo >&2 " ERROR: Kernel configuration is invalid."; \
echo >&2 " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo >&2 ; \
/bin/false)
...
In file included from /tmp/vbox.0/combined-os-specific.c:43:
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c: In function ‘rtR0MemObjNativeLockUser’:
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1447:39: error: assignment of read-only member ‘vm_flags’
1447 | papVMAs[rc]->vm_flags |= VM_DONTCOPY | VM_LOCKED;
| ^~
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c: In function ‘rtR0MemObjNativeMapUser’:
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1929:35: error: assignment of read-only member ‘vm_flags’
1929 | vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
| ^~
make[2]: *** [scripts/Makefile.build:249: /tmp/vbox.0/combined-os-specific.o] Error 1
make[1]: *** [Makefile:1944: /tmp/vbox.0] Error 2
make: *** [/tmp/vbox.0/Makefile-footer.gmk:133: vboxguest] Error 2
Could not find the X.Org or XFree86 Window System, skipping.
kernel modules and services were not reloaded
我们通过将 VirtualBox 升级到最新版本 v7.1.4 解决了该问题。
我们没有机会测试 VirtualBox v7.0.x 的后续补丁版本,但最好也进行验证。
搜索错误消息
error: assignment of read-only member ‘vm_flags’
发现Bug#1038003: xtrx-dkms: 无法为 Linux 6.3 构建模块:错误:只读成员“vm_flags”的赋值。虽然引用的错误不在 VirtualBox 上,但它确实解释了错误的原因:[PATCH v4 2/7] mm: 引入 vma->vm_flags 包装器函数来自 Linux 内核邮件列表,其中包含内核更改:
vm_flags
为只读。vm_flags_init
、vm_flags_reset
、vm_flags_set
和访问函数vm_flags_clear
。vm_flags_mod
由于Linux 内核 API不能保证在各个版本之间保持稳定,因此在内核更新(从而改变 API)之后,“树外”内核模块(例如 VirtualBox Guest Additions 模块)可能无法编译。
另一个答案说更新 VirtualBox 版本解决了该问题。因此,对于此答案,我们提供了一些背景信息,而不是调查如何更改 VirtualBox Guest Additions 模块源代码来修复编译错误。