Không thể xây dựng vmnet.


9

câu trả lời này chỉ dành cho kernel 3.13, nên tôi muốn chia sẻ giải pháp cho vấn đề Failed to build vmnetcho kernel 3.19 và các phiên bản trước đó. Do đó, đây không phải là vấn đề thực sự của tôi và chỉ nhằm mục đích giúp đỡ những độc giả tương lai.

Câu hỏi

Khi tôi muốn chạy VMware Workstation hoặc VMware Player lần đầu tiên, nó cần triển khai một số gói ở cấp kernel nhưng không thành công với dòng lỗi này.

Không thể xây dựng vmnet. Không thể thực hiện lệnh xây dựng.

Tôi nên làm gì để giải quyết vấn đề này?


Lưu ý rằng điều này không còn xuất hiện trong trường hợp này. Kể từ khi cài đặt mới ngày hôm nay, trên một hệ thống Linux, tôi đã không thể sao chép vấn đề xây dựng này.
Thomas Ward

Câu trả lời:


8

Giải pháp

  1. Thay đổi thư mục vào thư mục nguồn mô-đun vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Tháo các mô-đun vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Mở vmnet-only/driver.cbằng trình soạn thảo văn bản yêu thích của bạn.

    sudo gedit vmnet-only/driver.c
    
  4. Xung quanh dòng 267, thay đổi như sau [2]

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

    đến

    #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. Xung quanh dòng 1194, thay đổi như sau [2]

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

    đến

    #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. Lưu tệp này và sau đó mở tệp vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Xung quanh dòng 526, thay đổi như sau [2]

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

    đến

    #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. Lưu tệp này và sau đó tar lại các mô-đun. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Xóa thư mục làm việc trước đó. [1]

    sudo rm -r vmnet-only
    
  10. Chạy lại GUI (Workstation hoặc Player) và để nó xây dựng các mô-đun.

Người giới thiệu

[1]: Một câu trả lời từ nons ngủr .
[2]: Một bài viết từ Robert Gadsdon.


2
Cảm ơn bạn cho một bài viết tốt. Điều này đã giải quyết vấn đề cho tôi.
ChosSimbaOne

4

Cảm ơn budiap đã đăng bản vá cho Workstation 10! Tôi chỉ mất một lúc để nhận ra rằng bạn cần sử dụng mã đó để áp dụng mã đó vào một tệp vá. Đây là bài tôi đã làm cho các diễn đàn máy trạm vmware.

ĐƯỢC CHỨ! Tôi hiểu rồi. Máy trạm 10 trên Ubuntu15.04 hoặc bất cứ thứ gì-buntu. Tôi đã thử nghiệm điều này trên Xubfox 15.04 Kernel 3.19.0-18-generic

Tạo pastie mới (10215458) để vá cho Workstation 10.

Sau khi cài đặt mới Workstation 10,06 Cụ thể -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Phải là root, nhưng về cơ bản bạn có thể sao chép / dán.

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

Không thể tin tôi là người đầu tiên nêu lên điều này! Đây là một câu trả lời tuyệt vời, tuyệt vời. (Hy vọng bạn không bận tâm đến chỉnh sửa được đề xuất của tôi.)
Mark E. Haase

1
Tôi mới thử cái này với Kernel 4.2 với Ubuntu 15.10 và nó không hoạt động. Tôi không thể tìm thấy bất kỳ bản vá nào để WS10 hoạt động vào ngày 15.10 và phải sao lưu xuống 14 LTS sử dụng Kernel 3.19.
Timothy C. Quinn

Tương tự như @JavaScriptDude. Làm thế nào để vá cho kernel 4.4?
Ligemer

@Ligemer - Tôi đã từ bỏ việc cố gắng để các phiên bản cũ hơn của máy trạm vmware hoạt động trên Linux và chuyển sang hộp ảo và quyết định đã phục vụ tốt cho tôi. Đối với Linux và vmware tôi nghĩ giải pháp thực tế duy nhất là mua giấy phép cho phiên bản Workstation mới nhất - chỉ cần sử dụng trình phát vmware miễn phí và đưa ra cơ chế chụp nhanh bên ngoài như ZFS hoặc BTRFS.
Timothy C. Quinn

Cảm ơn @JavaScriptDude - đã đồng ý. Tôi cuối cùng cũng đi đến hộp ảo. Tôi là một người cắm trại vui vẻ :-) Hy vọng rằng các bình luận có thể giúp những người dùng Linux khác. Chúc mừng mã hóa.
Ligemer

2

nếu bạn đang chạy vmware workstation 10, hãy áp dụng bản vá này để làm cho nó hoạt động trên 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
 }

1
Chào chồi. Bất kỳ cơ hội của một hướng dẫn ngu ngốc về cách áp dụng bản vá này? Cảm ơn.
Simmo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.