Linux 磁盘管理 xfs文件系统扩容

XFS是一个开源的(GPL)日志文件系统,最初由硅谷图形(SGI)开发,现在大多数的Linux发行版都支持。事实上,XFS已被最新的CentOS/RHEL 7采用,成为其默认的文件系统。在其众多的特性中,包含了“在线调整大小”这一特性,使得现存的XFS文件系统在已经挂载的情况下可以进行扩展。然而,对于XFS文件系统的缩减却还没有支持。

一、裸磁盘扩容

裸磁盘扩容(Linux)
裸磁盘是指未进行分区的云硬盘,即创建的云硬盘挂至主机后,直接对磁盘进行格式化进行使用,用户可通过对硬盘扩容容量后,进入操作系统对裸磁盘进行扩容操作。

1.查看磁盘信息:判断裸磁盘

/dev/sdb 是一个 100G 的、没有分过区、直接格式化成 xfs 文件系统挂载使用的”裸磁盘”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看磁盘信息,没有分区信息
$ fdisk -l /dev/sdb

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

# /dev/sdb 磁盘没有分过区,直接挂载使用的,属于 “裸磁盘”

$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk /data

# 查看文件系统
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb xfs 100G 33M 100G 1% /data # /dev/sdb 挂载点

2.vCenter 扩容裸磁盘

这边是用VMware 虚拟机进行测试

重启操作系统后,查看 /dev/sdb 容量已增加到 200G

1
2
3
4
5
6
$ fdisk -l /dev/sdb

Disk /dev/sdb: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

xfs 文件系统还未扩容。

1
2
3
4
5
6
7
8
9
10
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb xfs 100G 33M 100G 1% /data # xfs 文件系统还未扩容

3.xfs 文件系统扩容

xfs 文件系统的磁盘不需要卸载挂载点,可以在线扩容,注意查看 blocks 数量是否增加。

1
2
3
4
5
6
7
8
9
10
11
$ xfs_growfs /data
meta-data=/dev/sdb isize=512 agcount=4, agsize=6553600 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=26214400, imaxpct=25 # 26214400 还是 100G 的 blocks 数量
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12800, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 26214400 to 52428800 # 提示信息,blocks 数量增加了!

4.扩容完验证:

1
2
3
4
5
6
7
8
9
10
11
# 查看挂载点容量
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb xfs 200G 33M 200G 1% /data # 200G 扩容成功!

二、单分区磁盘扩容

单分区磁盘是指磁盘在扩容之前已被挂载过虚拟机且只划分过 1 个分区,用户可通过对硬盘扩容容量后,进入操作系统对单分区磁盘进行分区扩容操作。单分区扩容在 Linux 及 Windows 操作系统上的操作不同,本章节为 Linux 单分区扩容操作指南。.

对两种分区表操作扩容(MBR 分区表、GPT 分区表)操作不同。

  • MBR 分区表请使用fdisk分区,GPT 分区表请使用 gdisk 工具分区。
  • fdisk 只能对 2T 以下的磁盘进行分区操作,大于 2T 用gdisk, parted

(一) 单分区磁盘扩容1:MBR分区表(<2T)

1.确认磁盘是MBR分区表

1
2
3
4
5
6
7
8
9
10
11
$ fdisk -l /dev/sdb

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos # MBR 分区格式
Disk identifier: 0x95728ed5

Device Boot Start End Blocks Id System
/dev/sdb1 2048 209715199 104856576 83 Linux # 只有1个分区

2.查看当前磁盘的信息,包括挂载点、文件系统类型及分区情况;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part /data # 分区1

$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb1 xfs 100G 33M 100G 1% /data # 挂载点

3.vCenter 扩容单分区磁盘

前面有讲过,这边省略
注释 fstab 的开机挂载选项,然后重启操作系统。

1
2
3
4
5
6
7
8
9
10
11
fdisk -l /dev/sdb

Disk /dev/sdb: 214.7 GB, 214748364800 bytes, 419430400 sectors # 磁盘容量变成200G了
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x95728ed5

Device Boot Start End Blocks Id System
/dev/sdb1 2048 209715199 104856576 83 Linux

4.重新创建单分区

  • 先删除 /dev/sdb1 分区,再重新创建 /dev/sdb1 分区。
  • 删除分区不会造成磁盘内数据丢失。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.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 # 删除分区
Selected partition 1
Partition 1 is deleted

Command (m for help): n # 创建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-419430399, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399): # 末扇区是 200G容量的扇区数量
Using default value 419430399
Partition 1 of type Linux and of size 200 GiB is set # 已识别到200G分区

Command (m for help): wq
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

5.fs 文件系统扩容

xfs 文件系统,则先执行 xfs_repair 检查文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
...
...
...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

# 查看分区
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 200G 0 disk
└─sdb1 8:17 0 200G 0 part

打开 fstab 的开机自启动挂载注释,使用 mount -a 重新挂载磁盘。

最后执行 xfs_growfs 在文件系统级别对磁盘分区进行最后的扩容操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ xfs_growfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6553536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=26214144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 26214144 to 52428544 # blocks 数量增加
# 验证是否成功
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb1 xfs 200G 33M 200G 1% /data # 200G 扩容成功

(二)单分区磁盘扩容2:GPT分区表(>2T)

