在企业里面,很多时候,我们也无法估量应用程序对磁盘空间的使用量,如果我们使用用传统的文件系统,磁盘分区一旦确定下来以后,就再也无法更改使用空间了,如果需要更改就必须让应用程序离线后,对原有分区的数据进行备份,然后再对磁盘进行重新分区格式,重新复制原来的数据放回新的磁盘分区上,由此带来的麻烦是不言而喻的,如果是可以离线的业务,到也好说,如果是不允许离线的业务,那就影响更大。所以一代全新的文件系统LVM的问世,打破了这一技术瓶颈。它允许用户使用容量不不统一的硬盘和分区组合在一起,构成一个逻辑空间,用户可以在这个逻辑空间上划分自己想要的逻辑卷空间,并且可以随时扩展或者缩减已经划分好的逻辑卷大小,更可观的是扩展操作还可以在线进行。


一、LVM的概念

LVM:Logical Volume Manager(逻辑卷管理器)

允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小

允许在多个物理设备间重新组织文件系统


将设备指定为物理卷,用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的,在物理卷上创建的逻辑卷是由物理区域(PE)组成,可以在逻辑卷上创建文件系统


逻辑卷的层次

上层:逻辑卷:LV——logical volume(表示单位是LE——logical extend:默认单位4M)

中层:卷组:VG——volume group

底层:物理卷:PV——physical volume(表示单位PE——physical extend:默认单位4M)


二、PV管理命令

pvcreate:创建pvpvcreate /dev/sda{14,15}

pvremove:删除pvpvremove /dev/sda{14,15}

pvscan:扫描当前系统上的所有pv

pvdisplay:查看pv的详细属性pvdisplay [/dev/sda15]省略即查看全部

pvmove:移动pv上的所有数据到其它pvpvmove /dev/sda15

pvs:简单查看pv属性


三、VG管理命令

vgcreate:创建vgvgcreate vg_name /path/to/pv -s #G

vgremove:删除vgvgremove vg_name

vgextend:扩展vgvgextend vg_name /dev/sda#

vgreduce:缩减vgvgreduce vg_name /dev/sda#

vgscan:扫描当前系统上的所有vg

vgdisplay:查看vg的详细属性

vgs:简单查看vg属性


四、LV管理命令

lvcreate:创建lvlvcreate -n lv_name -L #G vg_name

lvremove:删除lvlvremove /dev/vg_name/lv_name

lvextend:扩展lv

lvreduce:缩减lv

lvscan:扫描当前系统上的所有lv

lvdiskplay:查看lv的详细属性lvdisplay /dev/vg_name/lv_name

lvs:简单查看lv属性


五、扩展逻辑卷

1、扩展物理边界

lvextend -L #G /dev/vg_name/lv_name 将当前lv扩展到#G

lvextend -L +#G /dev/vg_name/lv_name 在当前lv上再扩展#G


2:扩展逻辑边界

resize2fs /dev/vg_name/lv_name # 在当前lv的基础上再扩展#G

resize2fs -p /dev/vg_name/lv_name 物理边界有多大,就扩展到多大


两条命令可以合并:lvextend -r -l +#%FREE /dev/vg_name/lv_name


六、缩减逻辑卷

1、确保缩减后的空间大小能存储原有的所有数据,有条件的情况下最好先备份准备缩减的逻辑卷上的数据

2,取消逻辑卷的挂载状态(不能在线缩减逻辑卷)

umount /dev/vg_name/lv_name

3,进行缩减之前应先强行检查文件系统的,确保文件系统处于一致性状态

e2fsck -f /dev/vg_name/lv_name

4、缩减逻辑边界

resize2fs /dev/vg_name/lv_name #G

5、缩减物理边界

lvreduce -L # /dev/vg_name/lv_name 将当前lv缩减到#G

lvreduce -L -# /dev/vg_name/lv_name 在当前lv上缩减#G


七、逻辑卷创建实例

