VirtualBox Guest Add-Inのインストールが失敗する場合の対処方法

2013年12月21日 21時49分

201312212149VVAW00.png

はじめに

2013年12月1日にリリースされたCentOS 6.5をVagrantでBox化しようとして、少しばかりハマりましたので、健忘録として記載します。

前提条件

作業の前提条件は、下記のとおりです。

ソフトウエアバージョン
OSWindows 7 Ultimate 32bit
CygwinSetup Version 2.831
VirtualBox4.3.6 r91406
Vagrant1.3.5

Vagrant Boxの作成

CentOS 6.5をVirtualBox 4.3.6上で作成し、Vagrant Boxを作成する。

  1. CentOS 6.5のインストール

    仮想マシンを作成し、CentOS-6.5-i386-minimailをインストールする。

    $ VBoxManage -v
    
    $ VBoxManage -v
    4.3.6r91406
    
    201312212149VVAW01.png
    $ mkdir -p /tmp/CentOS65-VB436 && cd /tmp/CentOS65-VB436
    $ VBoxManage createvm --name CentOS65-VB436
    $ VBoxManage registervm F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vbox
    $ VBoxManage modifyvm CentOS65-VB436 --ostype RedHat --memory 512 --acpi on --ioapic on --cpus 2 --hwvirtex on --nestedpaging on --largepages on --clipboard bidirectional --nic1 nat --cableconnected1 on --boot1 disk --boot2 dvd --boot3 none --boot4 none --usb off --usbehci off
    $ VBoxManage createhd --size 8192 --variant Fixed --filename F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vdi
    $ VBoxManage storagectl CentOS65-VB436 --name SATA --add sata --portcount 5 --bootable on
    $ VBoxManage storageattach CentOS65-VB436 --storagectl SATA --port 1 --type hdd --medium F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vdi
    $ VBoxManage storageattach CentOS65-VB436 --storagectl SATA --port 2 --type dvddrive --medium I:/ISO/CentOS/CentOS-6.5-i386-minimal.iso
    $ VBoxManage startvm CentOS65-VB436
    
    $ mkdir -p /tmp/CentOS65-VB436 && cd /tmp/CentOS65-VB436
    
    $ VBoxManage createvm --name CentOS65-VB436
    Virtual machine 'CentOS65-VB436' is created.
    UUID: ca2ba732-86f1-46b0-b799-fa17773c6078
    Settings file: 'F:\VirtualBox\CentOS65-VB436\CentOS65-VB436.vbox'
    
    $ VBoxManage registervm F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vbox
    
    $ VBoxManage modifyvm CentOS65-VB436 --ostype RedHat --memory 512 --acpi on --ioapic on --cpus 2 --hwvirtex on --nestedpaging on --largepages on --clipboard bidirectional --nic1 nat --cableconnected1 on --boot1 disk --boot2 dvd --boot3 none --boot4 none --usb off --usbehci off
    
    $ VBoxManage createhd --size 8192 --variant Fixed --filename F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vdi
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Disk image created. UUID: 11157f2f-4a39-4a63-b24b-605e3b0db389
    
    $ VBoxManage storagectl CentOS65-VB436 --name SATA --add sata --portcount 5 --bootable on
    
    $ VBoxManage storageattach CentOS65-VB436 --storagectl SATA --port 1 --type hdd --medium F:/VirtualBox/CentOS65-VB436/CentOS65-VB436.vdi
    
    $ VBoxManage storageattach CentOS65-VB436 --storagectl SATA --port 2 --type dvddrive --medium I:/ISO/CentOS/CentOS-6.5-i386-minimal.iso
    
    $ VBoxManage startvm CentOS65-VB436
    Waiting for VM "CentOS65-VB436" to power on...
    VM "CentOS65-VB436" has been successfully started.
    
    201312212149VVAW02.png
    201312212149VVAW03.png
    201312212149VVAW04.png
    201312212149VVAW05.png
    201312212149VVAW06.png
    201312212149VVAW07.png
  2. ネットワーク有効化とvagrantユーザの作成

    インストールしたばかりのCentOSは、ネットワークも有効になっていませんので、ネットワークを有効化し、vagrantユーザを作成します。

    # sed -i -e "s|^ONBOOT=.*|ONBOOT=yes|" /etc/sysconfig/network-scripts/ifcfg-eth0
    # service network restart
    # ifconfig eth0
    # groupadd vagrant
    # useradd -g vagrant vagrant
    # passwd vagrant
    # mkdir -p ~vagrant/.ssh
    # curl -ksLo ~vagrant/.ssh/authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
    # chmod 0700 ~vagrant/.ssh
    # chmod 0600 ~vagrant/.ssh/authorized_keys
    # chown -R vagrant:vagrant ~vagrant/.ssh
    # echo 'vagrant ALL=NOPASSWD:ALL' > /etc/sudoers.d/vagrant
    # chmod 0440 /etc/sudoers.d/vagrant
    # sed -i '/requiretty/s/^/#/' /etc/sudoers
    
    201312212149VVAW08.png
    201312212149VVAW09.png
  3. Vagrant Box化

    仮想マシンをシャットダウン後、Vagrant Boxを作成します。

    $ mkdir -p /tmp/box && cd /tmp/box
    $ VBoxManage export CentOS65-VB436 -o box.ovf
    $ VBoxManage showvminfo CentOS65-VB436 --machinereadable | grep ^macaddress1
    $ cat<<EOF>Vagrantfile
    Vagrant::Config.run do |config|
      config.vm.base_mac = "08002782E95D"
    end
    EOF
    $ tar cvf /tmp/CentOS65-VB436.box .
    $ rm -f box-disk1.vmdk box.ovf Vagrantfile
    
    $ mkdir -p /tmp/box && cd /tmp/box
    
    $ VBoxManage export CentOS65-VB436 -o box.ovf
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Successfully exported 1 machine(s).
    
    $ VBoxManage showvminfo CentOS65-VB436 --machinereadable | grep ^macaddress1
    macaddress1="08002782E95D"
    
    $ cat<<EOF>Vagrantfile
    > Vagrant::Config.run do |config|
    >   config.vm.base_mac = "08002782E95D"
    > end
    > EOF
    
    $ tar cvf /tmp/CentOS65-VB436.box .
    ./
    ./box-disk1.vmdk
    ./box.ovf
    ./Vagrantfile
    
    $ rm -f box-disk1.vmdk box.ovf Vagrantfile
    
    201312212149VVAW10.png

    以上で、VirtualBoxゲストアドインがインストールされていないBoxが作成できました。

