当前位置: 首页 > news >正文

手把手教你用LVM给Ubuntu虚拟机根目录扩容,解决开机卡住和GDM启动失败

虚拟机磁盘空间告急?Ubuntu根目录LVM扩容实战指南

当你正赶着处理一份紧急工作,Ubuntu虚拟机却突然卡在开机界面,屏幕上赫然显示着"failed to start gdm.service"的报错信息——这种场景恐怕是每位开发者的噩梦。更令人焦虑的是,通过journalctl查看日志后发现,罪魁祸首竟是根目录空间耗尽。本文将带你一步步解决这个棘手问题,无需重装系统,直接在线完成LVM扩容操作。

1. 诊断与前期准备

在开始扩容操作前,我们需要先确认问题的根源。当Ubuntu虚拟机出现GDM服务启动失败或卡在systemd-update-utmp-runlevel.service阶段时,按照以下步骤进行诊断:

  1. 进入命令行界面:在卡住的界面按下Alt+F2切换到虚拟控制台,输入用户名和密码登录
  2. 查看系统日志:执行sudo journalctl -xe,重点关注是否有"No space left on device"之类的磁盘空间相关错误
  3. 检查磁盘使用情况:运行df -hT,典型输出如下:
文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/vg-root ext4 20G 20G 0 100% / /dev/sda1 ext2 512M 136M 377M 27% /boot
  1. 确认LVM结构:执行lsblksudo pvdisplay查看当前LVM配置,例如:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 512M 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 18.5G 0 part └─vg-root 253:0 0 20G 0 lvm /

关键提示:确保你的根目录文件系统确实建立在LVM上(如示例中的/dev/mapper/vg-root),传统分区无法使用本文介绍的在线扩容方法。

2. 虚拟机磁盘扩展

确认问题后,我们需要先在虚拟机层面扩展磁盘容量。注意:不同虚拟化平台操作略有差异,这里以VMware为例:

  1. 关闭虚拟机电源
  2. 右键虚拟机 → 设置 → 硬盘 → 扩展容量
  3. 输入新的总大小(如从50GB扩展到80GB)
  4. 启动虚拟机并重新登录命令行界面

完成物理磁盘扩展后,新增的空间还不可用,需要通过以下命令让系统识别:

sudo echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan sudo partprobe /dev/sda

验证磁盘是否已扩展成功:

sudo fdisk -l /dev/sda

应能看到类似输出,其中磁盘总大小已更新:

Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors

3. 创建新分区并初始化为物理卷

现在我们需要将新增的30GB空间分配给LVM。重要安全提示:操作分区表有风险,请确保已备份重要数据。

  1. 使用fdisk创建新分区:
sudo fdisk /dev/sda
  1. 在fdisk交互界面中依次输入:

    • n创建新分区
    • p选择主分区
    • 4分区号(假设sda3已被占用)
    • 两次回车使用默认起始和结束扇区
    • t更改分区类型
    • 4选择刚创建的分区
    • 8e设置为Linux LVM类型
    • w写入更改并退出
  2. 让内核重新读取分区表:

sudo partprobe /dev/sda
  1. 将新分区初始化为物理卷:
sudo pvcreate /dev/sda4 sudo pvdisplay

4. 扩展卷组与逻辑卷

现在我们将新物理卷加入现有卷组,然后扩展逻辑卷:

  1. 首先确认当前卷组名称(通常为vgubuntu-vg):
sudo vgdisplay
  1. 将新物理卷添加到卷组:
sudo vgextend vg /dev/sda4
  1. 扩展逻辑卷(这里以根目录所在的/dev/vg/root为例):
sudo lvextend -l +100%FREE /dev/vg/root

专业技巧:使用-l +100%FREE可以自动使用所有可用空间,比手动计算GB数更可靠。

5. 文件系统扩容

最后一步是扩展文件系统以使用新增空间。特别注意:ext4和XFS文件系统的扩容命令不同。

对于ext4文件系统:

sudo resize2fs /dev/vg/root

对于XFS文件系统:

sudo xfs_growfs /

完成后,使用df -h验证扩容结果:

文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/vg-root 79G 20G 56G 26% /

6. 常见问题与高级技巧

在实际操作中,你可能会遇到以下情况:

情况一lvextend时报错"Insufficient free extents"

  • 解决方法:先用vgdisplay查看可用PE数量,然后用lvextend -l +[数量]精确指定

情况二:系统未识别新增磁盘空间

  • 尝试以下命令序列:
sudo sg_scan -i sudo sg_rescan /dev/sda sudo blockdev --rereadpt /dev/sda

性能优化建议:扩容后建议执行以下操作:

  1. 检查文件系统错误:
sudo fsck /dev/vg/root
  1. 重建initramfs(某些发行版需要):
sudo update-initramfs -u
  1. 重启验证:
sudo reboot

7. 自动化脚本方案

对于经常需要处理类似情况的管理员,可以准备一个自动化脚本:

#!/bin/bash # Auto expand LVM for Ubuntu VMs DISK="/dev/sda" PARTITION_NUM=4 VG_NAME=$(sudo vgdisplay | grep "VG Name" | awk '{print $3}') LV_PATH=$(sudo lvdisplay | grep "LV Path" | awk '{print $3}') # Create new partition echo -e "n\np\n${PARTITION_NUM}\n\n\nt\n${PARTITION_NUM}\n8e\nw" | sudo fdisk $DISK # Refresh partition table sudo partprobe $DISK # Create physical volume sudo pvcreate "${DISK}${PARTITION_NUM}" # Extend volume group sudo vgextend $VG_NAME "${DISK}${PARTITION_NUM}" # Extend logical volume sudo lvextend -l +100%FREE $LV_PATH # Resize filesystem if findmnt -no FSTYPE / | grep -q 'xfs'; then sudo xfs_growfs / else sudo resize2fs $LV_PATH fi

将此脚本保存为lvm_expand.sh,然后赋予执行权限:

chmod +x lvm_expand.sh

8. 预防措施与监控方案

与其等到空间耗尽才手忙脚乱地扩容,不如提前设置监控和预防措施:

  1. 设置磁盘空间告警
# 添加到crontab每天检查 echo '0 9 * * * root [ $(df / --output=pcent | tail -1 | tr -d "%") -gt 90 ] && echo "Warning: Root filesystem over 90%" | mail -s "Disk Space Alert" admin@example.com' | sudo tee /etc/cron.d/disk-alert
  1. 配置日志轮转:编辑/etc/logrotate.conf调整日志保留策略

  2. 使用LVM thin provisioning:更灵活的存储分配方式

# 创建thin pool sudo lvcreate -L 10G --thinpool thin_pool vg
  1. 定期清理无用文件
# 查找大文件 sudo find / -type f -size +100M -exec ls -lh {} \; # 清理旧内核 sudo apt autoremove --purge
http://www.zskr.cn/news/1432277.html

相关文章:

  • 计算SRAM架构优化与GSI APU性能提升实践
  • 从“黑盒子”到清晰电路:手把手教你用戴维南定理(Thevenin‘s Theorem)分析运放反馈网络
  • Play Integrity API Checker:你的Android设备安全检测工具终极指南
  • 告别虚拟机!用WSL2 + VSCode在Win11上5分钟搞定Hadoop 3.2.3伪分布式环境
  • Studio Library:Maya动画师的终极姿势与动画管理神器
  • 从用户情绪到系统智能:构建情感自适应系统的设计哲学与实践路径
  • 从数据手册的V-I曲线到实际板级测试:手把手教你验证TVS管的真实钳位性能
  • 2026年4月市场评价好的付费投放公司推荐,IP人设运营/新媒体代运营/千川投放/本地推投放,付费投放广告公司口碑推荐 - 品牌推荐师
  • 法律文书智能生成系统失效真相(2024司法部备案工具实测报告)
  • 别再手动看波形了!用Quartus Prime 22.1和Modelsim SE 2022.1实现自动化联合仿真(附完整脚本)
  • 智慧城市如何注入“人心”:从管理思维到服务体验的技术实践
  • Flutter VLC播放RTSP流媒体,从卡顿到流畅:一份保姆级的低延迟配置清单
  • 别再只会用红色了!LaTeX中xcolor宏包的5种高级文本高亮与标注技巧
  • 线性系统理论学不动了?手把手带你用格拉姆矩阵判据搞定能控性证明
  • 机器学习从业者必读:25条顶尖智慧金句与实战启示
  • USB3.0链路训练LTSSM实战:从设备插拔到U0状态,一次完整的握手过程全解析
  • 【2024最严合规版AI-A/B融合框架】:通过GDPR+ISO/IEC 23894双认证的7步落地清单
  • SAP PI/PO SFTP适配器实战:搞定Shift_JIS编码文件解析与生成(附避坑指南)
  • Python Google搜索API完全指南:零成本集成搜索引擎的3种技术方案
  • 用Multisim和74LS148做个病房呼叫器:从优先级编码到LED显示的保姆级仿真教程
  • Halcon HSmartWindow绘制ROI避坑指南:从参数获取到Region转换的完整C#代码解析
  • 告别环境配置噩梦:用Adoptium JDK 13搞定OpenTCS 5.11开发环境(附常见报错解决)
  • LightRAG:轻量级图索引与双层检索机制革新RAG架构
  • AI与大数据融合:构建智能决策流水线,驱动企业效率革命
  • 径向基函数(RBF)类型全解析:从高斯到薄板样条的实战选择指南
  • 告别面积误差烦恼!用这个ArcGIS Pro插件5分钟搞定图斑面积平差(支持公顷/亩换算)
  • HHIL仿真技术与CSTS系统韧性评估实践
  • 雾锁王国下载2026最新
  • 电路分析别死记!用Python+SymPy手把手教你推导诺顿等效电路
  • 别再到处搜了!高德/百度/ArcGIS地图瓦片URL,我帮你整理好了(附Leaflet加载代码)