一、LVM 磁盘分区基础

1.LVM 分区工作原理

LVM 的做法是将几个实体的 Partitions 分区或 Disk 磁盘通过软件组合成为一块看起来是独立的大磁盘 VG,然后将这块大磁盘再经过分区成为可使用分区槽 LV, 最终就能够挂载使用了。

2.LVM 分区特点

  • 可以弹性的调整 Filesystem 文件系统的容量。
  • 可以整合多个实体分区在一起,让这些分区看起来就像是一个磁盘一样。
  • 可以在未来从这个LVM管理的磁盘当中新增或移除实体分区。

3.LVM 分区的几个关键字

PV (Physical Volume) 实体滚动条:

  • PV 是组成 LVM 分区前我们的真实存在的物理分区。
  • 需要用 gdisk 调整系统标识符 system ID 成为 8e (LVM 的磁盘类型ID是8e00)。
  • 再经过 pvcreate 的指令将他转成 LVM 最底层的实体滚动条 PV ,之后才能够将这些 PV 加以利用。

VG (Volume Group) 滚动条群组:

  • VG 是由 PV 组成以后的 LVM 大磁盘。
  • 这个大磁盘的容量取决于 PE 的数量。
  • 我们后面要格式化使用的文件系统就是从这个 VG 上割出来格式化使用的。

PE (Physical Extent) 实体范围区块:

  • PE 是 LVM 分区的最小存储单元块,相当于磁盘的 block。预设值为 4MB。
  • 32bit 系统:PE=4MB,PE 数量最多为 65534,即 VG 最大等于 256G。
  • 64bit 系统:推荐 PE=16M,VG 的上限没有限制。

LV (Logical Volume) 逻辑滚动条:

  • LV 是由 VG 切割出来,用于格式化成文件系统的分区。
  • LV 的文件名通常为 /dev/vgname/lvname

4.LVM 分区的两种写入模式

  • linear 线性模式:假如我将 /dev/vda1, /dev/vdb1 这两个Partition 分区加入到 VG 当中,并且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/vda1 的容量用完之后,/dev/vdb1 的硬盘才会被使用到,这也是我们所建议的模式。

  • triped 交错模式:那什么是交错模式?就是我将一笔数据拆成两部分,分别写入 /dev/vda1 与 /dev/vdb1 的意思,感觉上有点像 RAID 0 !如此一来,一份数据用两颗硬盘来写入,理论上读写的效能会比较好。

LVM 默认的读写模式是线性模式,如果使用 triped 模式,当任何一个 Partition 故障时,所有的数据都会损毁!

5、LVM 磁盘分区三个阶段

1.LVM 各阶段命令总结表

任务 PV 阶段 VG 阶段 LV 阶段 Filesystem(xfs / ext4)
搜寻(scan) pvscan vgscan lvscan lsblk, blkid
建立(create) pvcreate vgcreate lvcreate mkfs.xfs, mkfs.ext4
查看(display) pvdisplay vgdisplay lvdisplay df, mount
增加(extend) vgextend lvextend (lvresize) xfs_growfs, resize2fs
减少(reduce) vgreduce lvreduce (lvresize) 不支援,resize2fs
删除(remove) pvremove vgremove lvremove umount, 重新格式化
改变容量(resize) lvresize xfs_growfs, resize2fs
改变属性(attribute) pvchange vgchange lvchange /etc/fstab, remount

2.LVM 分区三个阶段说明

PV 阶段:

  • pvcreate 将实体分区 Partition 建立成为 PV
  • pvscan 搜寻目前系统里面任何具有 PV 的磁盘
  • pvdisplay 显示出目前系统上面的 PV 状态
  • pvremove 将 PV 属性移除,让该分区 Partition 不具备 PV 属性

VG 阶段:

  • vgcreate 建立 VG
  • vgscan 搜寻系统上面是否有 VG 存在
  • vgdisplay 显示目前系统上面的 VG 状态
  • vgextend 在 VG 内增加额外的 PV
  • vgreduce 在 VG 内移除 PV
  • vgchange 设定 VG 是否启动 active
  • vgremove 删除一个 VG

LV 阶段:

  • lvcreate 建立 LV
  • lvscan 查询系统上面的 LV
  • lvdisplay 显示系统上面的 LV 状态
  • lvextend 在 LV 里面增加容量
  • lvreduce 在 LV 里面减少容量
  • lvremove 删除一个 LV
  • lvresize 对 LV 进行容量大小的调整

