首页 > 代码库 > 逻辑卷管理器(LVM)

逻辑卷管理器(LVM)

1、逻辑卷管理器(LVM)

(1)逻辑卷管理器(LVM,logical volume manager)可以整合多个物理分区在一起,让这些分区看起来就像一个磁盘一样,而且,还可以在将来其他的物理分区或将其从这个LVM管理的磁盘中删除。这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性,同时LVM还有快照功能。

(2)逻辑卷管理器的基本术语 物理卷(PV):简单说,物理卷就是磁盘或者是磁盘分区,由pvcreate命令创建。 物理扩展块(PE):LVM默认使用4MB的PE块,在LVM的卷组总最多只能含有65534个PE,因此默认的PE大小是256G。PE是整个LVM最小的存储块。 卷组(VG):将多个物理卷,使用vgcreate命令整合成一个大的磁盘,即为卷组,卷组的大小有物理卷的数量和大小决定。 逻辑卷(LG):逻辑卷是在卷组的基础上可以被格式化为文件系统的分区,大小有PE的块数决定。使用lvcreate命令创建。

技术分享

技术分享

2、创建物理卷(physical volume)

pvcreate:将物理分区新建成PV
    -f:强制创建物理卷,不需要用户确认;
    -u:指定设备的UUID;
    -y:所有的问题都回答“yes”;
    -Z:是否利用前4个扇区。
pvdisplay:显示当前系统上的PV状态
    pvdisplay命令显示的物理卷信息包括:物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID    
pvscan:查询磁盘上所有具有PV的磁盘
    -d:调试模式
    -e:仅显示属于输出卷组的物理卷
    -n:仅显示不属于任何卷组的物理卷
    -s:短格式输出
    -u:显示UUID
pvremove:将PV删除,让该分区不具有PV属性
pvmove:用来将一块盘上的数据移到另一块盘,可以移动整块盘的数据,也可以移动指定 extent 范围的数据
    eg:pvmove /dev/sdb /dev/sdc

3、创建卷组(volume group)

vgcreate:创建一个VG
    -l:卷组上允许创建的最大逻辑卷数;
    -p:卷组中允许添加的最大物理卷数;
    -s:卷组上的物理卷的PE大小(单位 M G T大小都可)。  
vgscan:查找系统上是否有VG
vgdisplay:显示目前系统的VG状态
    -A:仅显示活动卷组的属性;
    -s:使用短格式输出的信息。
vgextend:增加VG的额外PV
    -t:仅测试。
vgreduce:减少(删除)VG的PV
    -a:如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷;
    --removemissing:删除卷组中丢失的物理卷,使卷组恢复正常状态。
vgchange:设置卷组是处于活动状态还是非活动状态
    -a:设置卷组的活动状态
vgremove:删除一个VG(先做pvmove ,再做vgremove)
    -f:强制删除

4、创建逻辑卷(logical volume)

lvcreate:新建一个LV
    -L:指定逻辑卷的大小,后接容量,此容量需是PE的整数倍,单位为“kKmMgGtT”
    -l:指定逻辑卷的大小,后接PE个数
    -n:后接LV的名称
    -s:创建快照
lvscan:查询系统上的LV
    -b:显示逻辑卷的主设备和次设备号
lvdisplay:显示系统上的LV状态
lvextend:在LV里面增加容量
lvreduce:在LV里面减少容量
lvremove:删除一个LV
lvresize:调整LV的大小
resize2fs:调整ext系列系统LV大小
xfs_growfs:调整xfs格式LV大小

5、示例 (虚拟机环境)

