三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu根目录磁盘空间不足?LVM在线扩容实战指南

Ubuntu根目录磁盘空间不足?LVM在线扩容实战指南

1. 项目概述与核心痛点

最近在折腾一台跑着Ubuntu 20.04的开发服务器,系统盘是当初手抖只分了50GB,现在根目录(/)天天飘红,df -h一看,使用率已经超过95%,编译个稍微大点的项目或者更新几个软件包都提心吊胆。这场景,但凡用过Linux服务器的朋友估计都遇到过。磁盘空间不足,尤其是根目录空间告急,绝对是影响系统稳定性和日常工作的头号敌人。轻则软件无法安装更新,重则系统日志写满导致服务异常,甚至直接卡死。

所以,给Ubuntu的根目录扩容,从一个“可选项”变成了一个“必选项”。网上教程不少,但要么年代久远,要么步骤跳跃,对于分区、LVM这些概念一笔带过,新手照着操作很容易踩坑,比如误删分区导致数据丢失,或者扩容后系统无法启动。我这个项目,就是基于2023年最新的Ubuntu 20.04环境,把根目录磁盘扩容这个事,从头到尾、掰开揉碎了讲清楚。核心目标就一个:让你在理解每一步在干什么的前提下,安全、顺利地把空间加上去。我会重点补充很多教程里语焉不详的“Linux分区概念”,因为这是理解扩容操作的基础,知其然更要知其所以然。

2. Linux分区与存储管理核心概念解析

在动手扩容之前,我们必须先搞清楚Linux是怎么管理磁盘和分区的。很多扩容失败的操作,根源都在于对底层存储结构一知半解。

2.1 物理磁盘、分区与文件系统

你可以把整个存储结构想象成一栋大楼。

  • 物理磁盘:就是整块硬盘,好比这栋大楼的地皮和建筑主体。我们通过/dev/sda/dev/nvme0n1这样的设备文件来访问它。
  • 分区:相当于在大楼里用承重墙划分出的几个大房间,比如101室、102室。分区表(MBR或GPT)就是这栋大楼的户型图,记录了每个房间(分区)的起止位置和大小。常见的分区工具是fdiskparted
  • 文件系统:这是在每个“房间”(分区)内部进行的精装修,决定了家具(文件)如何摆放、如何查找。Ext4、XFS、Btrfs就是不同的“装修方案”。mkfs命令就是干这个的。
  • 挂载点:最后,我们需要给这些装修好的“房间”分配一个进入大楼后的路径标识,比如“101室是总经理办公室(/根目录)”,“102室是财务部档案室(/home)”。这个分配过程就是“挂载”,记录在/etc/fstab这个“大楼房间分配表”里。

扩容操作,本质上就是要么扩大某个“房间”的墙体(调整分区大小),要么在“房间”内部重新规划家具布局(调整文件系统大小),而且必须保证“装修”(文件系统)和“户型图”(分区表)的信息同步,否则系统就“找不到房间”或者“家具错位”了。

2.2 LVM:灵活的“空间池”管理方案

直接操作物理分区扩容,风险高且不灵活。这时就需要引入LVM(Logical Volume Manager,逻辑卷管理器)。它相当于在大楼和房间之间,增加了一个“智能空间管理系统”。

  • 物理卷(PV, Physical Volume):把整块硬盘或者某个分区,交给LVM系统管理,相当于把原材料(砖块)入库。
  • 卷组(VG, Volume Group):把多个物理卷(PV)的存储空间合并成一个大池子,相当于一个统一的“建材仓库”。
  • 逻辑卷(LV, Logical Volume):从卷组(VG)这个大仓库里,按需划出一块空间,创建出一个逻辑卷。这个逻辑卷对于上层的操作系统来说,就像一块独立的“硬盘”或“分区”,可以格式化和挂载。它非常灵活,可以随时从VG里扩容或缩容。

为什么推荐LVM?假设你的根目录在/dev/sda2这个分区上,空间不够了。如果没有LVM,你需要:

  1. 备份数据。
  2. 从相邻分区(比如/dev/sda3)腾出空间。
  3. 删除/dev/sda2,重新创建一个更大的/dev/sda2(这步极其危险!)。
  4. 恢复文件系统和数据。 而如果根目录在一个LVM逻辑卷(比如/dev/ubuntu-vg/ubuntu-lv)上,扩容通常只需要两条命令:lvextend扩展逻辑卷,然后resize2fs扩展文件系统,全程在线操作,无需重启,风险极低。本次扩容的核心前提,就是你的根目录最好已经在LVM之上。

2.3 查看当前存储布局

动手前,必须摸清家底。使用以下命令组合:

# 1. 查看磁盘分区情况 sudo fdisk -l # 或使用更现代的 lsblk lsblk -f

lsblk -f的输出非常直观,它会以树状图显示块设备、分区、文件系统类型、挂载点和大小。重点关注你的系统盘(通常是sdanvme0n1)以及根目录(/)所在的分区或逻辑卷。

# 2. 查看逻辑卷信息(如果你用了LVM) sudo pvs # 查看物理卷 sudo vgs # 查看卷组 sudo lvs # 查看逻辑卷
# 3. 查看文件系统使用情况 df -hT

df -hT会显示每个挂载点的总大小、已用空间、可用空间、使用百分比和文件系统类型。找到根目录(/)那一行,确认它是否真的快满了,以及它的文件系统类型(通常是ext4)。

注意:如果你的根目录文件系统类型是ext4且挂载在类似/dev/mapper/ubuntu--vg-ubuntu--lv这样的设备上,恭喜你,你正在使用LVM,扩容会相对简单。如果它直接挂载在类似/dev/sda2这样的原始分区上,扩容流程会复杂且风险更高,可能需要使用gparted等工具在Live CD环境下操作。

3. 扩容实战:基于LVM的根目录在线扩容

这是最推荐、最安全的方案。假设我们已通过lsblkdf确认,根目录位于LVM逻辑卷上,并且同一块物理硬盘上还有未分配的空间(例如,通过虚拟机管理界面为虚拟磁盘增加了容量,或者在物理服务器上新增了一块硬盘)。

3.1 场景一:扩展现有物理磁盘并扩容

这是虚拟机或云服务器中最常见的场景。你已经在VMware、VirtualBox或云控制台将系统盘从50GB扩容到了100GB,但进入系统后df -h发现根目录还是50GB。这是因为你只扩大了“大楼的地基”(物理磁盘),还没在“户型图”(分区表)和“房间”(分区/LVM)里体现。

步骤1:让系统识别扩容后的物理磁盘首先,检查内核是否识别了新的磁盘大小。有时需要让系统重新扫描SCSI总线。

# 对于虚拟SCSI/SATA磁盘 echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan # 注意:上面的路径`0:0:0:0`需要替换成你的实际磁盘标识,可以通过`ls /sys/class/scsi_disk/`查看 # 一个更通用的方法是安装工具并执行 sudo apt update && sudo apt install -y cloud-utils sudo growpart /dev/sda 1 # 假设你要扩展 /dev/sda 上的第1个分区

更稳妥的方法是直接使用parted工具。

步骤2:扩展物理分区假设系统盘是/dev/sda,根目录所在的LVM物理卷在/dev/sda3分区上。

# 使用parted工具 sudo parted /dev/sda (parted) print # 查看当前分区表,记下要扩展的分区号(例如3) (parted) resizepart 3 # 选择分区号3 # 它会询问结束位置,直接输入100%,表示使用所有可用空间 (parted) quit

实操心得:使用partedresizepart命令时,它可能会警告分区正在使用。只要这个分区是LVM物理卷的一部分,通常可以安全地在线调整。操作前务必再次用print命令确认分区号,输错了可能导致数据丢失。

步骤3:扩展LVM物理卷(PV)分区大小调整后,需要通知LVM:“原材料(砖块)变多了”。

# 刷新物理卷的大小信息 sudo pvresize /dev/sda3 # 使用 pvs 命令验证物理卷的新大小 sudo pvs

你应该能看到/dev/sda3这个PV的PSize变大了。

步骤4:扩展逻辑卷(LV)现在“建材仓库”(VG)里有更多空间了,我们可以把空间划给“总经理办公室”(根目录的逻辑卷)。

# 首先查看卷组是否有空闲空间 sudo vgs # 查看逻辑卷全名 sudo lvs # 假设卷组名是 ubuntu-vg,逻辑卷名是 ubuntu-lv # 将卷组中的所有空闲空间都分配给逻辑卷 sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv # 你也可以指定具体大小,例如增加20G: sudo lvextend -L+20G /dev/ubuntu-vg/ubuntu-lv

步骤5:扩展文件系统最后一步,告诉文件系统:“你的地盘变大了,可以重新规划家具了”。对于ext4文件系统:

# 调整ext4文件系统大小以填充整个逻辑卷 sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

对于xfs文件系统,命令不同:

sudo xfs_growfs /

执行完成后,再次运行df -h,你应该能看到根目录(/)的可用空间已经大幅增加。

3.2 场景二:添加新物理磁盘并扩容

如果现有磁盘无法扩展,或者你想彻底分离,可以添加新硬盘。

步骤1:识别新磁盘安装新硬盘后,使用lsblkfdisk -l找到新磁盘,例如/dev/sdb

步骤2:创建物理卷(PV)

sudo pvcreate /dev/sdb

步骤3:扩展卷组(VG)将新的物理卷加入到已有的卷组中。

# 假设现有卷组名为 ubuntu-vg sudo vgextend ubuntu-vg /dev/sdb

步骤4:扩展逻辑卷(LV)和文件系统接下来的步骤就和场景一的步骤4、5完全一样了:

sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

4. 非LVM环境下的根目录扩容(高风险操作)

如果你的根目录直接位于一个普通分区(如/dev/sda2)上,并且该分区后面有未分配空间,扩容将异常棘手,因为大多数文件系统不支持在线缩小后面的分区来为前面分区腾出空间。强烈建议先进行完整备份!

