LVM

LVM这个词不仅一次出现过,在安装Centos时,磁盘分区时,默认分区就是使用LVM方式分区;再一个就是在OpenStack部署时候用到LVM作为后端存储。对LVM的理解还是不太清晰,查询资料,整理了这篇LVM的博客。

1. LVM的背景

​ Linux用户安装Linux操作系统时遇到的一个最常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具(比如PatitionMagic等),但这都只是暂时解决办法,没有根本解决问题。因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,LogicalVolumeManager)机制就是一个完美的解决方案。

2. LVM简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

​ LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。

​ LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

3. LVM对比传统硬盘存储的优点

1、 统一管理:整合多个磁盘或分区形成一个资源池

2、 灵活性:可以使用不同磁盘、不同分区来组成一个逻辑卷

3、 可伸缩性:逻辑卷和卷组的容量都可以使用命令来扩展或者缩减,且不会影响破坏原有数据,支持磁盘热插拔。

4、 支持热插拔

5、 支持在线数据移动

6、 设备命名方便

7、 镜像卷:可以很方便的做数据镜像

8、 卷快照:把逻辑卷中的数据快照保存到新的逻辑卷进行备份

4. 逻辑分区与逻辑卷的区别

​ 逻辑卷与逻辑分区不是同一概念,逻辑分区容量大小不能改变;逻辑卷容量大小可以改变(基于物理卷和卷组之上的逻辑卷);逻辑卷管理器(LVM)可以更轻松的管理磁盘空间(整合的磁盘池)

5. LVM原理图

Physical volume (PV物理卷)、Volume group (VG卷组)、Logical volume(LV逻辑卷),通过图解更容易读懂物理磁盘、磁盘分区、物理卷、卷组、逻辑卷之间的关系(个人理解,仅供参考)

6. LVM实验过程

6.1 实验过程:

​ 通过LVM技术整合所有的磁盘资源进行分区,然后创建PV物理卷形成一个资源池,再划分卷组,最后在卷组上创建不同的逻辑卷,继而初始化逻辑卷,挂载到系统中使用。

测试环境

内核

LVM1版本需要2.4(包括)以后的内核支持;LVM2需要2.6(包括)以后的内核版本支持。

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@localhost ~]# uname -r
3.10.0-693.el7.x86_64

6.2 硬盘设置

新添加两块磁盘

[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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: 0x0000457f Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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 /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 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 /dev/mapper/centos-root: 18.2 GB, 18249416704 bytes, 35643392 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 /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 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

6.3 磁盘分区

6.3.1 第一块磁盘

[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G
Partition 1 of type Linux and of size 10 GiB is set Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p #主分区
Partition number (2-4, default 2):
First sector (20973568-41943039, default 20973568):
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-41943039, default 41943039):
Using default value 41943039
Partition 2 of type Linux and of size 10 GiB is set Command (m for help): p #第一块磁盘划分两个主分区 Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xfba75d9e Device Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 83 Linux
/dev/sdb2 20973568 41943039 10484736 83 Linux
Command (m for help): t #做LVM管理,需要修改分区类型为Linux LVM
Partition number (1,2, default 2): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xfba75d9e Device Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 8e Linux LVM
/dev/sdb2 20973568 41943039 10484736 8e Linux LVM
Command (m for help): w #保存分区信息
The partition table has been altered! Calling ioctl() to re-read partition table.
Syncing disks.
告诉内核
[root@localhost ~]# partprobe /dev/sdb #更新内核分区表 [root@localhost ~]# ls -l /dev/sdb*
brw-rw----. 1 root disk 8, 16 Oct 13 11:30 /dev/sdb
brw-rw----. 1 root disk 8, 17 Oct 13 11:30 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Oct 13 11:30 /dev/sdb2
[root@localhost ~]#

6.3.2 第二块磁盘

创建一个主分区和一个逻辑分区,用来测试扩展分区和逻辑分区是否能够创建PV物理卷并加入VG卷组,实验证明,扩展分区是无法创建PV和加入VG,主分区和逻辑分区可以。

[root@localhost ~]# fdisk /dev/sdc
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. Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5d61bb7c. Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #主分区
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G
Partition 1 of type Linux and of size 10 GiB is set Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e #扩展分区,要创建扩展分区之后,才能创建逻辑分区;扩展分区只能创建一个,分区表支持创建最多四分主分区,如果想要创建4个以上的分区,必须创建扩展分区,然后创建逻辑分区
Partition number (2-4, default 2):
First sector (20973568-41943039, default 20973568):
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-41943039, default 41943039):
Using default value 41943039
Partition 2 of type Extended and of size 10 GiB is set Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l #创建逻辑分区
Adding logical partition 5
First sector (20975616-41943039, default 20975616):
Using default value 20975616
Last sector, +sectors or +size{K,M,G} (20975616-41943039, default 41943039):
Using default value 41943039
Partition 5 of type Linux and of size 10 GiB is set Command (m for help): p Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 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: 0x5d61bb7c Device Boot Start End Blocks Id System
/dev/sdc1 2048 20973567 10485760 83 Linux
/dev/sdc2 20973568 41943039 10484736 5 Extended
/dev/sdc5 20975616 41943039 10483712 83 Linux Command (m for help): t #修改分区类型
Partition number (1,2,5, default 5): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): t
Partition number (1,2,5, default 5): 2
Hex code (type L to list all codes): 8e You cannot change a partition into an extended one or vice versa.
Delete it first. Type of partition 2 is unchanged: Extended Command (m for help): t
Partition number (1,2,5, default 5): 5
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 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: 0x5d61bb7c Device Boot Start End Blocks Id System
/dev/sdc1 2048 20973567 10485760 8e Linux LVM
/dev/sdc2 20973568 41943039 10484736 5 Extended
/dev/sdc5 20975616 41943039 10483712 8e Linux LVM Command (m for help): w #保存分区表信息
The partition table has been altered! Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe /dev/sdc
[root@localhost ~]# ls -l /dev/sdc*
brw-rw----. 1 root disk 8, 32 Oct 13 11:35 /dev/sdc
brw-rw----. 1 root disk 8, 33 Oct 13 11:35 /dev/sdc1
brw-rw----. 1 root disk 8, 34 Oct 13 11:35 /dev/sdc2
brw-rw----. 1 root disk 8, 37 Oct 13 11:35 /dev/sdc5

