一时失误买了一个硬盘只有8G的NAT VPS,更坑爹的是商家把其中的4G用作swap,实际可用空间不到4G,上传没几个文件硬盘就满了。swap用4G完全是浪费资源,于是研究了Linux使用fdisk拓展系统分区,成功把swap占用空间加到系统分区。

注意事项

1.  根据本教程操作,存在数据损失的可能性,请先备份数据;

2.  fdisk拓展分区的前提是被合并的分区位于合并分区之后,即 lsblk 有如下输出:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
└─sda1 8:1 0 4G 0 part /           # 需要拓展的分区
└─sda2 8:1 0 1K 0 part             # 被合并分区
└─sda3 8:1 0 4G 0 part [SWAP]      # 被合并分区

注意到被合并分区sda2和sda3都位于需要拓展分区sda1之后,并且中间无其他分区分隔。根据本文操作,是无法将sda1合并到sda3的,会导致系统无法启动和正常运行(也许可以,但本人未找到解决办法)。

Linux系统使用fdisk拓展系统盘分区

因为是小内存的NAT VPS,swap必不可少。要想将swap分区占用的空间腾挪出来,首先要创建新的swap。Linux系统增加swap请参考CentOS 7系统增加swap,以下仅给出操作命令:

fallocate -l 200M /swap   # 创建200M大小的swap
mkswap /swap
chmod 600 /swap
vim /etc/fstab
# 在/etc/fstab增加下面一行
/swap swap swap defaults 0 0
# 启用新创建的swap
swapon /swap
# 禁用原swap分区
swapoff /dev/sda3

接着使用fdisk将swap置换出来的分区合并到系统分区,操作如下:

1. 删除被合并的分区和要拓展的分区,同时创新一个新分区:

root@debian:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Partition number (1,2,3, default 3):

Partition 3 has been deleted.

Command (m for help): d
Partition number (1,2, default 2):

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-16777215, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215):

Created a new partition 1 of type 'Linux' and of size 8 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 设备或资源忙

The kernel still uses the old table. The new table will be used at the next reboot
 or after you run partprobe(8) or kpartx(8).

上述操作的注意点有:

1. 被合并分区首先都要删除,其应位于拓展分区之后,并且中间无其他分区间隔;

2. 拓展分区也要删除,然后再重新创建一个大的分区。创建新分区过程中会提示检测到旧分区,询问是否移除签名。因为我们想保存分区内的数据,请选择否(N)

3. 操作完成后,记得输入w将分区更改写入磁盘。

2. 让新分区生效。可以重启系统,或者使用partprobe工具(Ubuntu/Debian通过apt install parted,CentOS使用yum install parted安装):

root@debian:~# apt install -y parted
root@debian:~# partprobe

3. 新分区生效后,保存数据的情况下 lsblk 输出是原大小:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
└─sda1 8:1 0 4G 0 part /

我们需要resize2fs来拓展所有分区的可用空间:

root@debian:~# resize2fs /dev/sda1
resize2fs 1.43.4 (31-Jan-2017)
/dev/sda1 上的文件系统已被挂载于 /;需要进行在线调整大小

old_desc_blocks = 1, new_desc_blocks = 1
/dev/sda1 上的文件系统现在为 2096896 个块(每块 4k)。

拓展结束后,运行 lsblk 或者 df -h,可以看到分区顺利拓展到了8G:

root@debian:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    8G  0 disk
└─sda1   8:1    0    8G  0 part /

root@debian:~# df -h
文件系统        容量  已用  可用 已用% 挂载点
udev             73M     0   73M    0% /dev
tmpfs            20M  1.4M   19M    7% /run
/dev/sda1       7.9G  3.6G  3.9G   49% /
tmpfs            84M     0   84M    0% /dev/shm
tmpfs           5.0M     0  5.0M    0% /run/lock
tmpfs            84M     0   84M    0% /sys/fs/cgroup
tmpfs            17M     0   17M    0% /run/user/0

并且系统分区的所有数据完整被保留。

参考

  1. Linux查看硬盘信息方法总结
  2. CentOS 7系统增加swap
  3. Increase The Size Of A Linux Root Partition Without Rebooting
  4. How can I resize an ext root partition at runtime?