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

日记详情

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

Ubuntu 18.04磁盘空间告急?LVM与非LVM环境下的安全扩容实战指南

Ubuntu 18.04磁盘空间告急?LVM与非LVM环境下的安全扩容实战指南

1. 项目概述与核心痛点

最近在整理一台老旧的开发服务器,系统是Ubuntu 18.04 LTS,跑着几个后台服务。某天突然收到监控告警,说根分区/的使用率超过了95%。登录上去一看,df -h命令的结果让人心头一紧,/dev/sda1分区只剩下可怜的几百兆空间。这不仅仅是“磁盘空间不足”的提示,更是系统即将陷入僵局的预兆:日志无法写入、软件包无法更新、甚至可能导致正在运行的服务崩溃。对于运维和开发者来说,无论是物理服务器、虚拟机(如VMware、VirtualBox)还是云主机,磁盘空间告急都是一个必须立刻处理的“红色警报”。

这个项目标题“Ubuntu 18.04 ——— 扩展磁盘空间”直指一个非常经典且高频的运维场景。它不仅仅是执行几条命令,其背后涉及对Linux存储管理逻辑(LVM vs. 传统分区)、文件系统特性(ext4, xfs)、以及不同虚拟化或云平台底层磁盘操作的理解。很多人以为在管理界面给虚拟机“加了磁盘空间”就万事大吉,结果重启后发现系统里空间一点没变,问题就出在操作系统层级的后续处理上。本文将彻底拆解在Ubuntu 18.04系统上,从识别问题、规划方案,到安全扩展磁盘空间的完整流程,并重点分享在LVM和非LVM两种典型环境下,如何一步步操作,以及我踩过的那些坑和总结出的“保命”技巧。

2. 环境诊断与方案规划

动手之前,盲目操作是最大的风险。我们必须先摸清家底,再决定从哪条路走。

2.1 全面掌握存储现状

首先,使用一系列命令来构建对当前磁盘状况的完整认知:

  1. 查看磁盘分区与挂载情况df -h命令是最直观的起点,它显示了已挂载文件系统的使用情况。但要特别注意dfdu命令结果的差异。有时du -sh /统计的磁盘使用量会小于df显示的使用率,这通常是因为有文件被删除但仍有进程占用(lsof | grep deleted可查),或者存在磁盘配额、稀疏文件等情况。对于标题中提到的“centos du df 磁盘空间差太多”问题,在Ubuntu上同样需要注意。

  2. 了解磁盘分区表与布局sudo fdisk -llsblk命令更为关键。lsblk命令能以树状图形式清晰展示磁盘、分区、逻辑卷之间的关系,这是判断后续操作路径的核心依据。

    lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 98.5G 0 part ├─ubuntu--vg-root 253:0 0 97.6G 0 lvm / └─ubuntu--vg-swap_1 253:1 0 980M 0 lvm [SWAP]

    从上面的输出可以解读出重要信息:磁盘/dev/sda总大小100G,它被分成了三个主分区(sda1, sda2, sda3)。其中,/dev/sda3这个分区不是一个直接挂载的文件系统,而是一个LVM物理卷(PV)。它上面创建了一个名为ubuntu-vg的卷组(VG),并在卷组中划分了两个逻辑卷(LV):rootswap_1。根文件系统/实际上是挂载在逻辑卷/dev/ubuntu-vg/root上的。

  3. 确认是否使用LVM:这是决定扩展流程的分水岭。如果lsblk输出中TYPE列为lvm,或者使用sudo vgssudo pvssudo lvs命令有输出,则说明系统使用了LVM。否则,就是传统的直接分区方式。

2.2 两种核心扩展路径分析

基于诊断结果,我们面临两条主要技术路径:

路径一:系统使用了LVM(逻辑卷管理器)这是最灵活、风险相对较低的情况,也是很多现代Linux发行版(包括Ubuntu Server默认安装)的选择。LVM像是一个存储资源的“池化管理层”,它屏蔽了底层物理磁盘的细节。扩展思路是:先扩大底层的物理磁盘或分区 -> 将新增空间加入LVM的物理卷(PV) -> 扩展卷组(VG)的容量 -> 最后扩展逻辑卷(LV)及其上的文件系统。这条路径允许在线操作(无需卸载文件系统),是首选方案。

路径二:系统使用传统直接分区(非LVM)这种情况更棘手,常见于早期安装或自定义分区时未选用LVM。扩展思路取决于分区表类型(MBR或GPT)和分区位置。如果待扩展的分区不是磁盘上的最后一个分区,操作将异常复杂,可能需要借助第三方工具(如gpartedLive CD),并伴有较高数据丢失风险。如果它是最后一个分区,则相对简单:先扩展底层物理磁盘 -> 使用fdiskparted删除并重建该分区(注意起始扇区不变!)-> 最后扩展文件系统。

重要提示:无论哪种路径,在操作前对关键数据进行备份是铁律。对于虚拟机,可以创建快照;对于物理机或云主机,务必确保有可用的数据备份。本文后续将以更常见、更推荐的LVM路径作为详细讲解的主线,并在最后对比说明非LVM路径的关键风险和步骤。

3. LVM环境下的磁盘空间扩展实战

假设我们的Ubuntu 18.04运行在VMware虚拟机上,并且诊断发现它使用了LVM。现在我们在VMware管理界面,将虚拟机的硬盘从100G扩容到了150G。以下是在操作系统内部消化这新增50G空间的详细步骤。

3.1 步骤一:让操作系统识别新空间

在虚拟机管理界面扩容后,新增的空间对于虚拟机内的操作系统而言是“未分配”状态。我们首先需要让系统内核重新识别磁盘的新尺寸。

  1. 对于SCSI/SATA硬盘:执行以下命令让系统重新扫描SCSI总线。

    echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan

    请注意,路径中的0:0:0:0需要替换为你的实际磁盘标识符,可以通过ls /sys/class/scsi_disk/查看。

  2. 通用方法:更稳妥的方法是直接重启系统,或者使用partprobe命令通知操作系统分区表的变化。

    sudo partprobe /dev/sda

    执行后,再次使用sudo fdisk -l /dev/sda确认磁盘总容量是否已变为150G。

3.2 步骤二:扩展物理分区(如果需要)

在LVM架构中,物理卷(PV)可以建立在整块磁盘(/dev/sda)上,也可以建立在一个分区(如/dev/sda3)上。我们的例子中,PV建立在/dev/sda3这个分区上。因此,我们需要先扩展这个分区,以包含磁盘尾部新增的未分配空间。

这里使用parted工具,因为它对GPT和MBR分区表都支持良好,且能进行交互式调整。

sudo parted /dev/sda (parted) print free # 查看当前分区表和空闲空间,确认新增空间在sda3之后。 (parted) resizepart 3 # 选择要调整的分区号(sda3是3号分区)。 (parted) 100% # 将分区结束位置设置为磁盘的100%,即占用所有可用空间。 (parted) quit

操作完成后,再次运行sudo partprobe /dev/sdalsblk,应该能看到/dev/sda3分区的大小已经增加。

实操心得:使用partedresizepart时,务必确保扩展的是正确的分区号。一个错误的数字可能导致灾难性后果。在执行前,用print命令反复核对分区布局和空闲空间位置。对于MBR磁盘,如果新增空间超过了2TB,则需要先将磁盘转换为GPT分区表,这个过程涉及数据迁移,风险极高,不建议在线操作。

3.3 步骤三:扩展LVM物理卷(PV)

分区扩大了,但建立在它之上的LVM物理卷(PV)还不知道这个变化。我们需要扩展这个PV。

sudo pvresize /dev/sda3

这条简单的命令会检测/dev/sda3底层设备的实际大小,并自动将PV调整到与之匹配。执行后,使用sudo pvs命令查看,会发现/dev/sda3对应的PV的PSize(物理卷大小)已经增加了。