6.4 创建PV、VG、LV

6.4.1 创建PV物理卷

[root@localhost ~]# pvcreate /dev/sdc2 #sdc2是扩展分区,无法做成物理卷PV
Device /dev/sdc2 not found (or ignored by filtering).
[root@localhost ~]# pvcreate /dev/sdb1 #把sdb1做成物理卷PV,也可以用下面的写法,一次性把所有主分区或逻辑分区做成物理卷PV
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdb2 /dev/sdc1 /dev/sdc5
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdc5" successfully created.
[root@localhost ~]# pvdisplay #查看物理卷详细信息
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <19.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4863
Free PE 0
Allocated PE 4863
PV UUID 610jgI-z9pr-N5H1-R1Qv-jVMh-cMOD-2VKNm5 "/dev/sdb1" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID l65LfK-FxkO-I8ux-0Lj6-jQB1-ev6d-jl4D8v "/dev/sdc1" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID olFzUh-w2jf-sK32-i4lr-oYHP-zWTf-dKmgYw "/dev/sdc5" is a new physical volume of "<10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc5
VG Name
PV Size <10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 54wYXO-sN3e-Lyc6-2ZQg-YMkH-6khg-TqbKOA "/dev/sdb2" is a new physical volume of "<10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb2
VG Name
PV Size <10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID aqkWHa-RIxf-15Y9-mgLw-x82r-thpL-kxzYhc [root@localhost ~]# pvs #显示所有的物理卷,大小都是10G(分区的时候分配的)
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- 10.00g 10.00g
/dev/sdb2 lvm2 --- <10.00g <10.00g
/dev/sdc1 lvm2 --- 10.00g 10.00g
/dev/sdc5 lvm2 --- <10.00g <10.00g

6.4.2 创建VG卷组