第一步:在服务器上装载4块20G的硬盘,查看系统上是否已经识别

[root@centos7 test]# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sda      8:0    0   20G  0 disk 

├─sda1   8:1    0  200M  0 part /boot

├─sda2   8:2    0    5G  0 part /

└─sda3   8:3    0    5G  0 part /test

sdb      8:16   0   20G  0 disk 

sdc      8:32   0   20G  0 disk 

sdd      8:48   0   20G  0 disk 

sde      8:64   0   20G  0 disk 

sr0     11:0    1  7.2G  0 rom  

[root@centos7 test]#

成功识别,可以开始创建pv


第二步:开始创建pv,将四块硬盘全部创建成pv,以备待用

[root@centos7 test]# pvcreate /dev/sd{b,c,d,e}

 Physical volume "/dev/sdb" successfully created

 Physical volume "/dev/sdc" successfully created

 Physical volume "/dev/sdd" successfully created

 Physical volume "/dev/sde" successfully created

[root@centos7 test]#

pv创建成功,可以使用pvscan扫描所有pv,pvdisplay查看pv的详细属性


[root@centos7 test]# pvscan

 PV /dev/sdd         lvm2 [20.00 GiB]

 PV /dev/sdb         lvm2 [20.00 GiB]

 PV /dev/sde         lvm2 [20.00 GiB]

 PV /dev/sdc         lvm2 [20.00 GiB]

 Total: 4 [80.00 GiB] / in use: 0 [0   ] / in no VG: 4 [80.00 GiB]

[root@centos7 test]# pvdisplay /dev/sdb

 "/dev/sdb" is a new physical volume of "20.00 GiB"

 --- NEW Physical volume ---

 PV Name               /dev/sdb

 VG Name               

 PV Size               20.00 GiB

 Allocatable           NO

 PE Size               0   

 Total PE              0

 Free PE               0

 Allocated PE          0

 PV UUID               6S63C2-MAKa-4Rho-fd6q-oP0a-hg6o-xKI1Oa

[root@centos7 test]# 


第三步:开始创建vg,vg命名为myvg

[root@centos7 test]# vgcreate myvg /dev/sd{b,c,d}

 Volume group "myvg" successfully created

[root@centos7 test]# 

vg创建成功,可以使用vgscan扫描所有vg,vgdisplay查看vg的详细属性


[root@centos7 test]# vgscan

 Reading all physical volumes.  This may take a while...

 Found volume group "myvg" using metadata type lvm2

[root@centos7 test]# vgdisplay /dev/myvg

 --- Volume group ---

 VG Name               myvg

 System ID             

 Format                lvm2

 Metadata Areas        3

 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                3

 Act PV                3

 VG Size               59.99 GiB

 PE Size               4.00 MiB

 Total PE              15357

 Alloc PE / Size       0 / 0   

 Free  PE / Size       15357 / 59.99 GiB

 VG UUID               Fb6PT7-YAQa-JaKR-KWNO-EHh8-OBHC-56OA0s

[root@centos7 test]# 


第四步:开始创建lv,lv命名为mylv

[root@centos7 test]# lvcreate -n mylv -L 40G myvg

 Logical volume "mylv" created.

[root@centos7 test]# 

lv创建成功,可以使用lvscan扫描所有lv,lvdisplay查看lv详细属性


[root@centos7 test]# lvscan

 ACTIVE            '/dev/myvg/mylv' [40.00 GiB] inherit

[root@centos7 test]# lvdisplay /dev/myvg/mylv

 --- Logical volume ---

 LV Path                /dev/myvg/mylv

 LV Name                mylv

 VG Name                myvg

 LV UUID                GjUPmx-ww2H-RwIf-2up9-nnen-mRs2-IwC5Z6

 LV Write Access        read/write

 LV Creation host, time centos7, 2016-08-29 22:30:04 +0800

 LV Status              available

 # open                 0

 LV Size                40.00 GiB

 Current LE             10240

 Segments               3

 Allocation             inherit

 Read ahead sectors     auto

 - currently set to     8192

 Block device           253:0

