逻辑卷

来源:互联网 发布:贾斯汀比伯 知乎 编辑:程序博客网 时间:2024/05/16 01:24

0.目录

  • 目录
  • 逻辑卷
    • 1 什么是逻辑卷
    • 2 逻辑卷组成及说明
    • 3 逻辑卷的设备文件
  • 各管理命令
    • 1 物理卷管理命令
    • 2 卷组管理命令
    • 3 逻辑卷管理命令
  • 快照卷
    • 1 什么是快照卷
    • 2 使用场景
    • 3 命令创建及效果验证

1.逻辑卷

1.1 什么是逻辑卷

由逻辑卷管理器(LVM,Logical Volume Manager),把多个底层的块设备组织成一个逻辑设备,即逻辑卷(LV,Logical Volume)。

软RAID使用的是内核中的md(mutil device)模块,而LVM使用的是dm(device mapper)模块。

1.2 逻辑卷组成及说明

逻辑卷组成


  • 物理卷(Physical Volume)
    磁盘分区、RAID等块设备均可作为PV(上图为了方便展示,都搞成磁盘了)。生产环境中应尽量使用有冗余能力的RAID。

  • 卷组(Volume Group)
    VG由各PV组成创建,在VG上可创建LV(这也就是创建LV的步骤),VG本身不可直接被使用1。

    VG会把组成它的各PV划分为“块”,称为PE(物理盘区,Physical extent)。PE大小在创建VG时可定义,默认是4M。

    VG分给LV的最小单位就是PE2,分配给LV的PE被称为LE(逻辑盘区,Logical Extent)。

    VG可通过添加、移除PV,实现扩展、缩减大小。注意在移除某PV时,应先把该PV上的数据移动到其他PV上,且要确保剩余的PV有足够空间存储这些数据。

  • 逻辑卷
    LV相对于普通磁盘分区的优势,在于其可在VG上扩展或缩减而不影响其上的数据3,只要剩余空间足够。而普通磁盘分区空间需变化时,只能重新分区、格式化。
    所以它可用于无法预知使用空间的场景,比如红帽linux的根文件系统就在逻辑卷上。

1.3 逻辑卷的设备文件

逻辑卷的设备文件为/dev/dm-#,#为数字。

为便于识别、管理,有两符号链接文件指向逻辑卷设备文件:

  • /dev/mapper/VG_name-LV_name
    在/dev/mapper目录下,卷组名-其上的逻辑卷名。如卷组myvg1上的逻辑卷mylv1。

    [root@local ~]# ls -l /dev/mapper/myvg1-mylv1lrwxrwxrwx. 1 root root 7 Feb  6 21:00 /dev/mapper/myvg1-mylv1 -> ../dm-0
  • /dev/VG_name/LV_name
    /dev下,卷组名作为目录,逻辑卷名作为链接文件。

    [root@local ~]# ls -l /dev/myvg1/mylv1lrwxrwxrwx. 1 root root 7 Feb  6 21:00 /dev/myvg1/mylv1 -> ../dm-0

2.各管理命令

2.1 物理卷管理命令

