在Google Cloud Compute Engine中,Persistent Disk扩容本身并不等于Linux文件系统已经获得了新增容量。Google Cloud可以在线增加Persistent Disk的容量,但操作系统内部仍然存在块设备、分区、LVM以及文件系统几个不同层次。扩容以后究竟还需要执行什么命令,取决于你的磁盘到底采用了哪一种布局。
因此,遇到“Google Cloud控制台已经从100GB改成200GB,但Linux里的df -h还是100GB”时,不应该直接重复执行某个扩容命令,而应该先确定容量到底停在哪一层。
最简单的判断方法是同时查看lsblk、df -hT和findmnt:
lsblk
df -hT
findmnt
如果需要进一步确认磁盘和分区表:
sudo fdisk -l
sudo parted -l
这里要区分三个完全不同的数字。lsblk主要反映块设备和分区大小,df反映文件系统已经可以使用的容量,而findmnt告诉你哪个文件系统挂载到了哪个目录。如果Google Cloud控制台已经显示200GB,lsblk里的磁盘也已经变成200GB,但分区仍然只有100GB,那么问题在分区层;如果分区已经200GB而df仍然只有100GB,问题就进入文件系统层。如果中间还有LVM,那么还要再经过PV、VG和LV三个层次。
这也是Google Cloud磁盘扩容最容易被误解的地方:扩容操作增加的是Persistent Disk本身的容量,不会在所有Linux磁盘布局中自动把每一层都扩大。Google官方文档明确说明,非启动Persistent Disk在扩容以后通常还需要在操作系统内部扩展文件系统;某些启动盘则可以由Compute Engine和镜像提供的自动扩容机制完成。
设备名称也不能写死成/dev/sda。传统SCSI设备可能显示为/dev/sda、/dev/sda1,而采用NVMe接口时可能看到/dev/nvme0n1、/dev/nvme0n1p1。Google官方示例也特别区分了这两种命名方式。
假设执行:
lsblk
看到类似:
NAME SIZE TYPE MOUNTPOINT
nvme0n1 200G disk
└─nvme0n1p1 100G part /
这说明Google Cloud层面的磁盘已经扩容到200GB,但分区仍然只有100GB。此时直接执行df -h当然不会看到新增的100GB,因为文件系统实际上仍然位于100GB的分区里面。
这种情况下可以使用growpart扩展分区。例如:
sudo growpart /dev/nvme0n1 1
对于SCSI设备则可能是:
sudo growpart /dev/sda 1
growpart的作用是扩展已有分区,而不是扩展文件系统。执行之后再次查看:
lsblk
如果分区已经从100GB扩大到200GB,下一步才是文件系统扩展。
也可以直接使用parted完成分区调整,例如:
sudo parted /dev/nvme0n1
然后在交互环境中使用:
resizepart 1 100%
这里不应该把“GPT”写成resizepart的必要条件。GPT和MBR是分区表类型,parted是否能够调整分区取决于具体磁盘布局、分区位置和工具支持,而不是简单地说“必须是GPT”。Google Cloud的公开镜像目前通常使用GPT,而从其他环境导入的MBR磁盘还存在2TB限制,因此判断分区表类型仍然很有必要。
如果分区已经扩大,而df -hT仍然没有变化,就进入文件系统层。
对于ext4,常用命令是:
sudo resize2fs /dev/nvme0n1p1
对于XFS,则应该针对挂载点执行:
sudo xfs_growfs /
如果数据盘挂载在/mnt/data:
sudo xfs_growfs /mnt/data
Google Cloud官方文档目前同样采用这种区分:ext4使用resize2fs,XFS使用xfs_growfs,btrfs则使用相应的btrfs filesystem resize命令。
这里还有一个经常被写错的细节:不能简单说“ext4必须挂载以后才能resize2fs”。ext4支持在线扩容,在已挂载的文件系统上可以扩大;离线情况下也可以进行相应操作。XFS则不能缩小,在线扩容是其常见工作方式。工程上真正应该关注的是文件系统类型、当前状态以及扩容目标,而不是背一个“必须挂载”或“必须卸载”的固定规则。
如果磁盘使用LVM,处理路径又完全不同。比如:
/dev/nvme0n1
└─/dev/nvme0n1p1
└─PV
└─VG
└─LV
└─ext4/XFS
这时候不能看到磁盘变大以后直接执行resize2fs /dev/nvme0n1p1。因为文件系统可能根本不直接位于这个分区上,而是位于Logical Volume。
典型流程首先确认:
lsblk
sudo pvs
sudo vgs
sudo lvs
df -hT
如果分区需要扩大,可以先:
sudo growpart /dev/nvme0n1 1
然后让LVM看到新增空间:
sudo pvresize /dev/nvme0n1p1
再扩展逻辑卷:
sudo lvextend -l +100%FREE /dev/mapper/vg0-lv0
最后扩展文件系统。如果是ext4,可以使用:
sudo resize2fs /dev/mapper/vg0-lv0
如果是XFS,则针对挂载点:
sudo xfs_growfs /
实际设备名称当然必须根据pvs、vgs、lvs的输出确定,不能照抄示例路径。
还有一种情况反而更简单:Google Cloud的非启动数据盘可能没有分区表,而是直接在整个块设备上创建文件系统。Google官方文档甚至建议,在不需要多个独立卷的情况下,可以使用单个文件系统、不创建分区表的Persistent Disk,这样扩容路径更简单。
例如:
/dev/nvme0n2
└─XFS
└─/mnt/data
此时Google Cloud把磁盘从100GB扩展到200GB后,Linux看到的块设备可能已经是200GB,但文件系统仍然是100GB。因为没有中间的分区层,所以可以直接扩展文件系统:
sudo xfs_growfs /mnt/data
或者ext4:
sudo resize2fs /dev/nvme0n2
这也是为什么处理GCE磁盘时,第一步不是“执行growpart”,而是先看lsblk。有没有分区、有没有LVM,决定了后面的命令。
df -h与lsblk必须结合起来看。比如:
lsblk
nvme0n1 200G
└─nvme0n1p1 200G /
但:
df -h
/dev/nvme0n1p1 100G
这说明块设备和分区已经完成扩容,文件系统没有扩容。
反过来,如果:
lsblk
nvme0n1 200G
└─nvme0n1p1 100G
那么根本还没有走到文件系统阶段,继续执行resize2fs不会解决分区只有100GB的问题。
如果使用了LVM,则应该进一步比较:
sudo pvs
sudo vgs
sudo lvs
df -hT
这几个命令能够把容量究竟卡在PV、VG、LV还是文件系统层面显示出来。
另一个容易误导管理员的建议是“扩容以后重启”。对于GCE Persistent Disk,扩容通常可以在线进行,并不意味着必须重启VM。Google官方文档明确说明Persistent Disk可以在实例运行时增加容量;对于使用公开镜像的启动盘,很多情况下分区和文件系统也会自动扩展。
如果系统没有识别新的块设备容量,可以先检查:
lsblk
sudo dmesg | tail -100
以及重新读取分区表:
sudo partprobe
或者:
sudo partx -u /dev/nvme0n1
但如果lsblk已经显示新的磁盘容量,就没有必要为了“让系统识别”而盲目重启。此时问题通常已经从块设备层进入分区、LVM或文件系统层。
/etc/fstab也经常被错误地列为“扩容必须修改的地方”。实际上,如果只是扩大原有分区或原有文件系统,通常不需要因为容量变化而修改fstab。fstab主要解决的是系统启动时如何识别和挂载文件系统的问题。如果设备UUID、挂载点和文件系统没有变化,仅仅是容量从100GB变成200GB,原来的挂载配置通常仍然有效。真正需要检查fstab的场景,是出现挂载失败、设备路径变化、UUID错误或者新增加了需要持久化挂载的文件系统。
生产环境执行扩容操作之前,Google也建议先创建磁盘Snapshot。尤其是即将修改分区表或文件系统结构时,备份的价值远远高于节省几分钟操作时间。Google官方的磁盘扩容故障排查文档明确把创建Snapshot列为执行文件系统故障排查前的重要步骤。
另外,不要把“磁盘扩容”与“磁盘性能提升”完全混为一谈。Google Cloud Persistent Disk的性能与配置容量存在关联,某些磁盘类型随着容量增加可以获得更高的性能上限,但这并不意味着所有业务瓶颈都能通过扩大容量解决。数据库遇到IOPS、吞吐、队列深度或者VM侧限制时,需要分别分析磁盘类型、实例限制和实际I/O模式。Google目前也明确建议根据工作负载选择不同Persistent Disk类型。
还有一个工程上很重要的判断:如果扩容以后lsblk、df -hT全部已经显示正确,但应用仍然报告“磁盘空间不足”,就不要继续折腾分区。此时应该检查inode:
df -i
因为文件系统可能还有大量物理空间,却已经耗尽inode。日志目录存在大量小文件时,这种情况尤其常见。
还可以检查删除但仍被进程打开的文件:
sudo lsof +L1
如果某个服务删除了几十GB日志,但进程仍然保持文件描述符打开,那么df显示的已使用空间可能不会立即下降。这个问题与Google Cloud磁盘扩容没有直接关系,却经常在“我已经扩容了,为什么空间还是满的”这类故障中混在一起。
最终诊断可以按照一条非常稳定的路径进行:先确认Google Cloud控制台中的Persistent Disk容量,再用lsblk确认Linux看到的块设备容量,然后判断是否存在分区;如果存在分区,再确认分区是否已经扩大;如果使用LVM,则继续检查PV、VG和LV;最后根据ext4、XFS或btrfs选择对应的文件系统扩容工具;完成以后用df -hT、df -i以及应用实际写入测试进行验证。
Google Cloud磁盘扩容并不是一个“执行一条命令就结束”的操作。它实际上涉及云平台块设备、Linux分区表、LVM和文件系统四个不同层次。专业运维人员处理这类问题时,最有效的方法不是记住某个固定命令,而是先确定新增容量究竟停在哪一层,再只修改这一层。只要把lsblk、df -hT、pvs/vgs/lvs和文件系统工具串起来,绝大多数“磁盘已经扩容但Linux看不到空间”的问题都可以迅速定位。
Google Cloud 磁盘扩容后系统看不到空间怎么办,Linux 文件系统还需要哪些操作
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
分享 Facebook | X | WhatsApp | LinkedIn
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP