"Не вдалося побудувати vmnet" для ядра 3.19


9

Оскільки ця відповідь стосується лише ядра 3.13, тому я хотів би поділитися рішенням проблеми Failed to build vmnetдля ядра 3.19 та більш ранніх версій. Таким чином, це не є моєю актуальною проблемою, а покликана лише допомогти майбутнім читачам.

Питання

Коли я хочу запустити VMware Workstation або VMware Player вперше, йому потрібно розгорнути деякі пакети на рівні ядра, але це не вдається з цією лінією помилок.

Не вдалося побудувати vmnet. Не вдалося виконати команду зборки.

Що мені робити, щоб вирішити цю проблему?


Зауважте, що це вже не так. На сьогоднішній день у встановленій системі Linux я не зміг повторити цю проблему збірки.
Thomas Ward

Відповіді:


8

Рішення

  1. Змініть каталог у вихідний каталог модуля vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Зняти модулі vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Відкрийте vmnet-only/driver.cулюблений текстовий редактор.

    sudo gedit vmnet-only/driver.c
    
  4. Навколо лінії 267 змініть наступне [2]

    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
        ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;        
    

    до

    #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
        ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;
    #else 
    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
        ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;
    #endif
    
  5. Навколо рядка 1194 змінити наступне [2]

    if (filp && filp->f_dentry) {
        inode = filp->f_dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
    

    до

    #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    if (filp && filp->f_dentry) {
        inode = filp->f_dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
    #else 
    if (filp && filp->f_path.dentry) {
        inode = filp->f_path.dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
    #endif
    
  6. Збережіть цей файл, а потім відкрийте файл vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Навколо рядка 526 змінити наступне [2]

    return skb_copy_datagram_iovec(skb, 0, &iov, len);
    

    до

    #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    return skb_copy_datagram_iovec(skb, 0, &iov, len);
    #else
    struct iov_iter to;
    iov_iter_init(&to, READ, &iov, 1, len);
    return skb_copy_datagram_iter(skb, 0, &to, len);
    #endif
    
  8. Збережіть цей файл, а потім повторно націлюйте модулі. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Видаліть попередній робочий каталог. [1]

    sudo rm -r vmnet-only
    
  10. Запустіть GUI (Workstation або Player) ще раз і дозвольте йому створювати модулі.

Список літератури

[1]: Відповідь від неспання .
[2]: А рецензія від Роберта Gadsdon.


2
Дякую за добре написаний пост. Це вирішило для мене питання.
ChosSimbaOne

4

Дякуємо budiap за розміщення патча для Workstation 10! Просто мені знадобилося деякий час, щоб зрозуміти, що вам потрібно використовувати цей код, щоб застосувати цей код до файлу патча. Ось допис, який я зробив на форумах робочих станцій vmware.

ДОБРЕ! Зрозумів. Робоча станція 10 на Ubuntu15.04 або будь-що-buntu. Я тестував це на Xubuntu 15.04 Kernel 3.19.0-18-generic

Створено нову пасти (10215458) для патча для Workstation 10.

Після нової установки Workstation 10.06, зокрема -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Повинно бути root, але ви в основному можете скопіювати / вставити.

curl http://pastie.org/pastes/10215458/download -o /tmp/vmnet-3.19.patch_ws10

cd /usr/lib/vmware/modules/source
tar -xf vmnet.tar
patch -p0 -i /tmp/vmnet-3.19.patch_ws10
mv vmnet.tar vmnet.tar.SAVED
tar -cf vmnet.tar vmnet-only
rm -r vmnet-only
vmware-modconfig --console --install-all

Не можу повірити, що я перша особа, яка підтримала це! Це чудова, чудова відповідь. (Сподіваюся, ви не заперечуєте проти моєї запропонованої редакції.)
Марк Е. Хааз

1
Я просто спробував це з Kernel 4.2 з Ubuntu 15.10, і це не вийшло. Я не зміг знайти жодного виправлення, щоб WS10 працював 15.10, і мені довелося знизитись до 14 LTS, які використовували ядро ​​3.19.
Тімоті К. Куінн

Те саме, що і @JavaScriptDude. Як виправити ядро ​​4.4?
Ligemer

@Ligemer - Я відмовився від спроб застаріти версії робочої станції vmware для роботи на Linux і перейшов на віртуальну коробку, і рішення мені добре послужило. Для Linux та vmware я думаю, що єдиним практичним рішенням є придбання ліцензії на останню версію Workstation - або просто використовувати безкоштовний програвач vmware та придумати зовнішній механізм знімка, наприклад ZFS або BTRFS.
Тімоті К. Квін

Дякую @JavaScriptDude - погодився. Я також перейшов у віртуальний ящик. Я щасливий кемпер :-) Сподіваємось, коментарі можуть допомогти іншим користувачам Linux. Щасливе кодування.
Лігемер

2

якщо ви працюєте з робочою станцією vmware 10, застосуйте цей патч, щоб він працював на ядрі 3.19

diff -rupN vmnet-only/driver.c vmnet-only-modified/driver.c
--- vmnet-only/driver.c 2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/driver.c    2015-05-07 14:53:18.272218785 +0800
@@ -265,10 +265,17 @@ LinuxDriver_Ioctl32_Handler(unsigned int
 {
    int ret = -ENOTTY;

+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
       ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;
+#else 
+   if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
+      ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg);
+   }
+   return ret;
+#endif
 }


@@ -1191,11 +1198,19 @@ VNetFileOpUnlockedIoctl(struct file    *
    struct inode *inode = NULL;
    long err;

+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    if (filp && filp->f_dentry) {
       inode = filp->f_dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
+#else 
+   if (filp && filp->f_path.dentry) {
+      inode = filp->f_path.dentry->d_inode;
+   }
+   err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
+   return err;
+#endif
 }
 #endif

diff -rupN vmnet-only/netif.c vmnet-only-modified/netif.c
--- vmnet-only/netif.c  2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/netif.c 2015-05-07 14:51:43.326885576 +0800
@@ -149,7 +149,7 @@ VNetNetIf_Create(char *devName,  // IN:
    memcpy(deviceName, devName, sizeof deviceName);
    NULL_TERMINATE_STRING(deviceName);

-   dev = alloc_netdev(sizeof *netIf, deviceName, VNetNetIfSetup);
+   dev = alloc_netdev(sizeof *netIf, deviceName, NET_NAME_UNKNOWN, VNetNetIfSetup);
    if (!dev) {
       retval = -ENOMEM;
       goto out;
diff -rupN vmnet-only/userif.c vmnet-only-modified/userif.c
--- vmnet-only/userif.c 2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/userif.c    2015-05-07 14:52:32.095595913 +0800
@@ -523,7 +523,13 @@ VNetCopyDatagram(const struct sk_buff *s
       .iov_base = buf,
       .iov_len  = len,
    };
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
    return skb_copy_datagram_iovec(skb, 0, &iov, len);
+#else
+   struct iov_iter to;
+   iov_iter_init(&to, READ, &iov, 1, len);
+   return skb_copy_datagram_iter(skb, 0, &to, len);
+#endif
 }

1
Привіт будіап. Будь-який шанс у ідіотів керівництво про те, як застосувати цей патч? Дякую.
Сіммо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.