Linux在线扩容磁盘空间

2021/4/14 linuxLVM

# 前言

现在使用Linux各类发现版本的系统时,基本都用到了LVM(Logical Volume Manager)技术,它的优点就是对服务器存储介质管理方便,可以在任何时候对数据卷大小进行调整,下面我们就针对不同的情况进行介绍。

# 新增磁盘扩容

在现有服务器上,增加一个物理卷,通过LVM扩容现有分区。

# 查看现有分区情况

# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/cl00-root   18G  2.5G   15G   15% /
devtmpfs               482M     0  482M    0% /dev
tmpfs                  493M     0  493M    0% /dev/shm
tmpfs                  493M  6.8M  486M    2% /run
tmpfs                  493M     0  493M    0% /sys/fs/cgroup
/dev/sda1              227M  108M  104M   51% /boot
tmpfs                   99M     0   99M    0% /run/user/0
1
2
3
4
5
6
7
8
9

我们这里计划针对/根目录进行扩容。

# 查看现有磁盘情况

# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d9e82

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      489471      243712   83  Linux
/dev/sda2          489472     4395007     1952768   82  Linux swap / Solaris
/dev/sda3         4395008    41943039    18774016   8e  Linux LVM

磁盘 /dev/mapper/cl00-root:19.2 GB, 19222495232 字节,37543936 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

可以看到,现有一块物理卷/dev/sda,后面我们增加一块物理卷进行存储空间的扩容。

# 添加一个物理卷

这里就忽略添加操作,虚拟机或存储设备的添加操作可以后面有空再进行介绍。

添加了一个5GB的物理卷,添加物理卷后查看:

# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d9e82

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      489471      243712   83  Linux
/dev/sda2          489472     4395007     1952768   82  Linux swap / Solaris
/dev/sda3         4395008    41943039    18774016   8e  Linux LVM

磁盘 /dev/mapper/cl00-root:19.2 GB, 19222495232 字节,37543936 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

可以看到系统没有看到我们添加的物理卷,这个根据实际情况会有所不一样,因为在不同的虚拟化平台或者存储设备,有的添加完成后就可以看到,有的则无法看见。

如果无法发现我们添加的物理卷怎么办?我们可以通过重新扫描存储设备来发现新增加的物理卷。

# ls /sys/class/scsi_host/host
host0/ host1/ host2/ 
1
2

上面发现有几个host,则需要进行如下操作:

# echo "- - -" >/sys/class/scsi_host/host0/scan
# echo "- - -" >/sys/class/scsi_host/host1/scan
# echo "- - -" >/sys/class/scsi_host/host2/scan
1
2
3

再去查看下现有磁盘情况。

# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d9e82

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      489471      243712   83  Linux
/dev/sda2          489472     4395007     1952768   82  Linux swap / Solaris
/dev/sda3         4395008    41943039    18774016   8e  Linux LVM

磁盘 /dev/mapper/cl00-root:19.2 GB, 19222495232 字节,37543936 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区 # <=== 这里就是我们增加的新物理卷
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

此时我们就可以看到/dev/sdb这个我们新增加的物理卷,下面就开始进行LVM操作。

通过fdisk命令将新增加的物理卷进行分区;

# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x0d4f3248 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d4f3248

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
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
44

可以看到新建了一个/dev/sdb1分区,我们使用这个分区空间来进行扩容。

# 创建PV

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sda3  cl00 lvm2 a--  17.90g    0 
  /dev/sdb1       lvm2 ---   5.00g 5.00g
1
2
3
4
5
6

# 扩容现有VG

先查看/根目录在哪个VG,通过查找目录、LVVG的对应关系找到需要扩容的VG

# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/cl00-root   18G  2.5G   15G   15% /
devtmpfs               482M     0  482M    0% /dev
tmpfs                  493M     0  493M    0% /dev/shm
tmpfs                  493M  6.8M  486M    2% /run
tmpfs                  493M     0  493M    0% /sys/fs/cgroup
/dev/sda1              227M  108M  104M   51% /boot
tmpfs                   99M     0   99M    0% /run/user/0
# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl00 -wi-ao---- 17.90g                                                    
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  cl00   1   1   0 wz--n- 17.90g    0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

扩容cl00这个VG

# vgextend cl00 /dev/sdb1
  Volume group "cl00" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  cl00   2   1   0 wz--n- 22.90g 5.00g
