/!\ 没兴趣看我罗嗦废话的直接按照下文中蓝字部分执行应该就行了。
今天心血来潮编译安装了 2.6.37.3的内核,结果发现原来好好的 vbox 虚拟机打不开了,错误提示: 让重新安装 virtualbox-ose-dkms 然后用 root 执行 modprobe vboxdrv 。
看来是新内核和现有的vbox驱动不兼容了。
按照提示执行:
sudo apt-get install virtualbox-ose-dkms
结果提示已经安装了最新版本的 。。也是啊,我以前都有的啊。
尝试执行 sudo dpkg-reconfigure virtualbox-ose-dkms
就爆出一个错误。察看 /var/lib/dkms/virtualbox-ose/3.1.6/build/make.log 发现,问题出在 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 文件的 第 92行,
/var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c:92: error: unknown field ‘ioctl’ specified in initializer
vi +92 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 看到那一行的内容是:
ioctl: VBoxNetAdpLinuxIOCtl,
不知所以。上google。。。
结果发现这是个普遍的问题,这位仁兄说到了关键,
http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&ptid=1174031&pid=7323551
http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&ptid=1174031&pid=7323551
但是俺不知道怎么改。。。继续google,在某外国友人的论坛上发现了修改方法,一位好心的老兄给出了patch(代码):
--- VBoxNetAdp-linux.c~ 2010-08-05 14:52:24.000000000 +0100
+++ VBoxNetAdp-linux.c 2010-09-17 13:34:23.000000000 +0100
@@ -60,7 +60,7 @@
static int VBoxNetAdpLinuxOpen(struct inode *pInode, struct file *pFilp);
static int VBoxNetAdpLinuxClose(struct inode *pInode, struct file *pFilp);
-static int VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsigned int uCmd, unsigned long ulArg);
+static long VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsigned int uCmd, unsigned long ulArg);
/*****************************************************************************
* Global Variables *
@@ -83,7 +83,7 @@
owner: THIS_MODULE,
open: VBoxNetAdpLinuxOpen,
release: VBoxNetAdpLinuxClose,
- ioctl: VBoxNetAdpLinuxIOCtl,
+ unlocked_ioctl: VBoxNetAdpLinuxIOCtl,
};
/** The miscdevice structure. */
@@ -246,7 +246,7 @@
* @param uCmd The function specified to ioctl().
* @param ulArg The argument specified to ioctl().
*/
-static int VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, unsned int uCmd, unsigned long ulArg)
+static long VBoxNetAdpLinuxIOCtl(struct inode *pInode, struct file *pFilp, ungned int uCmd, unsigned long ulArg)
{
VBOXNETADPREQ Req;
PVBOXNETADP pAdp;
但是别高兴的太早。这个补丁俺打上去的时候被拒绝了,还好补丁的内容不多,俺手动改!!!,
首先将 /var/lib/dkms/virtualbox-ose/3.1.6/build/vboxnetadp/linux/VBoxNetAdp-linux.c 的第92行:
ioctl: VBoxNetAdpLinuxIOCtl,
改为:
unlocked_ioctl: VBoxNetAdpLinuxIOCtl,
然后搜索: int VBoxNetAdpLinuxIOCtl , 找到函数定义代码,将 int 改为 long.
现在为止,已经成功一半。
现在 进入 /usr/src/virtualbox-ose-3.1.6/vboxdrv 目录执行,sudo make install && sudo modprobe vboxdrv, ok ,如果不出错的话,vbox现在已经修复了。
为什么这么简单的一句命令我称之为一半呢?因为我当时天真的认为,直接执行下 sudo dpkg --configure virtualbox-ose-dkms 就可以了。谁知道它们竟然聪明的将我改的代码覆盖了。。。
--
yaoms
yaoms