二、创建 LVM 磁盘分区

1.磁盘分区

1.1. 挂载100G数据盘

为虚拟机挂载一块 100G 的数据盘,创建 GPT 格式的磁盘分区表,LVM 格式的磁盘ID。

1.2 .使用 gdisk 分区工具交互式操作磁盘分区

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
$ gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present

Creating new GPT entries.

# 查看交互式菜单
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition
i show detailed information on a partition
l list known partition types
n add a new partition
o create a new empty GUID partition table (GPT)
p print the partition table
q quit without saving changes
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit
x extra functionality (experts only)
? print this menu

# 查看 LVM 磁盘分区ID:8e00
Command (? for help): l
0700 Microsoft basic data 0c01 Microsoft reserved 2700 Windows RE
3000 ONIE boot 3001 ONIE config 4100 PowerPC PReP boot
4200 Windows LDM data 4201 Windows LDM metadata 7501 IBM GPFS
7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved
8200 Linux swap 8300 Linux filesystem 8301 Linux reserved
8302 Linux /home 8400 Intel Rapid Start 8e00 Linux LVM # LVM ID
a500 FreeBSD disklabel a501 FreeBSD boot a502 FreeBSD swap
a503 FreeBSD UFS a504 FreeBSD ZFS a505 FreeBSD Vinum/RAID
a580 Midnight BSD data a581 Midnight BSD boot a582 Midnight BSD swap
a583 Midnight BSD UFS a584 Midnight BSD ZFS a585 Midnight BSD Vinum
a800 Apple UFS a901 NetBSD swap a902 NetBSD FFS
a903 NetBSD LFS a904 NetBSD concatenated a905 NetBSD encrypted
a906 NetBSD RAID ab00 Apple boot af00 Apple HFS/HFS+
af01 Apple RAID af02 Apple RAID offline af03 Apple label
af04 AppleTV recovery af05 Apple Core Storage be00 Solaris boot
00 Solaris root bf01 Solaris /usr & Mac Z bf02 Solaris swap
bf03 Solaris backup bf04 Solaris /var bf05 Solaris /home
bf06 Solaris alternate se bf07 Solaris Reserved 1 bf08 Solaris Reserved 2
bf09 Solaris Reserved 3 bf0a Solaris Reserved 4 bf0b Solaris Reserved 5
c001 HP-UX data c002 HP-UX service ea00 Freedesktop $BOOT
eb00 Haiku BFS ed00 Sony system partitio ed01 Lenovo system partit
ef00 EFI System ef01 MBR partition scheme ef02 BIOS boot partition
fb00 VMWare VMFS fb01 VMWare reserved fc00 VMWare kcore crash p
fd00 Linux RAID

Press the <Enter> key to see more codes: q

# 创建 LVM 磁盘分区,这块100G的数据盘只分1个区。
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-209715166, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00 # LVM ID
Changed type of partition to 'Linux LVM'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

告知操作系统磁盘分区表的变化。

1
2
3
4
5
6
7
8
9
$ partprobe -s  
/dev/sda: msdos partitions 1 2
/dev/sdb: gpt partitions 1

# 查看挂载盘分区
$ 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

2.开始创建 LVM

对 /dev/sdb1 分区创建 PV

2.1创建 PV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ pvcreate /dev/sdb1
WARNING: xfs signature detected on /dev/sdb1 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/sdb1.
Physical volume "/dev/sdb1" successfully created.

# 查看 PV
$ pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "<100.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1 # PV 名称
VG Name # 目前并没有属于任何一个 VG
PV Size <100.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID JI5A2a-t1QI-reDu-xcjN-LYww-2vEV-JztpeD

2.2 创建 VG 名称为 data_vg,将分区 /dev/sdb1 纳入该 VG:

  • -s 指定 PE 大小,默认值为 4M
  • /dev/sdb1 需要纳入 VG 的 PV 名称,这里也可以是多个分区如:/dev/sdb{1,2,3}
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
$ vgcreate -s 16M data_vg /dev/sdb1
Volume group "data_vg" successfully created

# 查看 VG
$ vgdisplay data_vg
--- Volume group ---
VG Name data_vg # VG 名称
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 99.98 GiB
PE Size 16.00 MiB # 单个 PE 大小
Total PE 6399 # PE 总数量
Alloc PE / Size 0 / 0 # 已分配的 PE 数量,目前并没有分配
Free PE / Size 6399 / 99.98 GiB # 未分配的 PE 数量
VG UUID n0ptd5-HvHG-nx2c-3xCh-lXyZ-VILG-V2pwJB