当一块磁盘的容量大于 2TB 时,在 linux 下无法通过 fdisk 工具命令对对进行分区,需通过 parted 命令进行分区及扩容操作。

1.查看磁盘信息:判断GPT格式单分区磁盘

fdisk 无法操作 gpt 分区表格是的磁盘,因此要使用 parted 命令来查看分区表格式。

因此 /dev/sdb 是 gpt 分区格式的 100G 单分区磁盘,仅有一个分区 /dev/sdb1,文件系统挂载点是 /data

1
2
3
4
5
6
7
8
9
$ parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt # 分区表格式:gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 107GB 107GB xfs Linux filesystem

2.查看当前磁盘的信息,包括挂载点、文件系统类型及分区情况;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看磁盘有几个分区
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part /data # 只有1个分区

#查看文件系统
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv xfs 39G 2.1G 37G 6% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb1 xfs 100G 33M 100G 1% /data # 挂载点,容量100G

3.vCenter 扩容单分区磁盘

前面有讲过,这边省略
注释 fstab 的开机挂载选项,然后重启操作系统。

1
2
3
4
5
6
7
8
9
$ parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 215GB # 磁盘已扩容到200G
Sector size (logical/physical): 512B/512B
Partition Table: gpt # 分区表格式
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 107GB 107GB xfs Linux filesystem # 文件系统下还是100G

4.重新创建单分区

对离线状态的 /dev/sdb1 分区,使用 parted 命令删除原来分区并创建新分区,删除当前分区不会造成磁盘内数据丢失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 开始重新创建单分区
$ parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s # 将显示和操纵单位变成 sector 扇区

# 先按 p 查看磁盘下是仅有一个分区 1,容量目前看到的是 100G
(parted) p
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 419430400s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

# 注意这里起始扇区是从 2048s 开始的
Number Start End Size File system Name Flags
1 2048s 209715166s 209713119s xfs Linux filesystem

# 删除分区 1
(parted) rm 1

# 创建分区
(parted) mkpart
Partition name? []? # 分区名称
File system type? [ext2]? xfs # 文件系统类型
Start? 2048s # 起始扇区,仍然也是从2048s 开始
End? 100% # 结束扇区,这里使以百分比的形式使用余量所有扇区

# 查看
(parted) p
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 419430400s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
# 结束扇区数量增加了!
Number Start End Size File system Name Flags
1 2048s 419428351s 419426304s xfs

# 退出分区操作
(parted) q
Information: You may need to update /etc/fstab.

5.xfs 文件系统扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 挂载
$ mount /dev/sdb1 /data

# xfs文件系统扩容
$ xfs_growfs /data
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6553535 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=26214139, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 26214139 to 52428280

查看扩容成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 215GB 215GB xfs

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.8M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/root_vg-root_lv 39G 2.1G 37G 6% /
/dev/sda1 1014M 194M 821M 20% /boot
tmpfs 379M 0 379M 0% /run/user/0
/dev/sdb1 200G 33M 200G 1% /data

三、多分区磁盘扩容

查看硬盘分区

1
2
3
4
5
6
7
8
9
10
11
12
fdisk -l

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b8f71

Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 83886079 40893440 83 Linux

1、系统盘扩容

不同磁盘类型,遵循不同的磁盘扩容规则:

1.1 虚拟机上直接修改配置

有快照的虚拟机不支持扩容

1.2 系统内扩容步骤

步骤1:安装growpart
Cloud-init支持版镜像中已默认安装growpart,其余版本需要自行安装,过程如下:

CentOS:

1
2
3
yum install -y epel-release
yum install -y cloud-utils

Ubuntu:

1
2
sudo apt-get install cloud-initramfs-growroot

步骤2:扩容分区表

1
2
3
LANG=en_US.UTF-8
growpart /dev/sda 2

CentOS6和Debian8,可能会遇到内核以及工具链不支持热重载分区表的情况,如遇此情况,扩容分区表后需重启一次操作系统。

步骤3:扩容文件系统

1
2
3
resize2fs /dev/sda2 (ext4文件系统)
xfs_growfs /dev/vda1 (xfs文件系统) 或xfs_growfs /

步骤4:确认
查看是否扩容完成:

1
df -TH

2、数据盘扩容

2.1 系统内扩容步骤

查看数据盘的文件系统类型(升级操作需要针对ext4和xfs两种文件系统采取不同的操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
df -ihT
Filesystem Type Inodes IUsed IFree IUse% Mounted on
devtmpfs devtmpfs 472K 354 471K 1% /dev
tmpfs tmpfs 474K 1 474K 1% /dev/shm
tmpfs tmpfs 474K 545 474K 1% /run
tmpfs tmpfs 474K 16 474K 1% /sys/fs/cgroup
/dev/sda2 xfs 20M 196K 20M 1% /
/dev/sda1 xfs 512K 334 512K 1% /boot
tmpfs tmpfs 474K 1 474K 1% /run/user/0


# 针对ext4文件格式的操作系统(如CentOS6)
e2fsck -f /dev/vdb
resize2fs /dev/vdb
CopyErrorSuccess
# 针对xfs文件格式的操作系统(如CentOS7)
xfs_repair /dev/vdb
xfs_growfs /data

参考资料