这是怎么发生的?(之前的长答案)

这是怎么发生的?(之前的长答案)

在 Oracle VirtualBox 4.3.24 上运行 Ubuntu 14.04,完全无法安装客户添加项。我花了很长时间在网上寻找解决方案,但没有任何帮助...

在此处输入图片描述

如下所述,我尝试手动安装并从网上下载 ISO(与 VirtualBox 匹配的版本)。同样的错误:

在此处输入图片描述

编辑:

现在一些文件夹变成了“只读”,这会带来很大的麻烦。即使安装全新的 Ubuntu 14.04 映像也无济于事……因此只能重新安装 VirtualBox 本身……

答案1

我能够通过重新安装 Linux 映像来解决安装问题:

sudo apt-get install --reinstall linux-image-$(uname -r)

顺便说一句,这一切都是从升级 VirtualBox 开始的。双向剪贴板停止工作,所以我尝试重新插入 Guest Additions ISO。这导致了上述问题。现在,Guest Additions 已重新安装,但剪贴板仍然不起作用……

答案2

总结 可以通过重启快速修复不要使用 apt-get。参见底部的“只需重新启动!”。


这是怎么发生的?(之前的长答案)

如果您执行以下操作,就会出现此类问题:

  • 升级内核(比如从 .66 升级到 .67)
  • 运行apt-get autoremove并以某种方式删除正在运行的内核,或者手动删除“旧”内核,从而从 /lib/modules/kernel.66 中删除所有模块
  • 不重新启动,从而使“旧”的 .66 内核保持运行。加载的模块保留在内存中,一切正常,但是无法加载新模块自此.66个模块已被删除。
  • 尝试做任何需要加载尚未加载的模块的事情

安装 VirtualBox ISO 可能正是需要这样做——加载 ISO9660 支持模块。

请求的模块现在无法再自动加载,因为正在运行的内核(.66)在 /lib/modules/kernel.66 中找不到任何内容。模块存在,但它位于 /lib/modules/kernel.67 中,当前的 .66 内核对其一无所知(并且不建议加载不匹配的模块)。

重新安装未命名的内核当然会重新安装正在运行的内核模块,从而使 ../.66/.../isofs.ko 再次可用,并且无需重新启动。这是已安装内核的降级,更新问题仍将存在(见下文)。

也就是说,当您运行 Additions CD 时,它将安装跑步.66 内核,不是更新的.67 内核(仍然没有运行)。

如果你处于这种情况,你也可以当然通过重启来修复它(新的 .67 运行内核会找到它的模块),并且大概通过加载属于新内核的模块(isofs非常稳定),除非您经历了重要的内核升级,否则它仍然是兼容的(这仍然不推荐!):

# mount /dev/cdrom /mnt
mount: unknown filesystem type 'iso9660'

以上是您收到的根错误(“未知文件系统类型”)。

# uname -a
Linux virtual 3.13.0-66-generic ...

因此我们检查安装了哪个版本的模块。它应该是 .66:

# ls /lib/modules
3.13.0-67-generic

...但是只有一个目录,它是 .67(.66 目录可能存在,但是是空的;在这种情况下du -sh /lib/modules/*将告诉各个目录占用了多少空间,从而可以区分空目录和满目录)。

重新安装旧内核映像而不重新 grub 无法解决真正的问题

您重新安装正在运行的内核及其模块和头文件。现在您拥有两个内核,并grub设置为加载较新的内核。

ISO CD-ROM 可以安装(因为模块现在存在)并且 VBox 模块将被编译(因为已安装标题)。

它将为正在运行的 .66 内核编译模块,并且它们将运行一段时间。

第一次重启时,你会发现你的.67 内核没有任何 VirtualBox 添加内容。

重新安装内核也无法解决真正的问题

apt-get install --reinstall linux-image-$(uname -r)

如上所述,第一次重启时,你会发现内核被降级了(或者说“未升级”)。很快,Ubuntu 就会尝试升级它……然后你又会回到原点(见下文:“降级内核”),需要重启并再次安装 Virtualbox Additions。

修补 ISO 模块也无法解决真正的问题

我们很有可能可以强制加载 ISO9660 模块,因为内核 66 和 67 之间没有进行任何工作,并且二进制文件基本上没有变化,因此我们尝试:

# insmod /lib/modules/3.13.0-67-generic/kernel/fs/isofs/isofs.ko

没有错误。成功了。内核 .66 从内核 .67 加载模块。让我们再次尝试安装 CD-ROM:

# mount /dev/cdrom /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only

嘿!成功了!

是的,但这仍然不会有任何真正的帮助,因为正在安装的 CD 是 VirtualBox Additions,它需要跑步需要安装的内核头文件。如果正在运行的内核模块不再存在,内核头文件也有可能。因此,虽然 CD-ROM 可以安装,但安装程序在启动时会失败。

而且,即使它以某种方式找到了标题并且编译没有失败,新编译的 Virtualbox 模块也无处可去,因为 .66 模块目录已被清理(这就是模块isofs无法找到的原因!)。

但是,如果你通过恢复前一个内核的模块和头文件目录解决了所有问题,那么你现在实际上已经完成了一次昂贵的(部分)内核降级,并且新增的内容将是丢失的下次重新启动时,新安装的 .67 内核将与 .66 内核的其余部分一起启动。因为 Virtualbox Additions CD 从 .66 内核启动,并带有 .66 标头,因此会忠实地安装 .66 内核模块,而不是 .67 内核模块。

降级内核会起作用……但会持续一段时间

要是我们消除.67 内核并重新安装 .66 内核及其模块,一段时间内一切都会顺利。无需重新启动,如上面的“强制 ISO 模块”解决方案。

由于没有安装有附加问题的内核,因此重新启动不会丢失任何内容。

但这样内核还是会在“待升级”列表中,迟早会出现同样的问题(通常是后天,或者下周,取决于自动更新的频率)。

的确,你现在可以让它在你选择的更合适的时刻出现,这可能很有价值。在项目开发马拉松中途强制升级是魔鬼。

因此:只需重新启动!(然后重新运行 Additions CD)。

重新启动后,已经安装的较新的 .67 内核将被激活,并且其所有模块和标头都在那里;其中包括isofs用于读取 ISO9660 CD 文件系统的模块。

 sudo reboot

重新启动后,CD-ROM 就可以工作了,而且 Guest Additions 也可以安装。

使用附加功能更新 VirtualBox 上的内核的“最佳”顺序是:

 apt-get update
 apt-get upgrade              (or apt-get dist-upgrade)
 reboot                       
 (re)install VirtualBox Additions on the new kernel that is now running
 apt-get autoremove

(出于安全原因,次最新的旧内核可能不会被自动删除,以允许您“返回”)。

答案3

根据其他人的回答,通常可以通过重新启动来解决此问题。

不知何故“iso9660”模块未加载。depmod扫描所有模块并创建模块依赖关系。

sudo depmod -a
sudo mount /dev/sr0 /mnt
ls -l /mnt

这将解决这个问题。

答案4

我通过升级软件包并重新启动解决了这个问题(在 Ubuntu 16.04 上):

sudo apt-get update
sudo apt-get upgrade
sudo reboot

相关内容