[root@localhost ~]# fdisk /dev/sdb (使用fdisk命令创建了四个分区)
[root@localhost ~]# lsblk /dev/sdb 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  200G  0 disk 
├─sdb1   8:17   0    5G  0 part 
├─sdb2   8:18   0    5G  0 part 
├─sdb3   8:19   0   20G  0 part 
├─sdb4   8:20   0    1K  0 part (扩展分区)
└─sdb5   8:21   0   10G  0 part (逻辑分区)
[root@localhost ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
[root@localhost ~]# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# pvcreate /dev/sdb3
  Physical volume "/dev/sdb3" successfully created
[root@localhost ~]# pvcreate /dev/sdb5
  Physical volume "/dev/sdb5" successfully created
[root@localhost ~]# pvs (建立了4个PV,可以用pvdisplay命令查看更详细信息)
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb1       lvm2 ----  5.01g  5.01g
  /dev/sdb2       lvm2 ----  5.01g  5.01g
  /dev/sdb3       lvm2 ---- 20.01g 20.01g
  /dev/sdb5       lvm2 ---- 10.00g 10.00g
[root@localhost ~]# vgcreate vgtest /dev/sdb{1,2,3,5} (创建名为vgtest的卷组)
  Volume group "vgtest" successfully created
[root@localhost ~]# vgdisplay (vgtest卷组的详细信息)
  --- Volume group ---
  VG Name               vgtest
  System ID             
  Format                lvm2
  Metadata Areas        4
  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                4
  Act PV                4
  VG Size               40.02 GiB
  PE Size               4.00 MiB (此例子用默认的PE大小)
  Total PE              10246
  Alloc PE / Size       0 / 0   
  Free  PE / Size       10246 / 40.02 GiB
  VG UUID               Xe9pMF-tyCN-Bk5z-ZPub-TVHA-DCVm-hRVyqd
[root@localhost ~]# lvcreate -n lvtest -L 15G vgtest 
  Logical volume "lvtest" created. (在vgtest卷组创建了一个15G的逻辑卷lvtestS)
[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vgtest/lvtest
  LV Name                lvtest
  VG Name                vgtest
  LV UUID                qZcbaO-EX0V-QUhw-oDig-Ldoc-5Amp-X8jyUB
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2016-08-29 22:15:31 +0800
  LV Status              available
  # open                 0
  LV Size                15.00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
[root@localhost ~]# mkfs.ext4 /dev/vgtest/lvtest (将lvtest格式化为ext4系统)
[root@localhost ~]# mount /dev/vgtest/lvtest /mnt/lvtest(挂载,若/mnt/lvtest目录需事先存在)
[root@localhost ~]# df -h /mnt/lvtest (已经创建好一个15G的LV)
  Filesystem                Size  Used Avail Use% Mounted on
  /dev/mapper/vgtest-lvtest  15G   38M   14G  1%  /mnt/lvtest
如果要每次启动系统时自动挂载,需将以下字符写到/etc/fstab文件中
  /dev/vgtest/lvtest(建议用UUID)  /mnt/lvtest  ext4  defaults  0  0

至此一个完整的LVM已经创建好了,接下来补充一下逻辑卷的扩展和压缩

[root@localhost ~]# lvextend -L +5G /dev/vgtest/lvtest (增加5G空间,“+n”表示增加n空间;直接给定一个数字n,则表示增加到n空间,单位 M G T )
  Size of logical volume vgtest/lvtest changed from 15.00 GiB (3840 extents) to 20.00 GiB (5120 extents).
  Logical volume lvtest successfully resized. (成功在lvtest中增加了5G)
[root@localhost ~]# df -h /dev/vgtest/lvtest
  Filesystem                 Size  Used Avail Use% Mounted on
  /dev/mapper/vgtest-lvtest   15G   38M   14G   1% /mnt/lvtest (但是没显示,为什么?因为在线增加容量存在同步问题)
[root@localhost ~]# resize2fs /dev/vgtest/lvtest  (使增加的5G容量生效)
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vgtest/lvtest is mounted on /mnt/lvtest; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/vgtest/lvtest to 5242880 (4k) blocks.
The filesystem on /dev/vgtest/lvtest is now 5242880 blocks long.
[root@localhost ~]# df -h /mnt/lvtest/   (可以看到已经扩展为20G了)
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest   20G   42M   19G   1% /mnt/lvtest

注意:LVM的扩展可以不用卸载而在线进行,但是压缩却不能支持的。一般情况下文件系统都会存有数据,如果直接压缩空间的话,很容易造成数据的丢失、损坏。因此压缩空间前需要将已经挂载的系统卸载。现在我们继续接着上面的例子来进行压缩操作吧(压缩操作很危险,要注意做好备份)。

[root@localhost ~]# umount /mnt/lvtest (卸载)
[root@localhost ~]# e2fsck -f /dev/vgtest/lvtest (强制检测lvtest,此步必须有)
e2fsck 1.41.12 (17-May-2010)
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/vgtest/lvtest: 11/1310720 files (0.0% non-contiguous), 122065/5242880 blocks
[root@localhost ~]# resize2fs /dev/vgtest/lvtest 10G (降低文件系统的10G容量)
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vgtest/lvtest to 2621440 (4k) blocks.
The filesystem on /dev/vgtest/lvtest is now 2621440 blocks long.
[root@localhost ~]# lvreduce -L -10G /dev/vgtest/lvtest (压缩逻辑卷的10G空间)
  WARNING: Reducing active logical volume to 10.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vgtest/lvtest? [y/n]: y
  Size of logical volume vgtest/lvtest changed from 20.00 GiB (5120 extents) to 10.00 GiB (2560 extents).
  Logical volume lvtest successfully resized.
[root@localhost ~]# mount /dev/vgtest/lvtest /mnt/lvtest (挂载压缩后的lvtest) 
[root@localhost ~]# lvscan (可以看到lvtest已经被压缩了10G空间了)
  ACTIVE            ‘/dev/vgtest/lvtest‘ [10.00 GiB] inherit

至此,逻辑卷的压缩也已经完成,以上压缩步骤顺序千万不能乱,否则很容易造成文件损坏。既然说到这了,那么就顺便也来聊聊卷组(VG)压缩吧,压缩卷组前需要确认你要移出卷组的磁盘(或分区)是不包含数据的(避免数据丢失),可以用pvdisplay命令查看。

[root@localhost ~]# pvdisplay (查看那个分区是没有数据的,此例要移除/dev/sdb1,以每个人的实际情况确定删除的PV)
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vgtest
  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               9ccUO2-yK1I-zYPP-FQJi-yP2e-t1gQ-FZXLkL
[root@localhost ~]# vgreduce vgtest /dev/sdb1 (将/dev/sdb1移出vgtest卷组)
  Removed "/dev/sdb1" from volume group "vgtest"
[root@localhost ~]# vgs (查看VG大小,可以看到已经少了5G)
  VG     #PV #LV #SN Attr   VSize  VFree 
  vgtest   3   1   0 wz--n- 35.02g 25.02g
[root@localhost ~]# pvs (可以看到/dev/sdb1已经移出了)
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1         lvm2 ----  5.01g  5.01g
  /dev/sdb2  vgtest lvm2 a--u  5.01g  5.01g
  /dev/sdb3  vgtest lvm2 a--u 20.01g 10.01g
  /dev/sdb5  vgtest lvm2 a--u 10.00g 10.00g
现在我们再把/dev/sdb1添加回vgtest吧,看下面:
[root@localhost ~]# vgextend vgtest /dev/sdb1 
Volume group "vgtest" successfully extended
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  vgtest   4   1   0 wz--n- 40.02g 30.02g
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1  vgtest lvm2 a--u  5.01g  5.01g
  /dev/sdb2  vgtest lvm2 a--u  5.01g  5.01g
  /dev/sdb3  vgtest lvm2 a--u 20.01g 10.01g
  /dev/sdb5  vgtest lvm2 a--u 10.00g 10.00g
如果添加新的设备到VG中,需要先用pvcreate命令创建PV,再用vgextend命令将创建好的PV加入VG中。

6、快照功能

(1)快照相关介绍

1)快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
2)对于需要备份或者复制的现有数据集临时拷贝以及其它操作来说,快照是最合适的选择。
3)快照只有在它们和原来的逻辑卷不同时才会消耗空间。
    在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间。
    当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中。
    快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据。
    建立快照的卷大小只需要原始逻辑卷的15% ~20% 就够了。也可以使用lvextend 放大快照。

