LVM:logical volume manger ,version2

应用场景:在系统使用过程中常常遇到磁盘不够用的情况,那么普通的方法就是添加硬盘,从新分区格式化,并挂载到原来的文件系统中,但这样会造成磁盘空间浪费或者仍然不够用的情况。那么LVM可以实现根据需要动态的扩展磁盘的大小,实现磁盘空间的合理利用。


LVM原理:LVM是在硬件磁盘和文件系统之间的一个添加的一个逻辑中间层,利用软件的方式将多个物理磁盘(或分区)组合成逻辑上的一个磁盘(VG)。然后在此基础实现划分分区(LV),并创建文件系统供使用。LVM最大的特点只是在逻辑上实现LV容量的动态扩展,而不是考虑数据的安全存储。


数据在写入LV时,是通过什么机制写入真正的磁盘上的?

根据写入的机制不同,分为两种方式:

      1、线性方式(linear):所谓线性方式就是一次将数据写入磁盘多个磁盘,只有在前一个磁盘容量用完后才开始写入随后的磁盘。

      2、交错模式(triped):指的是将数据拆分成两部分,分别写到底层不同的磁盘中。感觉像RAID-0,理论上读写性能要好点。

   注释:使用交错模式的缺点就是当其中一个磁盘挂掉,其他磁盘上的数据也将不可用,所有LVM默认的写入方式是线性方式写入磁盘。

wKioL1Xee9fz_qbeAACo7fLxktA732.jpg

概念:

PV :physicalvolume,物理卷,就是将真正的磁盘或分区通过修改文件系统ID号,改变系统标识符(LVM标识符是8e),使之称为可用的PV.

VG:volumegroup,卷组。所谓卷组指的是在逻辑上将多个磁盘或分区看做一个大的磁盘,叫做卷组。

LV:logical volume,逻辑卷,相当于单个磁盘使用时的分区,LV就是在VG基础上的分区。

PE:physical extend,物理扩展快,相当于单个磁盘的数据块的概念。LVM中的PE是基本的存储单元,默认是4M(单个磁盘的块大小默认是4096K),

LE:逻辑块(Logical Extent,LE),逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。



所谓的lv的动态扩展就是可以在以创建好的VG中添加或删除PV,在以创建好的LV中添加或删除PE的数。但是在缩小容量的时候必须注意缩减后的容量必须能满足数据大小,否则将导致数据的丢失。


构建LVM的流程:

物理磁盘--构建PV--构建VG--构建LV--格式化LV文件系统


而在centos中内核是通过dm(device_mapper)模块来支持lvm的,使用lvm需要安装lvm软件,默认情况下都自带安装的(最小化安装除外)。

[root@localhost mnt]# rpm -qa | grep lvm

mesa-private-llvm-3.4-3.el6.x86_64

lvm2-libs-2.02.111-2.el6.x86_64

lvm2-2.02.111-2.el6.x86_64


逻辑卷设备在linux系统上的命名方式有三种:

1、/dev/dm-#

2、/dev/mapper/VG_NAME-LV_NAME

/dev/mapper/vol0-root

3、/dev/VG_NAME/LV_NAME

/dev/vol0/root

使用不同的管理工具来构建相应的单元

pv管理工具:

pvs :显示pv的状态

pvdisplay :显示当前系统上的pv详细状态

pvscan:查看当前系统已有的pv

pvmove:move physical extents

pvcreate:将普通磁盘创建为pv

pvremove:移除一个pv,成为普通磁盘

vg管理工具:

vgcreate:创建卷组

vgextend:扩展卷组容量

vgreduce :较少卷组容量(在做vgreduce时要先做pvmove)


lv管理工具:

lvs:查看lv信息

lvdisplay:查看详细的lv信息

lvcreate:创建lv

lvextend :扩展lv的容量

        lvreduce: 较少lv的容量

        lvremove:移除lv

更多相关的命令可自行使用命令补全功能查看

下面就以一个实例来演示lvm的使用。

例、在一个10G的磁盘上分4个分区,利用其做LVM事例。


一、使用fdisk /dev/sdb 并在其上划分4个分区,将其文件表示符改为8e。完成后查看

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

 

Disk /dev/sdb: 10.7 GB, 10737418240 bytes

255 heads, 62 sectors/track, 1326 cylinders

Units = cylinders of 15810 * 512 = 8094720 bytes

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

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

Disk identifier: 0x00086ec2

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1         267     2103490+  8e  Linux LVM

/dev/sdb2             267         532     2096482+  8e  Linux LVM

/dev/sdb3             532         797     2096482+  8e  Linux LVM