管理PV的工具,均以pv开头。

  • pvcreate
    用于创建物理卷。

    • 选项“-u”,指定创建的设备的UUID。
    • 选项“-v”,显示创建细节。
    • 选项“-f”,强制创建,即便覆盖原有数据。

    比如把/dev/sdb1、/dev/sdb2、/dev/sdb3创建为PV。

        Device Boot      Start         End      Blocks   Id  System/dev/sdb1               1         654     5253223+  8e  Linux LVM/dev/sdb2             655        1308     5253255   8e  Linux LVM/dev/sdb3            1309        1962     5253255   8e  Linux LVM# 创建之前应先把各分区类型改为8e[root@local ~]# pvcreate /dev/sdb{1,2,3}Physical volume "/dev/sdb1" successfully createdPhysical volume "/dev/sdb2" successfully createdPhysical volume "/dev/sdb3" successfully created
  • pvdisplay
    用于显示PV详细信息,可指定显示设备,不指定则显示所有PV信息。

    在PV加入VG之前,不可被使用且没有分配PE,所以PE信息均为0、Allocatable为“NO”。

    [root@local ~]# pvdisplay /dev/sdb1  "/dev/sdb1" is a new physical volume of "5.01 GiB"  --- NEW Physical volume ---  PV Name               /dev/sdb1  VG Name                 PV Size               5.01 GiB  Allocatable           NO  PE Size               0     Total PE              0  Free PE               0  Allocated PE          0  PV UUID               Nh5wxi-3xMs-5zFp-7wZy-Lj4B-5De1-unnoLV
  • pvs
    用于显示PV简要信息,用法同pvdisplay。

    [root@local ~]# pvs /dev/sdb1  PV         VG   Fmt  Attr PSize PFree  /dev/sdb1       lvm2 ---- 5.01g 5.01g
  • pvmove
    用于把某PV上的PE(也就是其上的数据数据),移动至其他PV,以便从该VG移除此PV。

  • pvremove
    用于删除PV。

2.2 卷组管理命令

管理VG的工具均已vg开头。

  • vgcreate
    用于创建VG。

    • 选项“-s”,指定创建的VG的PE大小,不指定则使用默认。创建后PE大小不会改变除非重新创建VG。

    把/dev/sdb1添加至名为vg1的VG(一个VG可以仅由一个PV组成)。

    [root@local ~]# vgcreate vg1 /dev/sdb1  Volume group "vg1" successfully created
  • vgdisplay
    用于显示VG详细信息,不指定VG名则显示所有VG。

    [root@local ~]# vgdisplay vg1  --- Volume group ---  VG Name               vg1  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               5.01 GiB  PE Size               4.00 MiB  Total PE              1282  Alloc PE / Size       0 / 0     Free  PE / Size       1282 / 5.01 GiB  VG UUID               rindE8-Me1J-rRUg-VjQa-TdYA-4JCY-ZlCIDU
  • vgs
    用于显示VG简要信息。

    [root@local ~]# vgs vg1  VG   #PV #LV #SN Attr   VSize VFree  vg1    1   0   0 wz--n- 5.01g 5.01g
  • vgrename
    用于重命名VG。

    把vg1重命名为myvg1。

    [root@local ~]# vgrename vg1 myvg1  Volume group "vg1" successfully renamed to "myvg1"
  • vgremove
    用于删除VG。

  • vgextend
    用于扩展VG,也就是把新的PV加入到VG。

    把/dev/sdb2、/dev/sdb3添加进myvg1。

    [root@local ~]# vgextend myvg1 /dev/sdb{2,3}  Volume group "myvg1" successfully extended[root@local ~]# vgs  VG    #PV #LV #SN Attr   VSize  VFree   myvg1   3   0   0 wz--n- 15.02g 15.02g# 可以看到PV数量变为了3,空间大小也扩展了
  • vgreduce
    用于缩减VG,就是把某PV移除出VG。

    把/dev/sdb3移除出myvg1。

[root@local ~]# pvmove /dev/sdb3  No data to move for myvg1        # 如前所述,移除PV前应先移动其上的数据,不过此处的/dev/sdb3上没存数据[root@local ~]# vgreduce myvg1 /dev/sdb3  Removed "/dev/sdb3" from volume group "myvg1"[root@local ~]# vgs  VG    #PV #LV #SN Attr   VSize  VFree   myvg1   2   0   0 wz--n- 10.02g 10.02g# PV数变为了2,空间也对应缩减

2.3 逻辑卷管理命令

