首页 / 资讯中心 / 文章详情

Ubuntu 18.04在VirtualBox中开机卡住的排查与修复

Ubuntu 18.04在VirtualBox中开机卡住的排查与修复 ★ FEATURED ARTICLE
用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 用CtrlAltF3确认系统没死Linux系统默认有多个虚拟控制台图形界面通常占用第一个其他几个是纯文本终端。当图形界面卡死或者屏幕黑掉的时候先别关虚拟机试试同时按下Ctrl、Alt和F3组合键。如果屏幕切换到黑色文本终端并且出现登录提示说明你的虚拟机内核、文件系统、基本服务都还活着问题被缩小到了图形栈这一层。这时候你可以用账号密码登录进去手动重启一下显示相关的服务或者直接看日志。需要注意的是VirtualBox默认可能没有把这些物理组合键完整转发给虚拟机我遇到过一次CTRLALTF3没反应的情况解决办法是先在VirtualBox菜单栏的“输入”里找到“键盘”选择二级软键盘或者重新绑定组合键也可以在虚拟机窗口按一下“HostF3”组合键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-time3dAPK缓存之类也可以清理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和acpioff。临时修改参数不需要进系统在GRUB菜单上选中当前内核那项按字母e进入编辑模式找到以“linux”开头的那一行通常在末尾会看到“quiet splash”字样。在splash后面加入nomodeset然后按F10或CtrlX启动即可。这个方法的好处是只对本次启动起作用即使加错了导致无法启动重启就能恢复。我实测最有效的是nomodeset。它的作用是让内核在启动阶段不要自动加载显卡驱动而是用最基本的显示模式输出画面。Ubuntu 18.04默认的显示驱动在某些内核版本和VirtualBox显示控制器组合下会出问题加了这个参数就能顺利进入桌面。我遇到过的黑屏光标问题用这个参数启动一次后就能正常进入登录界面。3.2 常见内核参数对照与适用场景内核参数作用适用场景nomodeset不自动加载显卡驱动使用保守的显示模式黑屏、光标闪烁、登录后黑屏noapic禁用高级可编程中断控制器某些硬件环境下中断冲突导致启动卡死acpioff禁用电源管理相关功能开机卡在ACPI相关的初始化阶段nolapic禁用本地APIC多核CPU与虚拟机配合异常时尝试这些参数的本质都是“绕过有问题的硬件抽象层”让系统先跑起来。它们不是长久稳定运行的方案因为关闭显卡加速后桌面会变得迟钝但用于诊断和应急足够了。3.3 修改后永久生效的正确姿势确定哪个参数对你的环境有效之后再考虑永久写入配置。配置文件是/etc/default/grub编辑它sudo nano /etc/default/grub找到“GRUB_CMDLINE_LINUX_DEFAULT”这一行把参数加进去GRUB_CMDLINE_LINUX_DEFAULTquiet 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-*注意卸载和重装最好在文本模式下进行也就是通过CtrlAltF3切换到的那个文本终端这样可以避免图形界面卡死影响操作。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的克隆功能也会埋雷。复制出来的磁盘镜像携带相同的UUIDVirtualBox无法区分开机时可能卡在磁盘挂载阶段。解决方法是给磁盘重新生成UUIDVBoxManage 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里开机卡住就按这个顺序来基本能覆盖绝大多数场景按CtrlAltF3尝试切入文本终端确认系统是否存活。如果切不进去重启进GRUB选恢复模式。进入root后先重新挂载根文件系统为读写再执行fsck检查文件系统。用df -h检查磁盘空间用journalctl --vacuum-time3d清理日志用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 新手最容易忽略的三个点第一CtrlAltF3切换文本终端这个技能太容易被忽略了它相当于一条“呼吸通道”能让你在图形界面挂掉时仍然保持对系统的控制。第二磁盘空间是万恶之源很多人以为虚拟机磁盘空间显示还有很多就万事大吉忽略了宿主机磁盘可能已经满了。第三增强功能的卸载和重装必须在文本终端下进行否则一边跑图形界面一边编译内核模块出问题的概率很高。我自己用的习惯是每次改内核参数之前先把/etc/default/grub备份成一个带日期的文件虚拟机里做完任何动内核的操作前先拍快照。这台Ubuntu 18.04的虚拟机后来一直跑得很稳再也没有被开机卡住困扰过。如果你也遇到这个鬼问题建议按顺序从恢复模式入手别一开始就想着重装系统。一个环境搭建起来成本不低能救就救很多时候只是几分钟的定位问题。
阅读完成 · 觉得有帮助?
咨询建站