"Gagal membangun vmnet" untuk kernel 3.19

9

Karena jawaban ini hanya untuk kernel 3.13, maka saya ingin membagikan solusi untuk masalah Failed to build vmnetuntuk kernel 3.19 dan versi sebelumnya. Jadi ini bukan masalah saya yang sebenarnya dan hanya dimaksudkan untuk membantu pembaca masa depan.

Pertanyaan

Ketika saya ingin menjalankan VMware Workstation atau VMware Player untuk pertama kalinya, ia perlu menggunakan beberapa paket di tingkat kernel tetapi gagal dengan garis kesalahan ini.

Gagal membangun vmnet. Gagal menjalankan perintah build.

Apa yang harus saya lakukan untuk menyelesaikan masalah ini?

kodok
sumber
Perhatikan bahwa ini tampaknya tidak lagi menjadi masalah. Pada saat instalasi baru hari ini, pada sistem Linux, saya belum dapat mereplikasi masalah build ini.
Thomas Ward

Jawaban:

8

Larutan

  1. Ubah direktori menjadi direktori sumber modul vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Hapus modul vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Buka vmnet-only/driver.cdengan editor teks favorit Anda.

    sudo gedit vmnet-only/driver.c
    
  4. Di sekitar baris 267, ubah yang berikut ini [2]

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

    untuk

    #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. Sekitar baris 1194, ubah yang berikut [2]

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

    untuk

    #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. Simpan file ini dan kemudian buka file vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Di sekitar baris 526, ubah yang berikut ini [2]

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

    untuk

    #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. Simpan file ini dan kemudian tar kembali modul. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Hapus direktori kerja sebelumnya. [1]

    sudo rm -r vmnet-only
    
  10. Jalankan GUI (Workstation atau Player) lagi dan biarkan untuk membangun modul.

Referensi

[1]: Jawaban dari nonsleepr .
[2]: Sebuah tulisan dari Robert Gadsdon.

kodok
sumber
2
Terima kasih atas posting yang ditulis dengan baik. Ini memecahkan masalah bagi saya.
ChosSimbaOne
4

Terima kasih budiap untuk memposting tambalan untuk Workstation 10! Butuh beberapa saat untuk mengetahui bahwa Anda perlu menggunakan kode itu untuk menerapkan kode itu ke file tambalan. Berikut adalah posting yang saya buat ke forum workstation vmware.

BAIK! Saya mendapatkannya. Workstation 10 di Ubuntu15.04, atau apa pun-buntu. Saya menguji ini pada Xubuntu 15.04 Kernel 3.19.0-18-generik

Membuat pastie baru (10215458) untuk tambalan untuk Workstation 10.

Setelah baru menginstal Workstation 10.06 Khusus -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Harus di-root, tetapi pada dasarnya Anda bisa menyalin / menempel.

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
sumber
Tidak percaya aku orang pertama yang membenarkan ini! Ini adalah jawaban yang sangat bagus. (Harap Anda tidak keberatan edit yang saya sarankan.)
Mark E. Haase
1
Saya baru saja mencoba ini dengan Kernel 4.2 dengan Ubuntu 15.10 dan tidak berhasil. Saya tidak dapat menemukan patch untuk menjalankan WS10 pada 15.10 dan harus kembali ke 14 LTS yang menggunakan Kernel 3.19.
Timothy C. Quinn
Sama seperti @JavaScriptDude. Bagaimana cara menambal kernel 4.4?
Ligemer
@Ligemer - Saya sudah menyerah untuk mencoba mendapatkan versi lama vmware workstation untuk bekerja di Linux dan beralih ke kotak virtual dan keputusannya telah membantu saya dengan baik. Untuk Linux, dan vmware saya pikir satu-satunya solusi praktis adalah dengan membeli lisensi untuk versi Workstation terbaru - atau hanya menggunakan vmware player gratis dan menghasilkan mekanisme snapshot eksternal seperti ZFS atau BTRFS.
Timothy C. Quinn
Terima kasih @JavaScriptDude - setuju. Saya akhirnya pergi ke kotak virtual juga. Saya senang berkemah :-) Semoga komentarnya dapat membantu pengguna Linux lainnya. Selamat coding.
Ligemer
2

jika Anda menjalankan vmware workstation 10, terapkan tambalan ini untuk membuatnya bekerja pada 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
sumber
1
Hai budiap. Adakah kemungkinan panduan idiot tentang cara menerapkan tambalan ini? Terima kasih.
Simmo