“Falha ao construir o vmnet” para o kernel 3.19

9

Como esta resposta é apenas para o kernel 3.13, gostaria de compartilhar uma solução para o problema Failed to build vmnetdo kernel 3.19 e versões anteriores. Portanto, esse não é meu problema real e destina-se apenas a ajudar futuros leitores.

Questão

Quando desejo executar o VMware Workstation ou o VMware Player pela primeira vez, ele precisa implantar alguns pacotes no nível do kernel, mas falha com esta linha de erro.

Falha ao criar o vmnet. Falha ao executar o comando de construção.

O que devo fazer para resolver este problema?

frogatto
fonte
Observe que isso não parece mais ser o caso. Atualmente, em uma instalação nova, em um sistema Linux, não consegui replicar esse problema de compilação.
Thomas Ward

Respostas:

8

Solução

  1. Mude o diretório para o diretório de origem do módulo vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Descompacte os módulos vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Abra vmnet-only/driver.ccom seu editor de texto favorito.

    sudo gedit vmnet-only/driver.c
    
  4. Na linha 267, altere o seguinte [2]

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

    para

    #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. Por volta da linha 1194, altere o seguinte [2]

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

    para

    #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. Salve este arquivo e abra o arquivo vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Na linha 526, altere o seguinte [2]

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

    para

    #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. Salve este arquivo e re-tar os módulos. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Exclua o diretório de trabalho anterior. [1]

    sudo rm -r vmnet-only
    
  10. Execute a GUI (estação de trabalho ou Player) novamente e deixe-a construir os módulos.

Referências

[1]: Uma resposta de nonsleepr .
[2]: Um artigo de Robert Gadsdon.

frogatto
fonte
2
Obrigado por um post bem escrito. Isso resolveu o problema para mim.
ChosSimbaOne
4

Obrigado budiap por postar patch para a Estação de Trabalho 10! Demorei um pouco para descobrir que você precisa usar esse código para aplicá-lo a um arquivo de patch. Aqui está o post que eu fiz nos fóruns da estação de trabalho vmware.

OK! Deixa comigo. Estação de trabalho 10 no Ubuntu15.04, ou qualquer outra coisa. Eu testei isso no Xubuntu 15.04 Kernel 3.19.0-18-generic

Criada nova pasta (10215458) para o patch da Estação de Trabalho 10.

Após a instalação nova da Estação de Trabalho 10.06 Especificamente -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Deve ser root, mas você pode basicamente copiar / colar.

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
Lon Kaut
fonte
Não posso acreditar que sou a primeira pessoa a fazer um voto positivo! Esta é uma ótima, ótima resposta. (Espero que você não se importa minha edição sugerido.)
Mark E. Haase
11
Eu apenas tentei isso com o Kernel 4.2 com o Ubuntu 15.10 e não funcionou. Não foi possível encontrar nenhum patch para fazer o WS10 funcionar na 15.10 e tive que voltar para 14 LTS que usavam o Kernel 3.19.
Timothy C. Quinn
O mesmo que @JavaScriptDude. Como corrigir o kernel 4.4?
Ligemer
@Ligemer - Eu desisti de tentar fazer com que versões mais antigas da estação de trabalho vmware funcionassem no Linux e passei para a caixa virtual, e a decisão me serviu bem. Para Linux e vmware, acho que a única solução prática é comprar uma licença para a versão mais recente da estação de trabalho - ou simplesmente usar o vmware player gratuito e criar um mecanismo de instantâneo externo como ZFS ou BTRFS.
Timothy C. Quinn
Obrigado @JavaScriptDude - concordou. Acabei indo para a caixa virtual também. Eu sou um campista feliz :-) Espero que os comentários possam ajudar outros usuários do Linux. Feliz codificação.
Ligemer 28/10
2

se você estiver executando a estação de trabalho vmware 10, aplique este patch para fazê-lo funcionar no kernel 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
fonte
11
Oi budiap. Alguma chance de um guia de idiotas sobre como aplicar esse patch? Obrigado.
Simmo 15/05