[root@centos7 test]# 


第五步:格式化lv,使用ext4系统,指定卷标为mylv

[root@centos7 test]# mkfs.ext4 -L mylv /dev/myvg/mylv

mke2fs 1.42.9 (28-Dec-2013)

Filesystem label=mylv

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

2621440 inodes, 10485760 blocks

524288 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2157969408

320 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 

4096000, 7962624


Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done   

[root@centos7 test]# 

lv的文件系统已经建立,可以挂载使用了


第六步:挂载lv,创建/mylv做为挂载点,并验证结果

[root@centos7 test]# mkdir /mylv

[root@centos7 test]# mount /dev/myvg/mylv /mylv

[root@centos7 test]# df -h

Filesystem             Size  Used Avail Use% Mounted on

/dev/sda2              5.0G  4.3G  744M  86% /

devtmpfs               899M     0  899M   0% /dev

tmpfs                  913M   84K  913M   1% /dev/shm

tmpfs                  913M  8.9M  904M   1% /run

tmpfs                  913M     0  913M   0% /sys/fs/cgroup

/dev/sda3              4.8G  1.2G  3.4G  26% /test

/dev/sda1              197M  139M   59M  71% /boot

tmpfs                  183M   16K  183M   1% /run/user/42

tmpfs                  183M     0  183M   0% /run/user/0

/dev/mapper/myvg-mylv   40G   49M   38G   1% /mylv

[root@centos7 test]# ll /mylv

total 16

drwx------. 2 root root 16384 Aug 29 22:39 lost+found

[root@centos7 test]# 


第七步:为lv配置自动挂载,使用lv的UUID写入fstab自动挂载文件,方便长期使用

[root@centos7 test]# blkid /dev/myvg/mylv

/dev/myvg/mylv: LABEL="mylv" UUID="184a8620-2b45-4f2e-ba6e-4951178ca261" TYPE="ext4" 

[root@centos7 test]# vim /etc/fstab


UUID="184a8620-2b45-4f2e-ba6e-4951178ca261" /mylv   ext4    defaults    0 0


八、逻辑卷扩展实例

第一步:扩展物理边界:lvextend -L [+] # /dev/myvg/mylv

查看当前lv物理边界

[root@centos7 ~]# lvs /dev/myvg/mylv

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-a----- 40.00g                                                    

[root@centos7 ~]# 


查看当前vg的物理边界

[root@centos7 ~]# vgs /dev/myvg

 VG   #PV #LV #SN Attr   VSize  VFree 

 myvg   3   1   0 wz--n- 59.99g 19.99g

[root@centos7 ~]# 

接下来可以正式开始扩展物理边界了


[root@centos7 ~]# lvextend -L +19.99G /dev/myvg/mylv

 Rounding size to boundary between physical extents: 19.99 GiB

 Insufficient free space: 5118 extents needed, but only 5117 available

[root@centos7 ~]# 

当前lv大小40G,vg大小59.99G,为什么我扩展19.99G,还报错了,原因很简单,le的尺寸是4M,我们指定的空间不一定是le的整数倍,也就有些误差,所以我们指定扩展容量的时候要比实际剩余值小一些才行,或者我们使用百分比模式去指定扩展空间就回避这个问题了。


[root@centos7 ~]# lvextend -L +19.98G /dev/myvg/mylv

 Rounding size to boundary between physical extents: 19.98 GiB

 Size of logical volume myvg/mylv changed from 40.00 GiB (10240 extents) to 59.98 GiB (15355 extents).

 Logical volume mylv successfully resized.

物理边界扩展成功,可以开始扩展逻辑边界了


第二步:扩展逻辑边界:resize2fs -p /dev/myvg/mylv

[root@centos7 ~]# resize2fs -p /dev/myvg/mylv