通常的步骤是:

  1. 使用Live CD/USB启动:从Ubuntu安装介质启动,选择“试用Ubuntu”。
  2. 使用GParted图形化工具:这是最安全直观的方法。在Live环境中打开GParted。
  3. 调整分区:你需要先缩小紧跟在根分区后面的那个分区(例如/dev/sda3,可能是/homeswap),在其前面腾出未分配空间。然后扩展根分区(/dev/sda2),将未分配空间合并进去。
  4. 应用操作:GParted会按顺序执行这些操作,可能需要较长时间。
  5. 重启:重启进入原系统,使用df -h检查。

致命警告:此操作任何一步出错都可能导致数据丢失或系统无法启动。特别是操作涉及系统关键分区时。如果根分区后面没有其他分区,而是磁盘末尾有未分配空间,情况会稍好,你可以直接扩展根分区。但多数情况下,根分区是最后一个主分区,扩展它需要先删除后面的扩展分区和逻辑分区,这几乎是不可行的。因此,对于生产环境或重要数据,优先考虑备份数据、重装系统并规划使用LVM,而非冒险进行非LVM分区调整。

5. 常见问题、排查技巧与实操心得

即使按照步骤操作,也可能会遇到各种问题。这里记录一些我踩过的坑和解决方案。

5.1 问题排查速查表

问题现象可能原因排查命令与解决方案
pvresizelvextend失败,提示没有空闲空间1. 物理分区未成功扩展。
2. 新增的磁盘空间未被分区表识别。
1. 用sudo parted /dev/sda unit s print确认分区结束扇区是否已增加。
2. 尝试重启系统,或使用partprobe命令让内核重读分区表:sudo partprobe /dev/sda
resize2fs失败,提示 “The filesystem is already xxxx blocks long.”逻辑卷(LV)已经扩展,但文件系统之前已经填充了该空间。这通常不是错误,只是提示无需操作。用df -h确认空间是否已增加。如果想强制检查文件系统,可运行sudo e2fsck -f /dev/ubuntu-vg/ubuntu-lv
扩容后系统无法启动,进入initramfsgrub rescue>1. 分区UUID可能因调整而改变,但/etc/fstab或grub配置未更新。
2. 文件系统损坏。
1. 在Live CD环境下,检查/etc/fstab中的UUID是否与blkid命令输出的新UUID一致。
2. 使用Live CD运行fsck修复文件系统:sudo fsck /dev/sda2(替换为你的根分区)。
df -h显示空间未变,但lsblk显示逻辑卷已变大文件系统未成功扩展。lvextendresize2fs是两个独立步骤。确保在执行lvextend后,执行了正确的文件系统扩展命令(resize2fs用于ext3/4,xfs_growfs用于xfs)。
虚拟机中扩展磁盘后,fdisk -l看不到新空间虚拟机设置生效,但操作系统内的磁盘驱动未刷新。对于VMware,确保虚拟机设置已保存,然后在系统中执行:
sudo echo 1 > /sys/class/scsi_disk/0:0:0:0/device/rescan
对于VirtualBox,可能需要先关闭虚拟机,在设置中“应用”更改,再启动。

5.2 关键实操心得与避坑指南

  1. 备份!备份!备份!:在进行任何磁盘操作前,确保有可用的、最新的数据备份。对于重要服务器,甚至可以制作整个系统盘的镜像。
  2. 善用lsblkdf -hT:这两个命令是你的“眼睛”。在操作前、操作中、操作后,反复使用它们确认当前状态,确保每一步都符合预期。
  3. 理解命令的“预览”模式:像partedlvextend等命令,有时提供--dry-run-n参数,可以在不实际执行的情况下模拟操作结果。正式执行前先用这个模式验证。
  4. LVM是你的好朋友:对于Linux服务器,在初始安装时就选择“使用LVM”是极具远见的做法。它带来的存储灵活性远超那一点点微乎其微的性能损耗。
  5. 云服务器的特殊性:在AWS、Azure、阿里云等平台上,扩容系统盘通常分为两步:a) 在控制台扩容云盘。b) 在实例内部执行分区和文件系统扩容操作。云平台通常有详细的官方文档,务必遵循,因为有些云盘可能使用了特殊的驱动或分区方案。
  6. 留有余地:不要一次性把空间全部分配完。无论是卷组还是逻辑卷,留一些空闲空间以备不时之需(例如突然需要创建一个快照或临时卷),是一个好习惯。
  7. 文档化你的操作:在终端里开一个文本编辑器,或者用script命令记录你的整个操作过程。万一出了问题,清晰的步骤记录是排查和求救的宝贵依据。

扩容完成后,看着df -h里根目录后面跟着的令人安心的使用百分比,那种感觉就像给老房子成功加盖了一层楼,既解决了燃眉之急,又为未来的发展留出了空间。整个过程的核心,就是对Linux存储栈的清晰认知:从物理磁盘到分区,再到LVM的卷组、逻辑卷,最后到文件系统和挂载点,一层层地理解和操作。希望这份结合了最新实践和基础概念的指南,能帮你下次面对“磁盘空间不足”的警告时,可以从容应对。

← 返回列表