扩展 Linux 云主机磁盘容量

2024-07-06 ⏳3.1分钟(1.2千字)

我之前跟大家介绍过注册 Oracle 免费云主机的经历。虽说 Oracle 主机的网络很不稳定,但提供对外 10T 流量,算是很大方了。最为可贵的一点是提供最多 200G 的免费磁盘空间,可以存不少数据。我申请了一台 ARM 24C 主机和一台 AMD 主机,各占 50G 磁盘空间。另外 100G 空间一直闲置。今天就试着把 ARM 主机的空间扩展到 150G,后面看看能不能做个下载站。本文梳理整个操作过程,希望能帮到大家。

首先声明一点,数据无价,大家一定要谨慎操作。本文仅仅分享我在自己设备上的实践经验,但不一定就能照搬到读者的实际场景中。请大家一定要小心⚠️

开始我本想着新建一块云盘,做数据盘用。这样的好处是可以跟系统盘隔离,不会因为系统炸了而影响数据。但缺点是无法充分利用系统盘容量。Oracle 要求系统盘最小也得 50G,实际上用个 10G 就差不多了,还会有 40G 的空闲。如果不能充分利用,有点可惜。

但是,Oracle 的免费套餐中只能创建两块磁盘。我已经有两个虚拟机,再创建就得收费了。没办法,只能在原有系统盘做在线扩容。

现在介绍详细的操作步骤。

首先是扩展云盘容量。这一步需要到 Oracle Cloud 后台操作。从你的虚拟机实例找到对应的引导卷 (boot volume),然后点击编辑 (Edit),在卷容量 (Volume size) 中输入空间大小,我是输入 150,单位是 GB。然后点击左下角的保存按钮。

这一步完成后只是提高了底层的云盘物理容量。虚拟机的 Linux 系统并不知道磁盘已经扩容。所以还需要一个重新扫描的动作 (rescan)。Oracle 后台保存后会弹出提示,要我们在 Linux 系统中执行两条命令。

sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan

第一条就是简单地从 /dev/oracleoci/oraclevda 设备中读取一个字节的数据。该命令应该就是让内核刷新一下设备状态。这里的 oraclevda 就是我们云盘。

第二条则是将 1 写入到 /sys/class/block/sda/device/rescan,其目的是让 Linux 系统重新扫描磁盘参数,也就是读取最新的磁盘容量。

完成之后可以通过 lsblk 查看当前的磁盘设备状态:

lsblk
...
sda       8:0    0   150G  0 disk
├─sda1    8:1    0    47G  0 part /
└─sda15   8:15   0    99M  0 part /boot/efi

这里候 sda 的容量已经是 150G 了。但我们的系统盘 sda1 区还是原来的 50G。为此,我们还需要扩展 sda1 分区的最大容量。

大家注意了,这里有 sda15 和 sda1 两个分区。sda15 用来保存 efi 启动信息,通常是在其他分区之前。sda1 是系统分区,排在最后。我们扩充的容量则排在 sda1 分区之后。

+-----+--------------+~~~~~~~~~~~~~~+
|sda15|     sda1     |  free space  |
+-----+--------------+~~~~~~~~~~~~~~+

只有在这种情况下才能扩展 sda1 分区。换句话说,我们只能扩展排在最后面的分区!

在操作之前,请务必确认。这里我使用 fdisk 来查看当前分区信息:

sudo fdisk /dev/sda
...
Command (m for help): p
...
Device      Start       End   Sectors   Size Type
/dev/sda1  206848 314572766 314365919 149.9G Linux filesystem
/dev/sda15   2048    204800    202753    99M EFI System

Partition table entries are not in disk order.

输入 p 命令列出所有分区。我们看到 sda15 分区是从 2048 扇区到 204800 扇区,确实是排在 sda1 之前。但 fdisk 在最后提示说分区表中分区顺序跟磁盘顺序不一致。sda15 明明占据磁盘最前面的空间,但在分区表中却排在 sda1 后面。所以才让我产生疑问。

最后的最后是扩展 sda1 分区容量。不同的文件系统需要使用不同的工具,我用的是 ext4 分区。网上的说法五花八门,这里只分享我验证过的方法:

sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1

growpart 命令是更新分区表信息,使对应的分区可以占满所有相临的可用空间。

resize2fs 是更新 ext4 分区信息,倒对应的分区占满所有磁盘存储空间。

到此整个扩容过程就结束了。使用 df 命令可以看到系统分区已经扩展到 150G🎉整个过程无需重启系统,非常方便。

最后再强调一点,数据无价,请谨慎操作!另外,之前我还写过一篇如何给 QEMU 虚拟磁盘扩容,有兴趣的读者也可以阅读。