≡articles //snippets ./categories $uses ~about /search

搬瓦工 VPS 硬盘满了连不上,又误挂 ISO 进了安装向导:KiwiVM 救回全过程

先说结果:

  • 起因是硬盘满了。根分区 40G,面板显示 38.61/41 GB,ext4 还默认给 root 预留了 5%,普通程序能写的空间基本没了。网站停止响应,外网 SSH 也连不上。
  • 我把面板里的 Mount ISO 当成了救援模式,挂了一个 Debian 安装盘再开机,结果直接进了安装菜单,比原来更糟。
  • 救回来的顺序:在面板卸载 ISO(这一步会自动强制关机)→ Start → 用面板自带的控制台以 root 登录 → 清 apt 缓存和旧日志 → 重启 qemu-guest-agent 和 ssh。之后面板恢复显示,SSH 能连上,数据都在。

从看到安装菜单到进系统清完磁盘,用了十来分钟。

一、现场:SSH 和内存都是 Unavailable

最先发现的是服务器上的服务没了响应,外网 SSH 怎么都连不上。登录 KiwiVM 面板,SSH Port 和 RAM and Swap 两项都显示 Unavailable。点开旁边的 details,面板是这样说的:

In order for KiwiVM to show RAM/Swap information, QEMU-KVM agent must be running inside of the VM, and the OS must be fully booted.

In order for KiwiVM to show SSH port, QEMU-KVM agent must be running inside of the VM.

Additionally, /etc/ssh/sshd_config must be readable and its syntax must be valid.

Please use Root shell – interactive to troubleshoot the sshd daemon.

也就是说,这两项靠系统里的 qemu-guest-agent 回报,系统没完全起来、或者 agent 没在跑,面板就只能显示 Unavailable。面板最后一句已经给了正确入口:Root shell – interactive。

我当时没往那儿走,而是看到了 Mount ISO,以为是救援模式,在列表里选了排在前面的 debian-12.0.0-i386-netinst.iso,挂上之后开机。

再打开 VNC 控制台,屏幕上是 Debian 12 的安装菜单(BIOS mode),底下一行在倒计时:Press a key, otherwise speech synthesis will be started in 11 seconds...

KiwiVM VNC 控制台里显示 Debian 12 安装菜单

这时候 Main controls 上的几项:

项 面板显示
Status Running
SSH Port Unavailable
RAM and Swap Unavailable
Disk usage 38.61/41 GB
Operating system Ubuntu 24.04 x86_64
Mounted ISO debian-12.0.0-i386-netinst.iso

KiwiVM 面板:ISO 已挂载,SSH 与内存显示 Unavailable,磁盘 38.61/41 GB

两项 Unavailable 还是 Unavailable,但原因已经换了:

  • 挂 ISO 之前,是 Ubuntu 卡在硬盘写满上,SSH 和 agent 没正常工作。
  • 挂 ISO 之后,跑的是安装盘,Ubuntu 根本没启动,安装盘里也没有 qemu-guest-agent。
  • Status 显示 Running 只说明虚拟机开着,不说明 Ubuntu 在跑。
  • 面板截图窗口里一直刷 No sound card detected after 21 seconds、22 seconds……这也是安装程序:菜单没人按键,它准备启用语音合成,先找声卡,找不到就每秒报一次。

另外,我选的是 i386(32 位)的盘,系统是 x86_64,就算真要重装也选错了。

安装菜单停在那里不会自己动硬盘。只要不在菜单里选安装、不一路确认下去,数据就还在。

二、卸载 ISO,再开机

在 Main controls 的 Mounted ISO 那一行点 Unmount,会弹出确认框:卸载 ISO 必须先强制关机。

卸载 ISO 前的确认框:需要先强制关机

确认后提示 ISO 已卸载,让你现在开机:

ISO 卸载成功,提示 Please start the VM now

这时候直接点 Start 就行。我卸完又在操作栏点了一次 Hard Stop,多余了,卸载那一步已经关过机。

三、从面板控制台登录

开机后我没再试 SSH,直接走面板的控制台:左侧 Root shell – interactive,点 Launch。

能看到 Ubuntu 的开机日志刷过去,说明这次是从硬盘启动的:

Root shell – interactive 页面,下方是 Ubuntu 开机日志

在 tty1 用 root 登录:

tty1 登录提示

四、清磁盘

实际跑的就这几条:

apt-get clean
journalctl --vacuum-size=50M
df -h

apt-get clean 没有输出。