管理LV的工具均已lv开头。

  • lvcreate
    用于在某VG上创建LV。

    • 选项“-L | –size”,用于指定LV大小。
    • 选项“-n | –name”,用于指定LV名。
    • 选项“-l”,不直接指定LV大小,而是指定分配给该LV多少盘区(LE)。

    在卷组myvg1上创建大小为3G,名为mylv1的逻辑卷。

    [root@local ~]# lvcreate -L 3G -n mylv1 myvg1  Logical volume "mylv1" created.[root@local ~]# vgs  VG    #PV #LV #SN Attr   VSize  VFree  myvg1   2   1   0 wz--n- 10.02g 7.02g# VG上的LV数量增加,VG空闲空间对应减少
  • lvdisplay、lvs
    用于显示LV的详细、简要信息,参数也可以是VG。

    [root@local ~]# lvdisplay /dev/myvg1/mylv1   --- Logical volume ---  LV Path                /dev/myvg1/mylv1  LV Name                mylv1  VG Name                myvg1  LV UUID                9PBiDC-zOsZ-MyRY-zKMO-GsFf-RBmr-MBmU9b  LV Write Access        read/write  LV Creation host, time local, 2017-02-05 12:41:53 +0800  LV Status              available  # open                 0  LV Size                3.00 GiB  Current LE             768  Segments               1  Allocation             inherit  Read ahead sectors     auto  - currently set to     256  Block device           253:0
    [root@local ~]# lvs /dev/myvg1/mylv1   LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  mylv1 myvg1 -wi-a----- 3.00g
  • lvrename
    用于重命名LV。

  • lvextend
    用于扩展LV。

    • 选项“-L | –size”,指定扩展大小。后跟数字#表示扩展到#大小;后跟“+#”表示在原空间基础上扩展#大小。

    注意:
    1、LV的扩展可以联机进行,即可以在LV挂载的情况下,直接进行,而无需先卸载。
    2、如果VG空间不够,应先扩展VG,再扩展LV。即先扩展下层,才能扩展上层。
    3、LV扩展完成后,其上的文件系统(如果扩展前建立的话)大小并没有改变,可使用命令resize2fs扩展文件系统的大小(该命令仅适用于ext系列文件系统,其他文件系统可使用其他工具),而不用重新对LV格式化。如不指定扩展大小,则表示文件系统扩展到整个LV的大小。

    把逻辑卷mylv1由3G扩展到4G。

    [root@local ~]# lvextend -L 4G /dev/myvg1/mylv1   Size of logical volume myvg1/mylv1 changed from 3.00 GiB (768 extents) to 4.00 GiB (1024 extents).[root@local ~]# lvs /dev/myvg1/mylv1  LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  • lvreduce
    用于缩减LV。缩减操作有风险,尽量不使用。

    • 选项“-L | –size”,指定缩减大小。后跟数字#表示缩减到#大小;后跟“-#”表示在原空间基础上扩展#大小。

    注意:
    1、LV缩减不允许联机进行,即如果要缩减,应先卸载LV,缩减完成后再挂载。
    2、因缩减操作易出错,所以缩减前应先强制检测文件系统(命令fsck、e2fsck等)。
    3、与扩展相反,缩减应是从上层先进行。先缩减文件系统(同样可使用resize2fs);再缩减LV;再缩减VG(如果需要的话)等等。

    把逻辑卷mylv1由4G缩减至3G。mylv1没有格式化和挂载,所以可直接缩减。

    [root@local ~]# lvreduce -L 3G /dev/myvg1/mylv1   WARNING: Reducing active logical volume to 3.00 GiB.  THIS MAY DESTROY YOUR DATA (filesystem etc.)Do you really want to reduce myvg1/mylv1? [y/n]: y  Size of logical volume myvg1/mylv1 changed from 4.00 GiB (1024 extents) to 3.00 GiB (768 extents).  Logical volume mylv1 successfully resized.[root@local ~]# lvs /dev/myvg1/mylv1  LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  mylv1 myvg1 -wi-a----- 3.00g
  • lvremove
    用于删除LV。
    显然如果LV所在的VG被删除,LV也一并被删除。

3.快照卷

3.1 什么是快照卷

对某一LV做快照卷,就是在同一卷组创建一个逻辑卷,作为此LV的另一访问路径4。一旦原卷上的数据发生变化,变化前的数据会立即先复制到快照卷。未发生变化的数据,快照卷不做记录。

这样由快照卷访问的数据,总是做快照那一刻的数据。所以快照卷主要用于数据的备份。

访问快照卷

