Ядро 4.12, виртуальная машина виртуального бокса не работает [закрыто]

Я получаю сообщение об ошибке

Драйвер ядра не установлен (rc = -1908)

, и я должен запустить его как root modprobe vboxdrv .

Пытался это сделать, но ничего не вышло. (говорит, что модуль dues не существует.) Как упоминалось в Интернете, я также пробовал:

apt-get update
sudo apt install --reinstall virtualbox-dkms

Это тоже не сработало:

------------------------------
Deleting module version: 5.1.6
completely from the DKMS tree.
------------------------------
Done.
Unpacking virtualbox-dkms (5.1.6-dfsg-2) over (5.1.6-dfsg-2) ...
Setting up virtualbox-dkms (5.1.6-dfsg-2) ...
Building only for 4.12.0-041200-generic
Building initial module for 4.12.0-041200-generic
ERROR (dkms apport): kernel package linux-headers-4.12.0-041200-generic is not supported
Error! Bad return status for module build on kernel: 4.12.0-041200-generic (x86_64)
Consult /var/lib/dkms/virtualbox/5.1.6/build/make.log for more information.
3
задан 10 July 2017 в 22:38

2 ответа

это работало над Ядром Ubuntu 16.04, x86_64 4.12 (4.12.0-041200-универсальный)

  • Изменитесь на исходный каталог Virtualbox

cd /usr/share/virtualbox/src

  • получите этот патч и поместите его в/usr/share/virtualbox/src

sudo wget http://paste.siduction.org/20170629003423

  • примените патч

sudo patch -Np0 < 20170629003423

  • выполненный vboxconfig путем выполнения

/sbin/vboxconfig

развлекайтесь!

источник: https://forum.siduction.org/index.php? topic=6769.0 плюс мой собственный опыт

4
ответ дан 1 December 2019 в 16:19

На странице, связанной @koleygr, патч, связанный melmarker, кажется, работает. Я могу скомпилировать на хинду Linux, работающем 4.12, хотя я не уверен в Ubuntu.

Патч:

diff -ruN vboxhost.orig/vboxdrv/linux/SUPDrv-linux.c vboxhost/vboxdrv/linux/SUPDrv-linux.c
--- vboxhost.orig/vboxdrv/linux/SUPDrv-linux.c  2016-08-22 00:00:00.000000000 +0200
+++ vboxhost/vboxdrv/linux/SUPDrv-linux.c   2017-05-31 19:00:22.887324690 +0200
@@ -1397,7 +1397,7 @@
 SUPR0DECL(uint32_t) SUPR0GetKernelFeatures(void)
 {
     uint32_t fFlags = 0;
-#ifdef CONFIG_PAX_KERNEXEC
+#if defined(CONFIG_PAX_KERNEXEC) || LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
     fFlags |= SUPKERNELFEATURES_GDT_READ_ONLY;
 #endif
 #if defined(VBOX_STRICT) || defined(VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV)
diff -ruN vboxhost.orig/vboxdrv/r0drv/linux/alloc-r0drv-linux.c vboxhost/vboxdrv/r0drv/linux/alloc-r0drv-linux.c
--- vboxhost.orig/vboxdrv/r0drv/linux/alloc-r0drv-linux.c   2016-08-22 00:00:00.000000000 +0200
+++ vboxhost/vboxdrv/r0drv/linux/alloc-r0drv-linux.c    2017-05-31 19:03:32.465413475 +0200
@@ -35,7 +35,10 @@
 #include <iprt/assert.h>
 #include <iprt/err.h>
 #include "r0drv/alloc-r0drv.h"
-
+#include <linux/kmemleak.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+#include <asm/set_memory.h>
+#endif

 #if (defined(RT_ARCH_AMD64) || defined(DOXYGEN_RUNNING)) && !defined(RTMEMALLOC_EXEC_HEAP)
 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
diff -ruN vboxhost.orig/vboxdrv/r0drv/linux/memobj-r0drv-linux.c vboxhost/vboxdrv/r0drv/linux/memobj-r0drv-linux.c
--- vboxhost.orig/vboxdrv/r0drv/linux/memobj-r0drv-linux.c  2017-02-02 16:54:00.000000000 +0100
+++ vboxhost/vboxdrv/r0drv/linux/memobj-r0drv-linux.c   2017-05-31 19:23:05.187059423 +0200
@@ -899,6 +899,9 @@
     unsigned long   pfn;
     struct page    *pPage;
     pte_t          *pEntry;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+    p4d_t           p4d;
+#endif
     union
     {
         pgd_t       Global;
@@ -917,9 +920,18 @@
     u.Global = *pgd_offset(current->active_mm, ulAddr);
     if (RT_UNLIKELY(pgd_none(u.Global)))
         return NULL;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+    p4d = *p4d_offset(&u.Global, ulAddr);
+    if (RT_UNLIKELY(p4d_none(p4d) || p4d_large(p4d) || !p4d_present(p4d)))
+        return NULL;
+#endif

 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+    u.Upper = *pud_offset(&p4d, ulAddr);
+#else
     u.Upper = *pud_offset(&u.Global, ulAddr);
+#endif
     if (RT_UNLIKELY(pud_none(u.Upper)))
         return NULL;
 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)
@@ -1463,13 +1475,23 @@
 {
     int rc = -ENOMEM;
     pgd_t *pgd;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+    p4d_t *p4d;
+#endif

     spin_lock(&mm->page_table_lock);

     pgd = pgd_offset(mm, ulAddr);
     if (!pgd_none(*pgd) && !pgd_bad(*pgd))
     {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+        p4d = p4d_offset(*pgd, ulAddr);
+        if (p4d_none(*p4d))
+            goto exit;
+        pmd_t *pmd = pmd_offset(p4d, ulAddr);
+#else
         pmd_t *pmd = pmd_offset(pgd, ulAddr);
+#endif
         if (!pmd_none(*pmd))
         {
             pte_t *ptep = pte_offset_map(pmd, ulAddr);
@@ -1487,6 +1509,9 @@
         }
     }

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+exit:
+#endif
     spin_unlock(&mm->page_table_lock);
     return rc;
 }
-1
ответ дан 1 December 2019 в 16:19

Другие вопросы по тегам:

Похожие вопросы: