Vine Linux 用の VirtualBox 1.5.4 rpm パッケージを作ってみる

私は VMware Player を愛用していますが,Mac OS X 上でも VirtualBox が使えるということで,Vine Linux 用に rpm パッケージを作ってみたくなった.

VirtualBox_1.5.4_Linux_x86.run から VirtualBox-1.5.4-0vlmp1.i386.rpm を作ってみました.デフォルトの VirtualBox_1.5.4_Linux_x86.run と異なる点は,次の 3 点です:

早い話,nosrc.rpm を作りました:VirtualBox-1.5.4-0vlmp1.nosrc.rpm on so-net

以下は単なる私のめもですので,無視ってください!

なお先人の知恵として,以下のサイトを参考にしました.
VirtualBox を Vine Linux にインストール:日々のあしあと:So-netブログ
VirtualBox のインストール方法:日々のあしあと:So-netブログ
VirtualBox のインストール方法 (2):日々のあしあと:So-netブログ
VirtualBox を 1.5.2 にアップデート:日々のあしあと:So-netブログ
VirtualBox の VM を一発起動:日々のあしあと:So-netブログ

VirtualBox-1.5.4_27034_fedora8-1.i586.rpm の解析

まずは Fedorarpm の解析をしてみる.VirtualBox-1.5.4_27034_fedora8-1.i586.rpm をインストールしようとするも…,

# rpm -ivh VirtualBox-1.5.4_27034_fedora8-1.i586.rpm
エラー: 依存性の欠如:
        libcrypto.so.6 は VirtualBox-1.5.4_27034_fedora8-1.i586 に必要とされています
        libstdc++.so.6 は VirtualBox-1.5.4_27034_fedora8-1.i586 に必要とされています
        libstdc++.so.6(CXXABI_1.3) は VirtualBox-1.5.4_27034_fedora8-1.i586 に必要とされています
        libstdc++.so.6(CXXABI_1.3.1) は VirtualBox-1.5.4_27034_fedora8-1.i586 に必要とされています
        libstdc++.so.6(GLIBCXX_3.4) は VirtualBox-1.5.4_27034_fedora8-1.i586 に 必要とされています
        rtld(GNU_HASH) は VirtualBox-1.5.4_27034_fedora8-1.i586 に必要とされています

と文句を言われたので,強制的にインストールしてみる.

# rpm -ivh --nodeps VirtualBox-1.5.4_27034_fedora8-1.i586.rpm 
準備中...                   ########################################### [100%]
   1:VirtualBox             ########################################### [100%]

Creating group 'vboxusers'. VM users must be member of that group!

No precompiled module for this kernel found -- trying to build one. Messages
emitted during module compilation will be logged to /var/log/vbox-install.log.

Success!

/etc/init.d/vboxdrv: Unknown system
/etc/init.d/vboxdrv: line 88: begin: command not found
/etc/init.d/vboxdrv: line 123: succ_msg: command not found

インストール自体は一応成功したが…,

$ rpm -qi VirtualBox-1.5.4_27034_fedora8
Name        : VirtualBox                   Relocations: (not relocatable)
Version     : 1.5.4_27034_fedora8               Vendor: innotek GmbH
Release     : 1                             Build Date: 2007年12月29日 20時13分09秒
Install Date: 2008年01月14日 17時40分51秒      Build Host: tinderdeb.intra-innotek.de
Group       : Applications/System           Source RPM: VirtualBox-1.5.4_27034_fedora8-1.src.rpm
Size        : 38091371                         License: VirtualBox Personal Use and Evaluation License (PUEL)
Signature   : (none)
URL         : http://www.virtualbox.org/
Summary     : Powerful PC virtualization solution
Description :
VirtualBox is a powerful PC virtualization solution allowing
you to run a wide range of PC operating systems on your Linux
system. This includes Windows, Linux, FreeBSD, DOS, OpenBSD
and others. VirtualBox comes with a broad feature set and
excellent performance, making it the premier virtualization
software solution on the market.