[root@localhost ~]# vgcreate VGtest1 /dev/sdb1 /dev/sdc1 #创建卷组1,卷组的PV物理卷,可以是不同磁盘,即整合了所有磁盘分区做成资源池
Volume group "VGtest1" successfully created
[root@localhost ~]# vgcreate VGtest2 /dev/sdb2 /dev/sdc5 #创建卷组2
Volume group "VGtest2" successfully created
[root@localhost ~]# vgs #显示所有卷组信息
VG #PV #LV #SN Attr VSize VFree
VGtest1 2 0 0 wz--n- 19.99g 19.99g
VGtest2 2 0 0 wz--n- 19.99g 19.99g
centos 1 2 0 wz--n- <19.00g 0
[root@localhost ~]# vgdisplay #查看所有卷组的详细信息
--- 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.00 GiB
PE Size 4.00 MiB
Total PE 4863
Alloc PE / Size 4863 / <19.00 GiB
Free PE / Size 0 / 0
VG UUID FjdwU1-IYgt-Q6r2-uGm7-q1de-g0yh-EsGm64 --- Volume group ---
VG Name VGtest1
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID pk62Bc-lRQW-iXim-VUng-PrIk-s9WR-10uctH --- Volume group ---
VG Name VGtest2
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID XsUyyE-1OSa-Xbno-L0W3-cL3E-XmeH-qb3QWW

6.4.3 创建LV逻辑卷

[root@localhost ~]# lvcreate -n LVtest1 -L 1G VGtest1 #-n表示创建逻辑卷名,-L表示分配逻辑卷的空间大小,VGtest1表示在卷组VGtest1上创建逻辑卷LVtest1
Logical volume "LVtest1" created.
[root@localhost ~]# lvcreate -n LVtest2 -L 1G VGtest2
Logical volume "LVtest2" created.
[root@localhost ~]# lvs #显示逻辑卷的信息(大小为1G,上面分配的)
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 -wi-a----- 1.00g
LVtest2 VGtest2 -wi-a----- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# lvdisplay #显示逻辑卷的详细信息
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID gS0ted-R1jU-NKWR-rpFb-quUd-Yu7w-c0VfGz
LV Write Access read/write
LV Creation host, time localhost, 2018-09-14 09:38:10 -0400
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 LTcnK5-ufCZ-5Cwx-Lpfi-Frgo-NMBm-OEE73C
LV Write Access read/write
LV Creation host, time localhost, 2018-09-14 09:38:10 -0400
LV Status available
# open 1
LV Size <17.00 GiB
Current LE 4351
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0 --- Logical volume ---
LV Path /dev/VGtest1/LVtest1
LV Name LVtest1
VG Name VGtest1
LV UUID PMv1Zv-WtJy-13v4-1GBc-5WaB-mcpk-f7dN22
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2018-10-13 11:48:28 -0400
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2 --- Logical volume ---
LV Path /dev/VGtest2/LVtest2
LV Name LVtest2
VG Name VGtest2
LV UUID HCk2OB-3iVy-Ryma-rKeH-kIie-NYKr-ZVkiIf
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2018-10-13 11:48:47 -0400
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
会创建对应的目录和文件
[root@localhost ~]# ls -l /dev/VGtest1/LVtest1
lrwxrwxrwx. 1 root root 7 Oct 13 11:48 /dev/VGtest1/LVtest1 -> ../dm-2
[root@localhost ~]# ls -l /dev/d
disk/ dm-0 dm-1 dm-2 dm-3 dmmidi dri/
[root@localhost ~]# ls -l /dev/dm-2
brw-rw----. 1 root disk 253, 2 Oct 13 11:48 /dev/dm-2

6.5 格式化LV逻辑卷

[root@localhost ~]# mke2fs -t ext4 /dev/VGtest1/LVtest1 #物理卷需要格式化之后才能使用,格式化为ext4格式
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376 Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done [root@localhost ~]# mkfs.ext4 /dev/VGtest2/LVtest2 #也可以使用这种方式格式化
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376 Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

6.6 挂载LV逻辑卷

[root@localhost ~]# mkdir /appdata
[root@localhost ~]# mkdir /applog
[root@localhost ~]# mount /dev/VGtest1/LVtest1 /appdata #把LV逻辑卷挂载到实际的目录
[root@localhost ~]# mount /dev/VGtest2/LVtest2 /applog
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 1.2G 16G 7% /
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 1014M 125M 890M 13% /boot
tmpfs 99M 0 99M 0% /run/user/0
/dev/mapper/VGtest1-LVtest1 976M 2.6M 907M 1% /appdata
/dev/mapper/VGtest2-LVtest2 976M 2.6M 907M 1% /applog
[root@localhost ~]# mount |grep VGtest
/dev/mapper/VGtest1-LVtest1 on /appdata type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/VGtest2-LVtest2 on /applog type ext4 (rw,relatime,seclabel,data=ordered)
永久挂载LV逻辑卷
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Sep 14 09:38:12 2018
#
# 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/centos-root / xfs defaults 0 0
UUID=944557a0-3f7c-434d-8202-c960db70b860 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/VGtest1/LVtest1 /appdata ext4 defaults 0 0
/dev/VGtest2/LVtest2 /applog ext4 defaults 0 0
~
~
"/etc/fstab" 13L, 617C written
[root@localhost ~]# mount -a #重新加载/etc/fstab文件