极端情况下,原LV上的数据如果都发生变化,创建的快照卷需和原LV一样大才能存储这些数据。
不过如果创建的快照卷仅短时间内使用,在这段时间内如果可以预见原LV上的数据变化不会超过某大小,那么快照卷创建为此大小即可。

3.2 使用场景

比如备份较多数据时,复制后一半时,前一半很可能已经发生变化了。这样复制完成后,前后数据就会是处于不同的时刻完成复制的。
如果使用快照卷作为访问路径进行备份,则复制的数据就都是做快照时刻的状态了。

3.3 命令创建及效果验证

同样使用命令lvcreate,其选项“-s”即表示创建的是快照卷。另外因快照卷一般只作为读取访问的入口,所以可使用选项“-p”设定其权限为只读。

效果验证:
在mylv1上创建ext4文件系统,并挂载至目录/tmp/lv_test。

[root@local ~]# mke2fs -t ext4 /dev/myvg1/mylv1 > /dev/nullmke2fs 1.41.12 (17-May-2010)[root@local ~]# mount /dev/myvg1/mylv1 /tmp/lv_test

在目录/tmp/lv_test创建内容为“hello”的文件hello。

[root@local ~]# echo hello > /tmp/lv_test/hello

此时对mylv1创建一个1G大小,名为mylv1-snap快照卷5,并挂载至目录/tmp/lv-snap_test。

[root@local ~]# lvcreate -s -L 1G -p r -n mylv1-snap /dev/myvg1/mylv1   Logical volume "mylv1-snap" created.[root@local ~]# mount -o ro /dev/myvg1/mylv1-snap /tmp/lv-snap_test

分别从mylv1和其快照卷所挂载的目录访问,查看内容,二者内容相同。

[root@local lv_test]# cd /tmp/lv_test/[root@local lv_test]# cat hello hello[root@local lv_test]# cd /tmp/lv-snap_test/[root@local lv-snap_test]# cat hello hello

修改文件hello内容为haha,查看两目录内容,快照卷仍为hello。

[root@local ~]# echo haha > /tmp/lv_test/hello [root@local ~]# cat /tmp/lv_test/hello haha[root@local ~]# cat /tmp/lv-snap_test/hello hello

在原卷所挂载的目录创建新的文件,效果也一样。

[root@local ~]# touch /tmp/lv_test/hello2[root@local ~]# ls /tmp/lv_test/hello  hello2  lost+found[root@local ~]# ls /tmp/lv-snap_test/hello  lost+found

即便卸载原卷,快照卷的挂载点依然可以使用。这再次证明快照卷是原卷的另一访问入口。

[root@local ~]# umount /dev/myvg1/mylv1[root@local ~]# ls /tmp/lv-snap_test/hello  lost+found[root@local ~]# cat /tmp/lv-snap_test/hello hello

(完)


  1. 就像磁盘上的扩展分区不能直接使用,而要在其上建立逻辑分区才可使用一样。 ↩
  2. 类似磁盘的磁道与分区的关系,某磁道分配给某分区只能是整个都分配,不能取部分。所以有时磁盘分区的大小会不精确,LV的大小也一样会有这种情况,PE只能整个分配,不能取部分。 ↩
  3. 逻辑卷扩展,一般问题不大;缩减则是有风险的,生产环境一般不使用缩减。 ↩
  4. 这点类似硬链接,硬链接不能跨分区,快照卷和原卷也是必须在同一VG上。 ↩
  5. 注意,要在原卷格式化后再创建快照卷,因为快照卷记录的是创建的时刻原卷上数据的状态,所以原卷如果没有格式化,那么快照卷的记录也是没有文件系统,这样快照卷在挂载时会报错(提示没有文件系统,无法挂载)。
    且可以想见,如果快照卷在原卷未格式化时创建,原卷格式化时,快照卷会视为是原卷上数据的变化,从而记录的就是创建的文件系统,没什么意义。
    这也再次说明,快照卷记录的是创建那一刻的原卷上的状态(即便原卷没有格式化)。 ↩
0 0
原创粉丝点击