LVM原理、创建、扩容、缩减、快照详解

LVM是什么?为什么要使用LVM?

    LVM(Logical Volume Manager):逻辑卷管理, 在日常使用或生产环境中, 我们可能会因为在规划存储时未考虑到未来数据增长的速度超乎我们的预计而措手不及,因为增加一块硬盘再将源数据移到新硬盘上很麻烦并且提高了成本还浪费硬盘空间。

    在1998年有人在开发了一个基于卷的管理方式, 在HP-UX中使用,这就是LVM,LVM可以无损扩容、缩减空间来达到应对硬盘空间不足的情况。

LVM相关原理

    LVM通过内核中的dm(device mapper)模块实现使用纯软件的方式将一个或多个底层硬件设备组织成一个或多个逻辑设备。

相关术语:

    PV:Physical Volume    #一般是物理分区 /dev/sd##…

    VG:Volume Group    #由多个PE组成,创建卷组时可指定PE大小

    PE:Physical Extent    #默认大小为4M,LVM中的最小单元

    LV:Logical Volume    #由多个PE组成

    LE:Logical Extent    #在LV中的PE称作LE

    LVM通过PV组成PV池,基于PV创建VG,VG由若干个PE组成,在VG中由多个PE组成LV,在LV中PE叫做LE。

原理图:

    File:LVM1.svg此图转自维基百科

实战:创建、扩容、缩减、快照

系统环境

