1. 项目概述
最近在给一台Ubuntu 24.04 LTS的虚拟机扩容时,遇到了LVM分区扩展的需求。原本20G的磁盘空间已经捉襟见肘,特别是在安装了几个大型开发工具后,系统频繁提示磁盘空间不足。本文将详细记录从20G扩展到40G的完整操作过程,包括每一步的原理说明和注意事项。
LVM(Logical Volume Manager)是Linux环境下对磁盘分区进行管理的一种机制,它最大的优势就是可以在不停机的情况下动态调整分区大小。不过在实际操作中,我发现很多新手容易在几个关键步骤上出错,比如物理卷和逻辑卷的命名格式差异、文件系统调整的时机等。下面我就把这次扩容的完整流程和踩过的坑都分享出来。
2. 环境准备
2.1 系统环境确认
首先需要确认当前系统的基本信息。我使用的是Ubuntu 24.04 LTS,但这个方法同样适用于Ubuntu 18.04及以上版本。
bash复制# 切换到root用户
sudo -i
# 查看系统版本
lsb_release -a
cat /etc/lsb-release
输出结果如下:
code复制No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.3 LTS
Release: 24.04
Codename: noble
2.2 磁盘现状分析
在开始扩容前,我们需要全面了解当前的磁盘分区情况。以下几个命令的组合使用可以帮我们获取完整信息:
bash复制# 查看块设备信息
lsblk
# 查看物理卷信息
pvdisplay
# 查看逻辑卷信息
lvdisplay
# 查看卷组信息
vgdisplay
# 查看磁盘使用情况
df -h
# 查看分区表
fdisk -l
特别要注意的是lsblk和df -h的输出差异:
lsblk显示的是物理设备的分区情况df -h显示的是已挂载文件系统的使用情况
在我的案例中,初始状态显示:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 252:0 0 18.2G 0 lvm /
3. VMware虚拟机磁盘扩容
3.1 在VMware中扩展虚拟磁盘
在开始Linux端的操作前,需要先在VMware层面扩展虚拟磁盘:
- 关闭虚拟机电源
- 右键虚拟机 → 设置 → 硬盘 → 扩展
- 将大小从20G调整为40G
- 启动虚拟机
注意:VMware的磁盘扩展只是增加了"物理"磁盘空间,还需要在操作系统内部分配和使用这些空间。
3.2 验证磁盘容量变化
重启后验证磁盘是否真的扩容成功:
bash复制fdisk -l /dev/sda
应该能看到类似输出:
code复制Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
...
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
虽然总大小显示40G,但下面的分区表仍然只使用了约20G空间(sda3的18.2G + sda2的1.8G)。
4. 创建新分区
4.1 使用fdisk创建新分区
我们需要将新增的20G空间创建为一个新分区:
bash复制fdisk /dev/sda
在fdisk交互界面中按顺序执行以下操作:
- 输入
p查看当前分区表 - 输入
n创建新分区 - 选择分区类型(主分区/扩展分区),直接回车使用默认值
- 设置分区号(通常为4)
- 设置起始扇区(直接回车使用默认值)
- 设置结束扇区(直接回车使用所有剩余空间)
- 输入
t更改分区类型 - 选择刚创建的分区号(4)
- 输入
8e设置为Linux LVM类型 - 输入
p再次确认分区表 - 输入
w保存并退出
4.2 更新系统分区表
创建分区后,需要让内核重新读取分区表:
bash复制partprobe /dev/sda
验证新分区是否创建成功:
bash复制fdisk -l /dev/sda
应该能看到新增的/dev/sda4分区,大小约20G。
5. LVM扩展操作
5.1 将新分区初始化为物理卷
bash复制pvcreate /dev/sda4
注意:如果之前在这个分区上创建过文件系统,pvcreate会提示检测到文件系统签名,需要输入
y确认擦除。
5.2 扩展卷组
查看当前卷组名称:
bash复制vgdisplay
然后扩展卷组:
bash复制vgextend ubuntu-vg /dev/sda4
5.3 扩展逻辑卷
现在可以将新增的空间分配给逻辑卷了:
bash复制# 查看当前逻辑卷路径
lvdisplay
# 扩展逻辑卷(两种方式任选其一)
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# 或指定具体大小
# lvextend -L +20G /dev/ubuntu-vg/ubuntu-lv
5.4 调整文件系统大小
最后一步是调整文件系统以使用新增的空间。对于ext4文件系统:
bash复制resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
重要提示:注意逻辑卷路径的格式差异!
- lvextend使用:/dev/ubuntu-vg/ubuntu-lv
- resize2fs使用:/dev/mapper/ubuntu--vg-ubuntu--lv
6. 验证与问题排查
6.1 验证扩展结果
bash复制df -h
输出应该显示根目录的可用空间已经增加:
code复制Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 38G 15G 22G 41% /
6.2 常见问题解决
-
resize2fs报错"找不到设备"
检查逻辑卷路径是否正确,特别注意-和--的区别 -
vgextend报错"找不到物理卷"
确保已经执行pvcreate,并且设备路径正确 -
扩展后空间没有变化
检查是否所有步骤都执行完成,特别是最后的resize2fs -
部分命令需要安装
如果缺少某些命令,可以安装以下软件包:bash复制
apt install lvm2 cloud-guest-utils
7. 自动化脚本
为了简化操作,我将整个过程编写成了一个Shell脚本:
bash复制#!/bin/bash
# 检查参数
if [ $# -ne 1 ]; then
echo "Usage: $0 <new_size_in_GB>"
exit 1
fi
NEW_SIZE=$1
DEVICE="/dev/sda"
VG_NAME="ubuntu-vg"
LV_NAME="ubuntu-lv"
# 检查是否是root用户
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
# 步骤1:创建新分区
echo -e "n\np\n\n\n\nt\n8e\nw" | fdisk $DEVICE
# 重新读取分区表
partprobe $DEVICE
# 获取新创建的分区
NEW_PARTITION=$(fdisk -l $DEVICE | tail -n 1 | awk '{print $1}')
# 步骤2:创建物理卷
pvcreate $NEW_PARTITION
# 步骤3:扩展卷组
vgextend $VG_NAME $NEW_PARTITION
# 步骤4:扩展逻辑卷
lvextend -l +100%FREE /dev/$VG_NAME/$LV_NAME
# 步骤5:调整文件系统
resize2fs /dev/mapper/$(echo $VG_NAME | sed 's/-/--/g')-$(echo $LV_NAME | sed 's/-/--/g')
echo "Disk extended successfully!"
使用方法:
bash复制chmod +x extend.sh
./extend.sh 40
8. 经验总结
-
操作前务必备份重要数据。虽然LVM扩展通常很安全,但任何磁盘操作都有风险。
-
注意路径格式差异。这是最容易出错的地方,特别是
-和--的使用场景。 -
在线扩容的优势。整个过程不需要重启系统,这在生产环境中尤为重要。
-
监控空间使用。建议设置监控告警,在空间使用率达到80%时就考虑扩容,避免临时抱佛脚。
-
XFS文件系统的区别。如果使用XFS文件系统,调整大小的命令是
xfs_growfs而不是resize2fs。
通过这次扩容,我再次体会到LVM的强大之处。它不仅提供了存储管理的灵活性,还能最大限度地减少服务中断时间。对于需要频繁调整存储配置的环境,LVM绝对是必备工具。