1
2
3
4
5

可以看到cl00这个VG已经扩容了5GB空间。

# 扩容LV

# lvextend -l +100%FREE /dev/mapper/cl00-root 
  Size of logical volume cl00/root changed from 17.90 GiB (4583 extents) to 22.90 GiB (5862 extents).
  Logical volume cl00/root successfully resized.
# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl00 -wi-ao---- 22.90g 
1
2
3
4
5
6

可以看到已经将cl00-root这个LV扩容至23GB。

# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/cl00-root   18G  2.5G   15G   15% /
devtmpfs               482M     0  482M    0% /dev
tmpfs                  493M     0  493M    0% /dev/shm
tmpfs                  493M  6.8M  486M    2% /run
tmpfs                  493M     0  493M    0% /sys/fs/cgroup
/dev/sda1              227M  108M  104M   51% /boot
tmpfs                   99M     0   99M    0% /run/user/0
1
2
3
4
5
6
7
8
9

但是查看/根目录空间没有增加,到这里还没有结束操作,还需要对增长的LV空间进行格式化文件系统才能够识别到增加的空间。

# 格式化LV增长的空间

首先需要查看文件系统格式。ext格式使用resize2fs命令进行格式化,xfs格式使用xfs_growfs命令。

# df -Th /
文件系统              类型  容量  已用  可用 已用% 挂载点
/dev/mapper/cl00-root ext4   23G  2.5G   19G   12% /
1
2
3

这里可以看到系统文件格式类型为ext4

# resize2fs /dev/mapper/cl00-root 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/cl00-root is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/mapper/cl00-root is now 6002688 blocks long.

[root@centos-temp ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/cl00-root   23G  2.5G   19G   12% /
devtmpfs               482M     0  482M    0% /dev
tmpfs                  493M     0  493M    0% /dev/shm
tmpfs                  493M  6.8M  486M    2% /run
tmpfs                  493M     0  493M    0% /sys/fs/cgroup
/dev/sda1              227M  108M  104M   51% /boot
tmpfs                   99M     0   99M    0% /run/user/0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

到此,/根目录已经成功扩容至23GB容量,期间也没有重启服务器,不影响正常业务。

# 现有磁盘扩容

有时,我们并不想给服务器增加过多的物理卷,而是通过扩容现有的物理卷来实现对系统目录的容量增加。

# 增加现有物理卷容量

# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d9e82

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      489471      243712   83  Linux
/dev/sda2          489472     4395007     1952768   82  Linux swap / Solaris
/dev/sda3         4395008    41943039    18774016   8e  Linux LVM

磁盘 /dev/mapper/cl00-root:24.6 GB, 24587010048 字节,48021504 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d4f3248

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM
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

添加物理卷容量后没有看到/dev/sdb空间增加,还是老样子,刷新磁盘。

# ls /sys/class/scsi_host/host
host0/ host1/ host2/ 

# echo "- - -" >/sys/class/scsi_host/host0/scan
# echo "- - -" >/sys/class/scsi_host/host1/scan
# echo "- - -" >/sys/class/scsi_host/host2/scan
1
2
3
4
5
6
# fdisk -l

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d4f3248

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d9e82

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      489471      243712   83  Linux
/dev/sda2          489472     4395007     1952768   82  Linux swap / Solaris
/dev/sda3         4395008    41943039    18774016   8e  Linux LVM

磁盘 /dev/mapper/cl00-root:24.6 GB, 24587010048 字节,48021504 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
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

看到/dev/sdb磁盘已经扩容到10GB,下面在该磁盘下再增加一个分区。

# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (10485760-20971519,默认为 10485760):
将使用默认值 10485760
Last 扇区, +扇区 or +size{K,M,G} (10485760-20971519,默认为 20971519):
将使用默认值 20971519
分区 2 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
分区号 (1,2,默认 2):
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d4f3248

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM
/dev/sdb2        10485760    20971519     5242880   8e  Linux LVM

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
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
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
44
45
46
47
# fdisk -l /dev/sdb

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0d4f3248

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM
/dev/sdb2        10485760    20971519     5242880   8e  Linux LVM
1
2
3
4
5
6
7
8
9
10
11
12

看到增加了一个/dev/sdb2分区,下面的步骤就和上面的一样操作,使用新增加的分区创建PV,扩展VGLV就可以了。