3.4 步骤四:扩展卷组(VG)与逻辑卷(LV)

现在,新增的物理空间已经作为“空闲空间”加入到了PV中。这些空间会自动成为该PV所属卷组(VG)的可用空间。通过sudo vgs查看,可以看到VG的VFree(卷组空闲空间)增加了。

接下来,我们将这些空闲空间全部分配给需要扩容的逻辑卷(LV),比如根分区所在的/dev/ubuntu-vg/root

# 首先,查看当前逻辑卷信息,确认LV路径和VG空闲空间 sudo lvs sudo vgs # 扩展逻辑卷,将卷组中所有空闲空间分配给root逻辑卷 sudo lvextend -l +100%FREE /dev/ubuntu-vg/root

-l +100%FREE参数表示使用卷组中100%的空闲空间。你也可以指定具体大小,如-L +50G

3.5 步骤五:扩展文件系统

这是最后一步,也是最关键的一步。逻辑卷(LV)是“容器”,文件系统(如ext4)才是真正存放数据的“货架”。容器变大了,货架也必须同步扩大,否则多出来的空间无法使用。

对于最常用的ext4文件系统,使用resize2fs命令:

sudo resize2fs /dev/ubuntu-vg/root

该命令会自动检测逻辑卷的大小,并将文件系统扩展到充满整个逻辑卷。如果是xfs文件系统,则需使用xfs_growfs命令:

sudo xfs_growfs /

注意,xfs_growfs的参数是挂载点,而不是设备路径。

操作完成后,再次运行df -h,你会欣喜地看到根分区/的可用空间已经大幅增加,整个扩展过程完成。

4. 非LVM环境扩展与高风险操作指南

如果你的系统安装时未使用LVM,那么扩展操作将直接作用于分区和文件系统,容错率更低。

4.1 场景分析与前置检查

假设你的df -h显示/dev/sda2直接挂载为/,且lsblk显示它后面没有其他分区。这是非LVM环境下唯一相对安全的扩展场景:待扩展分区是磁盘上的最后一个分区。

  1. 备份!备份!备份!:此操作无法回滚,务必先对整个系统或重要数据做完整备份。虚拟机务必创建快照。
  2. 使用Live CD/USB强烈建议使用Ubuntu Live CD/USB启动系统,在目标系统未运行时进行操作。因为大多数文件系统不支持对已挂载的根分区进行缩小或移动操作,但部分(如ext4)可能支持在线扩大。然而,在Live环境下操作是更稳妥的选择。
  3. 确认分区表类型:使用sudo fdisk -l /dev/sda查看,输出末尾会显示Disklabel type: gptdos(即MBR)。GPT更现代,支持大于2TB的磁盘。

4.2 使用GParted进行图形化操作(推荐)

对于新手,在Live环境下使用图形化工具GParted是最直观、相对安全的方式。

  1. 从Live介质启动,选择“试用Ubuntu”。
  2. 打开GParted(通常已预装,或可通过软件中心安装)。
  3. 在右上角选择你的硬盘(如/dev/sda)。
  4. 你会看到分区图示。找到需要扩展的分区(例如/dev/sda2)。
  5. 关键操作:右键点击该分区,选择“调整大小/移动”。
    • 在弹出窗口中,你可以拖动分区条两端的箭头。确保起始位置(Start)的数值绝对不变,只拖动结束位置(End)的箭头到磁盘末尾,以吸收所有空闲空间。
    • 绝对不要改变起始扇区!改变它意味着移动分区,会导致数据全部丢失。
  6. 点击“调整大小”,然后点击GParted工具栏上的绿色对勾“应用所有操作”。
  7. 等待操作完成。这个过程会先移动文件系统(如果涉及),然后扩展它,需要一定时间。

操作完成后,重启进入原系统,再次使用df -h检查,空间应该已经扩展成功。