インストール後に走っている処理(%post)で問題があるみたい./etc/init.d/vboxdrv: Unknown system と言われているので,Vine Linuxディストリビューション名を認識していないみたい.そこで…,

# ln -s /etc/vine-release /etc/redhat-release

とすれば良いっぽい.実際に…,

# rpm -e  VirtualBox-1.5.4_27034_fedora8
# rpm -ivh --nodeps VirtualBox-1.5.4_27034_fedora8-1.i586.rpm
準備中...                   ########################################### [100%]
   1:VirtualBox             ########################################### [100%]

Creating group 'vboxusers'. VM users must be member of that group!

No precompiled module for this kernel found -- trying to build one. Messages
emitted during module compilation will be logged to /var/log/vbox-install.log.

Success!

# 

となり,うまく %post が走ってくれる.んで,裏で何が走っているのか覗いてみると…,

$ rpm -q --scripts VirtualBox-1.5.4_27034_fedora8
preinstall scriptlet (using /bin/sh):
# XXX remove old modules from previous versions
find /lib/modules -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2> /dev/null
postinstall scriptlet (using /bin/sh):
LOG="/var/log/vbox-install.log"

# remove old cruft
if [ -f /etc/init.d/vboxdrv.sh ]; then
  echo "Found old version of /etc/init.d/vboxdrv.sh, removing."
  rm /etc/init.d/vboxdrv.sh
fi
if [ -f /etc/init.d/virtualbox ]; then
  echo "Found old version of /etc/init.d/virtualbox.sh, removing."
  rm /etc/init.d/virtualbox
  [ -f /sbin/rcvirtualbox ] && rm -f /sbin/rcvirtualbox
fi
rm -f /etc/vbox/module_not_compiled

# install udev rule
if [ -d /etc/udev/rules.d ]; then
  udev_out=`udevinfo -V 2> /dev/null`
  udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
  if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
    echo 'KERNEL="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"' \
      > /etc/udev/rules.d/60-vboxdrv.rules
  else
    echo 'KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"' \
      > /etc/udev/rules.d/60-vboxdrv.rules
  fi
fi

# XXX SELinux: allow text relocation entries
if [ -x /usr/bin/chcon ]; then
  chcon -t texrel_shlib_t /usr/lib/VBox* > /dev/null 2>&1
  chcon -t texrel_shlib_t /usr/lib/VRDPAuth.so > /dev/null 2>&1
  chcon -t texrel_shlib_t /usr/lib/virtualbox/components/VBox*.so > /dev/null 2>&1
  chcon -t java_exec_t    /usr/lib/virtualbox/VirtualBox
  chcon -t java_exec_t    /usr/lib/virtualbox/VBoxSDL
  chcon -t java_exec_t    /usr/lib/virtualbox/VBoxVRDP
fi

# create users groups
echo
echo "Creating group 'vboxusers'. VM users must be member of that group!"
echo
groupadd -f vboxusers 2> /dev/null
/sbin/chkconfig --add vboxdrv
/sbin/chkconfig --add vboxnet

if [ ! -f /lib/modules/`uname -r`/misc/vboxdrv.ko ]; then
  # compile problem
  cat << EOF
No precompiled module for this kernel found -- trying to build one. Messages
emitted during module compilation will be logged to $LOG.

EOF
  if ! /usr/share/virtualbox/src/build_in_tmp install > /var/log/vbox-install.log 2>&1; then
    cat << EOF
Compilation of the kernel module FAILED! VirtualBox will not start until this
problem is fixed. Please consult $LOG to find out why the
kernel module does not compile. Most probably the kernel sources are not found.
Install them and execute

  /etc/init.d/vboxdrv setup

as root.

EOF
    touch /etc/vbox/module_not_compiled
  else
    cat << EOF
Success!

EOF
    rm -f /etc/vbox/module_not_compiled
  fi
