“ ไม่สามารถสร้าง vmnet” สำหรับเคอร์เนล 3.19


9

เนื่องจากคำตอบนี้ใช้สำหรับเคอร์เนล 3.13 เท่านั้นดังนั้นฉันต้องการแชร์วิธีแก้ปัญหาFailed to build vmnetสำหรับเคอร์เนล 3.19 และเวอร์ชันก่อนหน้า ดังนั้นนี่ไม่ใช่ปัญหาที่แท้จริงของฉันและมีไว้เพื่อช่วยผู้อ่านในอนาคตเท่านั้น

คำถาม

เมื่อฉันต้องการเรียกใช้ VMware Workstation หรือ VMware Player เป็นครั้งแรกจำเป็นต้องปรับใช้แพคเกจบางอย่างในระดับเคอร์เนล แต่ล้มเหลวด้วยข้อผิดพลาดในบรรทัดนี้

ไม่สามารถสร้าง vmnet ไม่สามารถเรียกใช้งานคำสั่ง build ได้

ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้


โปรดทราบว่านี่จะไม่เกิดขึ้นอีกต่อไป ณ วันนี้การติดตั้งใหม่บนระบบ Linux ฉันไม่สามารถจำลองปัญหาการสร้างนี้ได้
Thomas Ward

คำตอบ:


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]: เป็นคำตอบจากnonsleepr
[2]: บทความจาก Robert Gadsdon


2
ขอบคุณสำหรับการโพสต์เขียนดี วิธีนี้แก้ไขปัญหาสำหรับฉัน
ChosSimbaOne

4

ขอบคุณ budiap สำหรับการโพสต์แพทช์สำหรับเวิร์กสเตชัน 10! ฉันเพิ่งจะรู้ว่าคุณต้องใช้รหัสนั้นเพื่อนำรหัสนั้นไปใช้กับไฟล์แพทช์ นี่คือโพสต์ที่ฉันทำกับฟอรัมเวิร์กสเตชัน vmware

ตกลง! ฉันเข้าใจแล้ว. Workstation 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

ต้องเป็นรูท แต่โดยทั่วไปคุณสามารถคัดลอก / วางได้

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

ไม่อยากจะเชื่อเลยว่าฉันเป็นคนแรกที่โหวตขึ้นนี้! นี่เป็นคำตอบที่ยอดเยี่ยมและยอดเยี่ยม (หวังว่าคุณจะไม่รังเกียจการแก้ไขที่ฉันแนะนำ)
Mark E. Haase

1
ฉันเพิ่งลองสิ่งนี้ด้วย Kernel 4.2 กับ Ubuntu 15.10 และมันไม่ทำงาน ฉันไม่พบแพตช์ใด ๆ เพื่อให้ WS10 ทำงานบน 15.10 และต้องกลับไปที่ 14 LTS ซึ่งใช้เคอร์เนล 3.19
Timothy C. Quinn

เหมือนกับ @JavaScriptDude วิธีการแก้ไขสำหรับ 4.4 เคอร์เนล
Ligemer

@Ligemer - ฉันยอมแพ้ที่จะพยายามใช้ vmware เวิร์กสเตชันรุ่นเก่าให้ทำงานบน Linux และเปลี่ยนไปใช้กล่องเสมือนจริงและการตัดสินใจทำให้ฉันดีขึ้น สำหรับ Linux และ vmware ฉันคิดว่าวิธีแก้ปัญหาเชิงปฏิบัติเพียงอย่างเดียวคือการซื้อลิขสิทธิ์สำหรับ Workstation รุ่นล่าสุดหรือเพียงแค่ใช้เครื่องเล่น vmware ฟรีและมาพร้อมกับกลไก snapshot ภายนอกเช่น ZFS หรือ BTRFS
ทิโมธีซีควินน์

ขอบคุณ @JavaScriptDude - เห็นด้วย ท้ายที่สุดฉันก็ไปที่กล่องเสมือนจริงเช่นกัน ฉันเป็นผู้ออกค่ายที่มีความสุข :-) หวังว่าความคิดเห็นจะช่วยผู้ใช้ Linux รายอื่น การเข้ารหัสที่มีความสุข
Ligemer

2

ถ้าคุณใช้ vmware เวิร์กสเตชัน 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
 }

1
สวัสดี budiap โอกาสที่คนโง่จะแนะนำเกี่ยวกับวิธีการใช้โปรแกรมแก้ไขนี้? ขอบคุณ
Simmo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.