CentOS 7.5のParallels-Toolsインストール失敗を強引に解消する

CentOS 7.5が出たので手持ちの仮想マシンをアップデートしてみたらエラーになりました。

ログはこんな感じ。

Fri May 11 19:53:00 JST 2018
cd prl_eth/pvmnet && make
cd prl_eth/pvmnet && rm -rf .*.cmd .tmp_versions
cd prl_tg/Toolgate/Guest/Linux/prl_tg && rm -rf .*.cmd .tmp_versions
cd prl_fs/SharedFolders/Guest/Linux/prl_fs && rm -rf .*.cmd .tmp_versions
make[1]: Entering directory `/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet'
make[1]: warning: jobserver unavailable: using -j1.  Add `+' to parent make rule.
cd prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze && rm -rf .*.cmd .tmp_versions
make -C /lib/modules/3.10.0-862.2.3.el7.x86_64/build M=/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet
make[2]: Entering directory `/usr/src/kernels/3.10.0-862.2.3.el7.x86_64'
  LD      /var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/built-in.o
  CC [M]  /var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.o
/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.c:396:2: error: unknown field ‘ndo_change_mtu’ specified in initializer
  .ndo_change_mtu = eth_change_mtu,
  ^
/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.c:396:2: warning: initialization from incompatible pointer type [enabled by default]
/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.c:396:2: warning: (near initialization for ‘pvmnet_netdev_ops.ndo_set_mac_address’) [enabled by default]
make[3]: *** [/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.o] Error 1
make[2]: *** [_module_/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet] Error 2
make[2]: Leaving directory `/usr/src/kernels/3.10.0-862.2.3.el7.x86_64'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet'
make: *** [installme] Error 2

このようなエラーが出てParallels-Toolsがインストール出来ませんでした。

というわけで。 このブログで毎度おなじみの強引な解消を試みます。

とりあえず、 /var/lib/dkms/parallels-tools/13.3.0.43321/build/prl_eth/pvmnet/pvmnet.c を見てみると

#ifdef HAVE_NET_DEVICE_OPS
static const struct net_device_ops pvmnet_netdev_ops = {
   .ndo_start_xmit = pvmnet_xmit,
   .ndo_get_stats = pvmnet_get_stats,
   .ndo_open = pvmnet_open,
   .ndo_stop = pvmnet_close,
   .ndo_init = pvmnet_init,
   .ndo_uninit = pvmnet_free,
#if REAL_LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)
   .ndo_set_multicast_list = pvmnet_set_multicast_list,
#else
   .ndo_set_rx_mode = pvmnet_set_multicast_list,
#endif
        .ndo_change_mtu = eth_change_mtu, // ←396行目
};
#endif

となっています。 とりあえず396行目をコメントアウトしてからyum reinstall kernelをやったらインストールに成功しました。

しばらく使ってみても特に問題なく動いているようです。

DKMSではなく手動インストールの場合

$ mount /dev/cdrom /mnt
$ cp -rf /mnt /tmp/parallels-tools
$ cd /tmp/parallels-tools

とすると、kmods/prl_mod.tar.gzがあります。 それを展開すると中にpvmnet.cがあるので、上記と同じように編集してから再度tar.gzに固めて、

$ ./install

とするとインストールできます。

追記

どうやらこれっぽいですね。

http://dpdk.org/dev/patchwork/patch/35566/

というわけで、

diff --git a/lib/librte_eal/linuxapp/kni/compat.h b/lib/librte_eal/linuxapp/kni/compat.h
index 3f8c0bc..6a6968d 100644
--- a/lib/librte_eal/linuxapp/kni/compat.h
+++ b/lib/librte_eal/linuxapp/kni/compat.h
@@ -101,6 +101,11 @@ 
 #undef NET_NAME_UNKNOWN
 #endif
 
+#if (defined(RHEL_RELEASE_CODE) && \
+   (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)))
+#define ndo_change_mtu ndo_change_mtu_rh74
+#endif
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
 #define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
 #endif

とのことなので、396行目を

        .ndo_change_mtu_rh74 = eth_change_mtu,

に書き換えて再インストールしてみたらうまくいきました。これが正解っぽいです。