VMWare で X Window System が起動しない (2007/06/23)

最初のほうに書いてあるのはこの問題の解決方法ではありません.この問題とは別の問題で,私がミスリードされた問題点です.ただ,ミスリードされた問題点の解決に役に立つかも知れないと思い,この問題の解法としては冗長ではありますが記述しました.

数週間前から,VMWare で X Window System が起動しなくなりました.linux-image-2.6.21-1-686 をインストールしてから,vmware-tools を再インストールしたあたりからです.

vmware-tools を再インストールした時にエラーが出ていました.

/tmp/vmware-config0/vmxnet-only/vmxnet.c: In function `vmxnet_netpoll':
/tmp/vmware-config0/vmxnet-only/vmxnet.c:1058: error: too many arguments to function `vmxnet_interrupt'
make[2]: *** [/tmp/vmware-config0/vmxnet-only/vmxnet.o] Error 1
make[1]: *** [_module_/tmp/vmware-config0/vmxnet-only] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.21-1-686'
make: *** [vmxnet.ko] Error 2
make: Leaving directory `/tmp/vmware-config0/vmxnet-only'
Unable to build the vmxnet module.

最初はこれが原因かと思い,/tmp/vmware-config0/vmxnet-only/vmxnet.c を調べると,

#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
static compat_irqreturn_t
vmxnet_interrupt(int irq, void *dev_id, struct pt_regs * regs)
#else
static compat_irqreturn_t
vmxnet_interrupt(int irq, void *dev_id)
#endif
であるのに対して,1058行目付近には,
static void
vmxnet_netpoll(struct net_device *dev)
{
   disable_irq(dev->irq);
   vmxnet_interrupt(dev->irq, dev, NULL);
   enable_irq(dev->irq);
}
とあります.確かに,カーネルバージョン 2.6.21 では,ルーチン vmxnet_interrupt は引数が2つであるのに対し,1058行目の vmxnet_interrupt は引数が3つになっています.そこで,元々の vmxnet_interrupt がどこに提供されているかを調べ,vmware-tools-distrib/lib/modules/source/vmxnet.tar にあることが分かりました.

この問題に対して,次の解決方法をとりました.

  1. vmxnet.tar を展開します.vmxnet-only ディレクトリが展開されます.

    # tar xvf vmxnet.tar
    
  2. vmxnet-only/vmxnet.c 内の

    #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
    
    と書かれている行をすべて
    #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
    
    と書き直します.

  3. アーカイブ vmxnet.tar を上書き作成します.

    # tar cvf vmxnet.tar vmxnet-only
    
  4. vmware-tools-distrib 内の vmware-install.pl で vmware-tools をインストールします.このとき,/tmp/vmware-config* があれば消しておきます.

    # rm -r /tmp/vmware-config*
    # ./vmware-install.pl
    

これで,vmxnet の問題点は解決するかも知れません.しかし,私の場合は,新たなエラーメッセージが出ました.

make: Leaving directory `/tmp/vmware-config0/vmxnet-only'
vmxnet: Unknown symbol paravirt_ops
Unable to make a vmxnet module that can be loaded in the running kernel:
vmxnet: Unknown symbol paravirt_ops
insmod: error inserting '/tmp/vmware-config0/vmxnet.o': -1 Unknown symbol in module

これを解決するには,カーネルの再構築をしなければならないようです.そこまでしたくはないと思い,上述の問題の解決はあきらめ,以前のカーネルバージョン linux-image-2.6.18-4-686 を利用することにしました.ところが,X Window System が立ち上がりません.vmware-tools をエラーなく再インストールしても立ち上がりません.このとき,vmxnet の問題は別の問題であることに遅まきながら気が付きました.単純に X.org と VMWare 間の問題と思い,ログを調べました.

# cat /var/log/Xorg.0.log | grep ^\(EE\)
(EE) Failed to load module "pex5" (module does not exist, 0)
(EE) Failed to load module "xie" (module does not exist, 0)
(EE) Failed to load module "xtt" (module does not exist, 0)
(EE) Failed to load module "keyboard" (module does not exist, 0)
(EE) AIGLX: Screen 0 is not DRI capable
(EE) No Input driver matching `keyboard'

ここで,研究室の Linux PC の /etc/X11/xorg.conf を見ると,キーボードのモジュールは kbd でした.そこで,VMWare 上の Linux の /etc/X11/xorg.conf (vmware-install.pl が作成)を次のように修正しました.まず,Section "Module" 内の次の3行をコメントアウトしました.

#       Load    "pex5"
#       Load    "xie"
#       Load    "xtt"

次に,Section "InputDevice" 内の

        Driver          "keyboard"
        Driver          "kbd"
と書き換えました.この結果,VMWare の linux-image-2.6.18-4-686 上で X Window System が起動できました.


梅原 大祐 / UMEHARA Daisuke umehara@kit.ac.jp
Last modified: 2020/05/01 15:37
Total Access Count