resize2fs 1.42.9 (28-Dec-2013)

Filesystem at /dev/myvg/mylv is mounted on /mylv; on-line resizing required

old_desc_blocks = 5, new_desc_blocks = 8

The filesystem on /dev/myvg/mylv is now 15723520 blocks long.

[root@centos7 ~]# lvs /dev/myvg/mylv

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-ao---- 59.98g                                                    

[root@centos7 ~]# 

mylv成功的从40G扩展到了60G


这是属于在vg还有空间的情况下去扩展lv,如果现在vg被lv全部占用完了,还想扩展lv的话,就必须首先扩展vg的物理边界,也就是说添加pv了,添加pv的前提是要添加硬盘或者分区了。在这里,我之前还有已经创建好的pv没用,所以我就略过此步,直接开始扩展vg了


第一步:扩展vg vgextend myvg /dev/sd#

[root@centos7 ~]# vgextend /dev/myvg /dev/sde

 Volume group "myvg" successfully extended

[root@centos7 ~]#

[root@centos7 ~]# vgs /dev/myvg

 VG   #PV #LV #SN Attr   VSize  VFree 

 myvg   4   1   0 wz--n- 79.98g 19.98g

[root@centos7 ~]# 

myvg成功的从60G扩展到了80G


第二步:扩展物理边界和扩展逻辑边界可以一步到位(这次我们使用百分比表示准备扩展的空间) lvextend -r -l +#%FREE /dev/myvg/mylv

[root@centos7 ~]# lvextend -r -l +100%FREE /dev/myvg/mylv

 Size of logical volume myvg/mylv changed from 59.99 GiB (15357 extents) to 79.98 GiB (20476 extents).

 Logical volume mylv successfully resized.

resize2fs 1.42.9 (28-Dec-2013)

Filesystem at /dev/mapper/myvg-mylv is mounted on /mylv; on-line resizing required

old_desc_blocks = 8, new_desc_blocks = 10

The filesystem on /dev/mapper/myvg-mylv is now 20967424 blocks long.

[root@centos7 ~]# lvs /dev/myvg/mylv

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-ao---- 79.98g                                                    

[root@centos7 ~]# 

mylv成功的从60G扩展到了80G


九、逻辑卷缩减实例


如果我们vg空间分配的太大了,想把多余的空间回收一部分,这就涉及到了逻辑卷的缩减问题了,缩减逻辑卷和扩展逻辑卷虽然是一个逆向操作,但它们之间存在一定的区别,扩展逻辑卷可以在线操作,但缩减逻辑卷是不能在线操作的,而且扩展逻辑卷没什么风险,缩减逻辑卷相对来说有一定的风险,在有条件的情况下,建议先备份数据后再执行缩减操作。

第一步:取消逻辑卷的挂载状态 umont /dev/myvg/mylv

[root@centos7 ~]# df -h

Filesystem             Size  Used Avail Use% Mounted on

/dev/sda2              5.0G  4.3G  743M  86% /

devtmpfs               899M     0  899M   0% /dev

tmpfs                  913M   84K  913M   1% /dev/shm

tmpfs                  913M  8.9M  904M   1% /run

tmpfs                  913M     0  913M   0% /sys/fs/cgroup

/dev/sda3              4.8G  1.2G  3.4G  26% /test

/dev/sda1              197M  139M   59M  71% /boot

tmpfs                  183M   16K  183M   1% /run/user/42

tmpfs                  183M     0  183M   0% /run/user/0

/dev/mapper/myvg-mylv   79G   56M   76G   1% /mylv

[root@centos7 ~]# umount /dev/myvg/mylv

