커널 3.19의“vmnet 빌드 실패”


9

때문에 이 대답은 단지 커널 3.13입니다, 그래서 문제에 대한 솔루션을 공유하고 싶습니다 Failed to build vmnet커널 3.19 및 이전 버전을. 따라서 이것은 내 실제 문제가 아니며 미래 독자를 돕기위한 것입니다.

질문

VMware Workstation 또는 VMware Player를 처음으로 실행하려면 일부 패키지를 커널 수준으로 배포해야하지만이 오류로 실패합니다.

vmnet을 빌드하지 못했습니다. 빌드 명령을 실행하지 못했습니다.

이 문제를 해결하려면 어떻게해야합니까?


이것은 더 이상 사실이 아닙니다. 오늘 새로 설치했을 때 Linux 시스템에서는이 빌드 문제를 복제 할 수 없었습니다.
토마스 워드

답변:


8

해결책

  1. 디렉토리를 vmware 모듈 소스 디렉토리로 변경하십시오. [1]

    cd /usr/lib/vmware/modules/source
    
  2. vmnet 모듈을 untar하십시오. [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 (워크 스테이션 또는 플레이어)를 다시 실행하여 모듈을 빌드하십시오.

참고 문헌

[1]:는 대답 에서 nonsleepr .
[2]:의 쓰기 업 로버트 Gadsdon에서.


2
잘 작성된 게시물에 감사드립니다. 이것은 나를 위해 문제를 해결했습니다.
ChosSimbaOne

4

Workstation 10 용 패치를 게시 해 주셔서 감사합니다. 패치 코드에 해당 코드를 적용하려면 해당 코드를 사용해야한다는 것을 알아내는 데 시간이 조금 걸렸습니다. 다음은 내가 vmware 워크 스테이션 포럼에 작성한 글입니다.

괜찮아! 알았어 Ubuntu15.04 또는 무엇이든 buntu의 워크 스테이션 10 Xubuntu 15.04 Kernel 3.19.0-18-generic에서 이것을 테스트했습니다.

Workstation 10 용 패치를위한 새로운 Pastie (10215458)를 만들었습니다.

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
방금 Ubuntu 15.10이있는 Kernel 4.2로 시도했지만 작동하지 않았습니다. WS10이 15.10에서 작동하도록하는 패치를 찾을 수 없었으며 Kernel 3.19를 사용하는 14 개의 LTS로 되돌려 야했습니다.
Timothy C. Quinn

@JavaScriptDude와 동일합니다. 4.4 커널을 패치하는 방법?
Ligemer

@Ligemer-Linux에서 작동하도록 이전 버전의 vmware 워크 스테이션을 가져 와서 가상 상자로 전환하려고 노력했지만 결정이 나에게 도움이되었습니다. Linux 및 vmware의 경우 유일한 실제 솔루션은 최신 Workstation 버전의 라이센스를 구입하거나 무료 vmware 플레이어를 사용하고 ZFS 또는 BTRFS와 같은 외부 스냅 샷 메커니즘을 제공하는 것입니다.
Timothy C. Quinn

감사합니다 @JavaScriptDude-동의합니다. 나는 가상 상자에도 갔다. 나는 행복한 캠프입니다 :-) 의견이 다른 Linux 사용자를 도울 수 있기를 바랍니다. 행복한 코딩.
Ligemer

2

vmware workstation 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.