Opened 4 years ago
Closed 4 years ago
#19724 closed defect (fixed)
Cannot install on OpenSUSE Leap 15.2 (fixed in SVN)
Reported by: | bLuE | Owned by: | Frank Batschulat (Oracle) |
---|---|---|---|
Component: | host support | Version: | VirtualBox 6.1.10 |
Keywords: | opensuse 15.2 5.3 5.4 | Cc: | |
Guest type: | all | Host type: | Linux |
Description
Hello,
When installing version 6.1.12, the install process fails. I get this error: # /sbin/vboxconfig Created symlink /etc/systemd/system/multi-user.target.wants/vboxdrv.service → /usr/lib/systemd/system/vboxdrv.service. Created symlink /etc/systemd/system/multi-user.target.wants/vboxballoonctrl-service.service → /usr/lib/systemd/system/vboxballoonctrl-service.service. Created symlink /etc/systemd/system/multi-user.target.wants/vboxautostart-service.service → /usr/lib/systemd/system/vboxautostart-service.service. Created symlink /etc/systemd/system/multi-user.target.wants/vboxweb-service.service → /usr/lib/systemd/system/vboxweb-service.service. vboxdrv.sh: Stopping VirtualBox services. vboxdrv.sh: Starting VirtualBox services. vboxdrv.sh: Building VirtualBox kernel modules. vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.
There were problems setting up VirtualBox. To re-start the set-up process, run
/sbin/vboxconfig
as root. If your system is using EFI Secure Boot you may need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information.
I also attach the log file to this bug report.
Here are some details from my system: OS: OpenSUSE Leap 15.2 Kernel: 5.3.18-lp152.20.7-default (x86_64) VirtualBox Version: 6.1.12
Please let me know if you need any more details. I can also do some testing if needed ;)
Cheers, bLuE
Attachments (2)
Change History (21)
by , 4 years ago
Attachment: | vbox-setup.log.gz added |
---|
comment:1 by , 4 years ago
the error during compiling the VBoxNetFlt is causing the failure, from the log file:
Building the main VirtualBox module. Building the net filter module. Error building the module: make V=1 CONFIG_MODULE_SIG= CONFIG_MODULE_SIG_ALL= -C /lib/modules/5.3.18-lp152.20.7-default/build M=/tmp/vbox.0 SRCROOT=/tmp/vb ox.0 -j8 modules .... /tmp/vbox.0/linux/VBoxNetFlt-linux.c: In function ‘vboxNetFltLinuxSkBufToSG’: /tmp/vbox.0/linux/VBoxNetFlt-linux.c:931:36: error: ‘skb_frag_t {aka struct bio_vec}’ has no member named ‘size’ pSG->aSegs[iSeg].cb = pFrag->size; ^~ /tmp/vbox.0/linux/VBoxNetFlt-linux.c:932:66: error: ‘skb_frag_t {aka struct bio_vec}’ has no member named ‘page_offset’; did you mean ‘bv_offset’? pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->page_offset; ^~~~~~~~~~~ bv_offset /tmp/vbox.0/linux/VBoxNetFlt-linux.c:952:40: error: ‘skb_frag_t {aka struct bio_vec}’ has no member named ‘size’ pSG->aSegs[iSeg].cb = pFrag->size; ^~ /tmp/vbox.0/linux/VBoxNetFlt-linux.c:953:70: error: ‘skb_frag_t {aka struct bio_vec}’ has no member named ‘page_offset’; did you mean ‘bv_offset’? pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->page_offset; ^~~~~~~~~~~ bv_offset make[3]: *** [/usr/src/linux-5.3.18-lp152.20.7/scripts/Makefile.build:281: /tmp/vbox.0/linux/VBoxNetFlt-linux.o] Error 1 make[2]: *** [/usr/src/linux-5.3.18-lp152.20.7/Makefile:1644: _module_/tmp/vbox.0] Error 2 make[1]: *** [../../../linux-5.3.18-lp152.20.7/Makefile:179: sub-make] Error 2 make: *** [/tmp/vbox.0/Makefile-footer.gmk:117: vboxnetflt] Error 2
presumably something was backported to linux-5.3.18-lp152.20.7 on OpenSuse 15.2 that wasn't in the 5.3 tree before.
comment:2 by , 4 years ago
yes, pretty sure they backported something from Linux kernel version 5.4 to this 5.3 OpenSuse kernel, because if we look at the function complained about we find this guards making a difference between 5.4 and below:
trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c ... 850 static void vboxNetFltLinuxSkBufToSG(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, PINTNETSG pSG, ... 927 # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) 928 pSG->aSegs[iSeg].cb = pFrag->bv_len; 929 pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->bv_offset; 930 # else /* < KERNEL_VERSION(5, 4, 0) */ 931 pSG->aSegs[iSeg].cb = pFrag->size; 932 pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->page_offset; 933 # endif /* >= KERNEL_VERSION(5, 4, 0) */ 934 Log6((" %p", pSG->aSegs[iSeg].pv)); 935 pSG->aSegs[iSeg++].Phys = NIL_RTHCPHYS; 936 Assert(iSeg <= pSG->cSegsAlloc); 937 }
the 5.4 stuff was introduced to support the 5.4 kernel version with ticket #18945
That change in Linux was:
PATCH v3 0/7 Convert skb_frag_t to bio_vec
https://www.spinics.net/lists/netdev/msg585545.html
So the OpenSuse folks decided to backport this from 5.4 to their 5.3 kernel of OpenSuse 15.2
comment:3 by , 4 years ago
Owner: | set to |
---|---|
Status: | new → accepted |
comment:4 by , 4 years ago
Component: | installer → host support |
---|---|
Keywords: | opensuse 15.2 5.3 5.4 added |
Version: | → VirtualBox 6.1.10 |
comment:5 by , 4 years ago
so I checked the upstream 5.3.18 kernel sources and they are still the same:
https://elixir.bootlin.com/linux/v5.3.18/source/include/linux/skbuff.h#L311
typedef struct skb_frag_struct skb_frag_t; struct skb_frag_struct { struct { struct page *p; } page; #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) __u32 page_offset; __u32 size; #else __u16 page_offset; __u16 size; #endif };
while on the 5.4 kernel branch is has become:
https://elixir.bootlin.com/linux/v5.4/source/include/linux/skbuff.h#L319
typedef struct bio_vec skb_frag_t;
which indeed then has:
https://elixir.bootlin.com/linux/v5.4/source/include/linux/bvec.h#L18
struct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; };
ie. somewhere in the OpenSuse specific version of 5.3.18, 5.3.18-lp152.20.7-default that must have been backported from the 5.4 kernel branch.
follow-up: 7 comment:6 by , 4 years ago
Hello,
Upon going though your comments, here is a bit more information it may help. I've looked at the 5.3.18-lp152.19.2 src.rpm (not the lp152.20.7), which should have these changes too.
grep -A 4 'struct bio_vec {' include/linux/bvec.h
struct bio_vec {
struct page *bv_page; unsigned int bv_len; unsigned int bv_offset;
};
There's also a changelog on spec file with the following (stripped): Wed Oct 16 18:51:52 CEST 2019 - <strippped>@suse.de ...
- net: Convert skb_frag_t to bio_vec (jsc#SLE-7979 jsc#SLE-7981).
...
I could also find a reference on a patch for it on the same src.rpm: ... patches.suse/net-Convert-skb_frag_t-to-bio_vec.patch ...
So, apparently OpenSUSE did backport that particular change.
Cheers, bLuE
comment:7 by , 4 years ago
Replying to bLuE:
Upon going though your comments, here is a bit more information it may help. I've looked at the 5.3.18-lp152.19.2 src.rpm (not the lp152.20.7), which should have these changes too.
Thanks for this detective work, this confirmation and detail is much appreciated.
comment:8 by , 4 years ago
we find the backport in the SLES archive:
https://lists.opensuse.org/opensuse-factory/2019-11/msg00065.html
==== kernel-kvmsmall ==== Version update (5.3.1 -> 5.3.8) ..... - net: Convert skb_frag_t to bio_vec (jsc#SLE-7979 jsc#SLE-7981). net: Rename skb_frag_t size to bv_len (jsc#SLE-7979 jsc#SLE-7981). - net: Rename skb_frag page to bv_page (jsc#SLE-7979 jsc#SLE-7981). - net: Reorder the contents of skb_frag_t (jsc#SLE-7979 jsc#SLE-7981).
So apparently as part of the update to 5.3.8 these 5.4 changes got backported and merged into this.
comment:9 by , 4 years ago
Hi, I reported basically the same problem and today compared the VBoxNetFlt-linux.c in 6.1.10 from virtualbox and opensuse Leap 15.2. The problem is with the detection of the kernel version. It eems the Leap 15.2 is treated as a 4.xx kernel not 5.xx. In leap 15.2 opensuse defined its own OPENSUSE_152 Makro and queries that with defined(OPENSUSE_152) to force to compile the kernel 5.xx code. Pls see their code snippet :
defined(OPENSUSE_152) |
pSG->aSegs[iSeg].cb = pFrag->bv_len; pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->bv_offset;
# else /* < KERNEL_VERSION(5, 4, 0) */
pSG->aSegs[iSeg].cb = pFrag->size; pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->page_offset;
# endif /* >= KERNEL_VERSION(5, 4, 0) */
Following is a diff comparing both versions of VBoxNetFlt-linux.c
1c1 < /* $Id: VBoxNetFlt-linux.c 135976 2020-02-04 10:35:17Z bird $ */ ---
/* $Id: VBoxNetFlt-linux.c $ */
75a76,79
# if defined(CONFIG_SUSE_VERSION) & CONFIG_SUSE_VERSION == 15 && CONFIG_SUSE_PATCHLEVEL == 2 # define OPENSUSE_152 # endif
927c931 < # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) ---
# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) defined(OPENSUSE_152)
948c952 < # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) ---
# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) defined(OPENSUSE_152)
These modifications are the only of this sort in /usr/share/virtualbox/src.
Rgds ... ichamel
comment:10 by , 4 years ago
Sry I forgot "uname -r" :
Linux claire 5.3.18-lp152.33-default #1 SMP Wed Jul 22 06:32:33 UTC 2020 (e5a8383) x86_64 x86_64 x86_64 GNU/Linux
follow-up: 12 comment:11 by , 4 years ago
For Oracle virtualbox users like me, what does this entail?
comment:12 by , 4 years ago
Replying to jcdole:
For Oracle virtualbox users like me, what does this entail?
You could modify that single file by applying the opensuse changes and call vboxconfig afterwards. It should compile properly and you can run virtualbox with this temporary solution until virtualbox.org comes up with the real patch...
Here again the diff of the virtualbox-file at the left and the opensuse version at the right, properly formatted now, I hope :
1c1 < /* $Id: VBoxNetFlt-linux.c 135976 2020-02-04 10:35:17Z bird $ */ --- > /* $Id: VBoxNetFlt-linux.c $ */ 75a76,79 > # if defined(CONFIG_SUSE_VERSION) & CONFIG_SUSE_VERSION == 15 && CONFIG_SUSE_PATCHLEVEL == 2 > # define OPENSUSE_152 > # endif > 927c931 < # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) --- > # if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || defined(OPENSUSE_152) 948c952 < # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) --- > # if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || defined(OPENSUSE_152)
The file to modify is /usr/share/virtualbox/src/vboxhost/vboxnetflt/linux/VBoxNetFlt-linux.c
The patch file :
--- VBoxNetFlt-linux.c 2020-04-09 19:56:04.000000000 +0200 +++ /usr/src/kernel-modules/virtualbox/src/vboxnetflt/linux/VBoxNetFlt-linux.c 2020-06-11 16:32:18.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: VBoxNetFlt-linux.c 135976 2020-02-04 10:35:17Z bird $ */ +/* $Id: VBoxNetFlt-linux.c $ */ /** @file * VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code. */ @@ -73,6 +73,10 @@ #define VBOXNETFLT_OS_SPECFIC 1 #include "../VBoxNetFltInternal.h" +# if defined(CONFIG_SUSE_VERSION) & CONFIG_SUSE_VERSION == 15 && CONFIG_SUSE_PATCHLEVEL == 2 +# define OPENSUSE_152 +# endif + typedef struct VBOXNETFLTNOTIFIER { struct notifier_block Notifier; PVBOXNETFLTINS pThis; @@ -924,7 +928,7 @@ for (i = 0; i < skb_shinfo(pBuf)->nr_frags; i++) { skb_frag_t *pFrag = &skb_shinfo(pBuf)->frags[i]; -# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || defined(OPENSUSE_152) pSG->aSegs[iSeg].cb = pFrag->bv_len; pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->bv_offset; # else /* < KERNEL_VERSION(5, 4, 0) */ @@ -945,7 +949,7 @@ for (i = 0; i < skb_shinfo(pFragBuf)->nr_frags; i++) { skb_frag_t *pFrag = &skb_shinfo(pFragBuf)->frags[i]; -# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || defined(OPENSUSE_152) pSG->aSegs[iSeg].cb = pFrag->bv_len; pSG->aSegs[iSeg].pv = VBOX_SKB_KMAP_FRAG(pFrag) + pFrag->bv_offset; # else /* < KERNEL_VERSION(5, 4, 0) */
To apply the patch assuming virtualbox is installed put the above patch into a file like /tmp/patch123.diff and run as root
cd /usr/share/virtualbox/src/vboxhost/vboxnetflt/linux/ patch -b </tmp/patch123.diff
and you should get an answer like
patching file VBoxNetFlt-linux.c
then leave the place and recompile :
cd /sbin/vboxconfig
and that's it.
Rgds ... ichamel
comment:13 by , 4 years ago
Thank you very much for your quick answer. I will try tomorrow on a test machine, as it is the first time I do this kind of modification. Regards
comment:14 by , 4 years ago
That works.
Great thanks to ichamel for the detailed method which help me.
Regards
by , 4 years ago
Attachment: | opensuse152fix.diff.txt added |
---|
comment:15 by , 4 years ago
comment:16 by , 4 years ago
Testbuilds containing the fix are available as .run installer for
Trunk:
https://www.virtualbox.org/download/testcase/VirtualBox-6.1.97-139689-Linux_amd64.run
6.1.X:
https://www.virtualbox.org/download/testcase/VirtualBox-6.1.13-139685-Linux_amd64.run
remove the current installed RPM package and install the
test build using the .run installer from:
https://www.virtualbox.org/wiki/Testbuilds
where revision is >= 139659 for Trunk and >= 139672 for 6.1.X.
follow-up: 18 comment:17 by , 4 years ago
Same issue exists also for 6.0.X. As far as I know it is still supported?
comment:18 by , 4 years ago
Replying to manfredsch:
Same issue exists also for 6.0.X. As far as I know it is still supported?
No. It is not.
https://www.virtualbox.org/wiki/Downloads
If you're looking for the latest VirtualBox 6.0 packages, see VirtualBox 6.0 builds. Please also use version 6.0 if you need to run VMs with software virtualization, as this has been discontinued in 6.1. Version 6.0 will remain supported until July 2020. If you're looking for the latest VirtualBox 5.2 packages, see VirtualBox 5.2 builds. Please also use version 5.2 if you still need support for 32-bit hosts, as this has been discontinued in 6.0. Version 5.2 will remain supported until July 2020.
comment:19 by , 4 years ago
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
Summary: | Cannot install on OpenSUSE Leap 15.2 → Cannot install on OpenSUSE Leap 15.2 (fixed in SVN) |
vbox-setup log file