6.7 VG卷组扩容

新建一个PV物理卷,然后加入VG即可(fdisk创建分区->修改分区类型Linux LVM->向内核注册新分区->创建物理卷->把物理卷加入需要扩容的卷组)。

发现卷组pv空间不够,我们需要扩大卷组空间,现在系统上新增了一块20G的硬盘/dev/sdc。

[root@localhost ~]# fdisk /dev/sdd #把新添加的磁盘进行分区
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. Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xc29c0ac3. Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #主分区
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G
Partition 1 of type Linux and of size 5 GiB is set Command (m for help): t #修改分区类型
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 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: 0xc29c0ac3 Device Boot Start End Blocks Id System
/dev/sdd1 2048 10487807 5242880 8e Linux LVM
Command (m for help): w #保存分区信息
The partition table has been altered! Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe /dev/sdd #更新内核分区表
[root@localhost ~]# pvcreate /dev/sdd1 #创建物理卷PV
Physical volume "/dev/sdd1" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 VGtest1 lvm2 a-- <10.00g <9.00g
/dev/sdb2 VGtest2 lvm2 a-- <10.00g <9.00g
/dev/sdc1 VGtest1 lvm2 a-- <10.00g <10.00g
/dev/sdc5 VGtest2 lvm2 a-- <10.00g <10.00g
/dev/sdd1 lvm2 --- 5.00g 5.00g
[root@localhost ~]# vgextend VGtest1 /dev/sdd1 #扩展VG卷组容量,把物理卷加入卷组
Volume group "VGtest1" successfully extended
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VGtest1 3 1 0 wz--n- <24.99g <23.99g
VGtest2 2 1 0 wz--n- 19.99g 18.99g
centos 1 2 0 wz--n- <19.00g 0
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 VGtest1 lvm2 a-- <10.00g <9.00g
/dev/sdb2 VGtest2 lvm2 a-- <10.00g <9.00g
/dev/sdc1 VGtest1 lvm2 a-- <10.00g <10.00g
/dev/sdc5 VGtest2 lvm2 a-- <10.00g <10.00g
/dev/sdd1 VGtest1 lvm2 a-- <5.00g <5.00g

6.8 LV逻辑卷扩容 (支持在线扩展)

在线将/dev/VGtest/LVtest1 扩展到4G,并且要求数据可以正常访问

[root@localhost ~]# echo "this is a test for LVM" >/appdata/test
[root@localhost ~]# cat /appdata/test #在挂载的逻辑卷里添加数据,用来测试在逻辑卷扩容是否会破坏原有数据
this is a test for LVM
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 -wi-ao---- 1.00g
LVtest2 VGtest2 -wi-ao---- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# lvextend -L +2G /dev/VGtest1/LVtest1 #扩容逻辑卷LVtest1,增加2G空间容量(从对应的卷组中划分空间容量)
Size of logical volume VGtest1/LVtest1 changed from 1.00 GiB (256 extents) to 3.00 GiB (768 extents).
Logical volume VGtest1/LVtest1 successfully resized.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 -wi-ao---- 3.00g
LVtest2 VGtest2 -wi-ao---- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g [root@localhost ~]# resize2fs /dev/VGtest1/LVtest1 #使用resize2fs命令来进行确认增加容量,前面的步骤只是初步分配,还不能实际使用,需要此步骤来确定实际分配使用
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/VGtest1/LVtest1 is mounted on /appdata; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/VGtest1/LVtest1 is now 786432 blocks long.
xfs系统确认实际使用的命令
xfs_growfs /dev/VGtest1/LVtest1
查看挂载目录的空间容量大小
[root@localhost ~]# df -h|grep VGtest
/dev/mapper/VGtest2-LVtest2 976M 2.6M 907M 1% /applog
/dev/mapper/VGtest1-LVtest1 3.0G 3.1M 2.8G 1% /appdata 数据并没有受损
[root@localhost ~]# cat /appdata/test
this is a test for LVM