journalctl --vacuum-size=50M 删了 15 个旧日志文件,系统日志大多一个 12.4M,用户日志一个七百多 K,合计:

Vacuuming done, freed 140.4M of archived journals from /var/log/journal/…

清完的 df -h:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        40G   34G  4.2G  89% /
/dev/sda2       974M   96M  811M  11% /boot

清理命令与 df -h 结果

40G 减去用掉的 34G、可用的 4.2G,还差 1.8G,就是 ext4 给 root 预留的那 5%。所以面板上 38.61/41 GB 看着还有两个多 G,普通程序其实已经写不进去了。

截图之后我又跑了两条:

find /var/log -type f -name "*.gz" -delete
rm -rf /tmp/*

第一条删掉了所有轮转压缩过的旧日志,以后要翻旧日志就没有了。第二条事后看是多余的:这台 Ubuntu 开机时会自动清空 /tmp(/usr/lib/tmpfiles.d/tmp.conf 里的 D /tmp 规则),后面反正要重启。系统还在跑的时候删 /tmp,正在用临时文件的服务可能出错。

这里有个失误:每一步前后我都没跑 df -h,所以哪一步清了多少,现在算不出来。能确定的只有 journal 的 140.4M。

五、sshd.service not found

清完想重启 SSH,结果报错:

root@…:~# systemctl restart sshd
Failed to restart sshd.service: Unit sshd.service not found.

Ubuntu 上这个服务叫 ssh,不叫 sshd。从 22.10 起默认改成了 ssh.socket 按需启动,ssh.service 平时不 enable,sshd 这个别名也就不存在。

最后跑的两条:

systemctl restart qemu-guest-agent
systemctl restart ssh

刷新面板,RAM and Swap 显示出了内存占用,SSH Port 也显示出了端口号。本地 SSH 连上去,网站和数据都在。

SSH 连不上还有很多别的原因,服务、防火墙、配置文件各查什么,我在《CentOS 7 SSH Connection Refused 完整排查指南》里写过。

六、空间去哪了

截图里清完是 34G,当天后来再看已经是 23G(62%),少了 11G。

这 11G 是我后来手动清出来的:截图之后那两条、几处缓存,还卸掉了一套已经不用的程序和它的全部服务。前面说过每一步都没记 df,所以哪一样占了多少,现在对不上账。

日志不是元凶。这台机器的 journald 之前就限了 200M(/etc/systemd/journald.conf 里 SystemMaxUse=200M),机器上也没装 Docker。

后来又找到两处能省的:

东西 清之前 清之后 怎么清的
宝塔面板的监控库 /www/server/panel/data/system.db 1.6G 121M 主要是 process_top_list 表,存了 39.6 万行进程记录。删掉 20 天以前的,再压缩数据库,完整性检查通过
多余的交换文件 /www/swap2 1G 删除 机器上有三个交换文件,一共 4G。先 swapoff,从 /etc/fstab 去掉那一行,再删文件,剩 /swap 1G 和 /www/swap 2G

清监控库之前我先把它备份了一份,确认面板正常后再删备份。前后根分区从 23G 降到 21G,现在 55%,剩 17G。

用宝塔的话,隔一段时间看一眼 system.db 有多大。它一直在记,不会自己变小。

下次再遇到,先跑这条,看根目录下哪个文件夹最大:

du -xh --max-depth=1 / 2>/dev/null | sort -hr | head -15

-x 只统计根分区本身,不会去数 /proc 这类虚拟目录。

记下来的三件事

  1. 面板显示 Unavailable,先点 details 看它要什么,再开 VNC 看一眼屏幕。Mount ISO 不是救援模式。
  2. 卸载 ISO 自带强制关机,卸完直接 Start。
  3. 清理之前先 df -h 记一下,不然清完不知道哪一步有用。

© 2026 本文由 Charlie 原创撰写,发布于 sodebug.com。未经授权禁止转载、洗稿、机器抓取。AI 训练数据使用需获得书面授权。

独立开发者,在 WordPress、Nginx 和各种 API 之间切换。不写没用的东西。

相关文章

CentOS 7 远程 SSH connection refused 解决方案3 minLinux 开启 BBR:不用脚本、不编译内核、三条命令搞定5 minLinux 负载排查方法论:Load Average 8.5、CPU 空闲 88%,从数字到底层 IO7 minVPS 常用测试脚本大全5 min
$ echo "less bullshit, more debugging" | send-to-inbox
新文章直接发到邮箱,一个月 2-4 封。
订阅