首页 > 代码库 > 磁盘管理之LVM

磁盘管理之LVM

最近总是在做LVM网上看了很多文章,写的不怎么滴。于是痛下决心,自己做一个简单明了的和大家分享一下。

一、LVM简介

LVM是 LogicalVolume Manager(逻辑卷管理)的简写,它由HeinzMauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。

优点:与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)。LVM也允许按用户组对存储卷进行管理,允许管理员用更直观的名称(如"sales‘、‘development‘)代替物理磁盘名(如‘sda‘、‘sdb‘)来标识存储卷。

知识点:

PV 、VG、 LV三者关系

PV:是物理的磁盘分区

VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘。

LV:也就是从VG中划分的逻辑分区

pv --> vg --> lv

 

主要关键点、注意点:

关键点:

存储空间边界:物理边界、逻辑边界

注意点:

扩展:物理边界 --> 逻辑边界

缩减:逻辑边界 --> 物理边界(缩减不能少于已经存储的所有数据空间的大小)

缩减时,先缩减文件系统,并要执行强制检测:e2fsck -f

 

涉及命令:

pv:pvcreate, pvs, pvdisplay, pvremove, pvmove, pvscan

vg: vgcreate, vgs, vgdisplay, vgremove, vgextend, vgreduce,vgscan

lv: lvcreate, lvs, lvdisplay, lvremove, lvextend, lvreduce,lvscan

目录:

本博主要讲LVM创建、在线扩容、在线缩减、快照和删除

 

废话不多说,看看实际操作:

 

准备环境:添加一块未使用过的磁盘/dev/sdb,使用fdisk从其中分出两个5G的分区,并且将其分区类型该为8e

[root@whb ~]# fdisk -l /dev/sdb

 

Disk /dev/sdb: 32.2 GB, 32212254720 bytes

255 heads, 63 sectors/track, 3916 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x5e9ab9d4

 

   Device Boot      Start        End      Blocks  Id  System

/dev/sdb1              1         654     5253223+ 8e  Linux LVM

/dev/sdb2            655        1308     5253255  8e  Linux LVM

[root@whb ~]#

一:LVM创建

1、创建物理卷PV

物理卷Physical Volume就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。pvcreate 命令将希望添加到卷组的所有分区或者磁盘创建为物理卷。

创建物理卷PV(Physical Volume)

[root@whb ~]# pvcreate /dev/sdb1

  Physical volume"/dev/sdb1" successfully created

[root@whb ~]# pvcreate /dev/sdb2

  Physical volume"/dev/sdb2" successfully created

查看一下:

[root@whb ~]# pvscan

  PV /dev/sdb1                      lvm2 [5.01 GiB]

  PV /dev/sdb2                      lvm2 [5.01 GiB]

或者:

[root@whb ~]# pvdisplay /dev/sdb1

  --- Physical volume ---

  PV Name               /dev/sdb1

  VG Name               testvg

  PV Size               5.01 GiB / not usable 2.10 MiB

  Allocatable           yes

  PE Size               4.00 MiB

  Total PE              1282

  Free PE               1282

  Allocated PE          0

  PV UUID              HKjj00-Gkth-MikJ-8tQ4-TpGI-y5e0-ctD3R3

2、创建卷组VG

卷组Volume Group是由多个PV整合而成的,VG最多可以有65534个PE(PhysicalExtent)组成,每一个物理卷被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认的PE块是4M,默认VG最大是256G{由默认的PE块大小计算:4M*65534/(1024M/G)=256G}。

[root@whb ~]# vgcreate testvg /dev/sdb1

  Volume group"testvg" successfully created

查看:

[root@whb ~]# vgs testvg

  VG     #PV #LV #SN Attr   VSize VFree

  testvg   1  0   0 wz--n- 5.01g 5.01g

 

扩展pv:

[root@whb ~]# vgextend testvg /dev/sdb2

  Volume group"testvg" successfully extended

[root@whb ~]# vgdisplay testvg

  --- Volume group ---

  VG Name               testvg

  System ID            

  Format                lvm2

  Metadata Areas        2

  Metadata SequenceNo  2

  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               10.02 GiB

  PE Size               4.00 MiB

  Total PE              2564

  Alloc PE / Size       0 / 0  

  Free  PE / Size      2564 / 10.02 GiB

  VG UUID              dHcETg-pshe-TR1h-tPnv-H0JQ-foWZ-0jjPJB

缩减pv:

缩减前要先将要移除硬盘上的数据迁移:

[root@whb ~]# pvmove /dev/sdb1

[root@whb ~]# vgreduce testvg /dev/sdb1

  Removed"/dev/sdb1" from volume group "testvg"

查看:

[root@whb ~]# vgs

  VG     #PV #LV #SN Attr   VSize VFree

  testvg   1  0   0 wz--n-  5.01g 5.01g

3、创建逻辑卷LV

    创建逻辑卷Logical Volume,就像硬盘上的分区一样,LV的大小是PE的整数倍。LV的访问路径: /dev/vgname/lvname或/dev/mapper/vgname-lvname

    Lvcreate参数: -L:创建LV的大小, -n 创建LV的名字

        e.g. lvcreate -L5G -n testlv testvg

其中-L容量的指定也可以用-l选项,指定PE的个数。

[root@whb ~]# lvcreate -L 2G -n testlv testvg

  Logical volume"testlv" created

查看:

[root@whb ~]# lvdisplay testvg

  --- Logical volume ---

  LV Path                /dev/testvg/testlv

  LV Name                testlv

  VG Name                testvg

  LV UUID               cqNyAR-QLxf-9H7M-280z-2h2h-X6A0-O2LWG6

  LV Write Access        read/write

  LV Creation host, timewhb, 2014-07-25 18:52:19 +0800

  LV Status              available

  # open                 0

  LV Size                5.00 GiB

  Current LE             1280

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:4

大功告成,LVM 创建完成,可以使用了

使用:

 格式化、挂载逻辑卷testlv:

 

格式化:

[root@whb ~]# mke2fs -t ext4 /dev/testvg/testlv

挂载:

[root@whb ~]# mkdir /mnt/lvm

[root@whb ~]# mount /dev/testvg/testlv /mnt/lvm/

查看:

[root@whb ~]# df -h

Filesystem                Size  Used Avail Use% Mounted on

/dev/mapper/testvg-testlv 5.0G  138M  4.6G  3% /mnt/lvm

 

LV的在线扩展和缩减

扩展逻辑卷的步骤:

1、创建新的分区,并修改分区类型为8e

2、创建物理卷PV

3、将新创建的PV添加到要扩展的逻辑卷所在的卷组

4、用命令lvextend或者lvresize来将新加入的PE添加到要扩展的逻辑卷中

5、用命令resize2fs扩展文件系统的容量

如果卷组中有多余的空间足够扩展逻辑卷,可以直接从第4步开始。

lv扩展到6G

[root@whb mnt]# lvextend -L 5G /dev/testvg/testlv

扩展物理边界:

[root@whb mnt]# resize2fs /dev/testvg/testlv

详解过程:

创建1个新分区/dev/sdb3,并修改分区类型为8e,创建之后的新分区:

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb3             917        1570     525325

将分区信息写入分区表:

[root@whb ~]# kpartx -af /dev/sdb

[root@whb ~]# partx -a /dev/sdb

 

新硬盘创建pv:

[root@whb ~]# pvcreate /dev/sdb3 

  dev_is_mpath: failed to get device for 18:02

  Physical volume "/dev/sdb3" successfully created

   

扩展VG:

[root@whb ~]# vgextend testvg /dev/sdb3

  Volume group "testvg" successfully extended   

扩展LV:

[root@whb ~]# lvextend -L 10G /dev/testvg/testlv 

  Extending logical volume testlv to 10.00 GiB

  Logical volume testlv successfully resized

物理边界扩展完成,下面扩张文件系统边界:

[root@whb ~]# resize2fs /dev/testvg/testlv 

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/testvg/testlv is mounted on /mnt/lvm; on-line resizing required

old desc_blocks = 1, new_desc_blocks = 1

Performing an on-line resize of /dev/testvg/testlv to 3407872 (4k) blocks.

The filesystem on /dev/testvg/testlv is now 3407872 blocks long.

[root@whb ~]# df -h

Filesystem              Size  Used Avail Use% Mounted on

/dev/mapper/testvg-testlv   10G  141M 10G   2% /mnt/lvm

缩减逻辑卷的步骤:

缩减逻辑卷一定要先离线

1、先卸载文件系统,然后强制执行检测e2fsck -f

2、然后确定要移除的物理卷的大小,有多少个PE。然后用命令resize2fs缩减文件系统大小,然后重新挂载逻辑卷

3、用命令lvreduce或者lvresize缩减指定个数的PE, 也可以计算出相应的大小来缩减

4、LV缩减之后,通过命令pvdisplay查看,指定要移除的PV,如果要移除的PV有PE在用,用pvmove转移PE到空闲的PV。pvmove可以指定要转移的PE 

       pvmove /dev/sdb1:1000-1999/dev/sdc1

       or

       pvmove /dev/sdb1:1000-1999/dev/sdc1:0-999

5、用命令vgreduce缩减指定要从卷组冲移除的物理卷,然后用pvremove命令移除物理卷

 

下面我们将sdb1移除详细步骤:

卸载文件系统:

[root@whb ~]# umount /mnt/lvm

强制检测文件系统:

[root@whb ~]# e2fsck -f /dev/testvg/testlv 

e2fsck 1.41.12 (17-May-2010)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

缩减文件系统:

[root@whb ~]# resize2fs /dev/testvg/testlv 9.7G

resize2fs 1.41.12 (17-May-2010)

resize2fs: Invalid new size: 9.7G

查看要移除的PV是否有占用的PE

[root@whb ~]# pvdisplay

  --- Physical volume ---

  PV Name               /dev/sdb1

  VG Name               testvg

  PV Size               3.01 GiB / not usable 2.75 MiB

  Allocatable           yes 

  PE Size               4.00 MiB

  Total PE              770

  Free PE               519

  Allocated PE          251

  PV UUID               xNUWFa-1FdZ-Ctkj-rvJp-dACa-FnJw-mJf6Sc

    --- Physical volume ---

  PV Name               /dev/sdb3

  VG Name               testvg

  PV Size               1.01 GiB / not usable 3.41 MiB

  Allocatable           yes 

  PE Size               4.00 MiB

  Total PE              258

  Free PE               258

  Allocated PE          0

  PV UUID               8esNBR-k4zM-sQW6-Z71N-hKBX-0YlT-Egb1o5

#可以看出/dev/sdb1有251个PE被分配,而/dev/sdb3的258个PE都是空闲的,所以通过pvmove命令来转移被分配的PE到/dev/sdb3

[root@whb ~]# pvmove /dev/sdb1 /dev/sdb3

  /dev/sdb1: Moved: 0.0%

  /dev/sdb1: Moved: 31.5%

  /dev/sdb1: Moved: 74.5%

  /dev/sdb1: Moved: 100.0%

转移之后:

[root@whb ~]# pvdisplay 

  --- Physical volume ---

  PV Name               /dev/sdb1

  VG Name               testvg

  PV Size               3.01 GiB / not usable 2.75 MiB

  Allocatable           yes 

  PE Size               4.00 MiB

  Total PE              770

  Free PE               770

  Allocated PE          0

  PV UUID               xNUWFa-1FdZ-Ctkj-rvJp-dACa-FnJw-mJf6Sc

    --- Physical volume ---

  PV Name               /dev/sdb3

  VG Name               testvg

  PV Size               1.01 GiB / not usable 3.41 MiB

  Allocatable           yes 

  PE Size               4.00 MiB

  Total PE              258

  Free PE               7

  Allocated PE          251

  PV UUID               8esNBR-k4zM-sQW6-Z71N-hKBX-0YlT-Egb1o5

/dev/sdb1中的数据全部都已经转移到/dev/sdb3中了.呵呵

将sdb1从testvg中移除:

[root@whb ~]# vgreduce testvg /dev/sdb1

  Removed "/dev/sdb1" from volume group "testvg"

[root@whb ~]# pvremove /dev/sdb1

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

[root@whb ~]# pvs

  PV         VG     Fmt  Attr PSize  PFree 

  /dev/sda2  vg0    lvm2 a--  59.99g  7.99g

  /dev/sdb2  testvg lvm2 a--   4.00g     0 

  /dev/sdb3  testvg lvm2 a--   5.01g     0 

  /dev/sdb5  testvg lvm2 a--   1.01g 28.00m

大功告成!!!!!

 

LVM快照系统

快照就是将当时的系统资料记录下来,就好像照相记录一般。未来若有任何数据更动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。

以创建逻辑卷testlv的快照为例:

命令格式:

lvcreate -s命令创建快照

#lvcreate -L 快照区大小 -s -n 快照名 被快照的逻辑卷

创建快照:

[root@whb ~]# lvcreate –L 1G -s -n testlv-snap/dev/testvg/testlv

  Logical volume "testlv-snap" created

 查看:

[root@bogon ~]# lvdisplay

  --- Logical volume ---

  LV Path                /dev/testvg/testlv

  LV Name                testlv

  VG Name                testvg

  LV UUID                zi5txf-3qCY-n70x-pAq6-hfUv-OBo6-4fdFtg

  LV Write Access        read/write

  LV Creation host, time bogon, 2014-07-21 14:32:32 +0800

  LV snapshot status     source of

                         testlv-snap [active]

  LV Status              available

  # open                 1

  LV Size                9.00 GiB

  Current LE             2304

  Segments               2

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:2

  

挂载快照:

[root@bogon ~]# mount /dev/testvg/testlv-snap /mnt/snapshot

删除LVM

以删除之前创建的LVM为例:

删除前先卸载:

[root@whb ~]# umount /mnt/lvm

[root@whb ~]# umount /mnt/snapshot

[root@whb ~]# lvremove /dev/testvg/testlv-snap

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

  Logical volume "testlv-snap" successfully removed

[root@whb ~]# lvremove /dev/testvg/testlv

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

  Logical volume "testlv" successfully removed

 

取消激活状态的卷组:

[root@whb ~]# vgchange -a n testvg 

[root@whb ~]# vgremove testvg

  Volume group "testvg" successfully removed

删除PV:

[root@whb ~]# pvremove /dev/sdb{2,3}

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

  Labels on physical volume "/dev/sdb3" successfully wiped[root@whb ~]# pvs

  PV         VG   Fmt  Attr PSize  PFree

 

本文出自 “gentoo” 博客,请务必保留此出处http://linuxgentoo.blog.51cto.com/7678232/1531030