ゲストアドインのインストール

Vagrant Boxを作成しましたので、Boxを起動してゲストアドインをインストールします。
ゲストアドインのインストールには、vagrant-vbguestプラグインを使用しますので、Vagrantにお勧めしたいプラグインを参考に、プラグインをインストールしておいて下さい。

  1. Box起動

    $ cd /tmp/CentOS65-VB436
    $ vi Vagrantfile
    
    VAGRANTFILE_API_VERSION = "2"
    
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      # BOX名
      config.vm.box = "CentOS65-VB436"
    
      # BOXのダウンロードURL
      config.vm.box_url = "file://d:/temp/CentOS65-VB436.box"
    end
    
    $ vagrant up
    

    起動すると、22行目でゲストアドインが見つからないと表示され、ゲストアドインのインストールが始まります。

    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Box 'CentOS65-VB436' was not found. Fetching box from specified URL for
    the provider 'virtualbox'. Note that if the URL does not have
    a box for this provider, you should interrupt Vagrant now and add
    the box yourself. Otherwise Vagrant will attempt to download the
    full box prior to discovering this error.
    Downloading or copying the box...
    Extracting box...ate: 107M/s, Estimated time remaining: --:--:--)
    Successfully added box 'CentOS65-VB436' with provider 'virtualbox'!
    [default] Importing base box 'CentOS65-VB436'...
    [default] Matching MAC address for NAT networking...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2222 (adapter 1)
    [default] Booting VM...
    [default] Waiting for machine to boot. This may take a few minutes...
    [default] Machine booted and ready!
    No installation found.
    Loaded plugins: fastestmirror
    Setting up Install Process
    
    Copy iso file C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
    Installing Virtualbox Guest Additions 4.3.6 - guest version is
    Verifying archive integrity... All good.
    Uncompressing VirtualBox 4.3.6 Guest Additions for Linux............
    VirtualBox Guest Additions installer
    Copying additional installer modules ...
    Installing additional modules ...
    Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
    Building the VirtualBox Guest Additions kernel modules
    Building the main Guest Additions module[  OK  ]
    Building the shared folder support module[  OK  ]
    Building the OpenGL support module[失敗]
    (Look at /var/log/vboxadd-install.log to find out what went wrong)
    Doing non-kernel setup of the Guest Additions[  OK  ]
    Installing the Window System drivers[失敗]
    (Could not find the X.Org or XFree86 Window System.)
    An error occurred during installation of VirtualBox Guest Additions 4.3.6. Some functionality may not work as intended.
    In most cases it is OK that the "Window System drivers" installation failed.
    [default] Mounting shared folders...
    [default] -- /vagrant
    
    201312212149VVAW11.png
    201312212149VVAW12.png

    reloadコマンドで、Boxを再起動するとゲストアドインのバージョンが、4.3.6であることが確認できます。

    $ vagrant reload
    
    [default] Attempting graceful shutdown of VM...
    [default] Clearing any previously set forwarded ports...
    [default] Fixed port collision for 22 => 2222. Now on port 2201.
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2201 (adapter 1)
    [default] Booting VM...
    [default] Waiting for machine to boot. This may take a few minutes...
    [default] Machine booted and ready!
    GuestAdditions 4.3.6 running --- OK.
    [default] Mounting shared folders...
    [default] -- /vagrant
    
    201312212149VVAW13.png

