ubuntu 9.10 α版に Sun Virtualbox 3.06を入れてWindowsXPを動かして快適コンピューティング環境だぜ!とか厨的な楽しみ方をしていたわけだが、ふとゲームでもやってみようと思い立ち、部屋に転がっていたジョイパッドを繋いでみた。

VirtualboxはUSB2.0をサポートしているそうなので、何の苦労もなく接続できる・・・はずだった。
そう思っていた。思い込んでいた。
・・・だが、違った。
結果的にはちゃんと動くところまで行ったが、結構ハマった。

まず、VirtualboxでUSBの設定をしただけではUSBデバイス(ジョイパッド)は認識されるだけで、メニューのデバイス→USBデバイスのところがグレーアウトして機器を選択できない状態だった。

思い付く言葉の組み合わせを片っ端から検索キーワードにしてググりまくったところ、古い情報から新しい情報までいろんな情報にヒットして、返って混乱した気がする。

今回のウチの場合、クリティカルな情報はここに載っていた。
気ままなブログ: VirtualBoxでWindowsXP導入~
大感謝!

引用内の
none /proc/bus/usb usbfs devgid=数字,devmode=664 0 0
の数字の部分は
VirtualboxユーザーグループID

調べ方は
cat /etc/group|grep vboxusers

<以下引用>
/etc/fstab
#usbfs
none /proc/bus/usb usbfs devgid=数字,devmode=664 0 0
を追記

次に /etc/init.d/mountdevsubfs.sh の
#! /bin/sh
### BEGIN INIT INFO
# Provides: mountdevsubfs
# Required-Start: mountkernfs
# Required-Stop:
# Should-Start: udev
# Default-Start: S
# Default-Stop:
# Short-Description: Mount special file systems under /dev.
# Description: Mount the virtual filesystems the kernel provides
# that ordinarily live under the /dev filesystem.
### END INIT INFO
#
# This script gets called multiple times during boot
#

PATH=/lib/init:/sbin:/bin
TTYGRP=5
TTYMODE=620
[ -f /etc/default/devpts ] && . /etc/default/devpts

TMPFS_SIZE=
[ -f /etc/default/tmpfs ] && . /etc/default/tmpfs

KERNEL="$(uname -s)"

. /lib/lsb/init-functions
. /lib/init/mount-functions.sh

do_start () {
#
# Mount a tmpfs on /dev/shm
#
SHM_OPT=
[ "${SHM_SIZE:=$TMPFS_SIZE}" ] && SHM_OPT=",size=$SHM_SIZE"
domount tmpfs shmfs /dev/shm tmpfs -onosuid,nodev$SHM_OPT

#
# Mount /dev/pts. Master ptmx node is already created by udev.
#
domount devpts "" /dev/pts devpts -onoexec,nosuid,gid=$TTYGRP,mode=$TTYMODE

###########ここから
# Magic to make /proc/bus/usb work
#
mkdir -p /dev/bus/usb/.usbfs
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
ln -s .usbfs/devices /dev/bus/usb/devices
mount --rbind /dev/bus/usb /proc/bus/usb
###########ここまで
}

case "$1" in
"")
echo "Warning: mountdevsubfs should be called with the 'start' argument." >&2
do_start
;;
start)
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
*)
echo "Usage: mountdevsubfs [start|stop]" >&2
exit 3
;;
esac
を追加。
<引用ここまで>

/etc/init.d/mountdevsubfs.sh というファイル自体がなかったため、空のファイルに上記内容をコピペして保存。出来上がったファイルに実行権限を付けて、設定完了。

Virtualbox上のWindowsXPでちゃんとUSBデバイス(ジョイパッド)が動くようになった。
やったね。