/dev/sdb4             797        1062     2096482+  8e  Linux LVM


二、创建PV

[root@localhost ~]# pvcreate /dev/sdb{1,2,3,4}

  Physical volume "/dev/sdb1" successfully created

  Physical volume "/dev/sdb2" successfully created

  Physical volume "/dev/sdb3" successfully created

  Physical volume "/dev/sdb4" successfully created

[root@localhost ~]# pvs

  PV         VG   Fmt  Attr PSize  PFree

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

  /dev/sdb1       lvm2 ---   2.01g 2.01g

  /dev/sdb2       lvm2 ---   2.00g 2.00g

  /dev/sdb3       lvm2 ---   2.00g 2.00g

  /dev/sdb4       lvm2 ---   2.00g 2.00g


三、使用/dev/sdb{1,2,3}创建VG

 [root@localhost ~]# vgcreate -s 16m vglpw /dev/sdb{1,2,3}

  Volume group "vglpw" successfully created

  [root@localhost ~]# vgs

  VG    #PV #LV #SN Attr   VSize  VFree

  vg0     1   4   0 wz--n- 59.99g 7.99g

  vglpw   3   0   0 wz--n-  5.97g 5.97g


四、创建一个3G大小的LV

[root@localhost ~]# lvcreate -L 3G -n /dev/lvname vglpw

  "/dev/lvname": Invalid path for Logical Volume

  Logical volume "lvname" created

另一种方式-l 指定pe个数来创建LV

[root@localhost ~]# lvcreate -l 10 -n lvname vglpw

  Logical volume "lvname" created

五、扩展LV,使用lvextend扩展lv容量

[root@localhost ~]# lvextend -l +3 vglpw/lvname

或者

[root@localhost ~]# lvextend -L 3G  vglpw/lvname

注:-l 表示PE的数量,-L表示lv的容量,支持“+”符号,表示扩增多大的容量,不带加号表示扩增到多大的容量。lvextend不能降低LV的容量。


六、重新设置LV的大小

[root@localhost ~]# lvresize -L -|+20m vglpw/lvname

或者

[root@localhost ~]# lvresize -|+3 vglpw/lvname

注:lvresize支持增加或减少lv容量,-l 表示PE的数量,-L表示lv的容量。在减少lv容量时必须保证减少后的容量能容下原有数据大小,否则会造成数据丢失。


七、使用lvreduce降低lv容量

[root@localhost ~]# lvreduce -l -3 vglpw/lvname

或者

[root@localhost ~]# lvreduce -L 3G  vglpw/lvname

注:-l 表示PE的数量,-L表示lv的容量,支持“-”符号,表示降低多大的容量,不带减号表示减少到多大的容量。在减少lv容量时必须保证减少后的容量能容下原有数据大小,否则会造成数据丢失。


八、降低vg中的pv数量

使用vgreduce移除vg中的pv,要先使用pvmove移除对应的pv

[root@localhost ~]# pvmove /dev/sdb3

[root@localhost ~]# vgreduce vglpw /dev/sdb3

  Removed "/dev/sdb3" from volume group "vglpw"


九、vg中添加pv

root@localhost ~]# vgextend vglpw /dev/sdb4

  Volume group "vglpw" successfully extended


十、使用mke2fs工具将lv格式化为ext4类型文件系统

[root@localhost ~]# mke2fs -t ext4 /dev/vglpw/lvname


十一、挂载lv/mnt目录下面并查看

[root@localhost ~]# mount /dev/vglpw/lvname /mnt

[root@localhost ~]# df -hP

Filesystem                Size  Used Avail Use% Mounted on

/dev/mapper/vg0-root       20G  288M   19G   2% /

tmpfs                     495M     0  495M   0% /dev/shm

/dev/sda1                 190M   28M  153M  16% /boot

/dev/mapper/vg0-usr       9.8G  1.9G  7.4G  21% /usr

/dev/mapper/vg0-var        20G  200M   19G   2% /var

/dev/mapper/vglpw-lvname  229M  2.1M  215M   1% /mnt

 

文件系统可以正常使用,添加一个文件a.txt

[root@localhost mnt]# ls

a.txt  lost+found

 


LVM在一般工作环境中还是会用道的,但是在centos中支持的btrfs文件系统,默认就具有了lvm的类似的功能,所以在今后的环境中btrfs文件系统的使用将会增多,lvm的功能也许将会被替代。

 


lvm的一个重要功能就是可以实现快照,从而实现数据的备份和还原。


 

wKiom1Xetm3RrCNgAAC6AYK6DiY990.jpg