ゲストアドインの再ビルド

ここまでの作業で、ゲストアドインのインストールが成功したように見えますが、Box起動時のブート画面を見ると、OpenGL support moduleのビルドに失敗しています。

Installing additional modules ...
Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module[  OK  ]
Building the shared folder support module[  OK  ]
Building the OpenGL support module[失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions[  OK  ]
Installing the Window System drivers[失敗]

X-Window Systemを導入していないため、Windows System driverの失敗は、当たり前なので問題無いのですが、OpenGLモジュールのビルドの失敗は、これまでありませんでしたので、そのままにしておくと大変な目に遭います。

私も最初は素通りしていたのですが、CentOSのさまざまなBoxを作成するうちに、メインモジュールのビルドが失敗するようになり、Box起動に時間が掛かるようになって初めて、Box起動のたびに毎回アドインのビルドが行われていることにて気づいた経験があります。

ですから、OpenGLモジュールの失敗の対処を最初にしておくと、その後ハマることは無いと思います。

というワケで、OpenGLモジュールのビルドが失敗しないための対処を行ったBoxを作成します。

  1. ゲストアドインイメージの割り当て

    VirtualBoxのバージョンと同じゲストアドインのISOイメージをBoxに割り当てます。

    $ VBoxManage storageattach `cat .vagrant/machines/default/virtualbox/id` --storagectl SATA --port 2 --type dvddrive --medium I:/ISO/VirtualBox/VBoxGuestAdditions_4.3.6.iso
    
    201312212149VVAW14.png

    Boxに接続し、カーネルソースに必要なヘッダファイルをシンボリックリンクで作成します。

    $ cd /usr/src/kernels/`uname -r`/include/drm
    $ sudo ln -s /usr/include/drm/drm.h .
    $ sudo ln -s /usr/include/drm/drm_sarea.h .
    $ sudo ln -s /usr/include/drm/drm_mode.h .
    $ sudo ln -s /usr/include/drm/drm_fourcc.h .
    
    201312212149VVAW15.png
  2. ゲストアドインの再インストール

    ゲストアドインのISOイメージをマウントして、ゲストアドインを再インストールすると、OpenGLモジュールのビルドが成功します。

    $ sudo mount -r /dev/cdrom /mnt
    $ sudo sh /mnt/VBoxLinuxAdditions.run
    
    Verifying archive integrity... All good.
    Uncompressing VirtualBox 4.3.6 Guest Additions for Linux............
    VirtualBox Guest Additions installer
    Removing installed version 4.3.6 of VirtualBox Guest Additions...
    Copying additional installer modules ...
    Installing additional modules ...
    Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
    Building the VirtualBox Guest Additions kernel modules
    Building the main Guest Additions module                   [  OK  ]
    Building the shared folder support module                  [  OK  ]
    Building the OpenGL support module                         [  OK  ]
    Doing non-kernel setup of the Guest Additions              [  OK  ]
    You should restart your guest to make sure the new modules are actually used
    
    Installing the Window System drivers                       [失敗]
    (Could not find the X.Org or XFree86 Window System.)
    
    201312212149VVAW16.png
  3. 再パッケージ化

    Boxを停止し、VagrantでカスタマイズしたBoxをパッケージ化するを参考にして、再パッケージ化します。

    $ vagrant package --base `cat .vagrant/machines/default/virtualbox/id` --output d:/temp/CentOS65-VB436-UPDATE.box
    
    [6540ca7a-575f-4309-b8a6-3b928f8e780a] Clearing any previously set forwarded ports...
    [6540ca7a-575f-4309-b8a6-3b928f8e780a] Creating temporary directory for export...
    [6540ca7a-575f-4309-b8a6-3b928f8e780a] Exporting VM...
    [6540ca7a-575f-4309-b8a6-3b928f8e780a] Compressing package to: d:/temp/CentOS65-VB436-UPDATE.box
    
    201312212149VVAW17.png

まとめ

CentOS 6.5のBoxにゲストアドインをインストールする際に、OpenGLモジュールのエラーが発生した場合や、VirtualBoxのバージョンを上げた場合には、カーネルソースの設定変更を行うことによって、ビルドエラーを回避することができます。