fi
if lsmod | grep -q "vboxdrv[^_-]"; then
  /etc/init.d/vboxdrv stop || true
fi
if [ ! -f /etc/vbox/module_not_compiled ]; then
  depmod -ae
  /etc/init.d/vboxdrv start > /dev/null
fi
/etc/init.d/vboxnet start > /dev/null
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ]; then
    /sbin/service vboxnet stop > /dev/null
    /sbin/chkconfig --del vboxnet
    /sbin/service vboxdrv stop > /dev/null
    /sbin/chkconfig --del vboxdrv
    rm -f /etc/udev/rules.d/60-vboxdrv.rules
    rm -f /etc/vbox/license_agreed
    rm -f /etc/vbox/module_not_compiled
fi
postuninstall scriptlet (using /bin/sh):
if [ "$1" -ge 1 ]; then
    /sbin/service vboxdrv restart > /dev/null 2>&1
    /sbin/service vboxnet restart > /dev/null 2>&1
fi

postinstall でカーネルモジュールのコピーもしているが,Vine Linux で走っているカーネル用に vboxdrv.ko をビルドして入れてくれているので,問題ないっぽい.

$ find /lib/modules/ | grep vbox
/lib/modules/2.6.23.1-49.fc8/misc/vboxdrv.ko
/lib/modules/2.6.23.8-63.fc8/misc/vboxdrv.ko
/lib/modules/2.6.16-0vl76.28/misc/vboxdrv.ko

VirtualBox-1.5.4_27034_fedora8 の MANIFEST は以下の通り.

$ rpm -ql VirtualBox-1.5.4_27034_fedora8
/etc/rc.d/init.d/vboxdrv
/etc/rc.d/init.d/vboxnet
/etc/vbox
/lib/modules
/lib/modules/2.6.23.1-49.fc8
/lib/modules/2.6.23.1-49.fc8/misc
/lib/modules/2.6.23.1-49.fc8/misc/vboxdrv.ko
/lib/modules/2.6.23.8-63.fc8
/lib/modules/2.6.23.8-63.fc8/misc
/lib/modules/2.6.23.8-63.fc8/misc/vboxdrv.ko
/usr/bin
/usr/bin/VBox
/usr/bin/VBoxAddIF
/usr/bin/VBoxDeleteIF
/usr/bin/VBoxManage
/usr/bin/VBoxSDL
/usr/bin/VBoxTAP
/usr/bin/VBoxTunctl
/usr/bin/VBoxVRDP
/usr/bin/VirtualBox
/usr/lib/VBoxDD.so
/usr/lib/VBoxDD2.so
/usr/lib/VBoxDDU.so
/usr/lib/VBoxKeyboard.so
/usr/lib/VBoxREM.so
/usr/lib/VBoxRT.so
/usr/lib/VBoxSharedClipboard.so
/usr/lib/VBoxSharedFolders.so
/usr/lib/VBoxVMM.so
/usr/lib/VBoxVRDP.so
/usr/lib/VBoxXML.so
/usr/lib/VBoxXPCOM.so
/usr/lib/VRDPAuth.so
/usr/lib/virtualbox
/usr/lib/virtualbox/VBoxDD2GC.gc
/usr/lib/virtualbox/VBoxDD2R0.r0
/usr/lib/virtualbox/VBoxDDGC.gc
/usr/lib/virtualbox/VBoxDDR0.r0
/usr/lib/virtualbox/VBoxManage
/usr/lib/virtualbox/VBoxSDL
/usr/lib/virtualbox/VBoxSVC
/usr/lib/virtualbox/VBoxVRDP
/usr/lib/virtualbox/VBoxXPCOMIPCD
/usr/lib/virtualbox/VMMGC.gc
/usr/lib/virtualbox/VMMR0.r0
/usr/lib/virtualbox/VirtualBox
/usr/lib/virtualbox/components
/usr/lib/virtualbox/components/VBoxC.so
/usr/lib/virtualbox/components/VBoxSVCM.so
/usr/lib/virtualbox/components/VBoxXPCOMBase.xpt
/usr/lib/virtualbox/components/VBoxXPCOMIPCC.so
/usr/lib/virtualbox/components/VirtualBox_XPCOM.xpt
/usr/lib/virtualbox/kchmviewer
/usr/lib/virtualbox/tstVMM
/usr/share/applications
/usr/share/applications/VirtualBox.desktop
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8/LICENSE
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8/License-1.4.html
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8/UserManual.pdf
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8/VirtualBox.chm
/usr/share/doc/VirtualBox-1.5.4_27034_fedora8/VirtualBoxAPI.chm
/usr/share/pixmaps
/usr/share/pixmaps/VBox.png
/usr/share/virtualbox
(以下省略)