原理:所谓的快照就是在lv所在的卷组中在划分一部分pe来当做快照区。在创建快照的时刻并不为快照区创建数据块,它只用来存放原理lv卷中的内容的元数据,在员lv中内容不发生改变时,快照卷和她原来的lv卷中的内容看起啦一样,当原lv卷内容发生改变时,在改变前将原来的数据放到快照卷当中。因此可以将快照卷复制的原lv中的数据复制出来另存为别的路径。当原lv发生改变需要还原时,可以拿快照卷保存的数据在将其还原回来。

使用快照卷的限制就是快照区本来大小就不如lv卷的大小,当原lv中的数据将要发生改变时,快照卷的容量必须能足够存放原lv中的数据大小,否则,快照复制的数据将不完整,因此可能造成数据丢失。

 

复制/etc/fsbat/etc/mtablvname当中

[root@localhost lvname]# cp /etc/fstab .

[root@localhost lvname]# cp -a /etc/mtab .

 

lvname创建快照卷lvshop并查看快照信息

[root@localhost mnt]# lvcreate -l 63 -s -n lvshop /dev/vglpw/lvname

 -s:表示创建快照卷

[root@localhost mnt]# lvdisplay /dev/vglpw/lvshop

  --- Logical volume ---

  LV Path                /dev/vglpw/lvshop

  LV Name                lvshop

  VG Name                vglpw

  LV UUID                Fob2xM-6WCP-DFmf-2d1q-FX2b-n6w1-4lXZNw

  LV Write Access        read/write

  LV Creation host, time localhost.localdomain, 2015-08-27 03:31:45 +0800

  LV snapshot status     active destination for lvname

  LV Status              available

  # open                 1

  LV Size                5.00 GiB

  Current LE             320

  COW-table size         1008.00 MiB

  COW-table LE           63

  Allocated to snapshot  0.00%

  Snapshot chunk size    4.00 KiB

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:5

 

挂载快照卷lvshop

[root@localhost mnt]# mount /dev/vglpw/lvshop /mnt/lvshop/

 

查看这两个卷,其指向的inode编号,硬连接一样

[root@localhost mnt]# ll -i *

lvname:

total 16

11 drwx------ 2 root root 16384 Aug 27 01:26 lost+found

 

lvshop:

total 16

11 drwx------ 2 root root 16384 Aug 27 01:26 lost+found

 

可以查看两个文件的内容都一样

[root@localhost mnt]# ll lvname lvshop

lvname:

total 24

-rw-r--r-- 1 root root   922 Aug 27 03:41 fstab

drwx------ 2 root root 16384 Aug 27 01:26 lost+found

-rw-r--r-- 1 root root   355 Aug 27 03:46 mtab

 

lvshop:

total 24

-rw-r--r-- 1 root root   922 Aug 27 03:41 fstab

drwx------ 2 root root 16384 Aug 27 01:26 lost+found

-rw-r--r-- 1 root root   355 Aug 27 03:46 mtab

删除lvname中的文件,lvshop中文件不变

[root@localhost lvname]# rm -rf mtab

[root@localhost lvname]# cd ..

[root@localhost mnt]# ll lvshop lvname

lvname:

total 24

-rw-r--r-- 1 root root   922 Aug 27 03:41 fstab

drwx------ 2 root root 16384 Aug 27 01:26 lost+found

-r--r--r-- 1 root root  1033 Aug 27 03:56 mounts

 

lvshop:

total 28

-rw-r--r-- 1 root root   922 Aug 27 03:41 fstab

drwx------ 2 root root 16384 Aug 27 01:26 lost+found

-r--r--r-- 1 root root  1033 Aug 27 03:56 mounts

-rw-r--r-- 1 root root   404 Aug 27 03:49 mtab

 

lvshop中内容备份出来,然后卸载lvshop,格式化lvname卷,然后在挂载lvname,使用备份的内容还原原来lvname中内容并查看,将数据还原

 

[root@localhost lvshop]# tar -czvf /back.tar.gz *

[root@localhost mnt]# umount /mnt/lvshop

[root@localhost mnt]# umount /mnt/lvname

[root@localhost mnt]# mke2fs -t ext4 /dev/vglpw/lvname

[root@localhost mnt]# mount /dev/vglpw/lvname /mnt/lvname

[root@localhost mnt]# ls /mnt/lvname

lost+found

[root@localhost mnt]# tar -xvf /back.tar.gz -C /mnt/lvname

fstab

lost+found/

mounts

mtab

[root@localhost mnt]# ls /mnt/lvname

fstab  lost+found  mounts  mtab