LVM详解

目录:

 一、概述

 二、LVM的相关概念

 三、概念图

 四、LVM基本操作

   1.创建PV

   2.查看PV信息

   3.创建VG

   4.查看VG信息

   5.创建LV

   6.查看LV信息

   7.挂载LV

   8.扩展卷组

   9.缩减卷组

   10.扩展逻辑卷

   11.缩减逻辑卷

   12.移除逻辑卷

   13.移除卷组

   14.移除物理卷

 五、LVM快照实现

 六、总结


一、概述

  LVM全称是Logical Volume Manager,即逻辑卷管理器。它是Linux环境下对磁盘分区进行管理的一种机制;它可以将多个物理分区整合在一起,并且可以根据实际需要动态调整文件系统空间。另外,它还可以提供快照,快照在刚创建的时候,其内容是和原卷一模一样的,只有数据在原卷中发生变化的时候,快照会将被改动数据的原数据保存起来。

二、LVM的相关概念

  1.物理卷(Physical Volume)

    物理卷是组成LVM的最底层的元素,即Linux上的物理分区。

  2.卷组(Volume Group)

    将各个独立的PV组合起来形成的一个存储空间就称为VG,VG的大小就是整个LVM的大小。

  3.逻辑卷(Logical Volume)

    可以被用户格式化、挂载并提供数据存储的对象就是LV。

  4.物理扩展块(Physical Extent)

    PE相当于Linux分区中的block,它是LVM的最小存储单位,默认为4M。

三、概念图

lvm01.jpg

四、LVM基本操作

 1.创建PV

  首先得先创建分区,并将分区的类型改为8e。在这里,我们可以按照以下方式分别创建/dev/sdb1、/dev/sdb2、/dev/sdc1、/dev/sdc2.

  创建PV使用以下命令格式:

    pvcreate device_name

    例如: pvcreate /dev/sdb1

[root@localhost ~]# fdisk /dev/sdb 
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G
 
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
 
Command (m for help): p
 
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: 0x05ff7b5d
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  8e  Linux LVM
 
[root@localhost ~]# pvcreate /dev/sdb{1,2} /dev/sdc{1,2}
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdc2" successfully created

 2.查看PV信息

  使用的命令:

  (1)pvs 简要查看PV信息

  (2)pvsdisplay 详细查看PV信息。

    A.pvsdisplay 直接使用该命令,查看所有PV的信息。

    B.pvsdisplay device_name 表示查看device_name这个PV的信息。

[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1       lvm2 ---  5.01g 5.01g
  /dev/sdb2       lvm2 ---  5.01g 5.01g
  /dev/sdc1       lvm2 ---  5.01g 5.01g
  /dev/sdc2       lvm2 ---  5.01g 5.01g
 
[root@localhost ~]# 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               rZsvZG-nMf0-To7I-3k2X-fzEL-jkvk-eNFd6h

 3.创建VG

  在有了PV之后,接下来我们要创建VG,创建VG使用以下命令:

   vgcreate VG_NAME PV_NAME

   -s PE:指定PE的大小

[root@localhost ~]# vgcreate testvg /dev/sd{b,c}1
  Volume group "testvg" successfully created

 4.查看VG信息

  查看VG使用以下命令:

   (1)vgs:简要查看VG信息。

   (2)vgdisplay:详细查看VG信息。

     A.vgdisplay: 直接使用该命令,查看所有VG的信息。

     B.vgdisplay VG_NAME: 表示查看这个VG的信息。

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  testvg   2   0   0 wz--n- 10.02g 10.02g
[root@localhost ~]# vgdisplay testvg
  --- Volume group ---
  VG Name               testvg
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                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               zmjsxc-4KPf-LEcC-96zL-BBDY-N0Cs-buSQ6n

 5.创建LV

  使用的命令:

   lvcreate -L SIZE -n LV_NAME VG_NAME

    -L 指定逻辑卷的大小

    -n 指定逻辑卷的名称

    -l PE的个数

[root@localhost ~]# lvcreate -L 5G -n mylv testvg
  Logical volume "mylv" created

 6.查看LV信息

  查看LV使用以下命令:

   (1)lvs: 简要查看LV信息

   (2)lvdisplay 逻辑卷的设备文件名称: 详细查看LV信息

     逻辑卷的设备文件名称路径:/dev/VG_NAME/LV_NAME 或者 /dev/mapper/VG_NAME-LV_NAME

[root@localhost ~]# lvs
  LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv testvg -wi-a----- 5.00g  
[root@localhost ~]# ll /dev/testvg/mylv 
lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/testvg/mylv -> ../dm-0
 
[root@localhost ~]# ll /dev/mapper/testvg-mylv 
lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/mapper/testvg-mylv -> ../dm-0
 
[root@localhost ~]# lvdisplay /dev/testvg/mylv 
  --- Logical volume ---
  LV Path                /dev/testvg/mylv
  LV Name                mylv
  VG Name                testvg
  LV UUID                cgrPIG-Zavs-GH9Z-55sR-MtSt-SFzg-SVETpG
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-07-24 01:19:20 +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:0

 7.挂载LV

  在挂载LV之前,我们要对LV进行格式化后再挂载,然后存放文件看是否正常。

# 格式化LV
[root@localhost ~]# mke2fs -t ext4 /dev/testvg/mylv 
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
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 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
 
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# 挂载LV
[root@localhost ~]# mount /dev/testvg/mylv /mnt
# 查看挂载的分区信息
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
                      5.0G  138M  4.6G   3% /mnt
# 测试存放文件
[root@localhost ~]# cp /etc/inittab /mnt/
[root@localhost mnt]# tail -4 /mnt/inittab 
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

 8.扩展卷组

  步骤:

   (1)准备好一个PV

   (2)使用vgextend命令完成扩展,命令格式:vgextend VG_NAME /PATH/TO/PV

#查看使用和未使用的PV,其中/dev/sdb2和/dev/sdc2都还未使用
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  testvg lvm2 a--  5.01g 8.00m
  /dev/sdb2         lvm2 ---  5.01g 5.01g
  /dev/sdc1  testvg lvm2 a--  5.01g 5.01g
  /dev/sdc2         lvm2 ---  5.01g 5.01g
#未扩展前的VG大小
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  testvg   2   1   0 wz--n- 10.02g 5.02g
#扩展VG
[root@localhost ~]# vgextend testvg /dev/sdb2
  Volume group "testvg" successfully extended
#扩展后的VG大小
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  testvg   3   1   0 wz--n- 15.02g 10.02g

 9.缩减卷组

  步骤:

   (1)确定要移除的PV

   (2)将此PV上的数据转移至其他的PV

     命令:pvmove PV_NAME

   (3)从卷组中将此PV移除

     命令:vgreduce /PATH/TO/PV

# 查看已经使用在卷组中的PV
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  testvg lvm2 a--  5.01g 8.00m
  /dev/sdb2  testvg lvm2 a--  5.01g 5.01g
  /dev/sdc1  testvg lvm2 a--  5.01g 5.01g
  /dev/sdc2         lvm2 ---  5.01g 5.01g
# 现在确定要移除/dev/sdb1,在移除前需要将数据转移到其他PV
[root@localhost ~]# pvmove /dev/sdb1 
  /dev/sdb1: Moved: 0.0%
  /dev/sdb1: Moved: 100.0%
# 将PV从卷组中移除
[root@localhost ~]# vgreduce testvg /dev/sdb1 
  Removed "/dev/sdb1" from volume group "testvg"
# 查看移除后的VG大小
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  testvg   2   1   0 wz--n- 10.02g 5.02g

 10.扩展逻辑卷

  步骤:

  (1)先确定扩展的LV大小,并确保对应卷组有足够的空间

  (2)扩展物理边界

    使用lvextend命令:lvextend -L [+]SIZE /PATH/TO/LV

    参数说明:

     -L [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE的容量;如果不带,表示扩展容量到SIZE,单位为"kKmMgGtT"

     -l [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE个PE的容量;不带+号,表示扩展到SIZE个PE的容量

      SIZE: 表示数字

  (3)扩展逻辑边界

    使用resize2fs /PATH/TO/DEVICE

# 确定VG的容量
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  testvg   2   1   0 wz--n- 10.02g 5.02g
# 未扩展前的LV容量
[root@localhost ~]# lvs
  LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv testvg -wi-ao---- 5.00g
# 扩展LV到8G,即物理边界
[root@localhost ~]# lvextend -L +3G /dev/testvg/mylv 
  Size of logical volume testvg/mylv changed from 5.00 GiB (1280 extents) to 8.00 GiB (2048 extents).
  Logical volume mylv successfully resized 
# 查看挂载的LV大小,发觉还是5G,因为还没扩展逻辑边界
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
                      5.0G  139M  4.6G   3% /mnt
# 扩展逻辑边界
[root@localhost ~]# resize2fs /dev/testvg/mylv 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/testvg/mylv is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/testvg/mylv to 2097152 (4k) blocks.
The filesystem on /dev/testvg/mylv is now 2097152 blocks long.
# 查看分区大小,文件系统大小也扩展了
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
                      7.9G  140M  7.4G   2% /mnt

 11.缩减逻辑卷

  步骤:

  (1)确定缩减后的大小,至少确保缩减后能容纳原来的所有数据

  (2)执行缩减:

    A.因为缩减有风险,所以必须卸载并检测文件系统,使用e2fsck -f命令

    B.缩减逻辑边界,使用resize2fs命令

     resize2fs /path/to/device SIZE

    C.缩减物理边界,使用lvreduce命令

     lvreduce -L [-]SIZE /path/to/lv

# 卸载并强行检测
[root@localhost ~]# umount /mnt/
[root@localhost ~]# e2fsck -f /dev/testvg/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/testvg/mylv: 12/524288 files (0.0% non-contiguous), 68623/2097152 blocks
# 缩减LV至3G,即逻辑边界
[root@localhost ~]# resize2fs /dev/testvg/mylv 3G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/testvg/mylv to 786432 (4k) blocks.
The filesystem on /dev/testvg/mylv is now 786432 blocks long.
# 缩减物理边界
[root@localhost ~]# lvreduce -L 3G /dev/testvg/mylv 
  WARNING: Reducing active logical volume to 3.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y/n]: y
  Size of logical volume testvg/mylv changed from 8.00 GiB (2048 extents) to 3.00 GiB (768 extents).
  Logical volume mylv successfully resized
# 为确保安全,再次检测
[root@localhost ~]# e2fsck -f /dev/testvg/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/testvg/mylv: 12/196608 files (0.0% non-contiguous), 47100/786432 blocks
# 挂载,查看分区大小并查看分区里面的文件是否正常
[root@localhost ~]# mount /dev/testvg/mylv /mnt/
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
                      3.0G  136M  2.7G   5% /mnt
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# tail -4 /mnt/inittab 
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

 12.移除逻辑卷

  移除逻辑卷之前,确保已经没有被挂载。此时使用lvremove /path/to/lv命令即可

# 查看逻辑卷
[root@localhost ~]# lvs
  LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  hello_lv  testvg -wi-a-----  1.00g                                                    
  mylv      testvg owi-aos---  3.00g 
# 移除hello_lv
[root@localhost ~]# lvremove /dev/testvg/hello_lv 
Do you really want to remove active logical volume hello_lv? [y/n]: y
  Logical volume "hello_lv" successfully removed
# 再次查看逻辑卷信息
[root@localhost ~]# lvs
  LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv      testvg owi-aos---  3.00g

 13.移除卷组

  使用vgremove VG_NAME

# 查看卷组信息
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  testvg   2   0   0 wz--n- 10.02g 10.02g
# 移除testvg
[root@localhost ~]# vgremove testvg
  Volume group "testvg" successfully removed

 14.移除物理卷

  使用pvremove PV_NAME命令

# 查看物理卷
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb2       lvm2 ---  5.01g 5.01g
  /dev/sdc1       lvm2 ---  5.01g 5.01g
  /dev/sdc2       lvm2 ---  5.01g 5.01g
# 移除物理卷
[root@localhost ~]# pvremove /dev/sdb2
  Labels on physical volume "/dev/sdb2" successfully wiped
[root@localhost ~]# pvremove /dev/sdc1
  Labels on physical volume "/dev/sdc1" successfully wiped
[root@localhost ~]# pvremove /dev/sdc2
  Labels on physical volume "/dev/sdc2" successfully wiped

五、LVM快照实现

 创建出来的快照卷是已经记录了原卷某个时刻所有文件的状态,在原卷没有做出修改之前,快照卷只是作为访问原卷的一个入口;一旦原卷中的文件发生改变的时候,系统会将原卷的文件复制一份到快照卷,这时的快照卷就不能作为访问原卷的入口了,快照卷里面只有原卷没有发生改变之前复制过来的文件。这时,我们就可以对快照卷里面的文件进行打包备份。

 创建快照使用lvcreate命令,使用以下参数

  -L SIZE: 指定快照卷的大小

  -s: 表示创建快照卷

  -p r: 限制快照卷为只读访问

  -n LV_NAME: 指定快照卷的名称

  示例:lvcreate -L SIZE -s -p r -n LV_NAME /path/to/lv

# 创建快照卷
[root@localhost mnt]# lvcreate -L 50M -s -p r -n mylv-snap /dev/testvg/mylv 
  Rounding up size to full physical extent 52.00 MiB
  Logical volume "mylv-snap" created
[root@localhost mnt]# lvs
  LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv      testvg owi-aos---  3.00g                                                    
  mylv-snap testvg sri-a-s--- 52.00m      mylv   0.02 
# 挂载快照卷
[root@localhost ~]# mount -o ro /dev/testvg/mylv-snap /media/
# 查看快照卷,此时的快照卷只是作为原卷的入口,所以内容和快照卷的是一样的
[root@localhost mnt]# cd /media/
[root@localhost media]# ls
inittab  lost+found
# 修改原卷的内容
[root@localhost mnt]# cp /etc/fstab /mnt/
[root@localhost mnt]# echo "Hello World" >> /mnt/inittab 
# 查看快照卷及里面的内容,发现没有新增的文件fstab,而且inittab的文件内容是和创建快照时一样
[root@localhost ~]# cd /media/
[root@localhost media]# ls
inittab  lost+found
[root@localhost media]# tail -3 inittab 
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:
# 打包备份
[root@localhost media]# tar zcf /tmp/backup.tar.gz /media/inittab 
tar: Removing leading `/' from member names
[root@localhost media]# ls /tmp/backup.tar.gz 
/tmp/backup.tar.gz
# 卸载快照卷
[root@localhost ~]# umount /media/

六、总结

 创建LV的过程:

  创建PV –> 创建VG –> 创建LV –> 格式化 –> 挂载

 扩展卷组的过程:

  准备PV –> 完成扩展

 缩减卷组的过程:

  确定移除的PV –> 转移移除PV的数据到别的PV –> 从卷组中移除PV

 扩展逻辑卷的过程:

  确定扩展大小 –> 扩展物理边界 –> 扩展逻辑边界

 缩减逻辑卷的过程:

  确定缩减大小 –> 卸载逻辑卷 –> 缩减逻辑边界 –> 缩减物理边界

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