手把手教你给Ubuntu虚拟机‘瘦身’与‘增肥’解决因磁盘满导致的开机卡死当Ubuntu虚拟机突然卡在开机界面屏幕上显示systemd-update-utmp-runlevel.service完成却无法继续启动时这往往是磁盘空间耗尽发出的最后警告。本文将带你从运维视角建立完整的空间管理策略——既教你用ncdu等工具定期瘦身清理空间也详解当灾难发生时如何安全增肥扩容。不同于简单扩容教程我们会对比分析清理与扩容的决策依据并给出可监控的预防方案。1. 预防优于治疗建立磁盘空间监控体系1.1 空间占用可视化分析定期运行磁盘分析是避免突发状况的关键。除了基础的df -h这些工具能提供更直观的视角# 安装可视化分析工具 sudo apt install ncdu # 扫描根目录占用情况耗时与数据量成正比 sudo ncdu / --exclude /mnt --exclude /media执行后会生成交互式界面用箭头键可导航查看各目录大小分布。特别需要关注的目录包括目录典型占用源清理建议/var/log系统日志配置logrotate或手动清理旧日志/var/cache软件包缓存使用apt clean清理/home用户下载文件查找大文件find -size 100M1.2 自动化监控与预警通过systemd服务实现空间监控自动化# 创建监控脚本 /usr/local/bin/disk-alert.sh #!/bin/bash THRESHOLD90 CURRENT$(df / --outputpcent | tail -1 | tr -d % ) [ $CURRENT -ge $THRESHOLD ] \ echo Warning: Root partition at ${CURRENT}% | \ mail -s Disk Space Alert adminexample.com赋予执行权限并创建定时任务sudo chmod x /usr/local/bin/disk-alert.sh sudo systemctl edit --force --full disk-alert.timer # 在编辑器中输入以下内容 [Unit] DescriptionDisk space check timer [Timer] OnCalendar*-*-* 8,20:00:00 Persistenttrue [Install] WantedBytimers.target2. 应急处理当系统已经卡死在启动界面2.1 进入恢复模式在虚拟机启动时长按Shift键进入GRUB菜单选择Advanced options for Ubuntu选择带有(recovery mode)的内核版本在恢复菜单中选择root进入命令行2.2 诊断空间问题在恢复环境中依次执行# 检查根分区使用率 df -h / # 查找大文件按大小降序 find / -type f -exec du -h {} 2/dev/null | sort -rh | head -20 # 分析日志错误重点看最近1小时 journalctl --since 1 hour ago -p err2.3 紧急清理策略根据诊断结果选择清理方案临时文件清理套餐# 清空临时目录 rm -rf /tmp/* # 清理旧内核保留最近2个 sudo apt purge $(dpkg -l linux-{image,headers}-* | awk /^ii/{print $2} | grep -vE $(uname -r | sed s/-generic//)|$(uname -r | sed s/-generic// | cut -d- -f1-2) | head -n -2)日志文件处理# 立即轮转并压缩日志 sudo logrotate --force /etc/logrotate.conf # 清空特定服务日志如nginx echo /var/log/nginx/access.log3. 扩容操作永久解决空间不足问题3.1 虚拟机磁盘扩展准备在虚拟机管理界面将磁盘扩容如从20G扩展到40G启动进入Live CD环境推荐使用Ubuntu安装ISO使用gparted图形工具或命令行工具扩容分区重要提示操作前务必创建虚拟机快照扩容有数据丢失风险3.2 LVM扩容详细流程对于采用LVM的Ubuntu系统扩容步骤如下# 查看物理卷状态 sudo pvdisplay # 扩展物理卷假设新增空间在/dev/sda3 sudo pvresize /dev/sda3 # 查看卷组信息 sudo vgdisplay # 扩展逻辑卷增加10G空间 sudo lvextend -L 10G /dev/ubuntu-vg/root # 调整文件系统ext4示例 sudo resize2fs /dev/ubuntu-vg/root3.3 非LVM系统扩容方案对于传统分区系统需要创建新分区并挂载# 创建新分区 sudo fdisk /dev/sda # 在交互界面按n创建新分区按w保存 # 格式化新分区 sudo mkfs.ext4 /dev/sda4 # 创建挂载点并迁移数据 sudo mkdir /newspace sudo mount /dev/sda4 /newspace sudo cp -ax /data/* /newspace/ sudo umount /newspace # 修改/etc/fstab实现开机自动挂载 echo /dev/sda4 /data ext4 defaults 0 2 | sudo tee -a /etc/fstab4. 深度优化从根源减少空间占用4.1 系统服务空间占用分析使用systemd-analyze检查启动服务# 列出所有服务磁盘使用 sudo systemd-analyze disk-usage # 按内存排序显示服务 sudo systemd-analyze blame --no-pager | head -10典型可优化服务示例服务名称功能描述优化建议apt-daily-upgrade.service自动更新检查改为手动更新或延长检查间隔fwupd.service固件更新服务禁用除非需要硬件固件更新ModemManager.service移动宽带支持虚拟机环境可安全禁用4.2 日志系统精细化管理编辑/etc/systemd/journald.conf进行优化[Journal] # 限制日志大小不超过100M SystemMaxUse100M # 不保存运行时日志到磁盘 RuntimeMaxUse50M # 最大保存7天日志 MaxRetentionSec7day应用配置后重启服务sudo systemctl restart systemd-journald4.3 容器与开发环境优化对于运行Docker的环境# 清理无用容器和镜像 docker system prune -af # 限制日志文件大小在/etc/docker/daemon.json配置 { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }对于Python开发环境# 清理pip缓存 rm -rf ~/.cache/pip # 检查虚拟环境占用 du -sh ~/.virtualenvs/*
手把手教你给Ubuntu虚拟机‘瘦身’与‘增肥’:解决因磁盘满导致的开机卡死
手把手教你给Ubuntu虚拟机‘瘦身’与‘增肥’解决因磁盘满导致的开机卡死当Ubuntu虚拟机突然卡在开机界面屏幕上显示systemd-update-utmp-runlevel.service完成却无法继续启动时这往往是磁盘空间耗尽发出的最后警告。本文将带你从运维视角建立完整的空间管理策略——既教你用ncdu等工具定期瘦身清理空间也详解当灾难发生时如何安全增肥扩容。不同于简单扩容教程我们会对比分析清理与扩容的决策依据并给出可监控的预防方案。1. 预防优于治疗建立磁盘空间监控体系1.1 空间占用可视化分析定期运行磁盘分析是避免突发状况的关键。除了基础的df -h这些工具能提供更直观的视角# 安装可视化分析工具 sudo apt install ncdu # 扫描根目录占用情况耗时与数据量成正比 sudo ncdu / --exclude /mnt --exclude /media执行后会生成交互式界面用箭头键可导航查看各目录大小分布。特别需要关注的目录包括目录典型占用源清理建议/var/log系统日志配置logrotate或手动清理旧日志/var/cache软件包缓存使用apt clean清理/home用户下载文件查找大文件find -size 100M1.2 自动化监控与预警通过systemd服务实现空间监控自动化# 创建监控脚本 /usr/local/bin/disk-alert.sh #!/bin/bash THRESHOLD90 CURRENT$(df / --outputpcent | tail -1 | tr -d % ) [ $CURRENT -ge $THRESHOLD ] \ echo Warning: Root partition at ${CURRENT}% | \ mail -s Disk Space Alert adminexample.com赋予执行权限并创建定时任务sudo chmod x /usr/local/bin/disk-alert.sh sudo systemctl edit --force --full disk-alert.timer # 在编辑器中输入以下内容 [Unit] DescriptionDisk space check timer [Timer] OnCalendar*-*-* 8,20:00:00 Persistenttrue [Install] WantedBytimers.target2. 应急处理当系统已经卡死在启动界面2.1 进入恢复模式在虚拟机启动时长按Shift键进入GRUB菜单选择Advanced options for Ubuntu选择带有(recovery mode)的内核版本在恢复菜单中选择root进入命令行2.2 诊断空间问题在恢复环境中依次执行# 检查根分区使用率 df -h / # 查找大文件按大小降序 find / -type f -exec du -h {} 2/dev/null | sort -rh | head -20 # 分析日志错误重点看最近1小时 journalctl --since 1 hour ago -p err2.3 紧急清理策略根据诊断结果选择清理方案临时文件清理套餐# 清空临时目录 rm -rf /tmp/* # 清理旧内核保留最近2个 sudo apt purge $(dpkg -l linux-{image,headers}-* | awk /^ii/{print $2} | grep -vE $(uname -r | sed s/-generic//)|$(uname -r | sed s/-generic// | cut -d- -f1-2) | head -n -2)日志文件处理# 立即轮转并压缩日志 sudo logrotate --force /etc/logrotate.conf # 清空特定服务日志如nginx echo /var/log/nginx/access.log3. 扩容操作永久解决空间不足问题3.1 虚拟机磁盘扩展准备在虚拟机管理界面将磁盘扩容如从20G扩展到40G启动进入Live CD环境推荐使用Ubuntu安装ISO使用gparted图形工具或命令行工具扩容分区重要提示操作前务必创建虚拟机快照扩容有数据丢失风险3.2 LVM扩容详细流程对于采用LVM的Ubuntu系统扩容步骤如下# 查看物理卷状态 sudo pvdisplay # 扩展物理卷假设新增空间在/dev/sda3 sudo pvresize /dev/sda3 # 查看卷组信息 sudo vgdisplay # 扩展逻辑卷增加10G空间 sudo lvextend -L 10G /dev/ubuntu-vg/root # 调整文件系统ext4示例 sudo resize2fs /dev/ubuntu-vg/root3.3 非LVM系统扩容方案对于传统分区系统需要创建新分区并挂载# 创建新分区 sudo fdisk /dev/sda # 在交互界面按n创建新分区按w保存 # 格式化新分区 sudo mkfs.ext4 /dev/sda4 # 创建挂载点并迁移数据 sudo mkdir /newspace sudo mount /dev/sda4 /newspace sudo cp -ax /data/* /newspace/ sudo umount /newspace # 修改/etc/fstab实现开机自动挂载 echo /dev/sda4 /data ext4 defaults 0 2 | sudo tee -a /etc/fstab4. 深度优化从根源减少空间占用4.1 系统服务空间占用分析使用systemd-analyze检查启动服务# 列出所有服务磁盘使用 sudo systemd-analyze disk-usage # 按内存排序显示服务 sudo systemd-analyze blame --no-pager | head -10典型可优化服务示例服务名称功能描述优化建议apt-daily-upgrade.service自动更新检查改为手动更新或延长检查间隔fwupd.service固件更新服务禁用除非需要硬件固件更新ModemManager.service移动宽带支持虚拟机环境可安全禁用4.2 日志系统精细化管理编辑/etc/systemd/journald.conf进行优化[Journal] # 限制日志大小不超过100M SystemMaxUse100M # 不保存运行时日志到磁盘 RuntimeMaxUse50M # 最大保存7天日志 MaxRetentionSec7day应用配置后重启服务sudo systemctl restart systemd-journald4.3 容器与开发环境优化对于运行Docker的环境# 清理无用容器和镜像 docker system prune -af # 限制日志文件大小在/etc/docker/daemon.json配置 { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }对于Python开发环境# 清理pip缓存 rm -rf ~/.cache/pip # 检查虚拟环境占用 du -sh ~/.virtualenvs/*