CentOS 7でVBoxGuestAdd-inが失敗した時の対処方法

2014年08月04日 19時42分

201408041942VVAW00.png

はじめに

Packerを使ってCentOS 7の仮想マシンイメージを作成するでは、CentOS 7のBoxイメージを作成しましたが、yumでシステムをアップデートした後、Vagrantで起動するとVirtualBox Guest Add-inのビルドに毎回失敗していました。そこで今回は、CentOS 7でVirtualBox Guest Add-inをビルドする方法を解説します。

前提条件

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

ソフトウエアバージョン
OSWindows 7 Ultimate 32bit
CygwinSetup Version 2.831
VirtualBox4.3.12 r93733
Vagrant1.6.3

確認方法

  1. Box起動

    vagrant up時に、VirtualBox Guest Add-inのビルドが失敗し、一旦リブートしてOSが起動しますので失敗した事がすぐに判ります。

    $ cd /tmp/centos-vm
    $ vagrant up
    
  2. VirtualBox Guest Add-inのビルド

    OS起動後、VirtualBox Guest Add-inをビルドします。

    # export LANG=C
    # mount -r /dev/cdrom /mnt
    # sh /mnt/VBoxLinuxAdditions.run
    
    201408041942VVAW01.png
    Verifying archive integrity... All good.
    Uncompressing VirtualBox 4.3.12 Guest Additions for Linux............
    VirtualBox Guest Additions installer
    Removing installed version 4.3.12 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                   [FAILED]
    (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, skipping.
    
  3. エラーログ確認

    /var/log/vboxadd-install.logを確認すると、構造体の存在しないメンバーを参照してエラーになって停止したことが判ります。

    # cat /var/log/vboxadd-install.log
    
    201408041942VVAW02.png
    RT_R0 -DIN_GUEST -DIN_GUEST_R0 -DIN_MODULE -DRT_WITH_VBOX -DVBGL_VBOXGUEST -DVBOX_WITH_HGCM -DRT_ARCH_AMD64 -DVBOX_WITH_64_BITS_GUESTS  -DMODULE  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(memobj_r0drv_linux)"  -D"KBUILD_MODNAME=KBUILD_STR(vboxguest)" -c -o /tmp/vbox.0/r0drv/linux/.tmp_memobj-r0drv-linux.o /tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c
    /tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c: In function 'rtR0MemObjNativeMapUser':
    /tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1542:26: error: 'struct mm_struct' has no member named 'numa_next_reset'
                     pTask->mm->numa_next_reset = jiffies + 0x7fffffffffffffffUL;
                              ^
    make[2]: *** [/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.o] Error 1
    make[1]: *** [_module_/tmp/vbox.0] Error 2
    make: *** [vboxguest] Error 2
    Creating user for the Guest Additions.
    Creating udev rule for the Guest Additions kernel module.
    

対処方法

VirtualBoxの問題報告にも同様の事象が報告されていますので、この問題報告を元に該当のファイル(memobj-r0drv-linux.c)を編集しても良いのですが、今回は、パッチを作成してVirtualBox Guest Add-inのビルドを行うシェルスクリプトを作成します。

  1. シェルスクリプト作成

    この記事で使用したスクリプト(vmtools.sh)を元にスクリプトを作成します。
    ただし、今回作成するスクリプトは、VirtualBox 4.3.12専用になっていますので、環境に合わせて修正して下さい。

    $ vi vboxbuild
    
    set -e
    mount -r /dev/cdrom /mnt
    sh /mnt/VBoxLinuxAdditions.run --noexec --keep
    umount /mnt
    
    # Apply patch
    cur_dir=$(pwd)
    tmp_dir=$(mktemp -d)
    patch=VBox-numa_no_reset.diff
    
    cat > ${patch} << _EOF_
    --- src/vboxguest-4.3.12/vboxguest/r0drv/linux/memobj-r0drv-linux.c.orig	2014-05-16 21:16:12.000000000 +0900
    +++ src/vboxguest-4.3.12/vboxguest/r0drv/linux/memobj-r0drv-linux.c	2014-08-04 18:55:12.346790321 +0900
    @@ -65,6 +65,17 @@
     # define VBOX_USE_PAE_HACK
     #endif
     
    +/*
    + * Distribution kernels like to backport things so that we can't always rely
    + * on Linux kernel version numbers to detect kernel features.
    + */
    +#ifdef CONFIG_SUSE_KERNEL
    +# if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
    +# define NUMA_NO_RESET
    +# endif
    +#elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
    +# define NUMA_NO_RESET
    +#endif
     
     /*******************************************************************************
     *   Structures and Typedefs                                                    *
    @@ -1533,12 +1544,12 @@
                     /** @todo Ugly hack! But right now we have no other means to disable
                      *        automatic NUMA page balancing. */
     # ifdef RT_OS_X86
    -#  if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
    +#  ifndef NUMA_NO_RESET
                     pTask->mm->numa_next_reset = jiffies + 0x7fffffffUL;
     #  endif
                     pTask->mm->numa_next_scan  = jiffies + 0x7fffffffUL;
     # else
    -#  if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
    +#  ifndef NUMA_NO_RESET
                     pTask->mm->numa_next_reset = jiffies + 0x7fffffffffffffffUL;
     #  endif
                     pTask->mm->numa_next_scan  = jiffies + 0x7fffffffffffffffUL;
    _EOF_
    
    tarball=${cur_dir}/install/VBoxGuestAdditions-amd64.tar.bz2
    
    cd ${tmp_dir}
    tar xjf ${tarball}
    patch -p0 < ${cur_dir}/${patch}
    tar cjf ${tarball} *
    
    # Run installer
    cd ${cur_dir}/install
    ./install.sh
    
    # Clean up
    cd ..
    rm -rf ${tmp_dir}
    rm -rf ${cur_dir}/install
    rm -f ${cur_dir}/${patch}
    
  2. スクリプトの転送

    ローカル側で作成したスクリプトを、Box側に転送します。

    $ scp -P 2222 vboxbuild root@127.0.0.1:/root
    
    201408041942VVAW03.png
  3. VirtualBox Guest Add-inのビルド

    転送したスクリプトを実行して、Guest Add-inをビルドします。
    予め、VirtualBox Guest Add-inのISOイメージは、Boxに割り当てておいて下さい。

    #sh vboxbuild
    
    201408041942VVAW04.png
    Creating directory install
    Verifying archive integrity... All good.
    Uncompressing VirtualBox 4.3.12 Guest Additions for Linux............
    patching file src/vboxguest-4.3.12/vboxguest/r0drv/linux/memobj-r0drv-linux.c
    VirtualBox Guest Additions installer
    Removing installed version 4.3.12 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, skipping.
    
  4. Box再起動

    reloadコマンドを使って、Boxを再起動します。

    $ vagrant reload
    
    201408041942VVAW05.png
    ==> default: Attempting graceful shutdown of VM...
    ==> default: Clearing any previously set forwarded ports...
    ==> default: Clearing any previously set network interfaces...
    ==> default: Preparing network interfaces based on configuration...
        default: Adapter 1: nat
    ==> default: Forwarding ports...
        default: 22 => 2222 (adapter 1)
    ==> default: Booting VM...
    ==> default: Waiting for machine to boot. This may take a few minutes...
        default: SSH address: 127.0.0.1:2222
        default: SSH username: vagrant
        default: SSH auth method: private key
        default: Warning: Connection timeout. Retrying...
        default: Warning: Connection timeout. Retrying...
    ==> default: Machine booted and ready!
    GuestAdditions 4.3.12 running --- OK.
    ==> default: Checking for guest additions in VM...
    ==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
    ==> default: to force provisioning. Provisioners marked to run always will still run.
    

    以上で、VirtualBox Guest Add-inが正常にビルドされ、Boxが起動できることが確認できます。