2.3 创建 LV:

  • -n:LV 的名称
  • -l:后面可以接 PE 的个数,通过 vgdisplay 查看未分配的 PE 数量来指定。
  • -L:后面接容量,单位可以是 M,G,T 等,要注意的是,最小单位为 PE,因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
1
2
3
4
5
6
# -l 根据未分配 PE 数量来创建 LV
$ lvcreate -l 6399 -n data_lv data_vg
Logical volume "data_lv" created.

# -L 根据容量单位来创建 LV
# $ lvcreate -L 90G -n data_lv data_vg

查看 LV,到这里已经得到了可以进行格式化的 /dev/data_vg/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
# 扫描操作系统下的 LV
$ lvscan
ACTIVE '/dev/data_vg/data_lv' [99.98 GiB] inherit # 刚才创建的 LV
ACTIVE '/dev/myvg/root' [<39.00 GiB] inherit

# 查看 LV
$ lvdisplay /dev/data_vg/data_lv
--- Logical volume ---
LV Path /dev/data_vg/data_lv
LV Name data_lv
VG Name data_vg
LV UUID 0oNsmj-PooR-qjsD-dP6d-FbM4-keLx-Bu0rJB
LV Write Access read/write
LV Creation host, time 1330test, 2022-09-01 17:41:43 +0800
LV Status available
# open 0
LV Size 99.98 GiB
Current LE 6399
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1

3.格式化与挂载 LV

格式化 LV 为 xfs 文件系统格式。

1
2
3
4
5
6
7
8
9
10
$ mkfs.xfs /dev/data_vg/data_lv
meta-data=/dev/data_vg/data_lv isize=512 agcount=4, agsize=6552576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26210304, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12798, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

挂载 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
# 查看 UUID
$ blkid /dev/data_vg/data_lv
/dev/data_vg/data_lv: UUID="16ba12c1-be58-485f-bbbb-62ea9facd1ff" TYPE="xfs"

# fstab 挂载
$ vim /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon Aug 29 06:28:22 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/myvg-root / xfs defaults 0 0
UUID=393c612c-13ed-41ce-b368-90465a19be08 /boot xfs defaults 0 0
UUID=16ba12c1-be58-485f-bbbb-62ea9facd1ff /data xfs defaults 0 0

# 挂载
$ mount -a
# 查看结果

$ lsblk -f /dev/sdb
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
└─sdb1 LVM2_member JI5A2a-t1QI-reDu-xcjN-LYww-2vEV-JztpeD
└─data_vg-data_lv xfs 16ba12c1-be58-485f-bbbb-62ea9facd1ff /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.9M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/myvg-root xfs 39G 2.0G 37G 6% /
/dev/sda1 xfs 1014M 150M 865M 15% /boot
tmpfs tmpfs 379M 0 379M 0% /run/user/0
/dev/mapper/data_vg-data_lv xfs 100G 33M 100G 1% /data # 挂载成功

三、LVM 移除

3.1.LVM 移除流程