4.3 命令行操作流程与致命风险

如果你必须或倾向于使用命令行,以下是基于parted的步骤概要,但请务必理解其风险:

# 1. 在Live环境中,确保根分区未挂载 sudo umount /dev/sda2 # 2. 检查文件系统(可选但推荐) sudo e2fsck -f /dev/sda2 # 3. 使用parted删除并重建分区(危险!) sudo parted /dev/sda (parted) print # 记录下要操作分区的Start值,例如 1048576kB (parted) rm 2 # 删除2号分区(/dev/sda2),这只是删除分区表条目,数据还在,但下一步出错就全没了。 (parted) mkpart primary ext4 1048576kB 100% # 用完全相同的Start值创建一个新的主分区,类型ext4,结束到100%。 (parted) quit # 4. 强制内核重读分区表 sudo partprobe /dev/sda # 5. 扩展文件系统到新分区大小 sudo resize2fs /dev/sda2

致命风险警告:上述命令中的rmmkpart是原子操作,一旦mkpart时输入的起始扇区(Start)有误,或者过程中断电,数据将极难恢复。这就是为什么图形化工具GParted在调整时会自动锁定起始位置,提供了更好的防错保护。对于非最后一个分区的扩展,操作涉及移动分区,必须使用GParted等工具,且耗时极长,风险呈指数级上升。

5. 云服务器与特殊场景下的扩展考量

除了传统的虚拟机和物理机,在公有云(如AWS EC2, 阿里云ECS, 腾讯云CVM)上运行Ubuntu 18.04时,扩展磁盘空间又是另一番流程。

5.1 云平台扩展通用流程

云平台的扩展通常分为控制台操作和系统内操作两步:

  1. 控制台扩容:在云服务商的管理控制台中,找到对应的云硬盘(EBS、云盘等)或实例配置,执行“扩容”操作。这相当于在硬件层面增加了磁盘容量。重要提示:很多云平台在扩容后,需要重启实例才能使操作系统识别到新容量,这与虚拟机热添加不同,务必查阅云厂商文档。

  2. 系统内操作:实例重启后,登录系统。后续的操作路径就回到了我们前面讨论的范畴:

    • 运行lsblkdf -h确认磁盘大小已变化,但分区和文件系统未变。
    • 判断是否使用LVM。很多云市场镜像默认使用LVM,这会让扩容变得非常简单,直接按照本文第三部分的步骤三(pvresize)开始操作即可,因为云硬盘通常作为一个完整的PV(如/dev/vda)使用,无需处理分区扩展。
    • 如果是非LVM,且云硬盘作为单个分区(如/dev/vda1)使用,那么就需要按照第四部分非LVM的“最后一个分区”场景来处理,使用growpartresize2fs命令组合是更标准的方式:
    # 安装 cloud-utils 工具(如果未安装) sudo apt-get install cloud-utils -y # 扩展分区(例如,磁盘是 /dev/vda,分区号是1) sudo growpart /dev/vda 1 # 扩展文件系统 sudo resize2fs /dev/vda1

5.2 扩展后的检查与优化