6.9 缩减逻辑卷LV

缩减逻辑卷的注意事项:

1、查看逻辑卷使用空间状况

2、不能在线缩减,得先卸载 切记

3、确保缩减后的空间大小依然能存储原有的所有数据

4、在缩减之前应该先强行检查文件,以确保文件系统处于一至性状态

[root@localhost ~]# e2fsck -f /dev/VGtest1/LVtest1 #处于挂载状态的LV逻辑卷无法强制检查
e2fsck 1.42.9 (28-Dec-2013)
/dev/VGtest1/LVtest1 is mounted.
e2fsck: Cannot continue, aborting.
[root@localhost ~]# umount /dev/VGtest1/LVtest1 #取消逻辑卷挂载
[root@localhost ~]# e2fsck -f /dev/VGtest1/LVtest1 #检查逻辑卷
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/VGtest1/LVtest1: 12/196608 files (0.0% non-contiguous), 21309/786432 blocks
[root@localhost ~]# resize2fs /dev/VGtest1/LVtest1 1G #首先需要确定缩减逻辑卷到多大空间容量,-1G表示缩减1G大小,1G表示缩减至1G(原来空间是3G)
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/VGtest1/LVtest1 to 262144 (4k) blocks.
The filesystem on /dev/VGtest1/LVtest1 is now 262144 blocks long. [root@localhost ~]# lvreduce -L 1G /dev/VGtest1/LVtest1 #再进行逻辑卷LV容量缩减
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce VGtest1/LVtest1? [y/n]: y
Size of logical volume VGtest1/LVtest1 changed from 3.00 GiB (768 extents) to 1.00 GiB (256 extents).
Logical volume VGtest1/LVtest1 successfully resized.
[root@localhost ~]# mount /dev/VGtest1/LVtest1 /appdata #重新挂载逻辑卷
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 -wi-ao---- 1.00g
LVtest2 VGtest2 -wi-ao---- 500.00m
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# df -h|grep VGtest
/dev/mapper/VGtest2-LVtest2 460M 1.6M 424M 1% /applog
/dev/mapper/VGtest1-LVtest1 976M 2.6M 914M 1% /appdata
[root@localhost ~]# cat /appdata/test
this is a test for LVM

6.10 缩减磁盘空间

发现物理磁盘空间使用不足,将其中一块硬盘或分区拿掉,避免磁盘浪费

1、pvmove /dev/sdb1 #将/dev/sdb1上存储的数据移到其它物理卷中

2、vgreduce VGtest /dev/sdb1 #将/dev/sdb1从VGtest卷组中移除

3、pvremove /dev/sdb1 #将/dev/sdb1从物理卷上移除

