कर्नेल 3.19 के लिए "vmnet बनाने में विफल"


9

क्योंकि यह उत्तर केवल कर्नेल 3.13 के लिए है, इसलिए मैं Failed to build vmnetकर्नेल 3.19 और पुराने संस्करणों के लिए समस्या का समाधान साझा करना चाहूंगा । इस प्रकार यह मेरी वास्तविक समस्या नहीं है और केवल भविष्य के पाठकों की मदद करना है।

सवाल

जब मैं पहली बार VMware वर्कस्टेशन या VMware प्लेयर चलाना चाहता हूं, तो इसे कर्नेल स्तर पर कुछ पैकेजों को तैनात करने की आवश्यकता है लेकिन यह इस त्रुटि की रेखा के साथ विफल हो जाता है।

Vmnet बनाने में विफल। बिल्ड कमांड निष्पादित करने में विफल।

इस समस्या के समाधान के लिए मुझे क्या करना चाहिए?


ध्यान दें कि यह अब ऐसा प्रतीत नहीं होता है। लिनक्स सिस्टम पर आज एक नई स्थापना के रूप में, मैं इस बिल्ड समस्या को दोहराने में सक्षम नहीं हूं।
थॉमस वार्ड

जवाबों:


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. जीयूआई (वर्कस्टेशन या प्लेयर) को फिर से चलाएं और इसे मॉड्यूल बनाने दें।

संदर्भ

[1]: Nonsleepr से एक उत्तर । : रॉबर्ट गैड्सडन का एक लेखन
[2]


2
एक अच्छी पोस्ट के लिए धन्यवाद। इससे मेरे लिए समस्या हल हो गई।
ChosSimbaOne

4

वर्कस्टेशन 10 के लिए पैच पोस्ट करने के लिए धन्यवाद budiap! मुझे यह पता लगाने में थोड़ा समय लगा कि आपको उस कोड को पैच फ़ाइल में लागू करने के लिए उस कोड का उपयोग करने की आवश्यकता है। यहाँ मैं पोस्ट करने के लिए vmware कार्य केंद्र मंचों बना दिया है।

ठीक है! मैं समझ गया। Ubuntu15.04 पर वर्कस्टेशन 10, या जो भी-बंटू। मैंने Xubuntu 15.04 कर्नेल 3.19.0-18-जेनेरिक पर इसका परीक्षण किया

वर्कस्टेशन 10 के लिए पैच के लिए नया पेस्टी (10215458) बनाया गया।

वर्कस्टेशन 10.06 की ताजा स्थापना के बाद विशेष रूप से -> VMware- वर्कस्टेशन-10.0.2-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

विश्वास नहीं कर सकता कि मैं इसे अपग्रेड करने वाला पहला व्यक्ति हूं! यह एक शानदार, शानदार जवाब है। (आशा है कि आप मेरे सुझाए गए संपादन को बुरा नहीं
मानेंगे

1
मैं सिर्फ Ubuntu 15.10 के साथ कर्नेल 4.2 के साथ यह कोशिश की और यह काम नहीं किया। मुझे WS.10 को 15.10 पर काम करने के लिए कोई पैच नहीं मिला और 14 एलटीएस पर वापस जाना पड़ा, जो कर्नेल 3.19 का उपयोग करता था।
टिमोथी सी। क्विन

@JavaScriptDude के समान। 4.4 कर्नेल के लिए पैच कैसे करें?
Ligemer

@ लाइगरमर - मैंने vmware वर्कस्टेशन के पुराने संस्करणों को लिनक्स पर काम करने की कोशिश करने के लिए छोड़ दिया है और वर्चुअल बॉक्स पर स्विच किया है और निर्णय ने मुझे अच्छी तरह से सेवा दी है। लिनक्स, और vmware के लिए मुझे लगता है कि एकमात्र व्यावहारिक समाधान नवीनतम वर्कस्टेशन संस्करण के लिए एक लाइसेंस खरीदना है-या- सिर्फ मुफ्त vmware प्लेयर का उपयोग करें और ZFS या BTRFS जैसे बाहरी स्नैपशॉट तंत्र के साथ आएं।
टिमोथी सी। क्विन

धन्यवाद @JavaScriptDude - सहमत हैं। मैंने वर्चुअल बॉक्स पर जाना समाप्त कर दिया। मैं एक खुश कैंपर हूं :-) उम्मीद है कि टिप्पणी अन्य लिनक्स उपयोगकर्ताओं की मदद कर सकती है। खुश कोडिंग।
18

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
हाय बुद्धिप एक बेवकूफ का कोई भी मौका इस पैच को लागू करने के बारे में मार्गदर्शन करता है? धन्यवाद।
सिममो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.