[root@centos7 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       5.0G  4.3G  743M  86% /

devtmpfs        899M     0  899M   0% /dev

tmpfs           913M   84K  913M   1% /dev/shm

tmpfs           913M  8.9M  904M   1% /run

tmpfs           913M     0  913M   0% /sys/fs/cgroup

/dev/sda3       4.8G  1.2G  3.4G  26% /test

/dev/sda1       197M  139M   59M  71% /boot

tmpfs           183M   16K  183M   1% /run/user/42

tmpfs           183M     0  183M   0% /run/user/0

[root@centos7 ~]# 


第二步:强行检查lv的文件系统 e2fsck -f /dev/myvg/mylv

[root@centos7 ~]# e2fsck -f /dev/myvg/mylv

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

mylv: 11/5242880 files (0.0% non-contiguous), 376154/20967424 blocks

[root@centos7 ~]# 


第三步:缩减lv的逻辑边界

[root@centos7 ~]# resize2fs /dev/myvg/mylv 60G

resize2fs 1.42.9 (28-Dec-2013)

Resizing the filesystem on /dev/myvg/mylv to 15728640 (4k) blocks.

The filesystem on /dev/myvg/mylv is now 15728640 blocks long.

[root@centos7 ~]# 


第四步:缩减lv的物理边界

[root@centos7 ~]# lvreduce -L 60G /dev/myvg/mylv 

 WARNING: Reducing active logical volume to 60.00 GiB

 THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce mylv? [y/n]: y

 Size of logical volume myvg/mylv changed from 79.98 GiB (20476 extents) to 60.00 GiB (15360 extents).

 Logical volume mylv successfully resized.

[root@centos7 ~]# lvs /dev/myvg/mylv

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-a----- 60.00g                                                    

[root@centos7 ~]# 

mylv成功的从80G缩减到了60G

十、逻辑卷快照

很多时候,我们对逻辑卷上的数据做了修改之后,我们还想再次返回原来的状态,那么这个时候逻辑卷快照就派上用场了,这个逻辑卷快照它只会在我们给逻辑卷做快照的那一瞬间,把逻辑卷上原有的所有的数据状态做一个记录下来,并不是完全的复制一个副本,只是在逻辑卷的原有数据发生改变时,才会把快照那一瞬间的原文件复制一个副本保存到快照卷上。当我们需要恢复快照时,可以直接用快照上的文件去替换逻辑卷上被修改过的文件,没有被修改过的文件是不需要做任何操作。由此以来,快照卷的空间大小设定是需要视快照卷使用过程中的数据的修改量决定的。


(一)建立快照:lvcreate -s -n mylv_snap -L 10G -p r /dev/myvg/mylv

1、我们复制一些文件到逻辑卷,并给逻辑卷建立一个快照

[root@centos7 ~]# df -h

Filesystem             Size  Used Avail Use% Mounted on

/dev/sda2              5.0G  4.3G  743M  86% /

devtmpfs               899M     0  899M   0% /dev

tmpfs                  913M   84K  913M   1% /dev/shm

tmpfs                  913M  8.9M  904M   1% /run

tmpfs                  913M     0  913M   0% /sys/fs/cgroup

/dev/sda3              4.8G  1.2G  3.4G  26% /test

/dev/sda1              197M  139M   59M  71% /boot

tmpfs                  183M   16K  183M   1% /run/user/42

tmpfs                  183M     0  183M   0% /run/user/0

/dev/mapper/myvg-mylv   59G   52M   57G   1% /mylv

[root@centos7 ~]# cp /etc/fstab /mylv

[root@centos7 ~]# cp /etc/fstab /mylv/a

[root@centos7 ~]# cp /etc/fstab /mylv/b

[root@centos7 ~]# ll /mylv

total 28

-rw-r--r--. 1 root root   444 Aug 30 21:55 a

-rw-r--r--. 1 root root   444 Aug 30 21:55 b

-rw-r--r--. 1 root root   444 Aug 30 21:55 fstab

drwx------. 2 root root 16384 Aug 29 22:39 lost+found

[root@centos7 ~]# lvcreate -s -n mylv_snap -L 10G -p r /dev/myvg/mylv

 Logical volume "mylv_snap" created.

[root@centos7 ~]#

成功建立快照,接下来我们去查看一下快照卷上的内容


2、创建一个/snap做为挂载点,并把快照卷挂载上来看看里面的文件状态

[root@centos7 ~]# mkdir /snap

[root@centos7 ~]# mount /dev/myvg/mylv_snap /snap

mount: /dev/mapper/myvg-mylv_snap is write-protected, mounting read-only

[root@centos7 ~]# ll /snap

total 28

-rw-r--r--. 1 root root   444 Aug 30 21:55 a

-rw-r--r--. 1 root root   444 Aug 30 21:55 b

-rw-r--r--. 1 root root   444 Aug 30 21:55 fstab

drwx------. 2 root root 16384 Aug 29 22:39 lost+found

[root@centos7 ~]# 

现在我们所看到的快照卷上的文件实际上是逻辑卷上文件的一个链接,并不是保存原有逻辑卷上文件的副本,这一点对于刚刚接触逻辑卷快照的同学来说是很难理解的,但其工作原理确实如此。接下来我们修改一下原逻辑卷上的文件,看看快照卷会不会有变化。


3、验证快照卷是否能保留住建立快照那一瞬间的状态

[root@centos7 ~]# echo "hello world" >> /mylv/a

[root@centos7 ~]# echo "hello world" > /mylv/b

[root@centos7 ~]# rm -f /mylv/fstab

[root@centos7 ~]# ll /mylv

total 24

-rw-r--r--. 1 root root   456 Aug 30 22:09 a

-rw-r--r--. 1 root root    12 Aug 30 22:10 b

drwx------. 2 root root 16384 Aug 29 22:39 lost+found

[root@centos7 ~]# ll /snap

total 28

-rw-r--r--. 1 root root   444 Aug 30 21:55 a

-rw-r--r--. 1 root root   444 Aug 30 21:55 b

-rw-r--r--. 1 root root   444 Aug 30 21:55 fstab

drwx------. 2 root root 16384 Aug 29 22:39 lost+found

[root@centos7 ~]# 

对比着来看,快照卷上的数据始终停留在拍摄快照的那一瞬间,不管你后面在原逻辑卷上创建、追加、删除多少数据,它是始终如一的。


(二)还原快照

1、首先我们把快照卷上的所有文件打包成了一个压缩文件

[root@centos7 ~]# mkdir /tmp/mylvbak

[root@centos7 snap]# tar -zcf /tmp/mylvbak/mylv.tar.gz *

[root@centos7 snap]# ll /tmp/mylvbak

total 4

-rw-r--r--. 1 root root 488 Aug 30 22:48 mylv.tar.gz

[root@centos7 snap]# 

打包成功,准备还原


2、卸载快照卷,删除快照卷,解包压缩文件,直接把解包出来的文件移动并覆盖原逻辑卷上的数据也就完成了还原快照的操作

[root@centos7 ~]# umount /dev/myvg/mylv_snap

[root@centos7 ~]# lvremove /dev/myvg/mylv_snap

Do you really want to remove active logical volume mylv_snap? [y/n]: y

 Logical volume "mylv_snap" successfully removed

[root@centos7 mylvbak]# tar -xf mylv.tar.gz 

[root@centos7 mylvbak]# ll

total 16

-rw-r--r--. 1 root root 444 Aug 30 21:55 a

-rw-r--r--. 1 root root 444 Aug 30 21:55 b

-rw-r--r--. 1 root root 444 Aug 30 21:55 fstab

drwx------. 2 root root   6 Aug 29 22:39 lost+found

-rw-r--r--. 1 root root 488 Aug 30 22:48 mylv.tar.gz

[root@centos7 mylvbak]# 

这一步的操作演示只是为了给大家展示一些原理性的东西,还原快照的操作非常简单,当我们需要还原快照的时候,去建立一个挂载点把快照卷临时挂载上来,复制快照上的数据去覆盖原逻辑卷上的数据即可。当前你在创建快照以后,在原逻辑卷上新建的和创建快照那一瞬间无关的数据,还原快照时是不会有任何更改的。


十一、删除pv

第一种情况:vg上还有剩余空间,并且剩余空间大于我们准备回收的PV的空间,此时我们可以直接使用pvmove把准备回收的pv上的已有数据移动到其它pv上,然后使用pvreomve直接删除pv即可


环境展示

[root@centos7 ~]# lvs

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-a----- 50.00g                                                    

[root@centos7 ~]# vgs

 VG   #PV #LV #SN Attr   VSize  VFree 

 myvg   4   1   0 wz--n- 79.98g 29.98g

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree 

 /dev/sdb   myvg lvm2 a--  20.00g     0 

 /dev/sdc   myvg lvm2 a--  20.00g     0 

 /dev/sdd   myvg lvm2 a--  20.00g  9.99g

 /dev/sde   myvg lvm2 a--  20.00g 20.00g

[root@centos7 ~]# 

接下来我们可以移动pv上的数据,回收sdb硬盘


第一步:移动sdb这个pv上的数据

[root@centos7 ~]# pvmove /dev/sdb

 /dev/sdb: Moved: 0.1%

 /dev/sdb: Moved: 21.5%

 /dev/sdb: Moved: 46.6%

 /dev/sdb: Moved: 71.8%

 /dev/sdb: Moved: 97.0%

 /dev/sdb: Moved: 100.0%

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree 

 /dev/sdb   myvg lvm2 a--  20.00g 20.00g

 /dev/sdc   myvg lvm2 a--  20.00g     0 

 /dev/sdd   myvg lvm2 a--  20.00g  9.99g

 /dev/sde   myvg lvm2 a--  20.00g     0 

[root@centos7 ~]# 

认真观察一下的朋友都能发现,其实,在我刚才展示的环境下,完全没有必要再移动sdb上的数据了,因为从环境展示的图中可以看出,sde是完全空闲状态的,所以我们选择sdb就可以完全省掉移动数据这个步骤了,这里纯粹是为了给大家展示所有pv上都存放有数据的情况


第二步:从vg中移除sdb这个pv

[root@centos7 ~]# vgreduce /dev/myvg /dev/sdb

 Removed "/dev/sdb" from volume group "myvg"

[root@centos7 ~]# vgs

 VG   #PV #LV #SN Attr   VSize  VFree

 myvg   3   1   0 wz--n- 59.99g 9.99g

[root@centos7 ~]# 

已经成功的从vg中的移除sdb这个pv了,现在可以直接删除sdb这个pv了


第三步:删除sdb这个pv

[root@centos7 ~]# pvremove /dev/sdb

 Labels on physical volume "/dev/sdb" successfully wiped

[root@centos7 ~]#

验证一下结果

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree

 /dev/sdc   myvg lvm2 a--  20.00g    0 

 /dev/sdd   myvg lvm2 a--  20.00g 9.99g

 /dev/sde   myvg lvm2 a--  20.00g    0 

[root@centos7 ~]# 

现在我们完全可以从服务器上直接拆除sdb这块物理硬盘了,sdb这块硬盘可以用用它处了。


第二种情况:如果vg上没有剩余空间,但是lv上的剩余空间大于我们准备回收的pv的空间,此时我们需要先缩减lv,把准备回收的pv的空间压缩回来,然后再执行第一种情况的操作,只有这样才能把多余的空间彻底释放出来用做它处。

环境展示

[root@centos7 ~]# df -h

Filesystem             Size  Used Avail Use% Mounted on

/dev/sda2              5.0G  4.3G  743M  86% /

devtmpfs               899M     0  899M   0% /dev

tmpfs                  913M   84K  913M   1% /dev/shm

tmpfs                  913M  8.9M  904M   1% /run

tmpfs                  913M     0  913M   0% /sys/fs/cgroup

/dev/sda3              4.8G  1.2G  3.4G  26% /test

/dev/sda1              197M  139M   59M  71% /boot

tmpfs                  183M   16K  183M   1% /run/user/42

tmpfs                  183M     0  183M   0% /run/user/0

/dev/mapper/myvg-mylv   50G   52M   47G   1% /mylv

[root@centos7 ~]# lvs

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-ao---- 50.00g                                                    

[root@centos7 ~]# vgs

 VG   #PV #LV #SN Attr   VSize  VFree

 myvg   3   1   0 wz--n- 59.99g 9.99g

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree

 /dev/sdc   myvg lvm2 a--  20.00g    0 

 /dev/sdd   myvg lvm2 a--  20.00g 9.99g

 /dev/sde   myvg lvm2 a--  20.00g    0 

[root@centos7 ~]# 

仔细观察一下,可以发现我们同样可以从当前卷组中移除一个20G的pv,只不过这一次我们的步骤就比上一种情况要多一个lv缩减的过程了,因为当前的vg都处于使用中(也就是所有的pv都处于使用中)

第一步:将lv从50G缩减到35G

[root@centos7 ~]# umount /dev/myvg/mylv

[root@centos7 ~]# e2fsck -f /dev/myvg/mylv

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

mylv: 13/3276800 files (0.0% non-contiguous), 251766/13107200 blocks

[root@centos7 ~]# resize2fs /dev/myvg/mylv 35G

resize2fs 1.42.9 (28-Dec-2013)

Resizing the filesystem on /dev/myvg/mylv to 9175040 (4k) blocks.

The filesystem on /dev/myvg/mylv is now 9175040 blocks long.

[root@centos7 ~]# lvreduce -L 35G /dev/myvg/mylv

 WARNING: Reducing active logical volume to 35.00 GiB

 THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce mylv? [y/n]: y

 Size of logical volume myvg/mylv changed from 50.00 GiB (12800 extents) to 35.00 GiB (8960 extents).

 Logical volume mylv successfully resized.

[root@centos7 ~]# lvs /dev/myvg/mylv

 LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 mylv myvg -wi-a----- 35.00g                                                    

[root@centos7 ~]# vgs

 VG   #PV #LV #SN Attr   VSize  VFree 

 myvg   3   1   0 wz--n- 59.99g 24.99g

[root@centos7 ~]# 

lv成功的从50G缩减到了35G,现在vg上也就剩余了足够我们回收的空间了,与此同时也就形成了第一种情况的环境,接下来重复一下第一种情况的操作步骤即可

第二步:从vg中移除pv,再删除pv,实现最终效果

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree 

 /dev/sdc   myvg lvm2 a--  20.00g  4.99g

 /dev/sdd   myvg lvm2 a--  20.00g 20.00g

 /dev/sde   myvg lvm2 a--  20.00g     0  

[root@centos7 ~]# vgreduce /dev/myvg /dev/sdd

 Removed "/dev/sdd" from volume group "myvg"

[root@centos7 ~]# pvremove /dev/sdd

 Labels on physical volume "/dev/sdd" successfully wiped

[root@centos7 ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree

 /dev/sdc   myvg lvm2 a--  20.00g 4.99g

 /dev/sde   myvg lvm2 a--  20.00g    0 

[root@centos7 ~]# 

因为这次我直接选择了空间处于完全空闲状态的pv,所以在从vg中移除pv之后,不用移动pv上的数据,就可以直接删除pv了


关于逻辑卷的操作也就分享这么多,大家对着教程多做几次实验基本掌握应该没问题。重点在于如何扩展和缩减逻辑卷,尤其是缩减的过种中涉及到步骤比较多,操作的先后顺序必须清析,才能成功实现。当然是实际生产环境中,缩减的情况比较少,大多都是空间不够了扩展的比较多。