[root@localhost appdata]# touch stu{0..100}
[root@localhost appdata]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 VGtest1 lvm2 a-- <10.00g <9.00g
/dev/sdb2 VGtest2 lvm2 a-- <10.00g <9.51g
/dev/sdc1 VGtest1 lvm2 a-- <10.00g <10.00g
/dev/sdc5 VGtest2 lvm2 a-- <10.00g <10.00g
/dev/sdd1 VGtest1 lvm2 a-- <5.00g <5.00g
[root@localhost appdata]# pvmove /dev/sdb1 #把sdb1磁盘分区的数据转移到其它磁盘上
/dev/sdb1: Moved: 6.64%
/dev/sdb1: Moved: 100.00%
[root@localhost appdata]# vgreduce VGtest1 /dev/sdb1 #把分区sdb1从VG卷组中移除
Removed "/dev/sdb1" from volume group "VGtest1"
[root@localhost appdata]# pvremove /dev/sdb1 #把sdb1分区从PV物理卷中释放出来
Labels on physical volume "/dev/sdb1" successfully wiped.
#如果磁盘划分了多个分区,做成多个物理卷加入了卷组,那么可以能重复以上步骤,把所有的空间都从卷组和物理卷中释放,然后可以拿走这块磁盘做它用 实现快照,进行备份还原
在/mnt/lvm目录上,我们将原始的目录文件进行快照,然后将/LVtets1目录中的内容清空,并进行还原
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 -wi-ao---- 1.00g
LVtest2 VGtest2 -wi-ao---- 500.00m
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# cat /appdata/test
this is a test for LVM
[root@localhost ~]# df -h|grep VGtest
/dev/mapper/VGtest2-LVtest2 460M 1.6M 424M 1% /applog
/dev/mapper/VGtest1-LVtest1 976M 2.6M 914M 1% /appdata
[root@localhost ~]# lvcreate -L 20M -n appdatabackup -s -p r /dev/VGtest1/LVtest1 #利用LVtest1逻辑卷,快照形成一个备份的物理卷appdatabackup(逻辑卷快照功能)
Using default stripesize 64.00 KiB.
Logical volume "appdatabackup" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LVtest1 VGtest1 owi-aos--- 1.00g
appdatabackup VGtest1 sri-a-s--- 20.00m LVtest1 0.06
LVtest2 VGtest2 -wi-ao---- 500.00m
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# mkdir /tmp/backup
[root@localhost ~]# mount /dev/VGtest1/appdatabackup /tmp/backup #把快照的逻辑卷挂载到目录上
mount: /dev/mapper/VGtest1-appdatabackup is write-protected, mounting read-only
[root@localhost ~]# cat /tmp/backup/test
this is a test for LVM
[root@localhost ~]# ls -l /appdata/test
-rw-r--r--. 1 root root 23 Oct 13 12:33 /appdata/test
[root@localhost ~]# ls -l /tmp/backup/test
-rw-r--r--. 1 root root 23 Oct 13 12:33 /tmp/backup/test
[root@localhost ~]# rm -rf /appdata/test #删除LVtest1逻辑卷的数据
[root@localhost ~]# ls -l /appdata/test
ls: cannot access /appdata/test: No such file or directory
[root@localhost ~]# cp /tmp/backup/test /appdata/ #从快照中恢复数据到逻辑卷LVtest1上
[root@localhost ~]# ls -l /appdata/test
-rw-r--r--. 1 root root 23 Oct 13 13:06 /appdata/test
[root@localhost ~]# df -h|grep VGtest
/dev/mapper/VGtest2-LVtest2 460M 1.6M 424M 1% /applog
/dev/mapper/VGtest1-LVtest1 976M 2.6M 914M 1% /appdata
/dev/mapper/VGtest1-appdatabackup 976M 2.6M 914M 1% /tmp/backup

知识扩展

resize2fs命令

resize2fs命令被用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核支持在线resize。,linux kernel 2.6支持在mount状态下扩容但仅限于ext3文件系统。

-d:打开调试特性;

-p:打印已完成的百分比进度条;

-f:强制执行调整大小操作,覆盖掉安全检查操作;

-F:开始执行调整大小前,刷新文件系统设备的缓冲区

如果是xfs文件系统,则需要使用xfs_growfs命令

e2fsck命令

e2fsck是检查ext2、ext3、ext4等文件系统的正确性。

补充说明:

e2fsck执行后的传回值及代表意义如下:

0 没有任何错误发生。

1 文件系统发生错误,并且已经修正。

2 文件系统发生错误,并且已经修正。

4 文件系统发生错误,但没有修正。

8 运作时发生错误。

16 使用的语法发生错误。

128 共享的函数库发生错误。

参 数:

-a 不询问使用者意见,便自动修复文件系统。

-b 指定superblock,而不使用预设的superblock。

-B <区块大小> 指定区块的大小,单位为字节。

-c 一并执行badblocks,以标示损坏的区块。

-C 将检查过程的信息完整记录在file descriptor中,使得整个检查过程都能完整监控。

-d 显示排错信息。

-f 即使文件系统没有错误迹象,仍强制地检查正确性。

-F 执行前先清除设备的缓冲区。

-l <文件> 将文件中指定的区块加到损坏区块列表。

-L <文件> 先清除损坏区块列表,再将文件中指定的区块加到损坏区块列表。因此损坏区块列表的区块跟文件中指定的区块是一样的。

-n 以只读模式开启文件系统,并采取非互动方式执行,所有的问题对话均设置以"no"回答。

-p 不询问使用者意见,便自动修复文件系统。

-r 此参数只为了兼容性而存在,并无实际作用。

-s 如果文件系统的字节顺序不适当,就交换字节顺序,否则不做任何动作。

-S 不管文件系统的字节顺序,一律交换字节顺序。

-t 显示时间信息。

-v 执行时显示详细的信息。

-V 显示版本信息。

-y 采取非互动方式执行,所有的问题均设置以"yes"回答。

参考博客:

©著作权归作者所有:来自51CTO博客作者Rickyyan的原创作品,如需转载,请注明出处。

