用VirtualBox装Ubuntu 18.04这件事,很多搞运维、做开发、或者在学校拿虚拟机当课程实验环境的同学大概率都干过。这个组合最大的问题就是“跑着跑着,某天开机突然卡住了”。我之前整理过一份关于“ubuntu 18.04 virtualbox开机卡住了”的方案,最早是从一份AI整理的应急手册里看到的,但真照着敲命令的时候发现,不少细节写得不够到位,比如恢复模式里文件系统只读会导致修复命令执行失败,比如内核参数加了之后为什么能开机也说不清楚。所以这次我干脆把同样的问题从头到尾重新过了一遍,以实际复测为准,把最有效的几条解决路径拆开来讲,踩过的坑也一并补上。这篇内容不是给服务器专家看的,而是给每一个正在被虚拟机开机问题折磨、又不想重装系统的普通用户。
1. 开机卡住的现象分类与原因定位
1.1 三种最常见现象,先对号入座
“开机卡住”其实是一类现象的总称,不同卡法对应完全不同的原因。我遇到最多的有三种:
第一种是黑屏,屏幕左上角有个小光标一直闪,键盘怎么按都没反应。这种多半是引导阶段出了问题,或者显卡驱动加载失败导致显示输出中断。第二种是卡在Ubuntu的Logo界面,下面几个点一直在跳动,但永远进不去登录界面。这种情况大概率是内核升级之后有服务不兼容,或者磁盘空间满了,systemd在初始化某些服务时反复超时。第三种是能勉强走到登录界面,但输入密码之后黑屏,或者鼠标一直转圈。这种几乎可以锁定为VirtualBox增强功能与当前内核版本不匹配,显卡驱动没加载上。
还有一种容易被忽略的情况:虚拟机窗口里看起来卡死了,但如果能切到文本终端,说明系统内核还活着,只是图形界面挂了。这也是我反复提醒自己的——先别慌着重装系统,先判断它到底死在哪一层。
1.2 为什么先定位再动手
很多人一遇到开不了机,第一反应就是重装,或者满世界找一键修复脚本。这其实是最浪费时间的操作。一个Ubuntu 18.04环境里可能装了开发工具链、数据库、各种配置文件,重装一次成本非常高,而且如果不搞清楚根本原因,重装后大概率还会再犯。
定位思路其实很简单:先看现象,再猜原因,最后用最便宜的验证手段去证实。比如黑屏光标,就先切文本终端;卡在Logo,就在重启时进恢复模式看日志和磁盘;登录后黑屏,就直接检查增强功能模块和显卡相关日志。每一步都花费不了多少时间,但能让你避开大量无效操作。我认识的不少同行,包括我在内,都因为跳过这一步而吃过亏,最后发现自己把系统折腾了好几遍,原因不过是硬盘空间只剩了几百MB。
2. 应急通道:TTY与恢复模式先救系统
2.1 用Ctrl+Alt+F3确认系统没死
Linux系统默认有多个虚拟控制台,图形界面通常占用第一个,其他几个是纯文本终端。当图形界面卡死或者屏幕黑掉的时候,先别关虚拟机,试试同时按下Ctrl、Alt和F3组合键。如果屏幕切换到黑色文本终端,并且出现登录提示,说明你的虚拟机内核、文件系统、基本服务都还活着,问题被缩小到了图形栈这一层。
这时候你可以用账号密码登录进去,手动重启一下显示相关的服务,或者直接看日志。需要注意的是,VirtualBox默认可能没有把这些物理组合键完整转发给虚拟机,我遇到过一次CTRL+ALT+F3没反应的情况,解决办法是先在VirtualBox菜单栏的“输入”里找到“键盘”,选择二级软键盘或者重新绑定组合键,也可以在虚拟机窗口按一下“Host+F3”组合键,Windows下的Host键默认是右Ctrl键。
如果真的连文本终端都切换不出来,再考虑强制关闭虚拟机。强制关闭的正确方式是使用VirtualBox自带的命令行工具,在宿主机终端执行:
VBoxManage controlvm "虚拟机名称" acpipowerbutton这是一个模拟按电源键的操作,比直接点“关闭电源”要温和得多,至少给系统一点机会保存数据。如果这也不响应,再使用reset参数:
VBoxManage controlvm "虚拟机名称" reset2.2 恢复模式里的三连操作
如果连文本终端都进不去,或者系统启动到Logo就卡死,恢复模式是下一个选择。重启虚拟机,在GRUB菜单出现时快速按下Shift键(有些机器是按Esc),进入“Advanced options for Ubuntu”,选择带有“recovery mode”字样的内核项。
进入恢复菜单后,里面有几个选项:两个root提示符、fsck、clean、dpkg、network等。我的操作习惯是先用“fsck”检查文件系统,这能解决很多由于异常关机导致的文件系统脏状态;然后选“root”进入命令行。注意,恢复模式下根文件系统通常是只读的,先执行重挂载再动手:
mount -o remount,rw /然后做三件事:看磁盘空间、看系统日志、清理临时文件。不要一进恢复模式就急着删东西,先搞清楚状况。磁盘空间的确认命令是df -h,如果某个分区使用率接近100%,大概率就是启动卡住的元凶。
2.3 清理磁盘和日志的具体命令
磁盘空间不足的问题其实相当普遍。日志文件是开销大户,尤其很多虚拟机从创建到现在从未清理过journal日志。18.04用的是systemd,日志可通过journalctl管理,清理三天前的日志可以用:
journalctl --vacuum-time=3dAPK缓存之类也可以清理:
apt clean apt autoremove --purge还可以顺手删掉已经不用的旧内核。我见过很多人的系统里躺着四五个不同版本的内核,每个都是几百MB。查看已安装内核:
dpkg --list | grep linux-image保留当前使用的最新版,其余的执行:
apt purge linux-image-4.15.0-xxx-generic删完之后执行:
update-grub清理完成后重启,你会发现之前卡死的开机流程恢复正常了。这个办法看起来简单,但真的能救回很多台“病入膏肓”的虚拟机。
3. 内核参数调整:跳过显卡和中断的坑
3.1 临时用GRUB参数启动一次
如果系统还是卡死,特别是卡在黑屏加光标的界面,可能是内核在加载显示驱动时崩溃了。内核提供了一些启动参数可以跳过这些坑,最常见的三个是nomodeset、noapic和acpi=off。
临时修改参数不需要进系统,在GRUB菜单上选中当前内核那项,按字母e进入编辑模式,找到以“linux”开头的那一行,通常在末尾会看到“quiet splash”字样。在splash后面加入nomodeset,然后按F10或Ctrl+X启动即可。这个方法的好处是只对本次启动起作用,即使加错了导致无法启动,重启就能恢复。
我实测最有效的是nomodeset。它的作用是让内核在启动阶段不要自动加载显卡驱动,而是用最基本的显示模式输出画面。Ubuntu 18.04默认的显示驱动在某些内核版本和VirtualBox显示控制器组合下会出问题,加了这个参数就能顺利进入桌面。我遇到过的黑屏光标问题,用这个参数启动一次后就能正常进入登录界面。
3.2 常见内核参数对照与适用场景
| 内核参数 | 作用 | 适用场景 |
|---|---|---|
| nomodeset | 不自动加载显卡驱动,使用保守的显示模式 | 黑屏、光标闪烁、登录后黑屏 |
| noapic | 禁用高级可编程中断控制器 | 某些硬件环境下中断冲突导致启动卡死 |
| acpi=off | 禁用电源管理相关功能 | 开机卡在ACPI相关的初始化阶段 |
| nolapic | 禁用本地APIC | 多核CPU与虚拟机配合异常时尝试 |
这些参数的本质都是“绕过有问题的硬件抽象层”,让系统先跑起来。它们不是长久稳定运行的方案,因为关闭显卡加速后桌面会变得迟钝,但用于诊断和应急足够了。
3.3 修改后永久生效的正确姿势
确定哪个参数对你的环境有效之后,再考虑永久写入配置。配置文件是/etc/default/grub,编辑它:
sudo nano /etc/default/grub找到“GRUB_CMDLINE_LINUX_DEFAULT”这一行,把参数加进去:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"保存后执行:
sudo update-grub这里有一个非常容易踩的坑:有些教程只让你改配置,不提醒你执行update-grub。不执行的话,修改不会写入启动配置,重启后依旧无效。另外,改之前建议备份:
sudo cp /etc/default/grub /etc/default/grub.bak万一参数加得不对导致系统起不来,还能在恢复模式下把备份文件还原回去。
4. 重装VirtualBox增强功能与显示配置
4.1 卸载旧增强包
增强功能是VirtualBox和客户机交互的桥梁,包括剪贴板共享、窗口自适应、鼠标无缝切换,更关键的是显卡驱动。Ubuntu 18.04内核升级后,旧增强包编译出来的内核模块会失效,表现就是登录后黑屏或分辨率异常。
重装之前先卸载干净。比较省事的做法是执行增强包自带的卸载脚本:
sudo /opt/VBoxGuestAdditions-*/uninstall.sh或者是先检查系统里是否已经安装了发行版的增强包:
dpkg -l | grep virtualbox-guest如果有相关包,先卸载:
sudo apt purge virtualbox-guest-*注意,卸载和重装最好在文本模式下进行,也就是通过Ctrl+Alt+F3切换到的那个文本终端,这样可以避免图形界面卡死影响操作。
4.2 前置依赖安装
增强包安装时会编译内核模块,依赖内核头文件和编译工具链。在Ubuntu 18.04里安装命令是:
sudo apt update sudo apt install build-essential dkms linux-headers-$(uname -r)linux-headers-$(uname -r)会精确安装当前正在运行的那个内核版本对应的头文件。这个细节很关键,如果安装的头文件版本和实际内核不一致,模块编译出来也会不匹配,装入系统照样黑屏。
4.3 挂载光盘并安装
依赖准备好之后,在VirtualBox菜单栏选择“设备” -> “安装增强功能”,虚拟机会挂载一个VBoxGuestAdditions.iso光盘。挂载后进入挂载点执行:
sudo mount /dev/cdrom /mnt cd /mnt sudo ./VBoxLinuxAdditions.run --nox11--nox11参数通常用于文本模式下不启动图形安装界面,但安装效果是一样的。安装完成后重启虚拟机。这里要提醒一下,如果系统本身开着Xorg图形进程,安装脚本会提示需要关闭图形进程,所以前面建议在文本终端里执行。
4.4 显示控制器的正确选择
如果重装完增强功能还是开机卡住,检查虚拟机的显示设置。VirtualBox在“设置” -> “显示”里允许选择显卡控制器,常见的是VBoxSVGA、VMSVGA和VBoxVGA。我踩过坑后给出的个人结论是:Ubuntu 18.04桌面版搭配VBoxSVGA最稳,显存给到64MB以上,并勾选“启用3D加速”。如果发现VBoxSVGA下依然黑屏,可以临时切换成VMSVGA试试。VMSVGA对老系统的兼容性更好,但性能略逊。切换之前先关机,因为这类改动需要完全断电才生效。
5. 启动服务、磁盘与虚拟机配置的整体排查
5.1 用systemd日志定位卡住的服务
Uuntu 18.04的启动流程由systemd接管,有些“卡住”其实表现为系统卡在某个服务上半天不动弹,比如apt定时更新、snapd服务等。判断方法很简单:在恢复模式或文本终端里查看启动耗时:
systemd-analyze blame | head -20如果某个服务耗时几十秒甚至上百秒,再单独查它:
systemctl status 服务名查看错误日志:
journalctl -b -p err --no-pager我遇到过最典型的是apt-daily-upgrade.service,它每次开机都会尝试下载更新,在网络不通的时候反复超时,导致开机流程被拖住。处理办法是直接禁掉某些不必要的开机任务:
sudo systemctl disable apt-daily.service sudo systemctl disable apt-daily-upgrade.service sudo systemctl disable unattended-upgrades.service这些服务禁用后不影响手动执行apt update和apt upgrade,只是不再偷偷在开机时折腾你。
5.2 快照与磁盘配置的隐藏大坑
很多人不知道,虚拟机的快照也是磁盘占用大户。每拍一张快照,整个磁盘镜像占用的空间都会增加。如果你有几张快照积压了很久,磁盘空间被占满,客户机里df -h显示的磁盘虽然还有空间,但底层虚拟磁盘文件已经占满宿主机磁盘了,系统同样会出现奇怪的启动卡死问题。
另外,手动复制VDI文件而不是使用VirtualBox的克隆功能,也会埋雷。复制出来的磁盘镜像携带相同的UUID,VirtualBox无法区分,开机时可能卡在磁盘挂载阶段。解决方法是给磁盘重新生成UUID:
VBoxManage internalcommands sethduuid /path/to/your-disk.vdi还有一个存储控制器的坑:新版本VirtualBox支持NVMe虚拟控制器,但如果客户机是18.04且内核版本较旧,没有对应的NVMe驱动,启动时就会卡在磁盘检测阶段。如果你的虚拟机用的是NVMe控制器且开机卡住,可以在设置里把控制器改成SATA,再把磁盘挂载到SATA控制器下,多数情况下能恢复正常。
5.3 CPU、内存与存储控制器的推荐配置
关于硬件配置,我给的参考值是这样:Ubuntu 18.04桌面版分配给它的CPU最好不少于2核,内存不少于2GB,日常使用4GB比较舒服。如果分配内存过少,系统进入图形界面后会因为内存不足反复重启图形服务,看起来就像开机卡住。存储控制器优先SATA,不一定非要追求NVMe。杂项设置里“启用PAE/NX”保持默认勾选即可,“启用嵌套虚拟化”只有在虚拟机里还要跑虚拟机时才建议打开,否则会带来不必要的性能损耗。
6. 排查顺序与防止复发的六条习惯
6.1 一套可以复用到底的排查顺序
我把整个排查过程压缩成一个固定的顺序,每次遇到Ubuntu 18.04在VirtualBox里开机卡住,就按这个顺序来,基本能覆盖绝大多数场景:
- 按Ctrl+Alt+F3尝试切入文本终端,确认系统是否存活。
- 如果切不进去,重启进GRUB,选恢复模式。
- 进入root后先重新挂载根文件系统为读写,再执行fsck检查文件系统。
- 用df -h检查磁盘空间,用journalctl --vacuum-time=3d清理日志,用apt autoremove --purge清理无用包。
- 重启后用GRUB临时参数方式加nomodeset启动一次,确认显卡问题。
- 如果能进系统,重装VirtualBox增强功能;如果进不去,就换VBoxVGA或VMSVGA显示控制器。
- 用systemd-analyze blame和journalctl定位是否有服务拖后腿,启用对应解决方案。
- 最后检查虚拟磁盘底层状态,确认没有快照超占、UUID冲突、存储控制器不兼容的问题。
这套顺序走下来,还没有遇到救不回来的虚拟机。只有真正到了文件系统结构性损坏或者系统文件被误删的地步,才需要重装系统。
6.2 防止复发的六条习惯
从多次踩坑中沉淀下来的几个好习惯,分享给你参考:
- 每次做内核升级前,给虚拟机拍一个快照,作为还原点。
- 改动/etc/default/grub之前,先备份:cp /etc/default/grub /etc/default/grub.bak
- 安装增强功能前,先把build-essential dkms linux-headers-$(uname -r)装好。
- 不要随便用cp复制VDI文件,要用VirtualBox的克隆功能。
- 磁盘空间要同时关注宿主机和客户机两侧,虚拟磁盘文件增长后宿主机剩余空间太小时,一切都很容易莫名奇妙出问题。
- 遇到开机异常时,先看日志再动手,别靠猜。
6.3 新手最容易忽略的三个点
第一,Ctrl+Alt+F3切换文本终端这个技能太容易被忽略了,它相当于一条“呼吸通道”,能让你在图形界面挂掉时仍然保持对系统的控制。第二,磁盘空间是万恶之源,很多人以为虚拟机磁盘空间显示还有很多就万事大吉,忽略了宿主机磁盘可能已经满了。第三,增强功能的卸载和重装必须在文本终端下进行,否则一边跑图形界面一边编译内核模块,出问题的概率很高。
我自己用的习惯是:每次改内核参数之前,先把/etc/default/grub备份成一个带日期的文件,虚拟机里做完任何动内核的操作前先拍快照。这台Ubuntu 18.04的虚拟机后来一直跑得很稳,再也没有被开机卡住困扰过。如果你也遇到这个鬼问题,建议按顺序从恢复模式入手,别一开始就想着重装系统。一个环境搭建起来成本不低,能救就救,很多时候只是几分钟的定位问题。