逻辑卷(LVM:Logical Volume Management)是利用系统内核中的device-mapper(DM)机制,在物理存储设备上建立一个抽象层,允许在其上建立逻辑存储卷;相对于直接使用存储设备增加了灵活性。
工作原理:
LVM是利用磁盘上的任意空间构建物理卷(PV);
物理卷由相同大小的物理单元(PE)组成;
将多个物理卷(PV)组成卷组(VG);
在卷组基础上构建逻辑卷(LV);
逻辑卷由多个相等大小的逻辑单元(LE)组成 ;
逻辑卷对PE的使用和映射由DM的表传入内核;
卷管理由用户空间使用LVM工具进行;
卷管理是对位于物理卷首的LVM元数据(metadata)的修改;
逻辑卷的优势:
部署灵活,支持在线调整大小和分配空间;设备命名方便;
逻辑卷的构建结构:
现在比较常用的是LVM2版本
LVM的一般操作和管理办法
一、PV的基本操作命令
二、VG的基本操作命令
三、LV的基本操作命令及扩展与缩小逻辑卷的详细过程
四、LVM快照
一、PV的基本命令:pvchange pvck pvcreate pvdisplay pvmove pvremove pvresize pvs pvscan
pvcreate: pv创建命令, pv可以是由fdisk命令创建的带有标志的分区建立,type 8e,也可以是直接没有分区的磁盘创建。命令格式: pvcreate PhysicalVolume [PhysicalVolume...]
exam:
[root@localhost ~]# pvcreate /dev/xvdg
Physical volume "/dev/xvdg" successfully created
[root@localhost ~]# pvcreate /dev/xvde1
Physical volume "/dev/xvde1" successfully created
pvs pvdisplay : 显示PV信息,pvs只是简单的信息,pvdisplay 显示详细信息
pvmove 与pvremove
pvmove : 将一个块磁盘上的数据移动另一块磁盘,可以移动整个盘的数据,也可以移动指定extent范围的数据。通过pvs -o+pv_used 可以显示当前PV的使用情况,然后能过 pvmove Sou_Pv_Name Des_Pv_Name,就可以把数据移除,然后,通过vgreduce VG_NAME PV_NAME 把数据已经移除的pv在VG卷组中删除。
pvremove: 删除一个存在的物理卷,不管这个物理卷是否有卷组还是没有。在pvremove后面直接接物理卷即可操作。
pvchange [选项] [参数] : 修改物理卷属性
pvchange指令允许管理员改变物理卷的分配许可。如果物理卷出现故障,可以使用pvchange指令禁止分配物理卷上的PE。
-u : 生成新的UUID
-x : 是否允许分配PE
exam: pvchang �Cx n /dev/sdb1 #禁止分配‘/dev/sdb1’ 上的PE
pvck 与pvscan
pvscan : 扫描所有磁盘上的物理卷,包括属于卷组和不恪属于卷组
-d : 调试模式
-e : 仅显示属于输出卷组的物理卷
-n : 仅显示不属于任何卷组的物理卷,这些物理卷是未被使用的
pvck : 检查物理卷的LVM元数据的一致性,元数据,指的是以ASCII的形式存储,保存了LVM卷组的详细配置。
-d :调试模式
-v : 详细信息模式
--labelsector : 指定LVM卷标所在扇区
example:
二、VG的基本操作与命令
vgcreate : 创建一个LVM卷组,
-s : 指定卷组上物理卷的PE大小
命令格式 vgcreate VG_NAME pv…. example: vgcreate VG_DATA /dev/sdb1 /dev/sdc1
vgdisplay : 显示vg详细信息,包括
-A 仅显示活动卷组的属性
vgs : 显示VG的一些基本信息
vgscan : 仅显示找到的卷组的名称和LVM元数据类型
三个命令显示效果如下
vgextend :向已有卷组中添加物理卷,即扩展卷,命令语法很简单,vgextend 卷组名 pv卷 即可
exam: vgextend VG_DATA /dev/sd#
vgreduce : 通过删除LVM卷组中的物理卷来减少卷组容量,语法: vgreduce [选项] [参数],不能删除lvm卷组中剩余的最后一个物理卷。
-a : 如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷,如果使用pvmove移除了所有的数据,则可以用 �Ca来删除空的物理卷。
--removemissing : 删除卷组中丢失的物理卷,使卷组恢复正常状态
vgchange : 修改卷组属性,经常被用来设定卷组处于活动状态或非活动状态
-a[y|n] : 指定卷组处理活动状态或非活动状态,
卷组处于活动状态时无法被删除,必须使用vgchange设置为非活动状态后才能删除。
vgremove : 删除卷组 ,语法 vgremove VG_NAME
-f : 强制删除
当卷组中已经创建了逻辑卷时,vgremove需要进行确认删除,防止删除数据。
vgconver : 转换卷组元数据格式,通用于转换指定LVM卷组的元数据格式,通过把LVM1格式的卷组转换无LVM2格式,转换元数据前必须保证卷组处于非活动状态,否则无法完成操作。example : vgconvert �CM2 VG_NAME
三、LV的基本操作命令
lvcreate : 创建LVM的逻辑卷,语法: lvcreate [选项][参数] VG_NAME
-L : 指定逻辑卷的大小,单位为“kKmMgGtT”
-l : 指定逻辑卷的大小,但指定的是LE的个数,LE对应的是创建VG时PE,大小和PE一样
lvdisplay : 显示逻辑卷的属性 ,用于显示LVM逻辑卷的大小,读写状态和快照信息等
lvscan : 扫描逻辑卷及其对应的设备
lvs : 显示逻辑卷的信息
lvextend : 扩展逻辑卷空间,lvextend在线扩展空间,整个过程对于应用程序来说是完全透明的。
-L : 指定逻辑卷的大小,单位为“kKmMgGtT”
-l : 指定逻辑卷的大小,但指定的是LE的个数
注意: 逻辑卷物理边界的增加或减少不代表所挂载分区的文件系统的逻辑边界也同样已经发生改变,在用上面的命令完成后,用df -h命令查看挂载分区的大小结果还是显示和以前一样,没有变化,因为文件系统的分区逻辑边界没有发生改变,所以,必须用 resize2fs命令来扩展文件系统逻辑边界。如果分区本身有100G的空间,用上面的命令扩展10G后,整个分区的大小为110G,所以扩展文件系统的过程如下几步:
1.用lvexted 命令增加LVM的逻辑分区的物理边界大小。
2.用命令lvs查看当前逻辑分区lv边界的大小
3.用 df �Ch 命令查看当前挂载的分区大小
4.用resize2fs命令来扩大当前文件系统分区的边界,用df -h命令查看当新文件系统大小,操作如下:
resize2fs 还有一个选项 �Cp ,是指达到当前lv逻辑卷的物理边界的最大边界,即 resize2fs �Cp /PATH/TO/LV即可
lvreduce : 收缩逻辑卷空间,用法和lvextend 相反,收缩逻辑卷有可能会损坏数据,所以要有个确认过程。
注意:实际操作过程,如果没有先缩小文件系统的逻辑边界就先缩小逻辑卷的边界,就有很大可能会损坏数据,如果要缩小分区大小,操作过程如下:
1.用df -h命令查看当前分区已使用的数据有多少,确定缩小后的容量是多少,一定不能小于已使用的数据,否则,数据会损坏。
2.先用umount卸载分区,然后用e2fsck命令检查要缩小分区的文件系统,确定文件系统保持一至性,e2fsck �Cf /PATH/TO/lv 。
3. 用resize2fs 缩小文件系统分区, resize2fs /PATH/TO/PV #G 注意,这里#表示的是剩下的空间是多少G,不是减少的空间是多少,
4. 重新挂载,用df -h命令查看当前文件系统的空间是多少,用lvs命令查看当前物理分区的容量是多少
5. 使用lvreduce 命令缩小当前分区的物理分区。然后用lvs查看当前逻辑卷的空间,用pvs查看当前剩余物理卷的空间变化。过程如下
缩小分区一定要十分的注意,lvreduce命令后面-L 选项后面跟的参数有’-‘表示缩小的空间,如果没有’-‘,表示剩余的空间,一定不要弄错,否则,一旦数据损坏,就可能会有严重后果,最好在进行操作前进行备份数据或使用快照功能。
lvresize : 调整逻辑卷空间大小,可以扩展,也可以缩小。使用选项也是-L 与-l ,然后用+ - 来表示增加或减少空间。用lvresize有可能导致数据丢失,
lvremove : 删除逻辑卷,要删除逻辑卷必须先umount卸载后才能删除,否则是无法删除的。
LVM快照
写时复制:当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此,snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
在写操作写入块之前,cow将原始数据移动到snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一至。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。
这样,文件的I/O流程有一个改变,那就是在文件系统和设备驱动之间增加了一个cow层,如下:
file I/0 �C> filesystem �C>CoW �C> block I/O
采用cow做为快照的实现方式时,snapshot的大小并不需要和原始卷一样大,其大小只需要考虑: 1.从shapshot创建到释放这段时间内,估计块的改变量有多大;2 数据更新的频率。一旦snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被翻译,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做的事情。如果snapshot只是做为备份来创建的,那么在创建快照时就做为只读最好,快照卷的创建要和原始卷在同一个卷组内,也就是,在vg里有空闲的pe才能给这个卷组里的逻辑卷创建快照。
创建快照:
lvcreate :
-s : 创建快照卷,如果不加s,那就是创建新的逻辑卷lv
-p r|w : 指定快照卷的权限,只读,读写
-n : 指定快照卷组名
语法: lvcreate �CL # �Cn SLV_NAME �Cs �Cp r /PATH/TO/LV
-L : 指定快照卷的大小
这里可以看到 Data% 显示为0,表示快照点用的空间百分比,如果快照变化已经超过了快照空间的大小,那么快照就会失效,所以,如果快照的空间和逻辑卷空间大小一样或比之更大,那么就不会出现快照卷失效的情况