技术分享

由于快照区与原本的LV 共用很多PE 的区块,因此快照区与 被快照的LV 必须要要在同一个VG 上!系统恢复的时候的文 件数量不能高于快照区的实际容量。

7、快照示例

[root@localhost ~]# vgdisplay (确认可用PE的数量)
  --- Volume group ---
  VG Name               vgtest
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  16
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               40.02 GiB
  PE Size               4.00 MiB
  Total PE              10246
  Alloc PE / Size       2560 / 10.00 GiB
  Free  PE / Size       7686 / 30.02 GiB (如果不够的话需要添加额外的PV哦)
  VG UUID               Xe9pMF-tyCN-Bk5z-ZPub-TVHA-DCVm-hRVyqd
[root@localhost ~]# lvcreate -l 524 -s -n testss /dev/vgtest/lvtest (创建一个PE数量为524个名字为testss的快照,详细属性可用lvdisplay查看。其中–s表示要创建快照,-n表示快照的名称,-L 表示快照的大小。)
 Logical volume "testss" created.
[root@localhost ~]# mkdir /mnt/snapshot
[root@localhost ~]# mount /dev/vgtest/testss /mnt/snapshot (挂载快照)
[root@localhost ~]# df (可以看到快照和原文件属性一样)
Filesystem                 1K-blocks    Used Available Use% Mounted o
/dev/mapper/vgtest-lvtest  10190136   23028   9642884   1%  /mnt/lvtest
/dev/mapper/vgtest-testss  10190136   23028   9642884   1%  /mnt/snapshot
[root@localhost ~]# umount /mnt/snapshot/ (卸载快照)
[root@localhost ~]# cp -r /boot /root /mnt/lvtest
[root@localhost ~]# df /mnt/lvtest (可以看到原系统已经有所改变)
Filesystem                 1K-blocks   Used Available Use% Mounted on
/dev/mapper/vgtest-lvtest  10190136 197800   9468112   3%  /mnt/lvtest
[root@localhost ~]# rm -rf /mnt/lvtest/. (将/lvtest里的问都删,也可重新格式化成原格式)
[root@localhost ~]# cp -a /mnt/snapshot/. /mnt/lvtest/ (用快照恢复原文件系统)
[root@localhost ~]# df /mnt/lvtest/ (可以看到已经恢复了)
Filesystem                 1K-blocks  Used Available Use% Mounted on
/dev/mapper/vgtest-lvtest  10190136 23012   9642900   1%  /mnt/lvtest

建议:最好将快照卷也备份一下。


本文出自 “新手学Linux” 博客,请务必保留此出处http://kop309.blog.51cto.com/9034739/1844912

逻辑卷管理器(LVM)