Çekirdek 3.19 için “vmnet oluşturulamadı”


9

Çünkü bu cevabı sadece kernel 3.13 içindir, bu yüzden sorun için bir çözüm paylaşmak istiyorum Failed to build vmnetkernel 3.19 ve önceki sürümler için. Dolayısıyla bu benim asıl sorunum değil ve sadece gelecekteki okuyuculara yardımcı olmayı amaçlıyor.

Soru

VMware Workstation veya VMware Player'ı ilk kez çalıştırmak istediğimde, bazı paketleri çekirdek düzeyinde dağıtmak gerekiyor, ancak bu hata satırında başarısız oluyor.

Vmnet oluşturulamadı. Build komutu yürütülemedi.

Bu sorunu çözmek için ne yapmalıyım?


Bunun artık böyle olmadığını unutmayın. Bugün yeni bir kurulumdan itibaren, bir Linux sisteminde, bu derleme problemini çoğaltamadım.
Thomas Ward

Yanıtlar:


8

Çözüm

  1. Dizini vmware modülü kaynak dizinine değiştirin. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Vmnet modüllerini untar. [1]

    sudo tar -xvf vmnet.tar
    
  3. vmnet-only/driver.csevdiğiniz metin editörü ile.

    sudo gedit vmnet-only/driver.c
    
  4. Çizgi 267 civarında, aşağıdakileri değiştirin [2]

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

    için

    #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 hattı çevresinde aşağıdakileri değiştirin [2]

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

    için

    #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. Bu dosyayı kaydedin ve ardından dosyayı açın vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Çizgi 526 civarında, aşağıdakileri değiştirin [2]

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

    için

    #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. Bu dosyayı kaydedin ve sonra modülleri yeniden tarlayın. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Önceki çalışma dizinini silin. [1]

    sudo rm -r vmnet-only
    
  10. GUI'yi (İş İstasyonu veya Oynatıcı) tekrar çalıştırın ve modülleri oluşturmasına izin verin.

Referanslar

[1]: Bir cevap dan nonsleepr .
[2]A yazma-up Robert Gadsdon dan.


2
İyi yazılmış bir yazı için teşekkür ederim. Bu benim için sorunu çözdü.
ChosSimbaOne

4

Workstation 10 için düzeltme eki gönderdiğiniz için teşekkürler budiap! Bu kodu bir yama dosyasına uygulamak için bu kodu kullanmanız gerektiğini anlamanız biraz zaman aldı. İşte vmware iş istasyonu forumlarına yaptığım yazı.

TAMAM! Anladım. Ubuntu15.04 veya her ne olursa olsun İş İstasyonu 10. Bunu Xubuntu 15.04 Kernel 3.19.0-18-jenerik üzerinde test ettim

Workstation 10 için yama için yeni pastie (10215458) oluşturuldu.

Workstation 10.06'nın yeni kurulumundan sonra -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Kök olmalı, ancak temel olarak kopyalayıp yapıştırabilirsiniz.

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

Bunu onaylayan ilk kişi olduğuma inanamıyorum! Bu harika, harika bir cevap. (Umarım önerilen düzenlememi önemsemezsin.)
Mark E. Haase

1
Ben sadece Ubuntu 15.10 ile Kernel 4.2 ile denedim ve işe yaramadı. WS10'u 15.10'da çalıştırmak için herhangi bir yama bulamadım ve Çekirdek 3.19'u kullanan 14 LTS'ye geri dönmek zorunda kaldım.
Timothy C. Quinn

@JavaScriptDude ile aynı. 4.4 çekirdek için yama nasıl yapılır?
Ligemer

@Ligemer - Linux üzerinde çalışmak için vmware iş istasyonunun eski sürümlerini almaya çalışmaktan vazgeçtim ve sanal kutuya geçtim ve karar bana iyi hizmet etti. Linux ve vmware için bence tek pratik çözüm en son Workstation sürümü için bir lisans satın almak -veya- sadece ücretsiz vmware oynatıcı kullanmak ve ZFS veya BTRFS gibi harici bir anlık görüntü mekanizması bulmaktır.
Timothy C. Quinn

Teşekkürler @JavaScriptDude - kabul etti. Sonunda sanal kutuya da gittim. Mutlu bir kampçıyım :-) Umarım yorumlar diğer Linux kullanıcılarına yardımcı olabilir. Mutlu kodlama.
Ligemer

2

vmware iş istasyonu 10 çalıştırıyorsanız, çekirdek 3.19 üzerinde çalışmasını sağlamak için bu düzeltme ekini uygulayın

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
Merhaba budiap. Aptalların bu yamanın nasıl uygulanacağı konusunda rehberlik şansı var mı? Teşekkürler.
Simmo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.