当前系统分区信息,当前系统有2块新硬盘,分别为20G
[root@server2 ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x0002777c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      208813+  83  Linux
/dev/sda2              27        1985    15735667+  83  Linux
/dev/sda3            1986        2247     2104515   82  Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0xdee177d5

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdc: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x00000000


LVM相关命令解释

vg管理工具:
    vgs    #查看vg简要信息
    vgdisplay      #查看vg详细信息
    vgcreate  [-s #[kKmMgGtTpPeE]] VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #创建vg
    vgextend  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #扩展vg容量
    vgreduce  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #缩减vg容量
    vgremove  VolumeGroupName  #删除vg

lv管理工具:
    lvs    #查看lv简要信息
    lvdisplay    #查看lv详细信息
    lvcreate -L #[mMgGtT] -n NAME VolumeGroup    #创建lv
    lvremove /dev/VG_NAME/LV_NAME    #删除lv

扩展逻辑卷:
    lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME    #扩展逻辑卷
    resize2fs /dev/VG_NAME/LV_NAME    #重新定义文件系统大小
    
缩减逻辑卷:
    umount /dev/VG_NAME/LV_NAME    #卸载lv
    e2fsck -f /dev/VG_NAME/LV_NAME    #检查lv
    resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]    #重新定义lv大小
    lvreduce -L [-] [mMgGtT] /dev/VG_NAME/LV_NAME    #缩减lv

LVM创建

[root@server2 ~]# pvcreate /dev/sdb     #将sdb硬盘添加到PV池中
  Physical volume "/dev/sdb" successfully created
[root@server2 ~]# pvcreate /dev/sdc    #将sdc硬盘添加到PV池中
  Physical volume "/dev/sdc" successfully created
[root@server2 ~]# pvs    #查看PV池
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb        lvm2 ---  20.00g 20.00g
  /dev/sdc        lvm2 ---  20.00g 20.00g
[root@server2 ~]# vgcreate myvg /dev/sdb     #创建名称为myvg的卷组,由/dev/sdb提供PE
  Volume group "myvg" successfully created    #提示vg创建成功
[root@server2 ~]# vgs    #查看vg简要信息
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   1   1   0 wz--n- 20.00g 10.00g
[root@server2 ~]# lvcreate -L 10G -n mylv myvg    #在myvg下创建容量为10G、名称为mylv的lv
  Logical volume "mylv" created.
[root@server2 ~]# lvs    #查看lv简要信息
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-a----- 10.00g 
  
[root@server2 ~]# mkfs.ext4 /dev/mapper/myvg-mylv     #格式化lv为ext4文件系统
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 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

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    #将mylv挂载到/mnt下

[root@server2 ~]# df -lh    #查看mylv分区使用情况
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      9.8G   23M  9.2G   1% /mnt

LVM扩展

我们现在想将mylv扩展到30G该如何操作?

    应该先将myvg扩展到30G以上,在将mylv扩展到30G

操作过程

[root@server2 ~]# vgextend myvg /dev/sdc    #扩展myvg,将sdc的空间也提供给myvg
  Volume group "myvg" successfully extended
  
[root@server2 ~]# vgs    #查看vg当前信息,myvg大小为40G
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   2   1   0 wz--n- 39.99g 29.99g
  
[root@server2 ~]# umount /mnt/    #卸载mylv

[root@server2 ~]# lvextend -L 30G /dev/myvg/mylv     #扩展lv到30G
  Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 30.00 GiB (7680 extents).
  Logical volume mylv successfully resized
  
[root@server2 ~]# lvs    #查看当前lv信息,mylv为30G
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-a----- 30.00g 
[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    #挂载mylv到/mnt目录

[root@server2 ~]# df    ##注意:这里显示mylv大小只有10G,这是因为我们没有进行重新定义
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/sda2             15357672 3527844  11043048  25% /
tmpfs                   502384       0    502384   0% /dev/shm
/dev/sda1               198123   36589    151094  20% /boot
/dev/mapper/myvg-mylv
                      10190136   23028   9642820   1% /mnt
[root@server2 ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      9.8G   23M  9.2G   1% /mnt
                      
[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv     #使用resize2fs可以重新定义分区的大小
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/myvg-mylv is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/myvg-mylv to 7864320 (4k) blocks.
The filesystem on /dev/mapper/myvg-mylv is now 7864320 blocks long.
[root@server2 ~]# df -lh    #现在mylv大小终于恢复正常了
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                       30G   28M   28G   1% /mnt

LVM缩减

    缩减mylv到10G

操作过程

[root@server2 ~]# umount /mnt/    #先卸载挂载目录
[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv 8G    
resize2fs 1.41.12 (17-May-2010)
Please run 'e2fsck -f /dev/mapper/myvg-mylv' first.    #提示需先使用e2fsck命令检查文件系统
[root@server2 ~]# e2fsck -f /dev/mapper/myvg-mylv     #检查mylv文件系统
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/mapper/myvg-mylv: 11/1966080 files (0.0% non-contiguous), 167409/7864320 blocks

[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv 8G    #使用resize2fs命令重新定义mylv分区大小
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/myvg-mylv to 2097152 (4k) blocks.
The filesystem on /dev/mapper/myvg-mylv is now 2097152 blocks long.

[root@server2 ~]# lvreduce -L 8G /dev/myvg/mylv     #将mylv大小缩减成8G
  WARNING: Reducing active logical volume to 8.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 30.00 GiB (7680 extents) to 8.00 GiB (2048 extents).
  Logical volume mylv successfully resized
  
[root@server2 ~]# lvs    #查看mylv信息
  LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-ao---- 8.00g 
[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    重新挂载
[root@server2 ~]# df -lh    #查看分区大小
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      7.8G   36M  7.4G   1% /mnt

LVM快照创建

    LVM快照简单来说就是将所快照源分区一个时间点所有文件的元数据进行保存,如果源文件没有改变,那么访问快照卷的相应文件则直接指向源分区的源文件,如果源文件发生改变,则快照卷中与之对应的文件不会发生改变。快照卷主要用于辅助备份文件。  这里只简单介绍,点击查看详细介绍

操作过程

[root@server2 mnt]# df    
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/sda2             15357672 3527924  11042968  25% /
tmpfs                   502384       0    502384   0% /dev/shm
/dev/sda1               198123   36589    151094  20% /boot
/dev/mapper/myvg-mylv
                       8125880   36852   7669600   1% /mnt
[root@server2 mnt]# pwd    #当前在mylv的分区中
/mnt
[root@server2 mnt]# cp -rf /etc/{grub.conf,sysconfig} ./    #复制/etc/sysconfig,/etc/grub.conf到当前目录(mylv中)
[root@server2 mnt]# ls    #查看当前分区中的文件
grub.conf  lost+found  sysconfig
[root@server2 mnt]# lvcreate -s -n mylv-snap -L 8G /dev/myvg/mylv    #创建mylv的快照卷mylv-snap
  Logical volume "mylv-snap" created.
[root@server2 mnt]# lvs    #查看lv的信息,出现了mylv-snap
  LV        VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv      myvg owi-aos--- 8.00g                                                    
  mylv-snap myvg swi-a-s--- 8.00g      mylv   0.00                                   
[root@server2 mnt]# mkdir /mylv-snap    #创建mylv-snap目录
[root@server2 mnt]# mount /dev/myvg/mylv-snap /mylv-snap/    #将mylv-snap挂载到/mylv-snap
[root@server2 mnt]# ll /mylv-snap/    #查看分区中的文件,和/mnt下一样
total 20
lrwxrwxrwx. 1 root root    22 Jan  4 16:01 grub.conf -> ../boot/grub/grub.conf
drwx------. 2 root root 16384 Jan  4 15:44 lost+found
drwxr-xr-x. 7 root root  4096 Jan  4 16:02 sysconfig
[root@server2 mnt]# cp /etc/rc.d/init.d/functions ./    #复制/etc/rc.d/init.d/functions到/mnt目录中
[root@server2 mnt]# ls    #查看当前目录(/mnt,即是mylv)中的文件
functions  grub.conf  lost+found  sysconfig
[root@server2 mnt]# ll /mylv-snap/    #查看/mylv-snap(即是mylv-snap)中的文件,发现并没有functions
total 20
lrwxrwxrwx. 1 root root    22 Jan  4 16:01 grub.conf -> ../boot/grub/grub.conf
drwx------. 2 root root 16384 Jan  4 15:44 lost+found
drwxr-xr-x. 7 root root  4096 Jan  4 16:02 sysconfig

总结

    LVM虽然很好用,但是因为在硬件上使用纯软件方式进行管理,所以误删除数据恢复更加困难,LVM缩减分区大小风险较大,况且现在btrfs已经很稳定了,功能更加强大,并不推荐使用LVM对磁盘分区进行管理。

原创文章,作者:Net18-AnyISalIn,如若转载,请注明出处:http://www.178linux.com/12339

(0)
上一篇 2016-03-09 10:11
下一篇 2016-03-09 10:17

相关推荐

  • bash脚本之练习

    1、编写服务脚本/root/bin/testsrv.sh,完成如下要求  (1) 脚本可接受参数:start, stop, restart, status  (2) 如果参数非此四者之一,提示使用格式后报错退出 (3) 如是start:则创建/var/lock/subsys/SCRIPTNAME, 并显示“启动成功” 考虑:如果事先已经启…

    Linux干货 2016-08-24
  • MHA+keepalived 高可用MYSQL集群

    一、MHA简介 二、试验环境及要求 三、部署MHA 四、测试MHA集群功能 一、MHA简介     MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案。在MySQL故障切换过程中,MHA能做到在0~30秒之内手动或自动(结合脚本)完成数据库的故障切换操作,并且在…

    2017-02-25
  • 【LINUX编译安装程序】Centos7.4编译安装httpd 2.4.29

    举例:Centos7.4编译安装httpd 2.4.29

    Linux干货 2018-03-17
  • CentOS6.8编译安装—- php-fpm

    安装环境: [root@station11 ~]# lsb_release -a Distributor ID: CentOS Description:     CentOS release 6.8 (Final) Release:  6.8 Codename:    …

    Linux干货 2016-12-21
  • 干货 | 20 行 Python 代码创建可视化地图

    当我开始建造Vincent时, 我的一个目的就是使得地图的建造尽可能合理化. 有一些很棒的python地图库-参见Basemap 和 Kartograph能让地图更有意思. 我强烈推荐这两个工具, 因为他们都很好用而且很强大. 我想有更简单一些的工具,能依靠Vega的力量并且允许简单的语法点到geoJSON文件,详细描述一个投影和大小/比列,最后输出地图. …

    2017-09-08
  • Centos6搭建vsftpd手册

    1、开启防火墙ftp端口vi /etc/sysconfig/iptables     #编辑防火墙配置文件 1 -A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT(允许21端口通过防火墙) 2 -A INPUT -m st…

    Linux干货 2017-04-26

评论列表(2条)

  • stanley
    stanley 2016-03-09 10:16

    16岁文章已经写成这样,让我等汗颜呀~