手把手教你给 CentOS 7 添加硬盘及扩容(LVM)

前言

LVM基本组成

LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。通过LVM,你可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,无需担心某个硬盘上没有足够的连续空间。

LVM的基本组成块(building blocks)如下:

  1. 物理卷 Physical volume (PV) :可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)

  2. 卷组 Volume group (VG) :将一组物理卷收集为一个管理单元

  3. 逻辑卷 Logical volume (LV) :虚拟分区,由物理区域

  4. 物理区域 Physical extent (PE) :硬盘可供指派给逻辑卷的最小单位(通常为4MB)

lvm-volume

LVM 优点

比起正常的硬盘分区管理,LVM更富于弹性:

  1. 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘

  2. 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区

  3. 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小

  4. 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间

  5. 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作,LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。

  6. 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。

  7. 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。

添加一块物理硬盘

添加一块硬盘(60GB)到系统中,并让系统识别它,具体步骤参考 不重启添加硬盘

使用 fdisk -l 命令查看到这块新盘为 /dev/sdb

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
[root@node2 ~]# fdisk -l #查看硬盘
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000dda69

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 8e Linux LVM

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

磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/sdb:64.4 GB, 64424509440 字节,125829120 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

对新盘分区

使用 fdisk 命令对新盘进行分区,这里建立了一个主分区 /dev/sdb1 ,大小 8GB,最后使用 partprobe 命令重新读取分区表,命令记录如下:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
[root@node2 ~]# fdisk /dev/sdb #对 /dev/sdb 执行分区操作
欢迎使用 fdisk (util-linux 2.23.2)。

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

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

命令(输入 m 获取帮助):m # 输入 m 获取帮助
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

命令(输入 m 获取帮助):n # 输入 n 添加新的物理分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # 输入 p 选择主分区类型
分区号 (1-4,默认 1): # 默认
起始 扇区 (2048-125829119,默认为 2048): # 默认
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-125829119,默认为 125829119): # 默认
将使用默认值 125829119
分区 1 已设置为 Linux 类型,大小设为 60 GiB

命令(输入 m 获取帮助):t # 输入 t 修改分区 id
已选择分区 1
Hex 代码(输入 L 列出所有代码):L # 输入 L 查看所有 ID

0 空 24 NEC DOS 81 Minix / 旧 Linu bf Solaris
1 FAT12 27 隐藏的 NTFS Win 82 Linux 交换 / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏的 C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC
11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq 诊断 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f2 DOS 次要
16 隐藏的 FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fd Linux raid 自动
1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fe LANstep
1c 隐藏的 W95 FAT3 75 PC/IX be Solaris 启动 ff BBT
1e 隐藏的 W95 FAT1 80 旧 Minix
Hex 代码(输入 L 列出所有代码):8e # 输入 8e 修改分区为 Linux LVM 类型
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):w # 输入 w 将修改写入磁盘
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
# 分区结束
[root@node2 ~]# partprobe # 使用 partprobe 命令重新读取分区表
[root@node2 ~]# fdisk -l # 查看修改后的结果

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

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 8e Linux LVM

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


磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


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

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 125829119 62913536 8e Linux LVM
[root@node2 ~]#

创建物理卷(PV)

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
[root@node2 ~]# pvdisplay # 创建新物理卷前查看 PV
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4994
Free PE 10
Allocated PE 4984
PV UUID ypckOI-BXmZ-J6Cp-jIbY-Gn2m-D7yr-2s1o68

[root@node2 ~]# pvcreate /dev/sdb1 # 创建 PV
Physical volume "/dev/sdb1" successfully created.
[root@node2 ~]# pvdisplay # 再次查看,可看到新的 PV
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4994
Free PE 10
Allocated PE 4984
PV UUID ypckOI-BXmZ-J6Cp-jIbY-Gn2m-D7yr-2s1o68

"/dev/sdb1" is a new physical volume of "60.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 60.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID NE729N-o2N6-dc8o-dryH-drZx-ql8c-A9MGlH

[root@node2 ~]#

将PV加入卷组(VG)

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
[root@node2 ~]# vgdisplay # 查看卷组,可用 PE 为 10 个
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 19.51 GiB
PE Size 4.00 MiB
Total PE 4994
Alloc PE / Size 4984 / 19.47 GiB
Free PE / Size 10 / 40.00 MiB
VG UUID pQd8HL-4SpW-36rY-oQoF-wIcL-8vXl-BTjQTz

[root@node2 ~]# vgextend centos /dev/sdb1 # 将新的 PV 加入 centos 组卷
Volume group "centos" successfully extended
[root@node2 ~]# vgdisplay # 查看 VG 信息,可用 PE 为 15369 个
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 79.50 GiB
PE Size 4.00 MiB
Total PE 20353
Alloc PE / Size 4984 / 19.47 GiB
Free PE / Size 15369 / 60.04 GiB
VG UUID pQd8HL-4SpW-36rY-oQoF-wIcL-8vXl-BTjQTz

创建逻辑卷(LV)

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[root@node2 ~]# lvdisplay # 先查看 LV 信息
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID 2Dhfs3-Vl5T-wJft-5KCe-Rhwv-3rmv-olue6A
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1

--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID kzgrfG-vO3b-ehtS-Ydxx-92jK-ol2T-l7NJw7
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 1
LV Size 17.47 GiB
Current LE 4472
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0

[root@node2 ~]# lvcreate -L 40G -n aurthur centos # 创建了一个新的 LV,并起名 aurthur
Logical volume "aurthur" created.
[root@node2 ~]# lvdisplay # 查看创建新 LV 后的相关信息,多了 /dev/centos/aurthur LV
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID 2Dhfs3-Vl5T-wJft-5KCe-Rhwv-3rmv-olue6A
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1

--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID kzgrfG-vO3b-ehtS-Ydxx-92jK-ol2T-l7NJw7
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 1
LV Size 17.47 GiB
Current LE 4472
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0

--- Logical volume ---
LV Path /dev/centos/aurthur
LV Name aurthur
VG Name centos
LV UUID GemtcP-9beI-Cao9-oJ3a-p1oD-ee3e-THh5Bd
LV Write Access read/write
LV Creation host, time node2, 2017-01-07 21:20:13 +0800
LV Status available
# open 0
LV Size 40.00 GiB
Current LE 10240
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2

[root@node2 ~]# vgdisplay # 查看一下 VG ,可用 PE 仅剩 5129 个
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 79.50 GiB
PE Size 4.00 MiB
Total PE 20353
Alloc PE / Size 15224 / 59.47 GiB
Free PE / Size 5129 / 20.04 GiB
VG UUID pQd8HL-4SpW-36rY-oQoF-wIcL-8vXl-BTjQTz

格式化逻辑卷(LV)并挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@node2 ~]# mkfs.xfs /dev/centos/aurthur # 格式化新 LV
meta-data=/dev/centos/aurthur isize=512 agcount=4, agsize=2621440 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=10485760, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=5120, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

[root@node2 ~]# mkdir /data # 新建挂载点
[root@node2 ~]# mount -t xfs /dev/centos/aurthur /data # 将已格式化的 LV 挂在到 /data 上
[root@node2 ~]# df -Th # 查看挂载后的信息
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 18G 1.5G 17G 9% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 169M 329M 34% /boot
tmpfs tmpfs 783M 0 783M 0% /run/user/0
/dev/mapper/centos-aurthur xfs 40G 33M 40G 1% /data

设置开机自动挂载

编辑 /etc/fstab 文件,加入一行

1
/dev/centos/aurthur     /data                   xfs     defaults        1 2

用命令查看是否有错

1
2
3
4
5
[root@node2 ~]# mount -fav
/ :已忽略
/boot :已经挂载
swap :已忽略
/data :已经挂载

逻辑卷(LV)扩容

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
[root@node2 ~]# lvextend -l +100%FREE /dev/centos/aurthur # 用 lvextend 将 /dev/centos/aurthur 所在卷组所有剩余空间都分配给了它
Size of logical volume centos/aurthur changed from 40.00 GiB (10240 extents) to 60.04 GiB (15369 extents).
Logical volume centos/aurthur successfully resized.
[root@node2 ~]# xfs_growfs /dev/centos/aurthur # 用 xfs_growfs 对扩容后的 LV 进行 xfs 格式大小调整,Centos 6 使用 resize2fs
meta-data=/dev/mapper/centos-aurthur isize=512 agcount=4, agsize=2621440 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=10485760, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5120, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10485760 to 15737856

[root@node2 ~]# vgdisplay # 查看卷组信息,可用 PE 已经为 0 个
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 7
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 2
Act PV 2
VG Size 79.50 GiB
PE Size 4.00 MiB
Total PE 20353
Alloc PE / Size 20353 / 79.50 GiB
Free PE / Size 0 / 0
VG UUID pQd8HL-4SpW-36rY-oQoF-wIcL-8vXl-BTjQTz
[root@node2 ~]# lvdisplay # 查看 LV 信息,/dev/centos/aurthur 已扩大为 60.04 G
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID 2Dhfs3-Vl5T-wJft-5KCe-Rhwv-3rmv-olue6A
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1

--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID kzgrfG-vO3b-ehtS-Ydxx-92jK-ol2T-l7NJw7
LV Write Access read/write
LV Creation host, time node1, 2017-01-05 16:22:47 +0800
LV Status available
# open 1
LV Size 17.47 GiB
Current LE 4472
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0

--- Logical volume ---
LV Path /dev/centos/aurthur
LV Name aurthur
VG Name centos
LV UUID GemtcP-9beI-Cao9-oJ3a-p1oD-ee3e-THh5Bd
LV Write Access read/write
LV Creation host, time node2, 2017-01-07 21:20:13 +0800
LV Status available
# open 1
LV Size 60.04 GiB
Current LE 15369
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2

[root@node2 ~]# df -Th # 查看挂载信息,/data 容量已扩大为 60 G
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 18G 1.5G 17G 9% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 169M 329M 34% /boot
tmpfs tmpfs 783M 0 783M 0% /run/user/0
/dev/mapper/centos-aurthur xfs 61G 33M 60G 1% /data