これで VirtualBox_1.5.4_Linux_x86.run から rpm パッケージを作る足掛かりができたかね!?

VirtualBox_1.5.4_Linux_x86.run の解析

こちらも展開して中身を覗いてみると…,

$ bash VirtualBox_1.5.4_Linux_x86.run --target /tmp/vbox
Creating directory /tmp/vbox
Verifying archive integrity... All good.
Uncompressing VirtualBox for Linux installation........
VirtualBox Version 1.5.4 (Sat Dec 29 08:50:14 CET 2007) installation
This program must be run with administrator privileges.  Aborting
$ cd /tmp/vbox
$ ls
LICENSE             deffiles*    routines.sh*  vboxnet.sh*
VirtualBox.tar.bz2  install.sh*  vboxdrv.sh*

となっていました.deffiles は VirtualBox.tar.bz2 の MANIFEST で,残りのスクリプトは,install.sh で通常実行されるもので,ディストリの判定も /etc/hogehoge-release でやっています.なので,/etc/redhat-release なところを,/etc/vine-release に置換するか,/etc/vine-release の分岐を追加すれ良いですね*1

実際に VirtualBox_1.5.4_Linux_x86.run を用いてデフォルトでインストールをしてみます.

!!!NOTE: Keeping the symbolic link /etc/redhat-release -> /etc/vine-release
         If you need, run "rpm -e VirtualBox-1.5.4_27034_fedora8".

# bash VirtualBox_1.5.4_Linux_x86.run (or # bash install.sh)
Verifying archive integrity... All good.
Uncompressing VirtualBox for Linux installation........
VirtualBox Version 1.5.4 (Sat Dec 29 08:50:14 CET 2007) installation
Installing VirtualBox to /opt/VirtualBox-1.5.4

VirtualBox has been installed successfully.

You will find useful information about using VirtualBox in the user manual
  /opt/VirtualBox-1.5.4/UserManual.pdf
and in the user FAQ
  http://www.virtualbox.org/wiki/User_FAQ

We hope that you enjoy using VirtualBox.

# 

デフォルトだと /opt/VirtualBox-1.5.4 に入ってしまうんですね.Solaris とか昔のシステムっぽい階層構造を久しぶりにみました.これが正しいっていう方も….これは,install.sh に INSTALLATION_DIR="/opt/VirtualBox-1.5.4" とあるので,

# INSTALLATION_DIR="/usr/share/VirtualBox" bash VirtualBox_1.5.4_Linux_x86.run

とかすると,良い感じ!?になってくれるかな.

/etc/redhat-release の判定により,然るべきところへ入るようなので,VirtualBox-1.5.4_27034_fedora8-1.i586.rpm と同じスクリプトにもディレクトリ構成にもできない*2.しかしながら,Adobe Reader のような all-in-one な構成で,/etc/vine-release を見るように改造してみることに決めた.

*1:本家にお願いして,次のリリースに入れてもらおうかな???

*2:ディレクリ構造が異なるので,vboxnet, vboxdrv が異なる./etc/vbox/vbox.cfg を見ている.