LVM:logical volume manger ,version2
应用场景:在系统使用过程中常常遇到磁盘不够用的情况,那么普通的方法就是添加硬盘,从新分区格式化,并挂载到原来的文件系统中,但这样会造成磁盘空间浪费或者仍然不够用的情况。那么LVM可以实现根据需要动态的扩展磁盘的大小,实现磁盘空间的合理利用。
LVM原理:LVM是在硬件磁盘和文件系统之间的一个添加的一个逻辑中间层,利用软件的方式将多个物理磁盘(或分区)组合成逻辑上的一个磁盘(VG)。然后在此基础实现划分分区(LV),并创建文件系统供使用。LVM最大的特点只是在逻辑上实现LV容量的动态扩展,而不是考虑数据的安全存储。
数据在写入LV时,是通过什么机制写入真正的磁盘上的?
根据写入的机制不同,分为两种方式:
1、线性方式(linear):所谓线性方式就是一次将数据写入磁盘多个磁盘,只有在前一个磁盘容量用完后才开始写入随后的磁盘。
2、交错模式(triped):指的是将数据拆分成两部分,分别写到底层不同的磁盘中。感觉像RAID-0,理论上读写性能要好点。
注释:使用交错模式的缺点就是当其中一个磁盘挂掉,其他磁盘上的数据也将不可用,所有LVM默认的写入方式是线性方式写入磁盘。
概念:
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的一个重要功能就是可以实现快照,从而实现数据的备份和还原。
原理:所谓的快照就是在lv所在的卷组中在划分一部分pe来当做快照区。在创建快照的时刻并不为快照区创建数据块,它只用来存放原理lv卷中的内容的元数据,在员lv中内容不发生改变时,快照卷和她原来的lv卷中的内容看起啦一样,当原lv卷内容发生改变时,在改变前将原来的数据放到快照卷当中。因此可以将快照卷复制的原lv中的数据复制出来另存为别的路径。当原lv发生改变需要还原时,可以拿快照卷保存的数据在将其还原回来。
使用快照卷的限制就是快照区本来大小就不如lv卷的大小,当原lv中的数据将要发生改变时,快照卷的容量必须能足够存放原lv中的数据大小,否则,快照复制的数据将不完整,因此可能造成数据丢失。
复制/etc/fsbat和/etc/mtab到lvname当中
[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