当前位置: 首页 > 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.jsqmd.com/news/920953/

相关文章:

  • 告别树莓派!用CH341A串口工具在Windows上轻松调试I2C设备(附TPA6130A2实测)
  • 计算SRAM架构优化与GSI APU性能提升实践
  • 从“黑盒子”到清晰电路:手把手教你用戴维南定理(Thevenin‘s Theorem)分析运放反馈网络
  • LLM如何革新硬核工程问题求解:从仿真建模到协同决策
  • Play Integrity API Checker:你的Android设备安全检测工具终极指南
  • FPGA玩转串口通信:深入Xilinx AXI UART 16550 IP核的FIFO与中断机制,避开数据丢失的那些坑
  • 告别官方镜像!在Debian 12上手动搭建Proxmox VE 8.0的保姆级教程(含GUI桌面保留与电源策略优化)
  • 告别虚拟机!用WSL2 + VSCode在Win11上5分钟搞定Hadoop 3.2.3伪分布式环境
  • 投票链接怎么制作,小程序的操作指南 - 投票小程序
  • 从邻接矩阵到路径还原:一个完整的Floyd算法Java实战项目(附LeetCode刷题指南)
  • K8s网络管理利器:Calicoctl从安装到实战,教你排查节点就绪与网络策略问题
  • ESP32开发板到手别吃灰!5分钟用VSCode和PlatformIO跑通你的第一个物联网程序
  • 别被NAND骗了!CM211-1 MC022盒子刷Armbian保姆级教程(S905L3+EMMC实战)
  • 避坑指南:VASP做CI-NEB计算时,你的INCAR参数可能都设错了
  • [智能体-166]:Langchain有哪些结构化地方和对应的方法?代码示例
  • 保姆级教程:用Unity UGUI与World Space Canvas搞定3D游戏中的动态血条与摇杆控制
  • GRBL算法调参避坑指南:如何根据你的步进电机和机械结构优化STM32运动性能
  • Studio Library:Maya动画师的终极姿势与动画管理神器
  • 保姆级教程:用Operator模式在K8s集群里部署Calico网络插件(附VXLAN配置避坑)
  • 从用户情绪到系统智能:构建情感自适应系统的设计哲学与实践路径
  • 大语言模型行为根源:从语义理解到结构触发的范式转变
  • 从数据手册的V-I曲线到实际板级测试:手把手教你验证TVS管的真实钳位性能
  • 如何永久保存B站视频:解密m4s-converter的跨平台转换方案
  • VASP过渡态计算避坑指南:CI-NEB方法中INCAR参数设置与收敛性诊断实战
  • 手把手调优:如何榨干寒武纪MLU的算力?从Cluster到Core的并发与流水线实战
  • 告别Arduino IDE!用VSCode+PlatformIO给ESP32点灯,保姆级避坑指南
  • 从零到部署:在Linux服务器上为你的.NET 8.0应用配置生产环境
  • 2026年4月市场评价好的付费投放公司推荐,IP人设运营/新媒体代运营/千川投放/本地推投放,付费投放广告公司口碑推荐 - 品牌推荐师
  • 新手别慌!一文拆解SMIC 180nm工艺库里的那些文件夹都是干啥的
  • WizTree vs. 传统工具:实测它如何秒杀TreeSize,成为磁盘分析新王者