LVM 移除流程:

  • 先卸载操作系统上的 LVM 文件系统
  • 使用 lvremove 移除 LV
  • 使用 vgchange -a n VG_NAME 让这个 VG 不具有 Active 的活跃标志
  • 使用 vgremove 移除 VG
  • 使用 pvremove 移除
  • 最后使用 gdisk 修改磁盘 ID 类型为 Linux 普通磁盘分区类型 ID 8300

    3.2.移除 LVM

    从操作系统中取消挂载 LV,并删除 /etc/fstab 中的开机自启动配置。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ umount /dev/mapper/data_vg-data_lv
    # 移除 LV

    $ lvremove /dev/mapper/data_vg-data_lv
    Do you really want to remove active logical volume data_vg/data_lv? [y/n]: y
    Logical volume "data_lv" successfully removed
    #移除 VG

    $ vgremove data_vg
    Volume group "data_vg" successfully removed
    # 移除 PV

    $ pvremove /dev/sdb{1,2}
    Labels on physical volume "/dev/sdb1" successfully wiped.
    Labels on physical volume "/dev/sdb2" successfully wiped.

    3.3.修改 /dev/sdb 磁盘分区 ID 为 8300

    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
    $ gdisk /dev/sdb
    GPT fdisk (gdisk) version 0.8.10

    Partition table scan:
    MBR: protective
    BSD: not present
    APM: not present
    GPT: present

    Found valid GPT with protective MBR; using GPT.

    Command (? for help): ?
    b back up GPT data to a file
    c change a partition's name
    d delete a partition
    i show detailed information on a partition
    l list known partition types
    n add a new partition
    o create a new empty GUID partition table (GPT)
    p print the partition table
    q quit without saving changes
    r recovery and transformation options (experts only)
    s sort partitions
    t change a partition's type code
    v verify disk
    w write table to disk and exit
    x extra functionality (experts only)
    ? print this menu

    Command (? for help): t
    Partition number (1-2): 1
    Current type is 'Linux LVM'
    Hex code or GUID (L to show codes, Enter = 8300): # 默认值
    Changed type of partition to 'Linux filesystem'

    Command (? for help): t
    Partition number (1-2): 2
    Current type is 'Linux LVM'
    Hex code or GUID (L to show codes, Enter = 8300):
    Changed type of partition to 'Linux filesystem'

    Command (? for help): w

    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!

    Do you want to proceed? (Y/N): y
    OK; writing new GUID partition table (GPT) to /dev/sdb.
    The operation has completed successfully.

    # gdisk 删除分区 /dev/sdb 下的两个分区。

    Command (? for help): d
    Partition number (1-9): 9

    Command (? for help): d
    Partition number (1-8): 8

    Command (? for help): d
    Partition number (1-7): 7

    Command (? for help): d
    Partition number (1-6): 6

    Command (? for help): d
    Partition number (1-5): 5

    3.4.删除分区

    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
    $ gdisk /dev/sdb
    GPT fdisk (gdisk) version 0.8.10

    Partition table scan:
    MBR: protective
    BSD: not present
    APM: not present
    GPT: present

    Found valid GPT with protective MBR; using GPT.

    Command (? for help): d
    Partition number (1-2): 2 # 删除 /dev/sdb2

    Command (? for help): d # 删除 /dev/sdb2
    Using 1

    Command (? for help): w # 保存配置

    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!

    Do you want to proceed? (Y/N): y
    OK; writing new GUID partition table (GPT) to /dev/sdb.
    The operation has completed successfully.

    3.5.最后记得通知操作系统磁盘分区表的变化。

    1
    2
    3
    $ partprobe -s
    /dev/sda: msdos partitions 1 2
    /dev/sdb: gpt partitions

四、Demo1:扩容 LVM 数据盘 /data (100G -> 200G)

假设在 Demo1 的 LVM 数据盘 /data 快满了,需要扩容到 200G。

关机虚拟机,将 100G 的挂载盘 /dev/sdb 容量上调到 200G。注意不是新添加硬盘,新添加硬盘当然也可以实现。

4.1 查看信息

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
# 查看磁盘容量
$ fdisk -l

Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 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: 0x00034932

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

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: 0x00000000

# 查看分区容量
$ 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/myvg-root xfs 39G 2.0G 37G 6% /
/dev/sda1 xfs 1014M 150M 865M 15% /boot
/dev/mapper/data_vg-data_lv xfs 100G 33M 100G 1% /data # LV 分区容量还是100G
tmpfs tmpfs 379M 0 379M 0% /run/user/0

4.2.创建 /dev/sdb2 磁盘分区

在 /dev/sdb 磁盘下为刚刚扩容的空间创建第二个分区 /dev/sdb2,有以下几个点仍然需要注意:
(如果已经有2了,那就创建3,以此类推)

  • GPT 分区表类型的磁盘使用 gdisk 磁盘分区工具进行创建分区
  • 现在是扩容磁盘,注意不需要再创建分区表类型了!!
  • /dev/sdb2 的磁盘ID 类型必须为 8e00 (LVM分区ID)
  • 重要:使用 gdisk 分区工具需格外小心,稍作不慎将丢失磁盘所有数据!!!
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
$ gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present

Found valid GPT with protective MBR; using GPT.

# 先查看下当前磁盘的分区
Command (? for help): p
Disk /dev/sdb: 419430400 sectors, 200.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 8F764B92-2199-492F-A3F4-6A90CEF70C05
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 419430366
Partitions will be aligned on 2048-sector boundaries
Total free space is 209717214 sectors (100.0 GiB)

Number Start (sector) End (sector) Size Code Name
1 2048 209715166 100.0 GiB 8E00 Linux LVM # 仅有一个分区1

