はじめに
Packerを使ってCentOS 7の仮想マシンイメージを作成するでは、CentOS 7のBoxイメージを作成しましたが、yumでシステムをアップデートした後、Vagrantで起動するとVirtualBox Guest Add-inのビルドに毎回失敗していました。そこで今回は、CentOS 7でVirtualBox Guest Add-inをビルドする方法を解説します。
2014年08月04日 19時42分
Packerを使ってCentOS 7の仮想マシンイメージを作成するでは、CentOS 7のBoxイメージを作成しましたが、yumでシステムをアップデートした後、Vagrantで起動するとVirtualBox Guest Add-inのビルドに毎回失敗していました。そこで今回は、CentOS 7でVirtualBox Guest Add-inをビルドする方法を解説します。
作業の前提条件は、下記のとおりです。
ソフトウエア | バージョン |
---|---|
OS | Windows 7 Ultimate 32bit |
Cygwin | Setup Version 2.831 |
VirtualBox | 4.3.12 r93733 |
Vagrant | 1.6.3 |
vagrant up時に、VirtualBox Guest Add-inのビルドが失敗し、一旦リブートしてOSが起動しますので失敗した事がすぐに判ります。
$ cd /tmp/centos-vm $ vagrant up
OS起動後、VirtualBox Guest Add-inをビルドします。
# export LANG=C # mount -r /dev/cdrom /mnt # sh /mnt/VBoxLinuxAdditions.run
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.
/var/log/vboxadd-install.logを確認すると、構造体の存在しないメンバーを参照してエラーになって停止したことが判ります。
# cat /var/log/vboxadd-install.log
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のビルドを行うシェルスクリプトを作成します。
この記事で使用したスクリプト(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}
ローカル側で作成したスクリプトを、Box側に転送します。
$ scp -P 2222 vboxbuild root@127.0.0.1:/root
転送したスクリプトを実行して、Guest Add-inをビルドします。
予め、VirtualBox Guest Add-inのISOイメージは、Boxに割り当てておいて下さい。
#sh vboxbuild
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.
reloadコマンドを使って、Boxを再起動します。
$ vagrant reload
==> 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が起動できることが確認できます。