原文地址:LVM逻辑卷管理--在线扩容、逻辑卷与卷组容量缩减、逻辑卷快照

linux中LVM介绍及实验过程的更多相关文章

  1. 使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程

    使用ps.top.ps_mem命令找出Linux中的最大内存消耗过程 2020-02-08 16:06:59作者:自力稿源:云网牛站 您可能已经看到Linux系统多次消耗过多的内存,如果是这种情况,那 ...

  2. Linux系统LVM逻辑卷创建过程以及自动化脚本

    转至:https://cloud.tencent.com/developer/article/1068328 Linux系统LVM逻辑卷创建过程以及自动化脚本 2018-03-21阅读 6300   ...

  3. linux中日志介绍

    linux日志 linux日志大多是以明文存储,一般存储在/var/log目录中,linux系统中主要有三个日志子系统:连接时间日志,进程统计日志,错误日志. 连接时间日志 连接时间日志是有多个程序执 ...

  4. Linux中ssh介绍与ssh+key密钥登陆部署

    环境内核信息: [root@zabbix- ~]# uname -a Linux zabbix- -.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_64 x86 ...

  5. AIX 与Linux 中crontab 介绍

    AIX 与Linux 中crontab 用法相似,先介绍Linux 中的Crontab 用法,再后介绍AIX 与Linux 的不同之处.   一.Crontab 介绍 crontab命令的功能是在一定 ...

  6. 解析Linux中LVM与磁盘配额

    LVM 逻辑卷管理 LVM 概述 LVM 是 Linux 操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上.文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此 ...

  7. Linux中LVM逻辑卷管理

    一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区 进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的 ...

  8. 『学了就忘』Linux日志管理 — 90、Linux中日志介绍

    目录 1.日志相关服务 2.系统中常见的日志文件 1.日志相关服务 在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.RedHat认为syslogd已经不能满足在工 ...

  9. Linux中Main函数的执行过程

    1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, int main() { return(0); } 2.  编译 -#gcc -o ...

随机推荐

  1. Educational Codeforces Round 69

    目录 Contest Info Solutions A. DIY Wooden Ladder B. Pillars C. Array Splitting D. Yet Another Subarray ...

  2. 【原创】go语言学习(十)Map类型

    目录 声明和初始化 基本操作 map排序 map类型的切⽚片 课后作业 声明和初始化 1.map类型是⼀一个key-value的数据结构. //var a map[key的类型]value类型 var ...

  3. 在docker容器中编译hadoop 3.1.0

    在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...

  4. SpringMVC 捕获参数绑定失败时的异常

    SpringMVC配置数据验证(JSR-303)中提到了用String类型的域来绑定Ajax中的非法类型的参数. 这样做的目的是一旦发生一种情况,后端可以返回一个自定类的返回值,而不是返回Spring ...

  5. 《基于Python的GMSSL实现》课程设计个人报告

    <基于Python的GMSSL实现>课程设计个人报告 一.基本信息 姓名:刘津甫 学号:20165234 题目:GMSSL基于python的实现 指导老师:娄嘉鹏 完成时间:2019年5月 ...

  6. php基础总结

    目录 PHP开发基础 运算符.表达式和流程控制语句 数组和字符串 函数 PHP与Web页面交互 PHP操作MySQL数据库 面向对象基础 期间看到的几篇有意思的博客 为什么 var_dump(&quo ...

  7. T-MAX—项目系统设计与数据库设计

    团队作业第四次-项目系统设计与数据库设计 这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第四次-项目系统设计与数据库设计 团队名称 T-MAX 这个作业的目标 在开 ...

  8. 搭建JavaWeb应用开发环境——Tomcat服务器

    学习web开发,需要先安装一台web服务器,然后再在web服务器中开发相应的web资源,供用户使用浏览器访问. 搭建JavaWeb应用开发环境——Tomcat服务器 1.疑问:学习web开发,为什么必 ...

  9. arcgis python ValueTable使用

    本文链接:https://blog.csdn.net/A873054267/article/details/86007125 #多值参数指定方式 1 python list类型 2 字符串类型,以逗号 ...

  10. webpack介绍和使用

    一webpack介绍1由来2介绍3作用4拓展说明5webpack整体认知二webpack安装1安装node2安装cnpm3安装nrm的两种方法4安装webpack三webpack配置0搭建项目结构1初 ...