GCP虚拟机在谷歌控制台中增加磁盘容量后,磁盘已满99.8%,尚未调整其文件系统的大小。
我在GCP上有一个基于公共映像ubuntu-2004-focal-v20220419
的小型VM。有一个10GB的磁盘,带有根分区和文件系统。一些日志占用了99.8%的磁盘容量。我将磁盘大小增加到15GB(没有删除任何数据),然后重新启动VM。文件显示:
对于具有公共映像的虚拟机,在增加启动磁盘的大小并重新启动虚拟机后,计算引擎会自动调整根分区和文件系统的大小。
然而,我可以看到文件系统没有调整的大小
~$ sudo lsblk
sda 8:0 0 15G 0 disk
├─sda1 8:1 0 9.9G 0 part /
├─sda14 8:14 0 4M 0 part
└─sda15 8:15 0 106M 0 part /boot/efi
我想知道为什么会这样?我预计,根据上述文件,额外的5GB将自动与sda1
合并。可能是因为磁盘太满了,所以一些GCP后台进程无法调整文件系统的大小?
我给出这个回应是为了帮助其他社区解决这个问题,@John Hanley在评论区做出了适当的回应。
重要注意事项:
- 在修改磁盘上的文件系统之前,请创建一个快照
- 启动磁盘使用MBR分区,其大小限制为2 TB。不要将启动磁盘的大小调整为超过2 TB
- 我建议在修改存储之前关闭系统。列出项目
步骤1–在Google控制台中创建一个默认实例进行测试
默认磁盘大小为10 GB。
步骤2–连接到实例
转到谷歌控制台->计算引擎。将显示VM实例的列表。在带有实例的行上,单击"SSH"。您还可以使用CLI:"gcloud compute ssh<instance_name>"。
执行"df"命令并记录输出。
df > df_before_resize.txt
Filesystem 1K-blocks Used Available Use% Mounted on
udev 292220 0 292220 0% /dev
tmpfs 60672 3184 57488 6% /run
/dev/sda1 10253588 1645864 8067156 17% /
tmpfs 303352 0 303352 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 303352 0 303352 0% /sys/fs/cgroup
步骤3–关闭实例
步骤4–将磁盘大小调整为16 GB
转到谷歌控制台->计算引擎->磁盘。为实例选择磁盘。单击编辑按钮并将磁盘大小调整为16 GB。
步骤5–启动实例并使用SSH进行连接
步骤6–再次执行"df"命令
Filesystem 1K-blocks Used Available Use% Mounted on
udev 292220 0 292220 0% /dev
tmpfs 60672 3176 57496 6% /run
/dev/sda1 15414196 1659504 13004496 12% /
tmpfs 303352 0 303352 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 303352 0 303352 0% /sys/fs/cgroup
比较/dev/sda1的行可以确认Google Compute上的Debian 9 Stretch确实会自动调整根文件系统的大小。现在我想知道怎么做。
步骤7–获取串行端口控制台输出
gcloud compute instances get-serial-port-output --zone us-east4-c instance-1 > console.log
gcloud计算实例的文档获取串行端口输出。
步骤8–分析控制台输出
这产生了大约1000条生产线。为了减少这种输出,我使用grep来搜索可能与调整文件系统大小有关的输出。注意我是怎么拼写"resiz"的。我希望搜索包括"调整大小"one_answers"调整大小"。
grep -e resiz -e expand console.log
这产生了以下内容:
Oct 28 [ 3.979172] EXT4-fs (sda1): resizing filesystem from 2620928 to 3931643 blocks
Oct 28 00:11:57 localhost expand-root.sh[458]: Growing partition /dev/sda1
Oct 28 00:11:57 localhost expand-root.sh[458]: CHANGED: partition=1 start=4096 old: size=20967424 end=20971520 new: size=31453151,end=31457247
Oct 28 00:11:57 localhost expand-root.sh[458]: Resizing ext4 filesystem on /dev/sda1
Oct 28 00:11:57 localhost expand-root.sh[458]: resize2fs 1.43.4 (31-Jan-2017)
Oct 28 00:11:57 localhost kernel: [ 3.979172] EXT4-fs (sda1): resizing filesystem from 2620928 to 3931643 blocks
[ 4.577767] EXT4-fs (sda1): resized filesystem to 3931643
Oct 28 00:11:57 instance-1 kernel: [ 4.577767] EXT4-fs (sda1): resized filesystem to 3931643
Oct 28 00:11:58 instance-1 expand-root.sh[458]: Filesystem at /dev/sda1 is mounted on /; on-line resizing required
Oct 28 00:11:58 instance-1 expand-root.sh[458]: old_desc_blocks = 2, new_desc_blocks = 2
Oct 28 00:11:58 instance-1 expand-root.sh[458]: The filesystem on /dev/sda1 is now 3931643 (4k) blocks long.
第9步–找出用于调整根文件系统大小的命令
从控制台的输出中,我可以看到命令"expand-root.sh"。使用命令"which-expand-root.sh",我发现这个命令位于"/usr/bin/expand-rot.sh"处。
#!/bin/bash
# Expands a partition and filesystem using growpart and an appropriate
# filesystem tool for live filesystem expansion. Takes three arguments:
# DEVICE, such as "/dev/sda"
# PARTITION, such as "1"
# FILESYSTEM, such as "ext4"
DEVICE="${1}"
PARTITION="${2}"
FILESYSTEM="${3}"
if [[ -z "${DEVICE}" || -z "${PARTITION}" || -z "${FILESYSTEM}" ]]; then
echo "Requires: $0 DEVICE PARTITION FILESYSTEM"
exit 1
fi
# Grow partition using growpart
if [[ -x /usr/bin/growpart ]]; then
echo "Growing partition ${DEVICE}${PARTITION}"
/usr/bin/growpart "${DEVICE}" "${PARTITION}"
else
echo "/usr/bin/growpart was not found"
exit 1
fi
echo "Resizing ${FILESYSTEM} filesystem on ${DEVICE}${PARTITION}"
case "${FILESYSTEM}" in
xfs) xfs_growfs / ;;
ext2) resize2fs "${DEVICE}${PARTITION}" ;;
ext3) resize2fs "${DEVICE}${PARTITION}" ;;
ext4) resize2fs "${DEVICE}${PARTITION}" ;;
*) echo "Unsupported filesystem, unable to expand size." ;;
esac
如果你调整根磁盘的大小,在谷歌云计算引擎上运行的Debian 9 Stretch会自动调整根卷的大小。非常好。
谷歌云提供了在虚拟机实例运行时调整磁盘大小的功能。您能在系统运行时调整根磁盘和根文件系统的大小吗?如果是,如何?
步骤1-转到谷歌控制台->计算引擎->磁盘。为实例选择磁盘。
步骤2–单击"CREATE SNAPSHOT"按钮创建恢复快照。
步骤3–单击编辑按钮并将磁盘大小调整为25 GB。
步骤4–连接到实例。
步骤5–执行此命令以查看磁盘大小和分区布局:
fdisk -l
该命令产生以下输出:
Disk /dev/sda: 25 GiB, 26843545600 bytes, 52428800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x70df3223
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 4096 31457246 31453151 15G 83 Linux
请注意,磁盘大小报告为"25Gib",但分区大小仍然是"15G"。这意味着磁盘驱动器的大小被调整为25 GB,但根分区(文件系统)的大小保持不变。让我们在系统运行时尝试调整根文件系统的大小。
expand-root.sh /dev/sda 1 ext4
Growing partition /dev/sda1
CHANGED: partition=1 start=4096 old: size=31453151 end=31457247 new: size=52424671,end=52428767
Resizing ext4 filesystem on /dev/sda1
resize2fs 1.43.4 (31-Jan-2017)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/sda1 is now 6553083 (4k) blocks long.
自动调整大小
现在,让我们更进一步,从命令行或脚本中完全自动调整VM磁盘的大小和根文件系统的大小。
步骤1–快照磁盘
首先,我们将快照磁盘以备不时之需。
gcloud compute disks snapshot instance-1 --snapshot-names instance-1-snapshot --zone us-east4-c --description="This is a test snapshot"
gcloud计算磁盘快照的文档。
第2步–调整磁盘大小
此命令将调整VM实例磁盘的大小。根据需要的大小、磁盘名称和区域进行修改。请注意–quiet标志。这将阻止出现确认调整大小的提示。
gcloud compute disks resize instance-1 --zone us-east4-c --size 30GB --quiet
gcloud计算磁盘调整大小的文档。
步骤3–重新设置根文件系统的大小
此命令将使用SSH连接到实例并远程执行expand-root.sh程序。
gcloud compute ssh instance-1 --zone us-east4-c --command "sudo expand-root.sh /dev/sda 1 ext4"
gcloud计算ssh的文档。
第4步-验证尺寸
on VM实例上的最后一个"df"命令显示新的根文件系统是30GB(30896016个块)。
Filesystem 1K-blocks Used Available Use% Mounted on
udev 292220 0 292220 0% /dev
tmpfs 60672 3180 57492 6% /run
/dev/sda1 30896016 1663296 27853564 6% /
tmpfs 303352 0 303352 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 303352 0 303352 0% /sys/fs/cgroup
这是@John Hanley文档的完整博客链接。
我已经在服务器故障社区发布了我的解决方案。我希望这对某人有帮助。https://serverfault.com/a/1119504/450511