# 创建新分区
Command (? for help): n
Partition number (2-128, default 2): # 分区编号,默认
First sector (34-419430366, default = 209715200) or {+-}size{KMGTP}: # 起始扇区,默认从未分区部分的首部开始
Last sector (209715200-419430366, default = 419430366) or {+-}size{KMGTP}: # 结束扇区,默认到未分区部分的尾部
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00 # 分区 ID :8e00 是 LVM 格式分区 ID
Changed type of partition to 'Linux LVM'

# 保存写入分区表
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

4.3.告知操作系统磁盘分区表的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ partprobe -s 
/dev/sda: msdos partitions 1 2
/dev/sdb: gpt partitions 1 2
# 查看分区结果。

$ 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 107GB 107GB Linux LVM lvm
2 107GB 215GB 107GB Linux LVM lvm # 第二个分区

# sdb2 分区目前还没做任何动作
$ lsblk /dev/sdb -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
├─sdb1 LVM2_member JI5A2a-t1QI-reDu-xcjN-LYww-2vEV-JztpeD
│ └─data_vg-data_lv xfs 16ba12c1-be58-485f-bbbb-62ea9facd1ff /data
└─sdb2

4.3.扩容 LVM

首先我们要为 /dev/sdb2 创建一个 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
$ pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
扩容 VG

# 先查看操作系统下有哪些 VG
$ vgscan
Reading volume groups from cache.
Found volume group "data_vg" using metadata type lvm2 # 将要扩容的 VG
Found volume group "myvg" using metadata type lvm2

# 扩容 VG
$ vgextend data_vg /dev/sdb2
Volume group "data_vg" successfully extended

# 查看 VG
$ vgdisplay data_vg
--- Volume group ---
VG Name data_vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2 # PV 数量增加了
Act PV 2
VG Size <199.97 GiB # VG 总容量增加了
PE Size 16.00 MiB
Total PE 12798
Alloc PE / Size 6399 / 99.98 GiB
Free PE / Size 6399 / 99.98 GiB # 未分配的 PE 数量增加了
VG UUID n0ptd5-HvHG-nx2c-3xCh-lXyZ-VILG-V2pwJB

扩容 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
# 先扫描确认我们要扩容哪个 LV
$ lvscan
ACTIVE '/dev/data_vg/data_lv' [99.98 GiB] inherit # 要扩容的 LV
ACTIVE '/dev/myvg/root' [<39.00 GiB] inherit

# VG 中未分配的 PE 数量全部分配给 LV
$ lvresize -l +6399 /dev/data_vg/data_lv
Size of logical volume data_vg/data_lv changed from 99.98 GiB (6399 extents) to <199.97 GiB (12798 extents).
Logical volume data_vg/data_lv successfully resized.

# 查看 LV 扩容结果
$ lvdisplay /dev/data_vg/data_lv
--- Logical volume ---
LV Path /dev/data_vg/data_lv
LV Name data_lv
VG Name data_vg
LV UUID 0oNsmj-PooR-qjsD-dP6d-FbM4-keLx-Bu0rJB
LV Write Access read/write
LV Creation host, time 1330test, 2022-09-01 17:41:43 +0800
LV Status available
# open 1
LV Size <199.97 GiB # 容量增加了
Current LE 12798
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1

4.3.文件系统扩容

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 查看 xfs 文件系统的 LV
$ xfs_info /dev/data_vg/data_lv
meta-data=/dev/mapper/data_vg-data_lv isize=512 agcount=4, agsize=6552576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=26210304, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12798, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

# xfs 文件系统扩容!!
$ xfs_growfs /dev/data_vg/data_lv
meta-data=/dev/mapper/data_vg-data_lv isize=512 agcount=4, agsize=6552576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=26210304, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12798, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 26210304 to 52420608 # 数据 block 增加了!!

# 再次查看
$ xfs_info /dev/data_vg/data_lv
meta-data=/dev/mapper/data_vg-data_lv isize=512 agcount=8, agsize=6552576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=52420608, imaxpct=25 # block 数量翻倍
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=12798, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0


# 查看分区容量
$ 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/myvg-root xfs 39G 2.0G 37G 6% /
/dev/sda1 xfs 1014M 150M 865M 15% /boot
/dev/mapper/data_vg-data_lv xfs 200G 33M 200G 1% /data # 分区容量增加了!!!
tmpfs tmpfs 379M 0 379M 0% /run/user/0

参考资料