VMWare player e Ubuntu 15.04: driver net não compila mais, como consertar?

4

Eu uso o VMWare Player no Ubuntu e executo um número diferente de máquinas virtuais nele.

Funcionou bem até 14.10, quando o kernel foi atualizado, eu seria solicitado a recompilar os módulos etc; mas não funciona mais com o Ubuntu 15.04.

O problema é que ele falha ao tentar recompilar o "adaptador de rede virtual". Como posso consertar isso?

    
por fge 24.04.2015 / 08:34

2 respostas

15

Use este comando (precisa de acesso root):

$ wget http://pastie.org/pastes/9934018/download -O /tmp/vmnet-3.19.patch
$ cd /usr/lib/vmware/modules/source
$ tar -xf vmnet.tar
$ patch -p0 -i /tmp/vmnet-3.19.patch
$ tar -cf vmnet.tar vmnet-only
$ rm -r *-only
$ vmware-modconfig --console --install-all

para o vmware-player 9 você também precisa mudar:

  • linha somente para vmnet / netif.c de:

    dev = alloc_netdev(sizeof *netIf, deviceName, VNetNetIfSetup);
    

    para

    dev = alloc_netdev(sizeof *netIf, deviceName, NET_NAME_UNKNOWN, VNetNetIfSetup);
    
  • apenas vmnet / filter.c linha 207 de:

    VNetFilterHookFn(unsigned int hooknum, // IN:

    para:

    VNetFilterHookFn(const struct nf_hook_ops *ops, // IN:

  • somente para vmnet / filter.c linha 255 de:

    transmit = (hooknum == VMW_NF_INET_POST_ROUTING);

    para:

    transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);

por Petro Pikh 24.04.2015 / 09:34
0

Isso ocorre porque o Ubuntu 15.04 usa o kernel Linux 3.19, que traz mudanças para a API de rede que o VMWare player ainda não contabilizou.

Nota: a versão do VMWare Player usada aqui é 7.1.x.

A solução é aplicar o seguinte patch ao driver vmnet:

diff --git a/driver.c b/driver.c
index 2e1e643..507a509 100644
--- a/driver.c
+++ b/driver.c
@@ -266,7 +266,7 @@ LinuxDriver_Ioctl32_Handler(unsigned int fd,     // IN: (unused)
    int ret = -ENOTTY;

    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
-      ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
+      ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;
 }
@@ -1191,8 +1191,8 @@ VNetFileOpUnlockedIoctl(struct file    *filp,  // IN:
    struct inode *inode = NULL;
    long err;

-   if (filp && filp->f_dentry) {
-      inode = filp->f_dentry->d_inode;
+   if (filp && filp->f_path.dentry) {
+      inode = filp->f_path.dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
diff --git a/userif.c b/userif.c
index e68d4ce..b311f48 100644
--- a/userif.c
+++ b/userif.c
@@ -523,7 +523,9 @@ VNetCopyDatagram(const struct sk_buff *skb, // IN: skb to copy
       .iov_base = buf,
       .iov_len  = len,
    };
-   return skb_copy_datagram_iovec(skb, 0, &iov, len);
+   struct iov_iter to;
+   iov_iter_init(&to, READ, &iov, 1, len);
+   return skb_copy_datagram_iter(skb, 0, &to, len);
 }

Para isso:

  • seja raiz ...
  • faça uma cópia de backup de /usr/lib/vmware/modules/source/vmnet.tar em algum lugar;
  • descompacte-o em um diretório temporário;
  • aplique o patch acima ( cd vmnet-only && patch -p1 <path/to/the.patch && cd .. );
  • recrie o arquivo tar, sobrescrevendo o original ( tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only ).

Você pode então reiniciar o VMWare player; o driver irá compilar e instalar.

    
por fge 24.04.2015 / 08:34