空间扩展成功后,并不意味着工作结束,以下几个后续步骤能确保系统稳定运行:

  1. 文件系统一致性检查:对于ext4,虽然resize2fs通常很安全,但在大容量扩展后,运行一次只读检查是个好习惯:sudo e2fsck -n /dev/ubuntu-vg/root-n参数表示只检查不修复。

  2. 更新initramfs:在某些老旧系统或特定硬件上,如果/boot分区空间不足,更新内核可能会失败。扩展后如果涉及/boot分区,需要更新initramfs:sudo update-initramfs -u -k all

  3. 监控与日志分析:扩展空间是为了解决“症状”,更要找到“病因”。使用ncdudu -sh /*等工具深入分析究竟是哪个目录占用了大量空间。是日志文件(/var/log)?是应用程序缓存?还是用户数据?找到根源后,可以设置日志轮转(logrotate)、清理缓存策略,或规划将特定目录(如/home/var)迁移到独立的分区或逻辑卷中,实现更灵活的存储管理。

6. 常见问题排查与实战经验记录

即使按照步骤操作,也可能遇到各种“坑”。下面是我在多次扩容中积累的问题清单和解决方法。

6.1 问题速查表

问题现象可能原因排查命令与解决方案
df -h显示空间未增加1. 未扩展文件系统。
2. LV未扩展。
3. 分区未扩展。
4. 磁盘容量未刷新。
1. 检查并执行resize2fsxfs_growfs
2. 检查sudo lvs,确认LV大小,用lvextend扩展。
3. 检查lsblk,确认分区大小,用partedgrowpart扩展分区。
4. 重启或使用partprobeecho 1 > …/rescan
lvextend失败,提示“Insufficient free space”VG中确实没有空闲空间。运行sudo vgs查看VFree。空间可能还在PV层,需先执行pvresize;或者新增的磁盘空间未正确加入PV。
resize2fs提示“The filesystem is already … blocks long.”文件系统已经和LV大小一致,无需扩展。运行sudo resize2fs -P /dev/ubuntu-vg/root查看文件系统最小尺寸,再与LV大小(sudo lvs)对比。
扩容后系统无法启动1./boot分区空间满,内核更新失败。
2. GRUB配置错误。
1. 从Live CD启动,清理/boot下旧内核,或扩展/boot分区。
2. 在Live CD中chroot到原系统,重装并配置GRUB:grub-install&update-grub
非LVM扩展分区时,parted报错分区不是磁盘上最后一个分区。极其危险!必须使用GParted等工具在Live环境下操作,涉及分区移动,耗时很长,务必先备份。
云服务器扩容后lsblk无变化云平台需要重启实例或卸载重挂磁盘。1. 查阅云厂商文档,确认是否需要重启。
2. 对于某些云盘,可能需要先卸载(umount),在控制台分离再挂载,或使用rescan-scsi-bus.sh等脚本。

6.2 核心经验与避坑指南

  1. 顺序是铁律:牢记扩展链条:物理磁盘 -> 分区 -> 物理卷(PV) -> 卷组(VG) -> 逻辑卷(LV) -> 文件系统。操作前用lsblkdfpvsvgslvs命令确认当前状态,一步步向上推进,切忌跳步。

  2. 备份重于一切:尤其是非LVM环境下的分区操作,一次误操作就可能导致数据全丢。虚拟机的快照、云硬盘的快照、或文件级备份,必须在操作前完成。

  3. 理解“扩展”与“移动”:在调整分区大小时,partedGParted中的“Resize/Move”操作,如果只拖动结束位置,是“扩展”;如果改变了起始位置,就是“移动”。移动分区意味着所有数据需要物理搬迁,速度慢、风险高。对于非末尾分区扩容,本质上就是先移动后面的分区腾出空间,再扩展目标分区,这是一个组合操作。

  4. 善用Live环境:对于涉及根分区或复杂分区表的操作,使用Ubuntu Live USB启动进行操作是最安全的选择。这保证了所有待操作的文件系统都处于未挂载状态。

  5. 文档与注释:在生产环境操作时,将每一步执行的命令、输出结果(特别是fdisk -llsblkvgslvs的完整输出)记录下来。如果出现问题,这些记录是寻求帮助或进行回滚分析的唯一依据。

最后,我个人最深刻的体会是:预防优于治疗。在初次安装系统时,只要条件允许,就优先选择LVM分区方案。它提供的存储抽象层,让日后无论是扩展、收缩,还是迁移数据,都拥有了巨大的灵活性。对于/home/var这类容易增长的数据目录,在规划时就可以将其放在独立的逻辑卷上,避免根分区被“撑爆”的风险。磁盘空间管理,看似是基础操作,却非常考验运维人员对Linux存储栈的透彻理解和谨慎细致的工作习惯。

← 返回列表