«Не удалось собрать vmnet» для ядра 3.19

9

Поскольку этот ответ только для ядра 3.13, я хотел бы поделиться решением проблемы Failed to build vmnetдля ядра 3.19 и более ранних версий. Таким образом, это не моя актуальная проблема, а только для того, чтобы помочь будущим читателям.

Вопрос

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

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

Что я должен сделать, чтобы решить эту проблему?

frogatto
источник
Обратите внимание, что это больше не так. Начиная с новой установки сегодня, в системе Linux я не смог повторить эту проблему сборки.
Томас Уорд

Ответы:

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.

frogatto
источник
2
Спасибо за хорошо написанный пост. Это решило проблему для меня.
ChosSimbaOne
4

Спасибо budiap за публикацию патча для Workstation 10! Мне потребовалось некоторое время, чтобы понять, что вам нужно использовать этот код, чтобы применить этот код к файлу патча. Вот пост, который я сделал на форумах рабочих станций vmware.

ЛАДНО! Я понял. Рабочая станция 10 на Ubuntu15.04, или как там-buntu. Я проверял это на Xubuntu 15.04 Kernel 3.19.0-18-generic

Создан новый pastie (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, которые использовали Kernel 3.19.
Тимоти К. Куинн
То же, что @JavaScriptDude. Как пропатчить ядро ​​4.4?
Ligemer
@Ligemer - Я перестал пытаться заставить старые версии рабочей станции vmware работать на Linux и переключился на виртуальную коробку, и решение мне помогло. Для Linux и vmware я думаю, что единственное практическое решение - это купить лицензию на последнюю версию Workstation - или просто использовать бесплатный проигрыватель vmware и придумать внешний механизм моментальных снимков, такой как ZFS или BTRFS.
Тимоти К. Куинн
Спасибо @JavaScriptDude - согласился. Я закончил тем, что пошел в виртуальную коробку также. Я счастливый турист :-) Надеюсь, комментарии могут помочь другим пользователям Linux. Удачного кодирования.
Ligemer
2

если вы работаете с vmware workstation 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
 }
budiap
источник
1
Привет, приятель. Есть ли шанс у руководства идиотов о том, как применить этот патч? Спасибо.
Симмо