映射成逻辑设备
DeviceMapper自Linux 2.6被引入成为了Linux最重要的一个技术。它在内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,它包含三个重要的对象概念,Mapped Device、Mapping Table、Target device。
Mapped Device 是一个逻辑抽象,可以理解成为内核向外提供的逻辑设备,它通过Mapping Table描述的映射关系和 Target Device 建立映射。Target device 表示的是 Mapped Device 所映射的物理空间段,对 Mapped Device 所表示的逻辑设备来说,就是该逻辑设备映射到的一个物理设备。
Mapping Table里有 Mapped Device 逻辑的起始地址、范围、和表示在 Target Device 所在物理设备的地址偏移量以及Target 类型等信息(注:这些地址和偏移量都是以磁盘的扇区为单位的,即 512 个字节大小,所以,当你看到128的时候,其实表示的是128*512=64K)。
DeviceMapper 中的逻辑设备Mapped Device不但可以映射一个或多个物理设备Target Device,还可以映射另一个Mapped Device,于是,就是构成了一个迭代或递归的情况,就像文件系统中的目录里除了文件还可以有目录,理论上可以无限嵌套下去。
DeviceMapper在内核中通过一个一个模块化的 Target Driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的插件包括软 Raid、加密、多路径、镜像、快照等,这体现了在 Linux 内核设计中策略和机制分离的原则。如下图所示。从图中,我们可以看到DeviceMapper只是一个框架,在这个框架上,我们可以插入各种各样的策略。
在内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath 表示的就是这些 target driver。Device mapper 进一步体现了在 Linux 内核设计中策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。Device mapper 用户空间相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等等,而具体过滤和重定向 IO 请求的工作由内核中相关代码完成。因此整个 device mapper 机制由两部分组成--内核空间的 device mapper 驱动、用户空间的device mapper 库以及它提供的 dmsetup 工具。在下文中,我们分内核和用户空间两部分进行介绍。
DM映射出来的逻辑设备支持动态增减
/dev/md[0-31]:软raid设备
meta device
RAID,LVM2
LVM1和LVM2的比较:
•支持了更多的逻辑卷类型;
•支持了cluster lvm功能;
•提供了基于文本格式的元数据信息,依赖meta divice
•提供了更多的命令集和操作命令;
目前的linux发行版基本都是自带LVM2
snapshot:快照,快照中保存着修改的数据
访问修改的数据,访问快照;访问未修改的数据,访问原数据
multipath:多路径
RAID 1 , RAID 5
RAID只是在硬件级别为了防止业务中断导致的损失,而不能防御由于意外发生导致数据丢失的情况
数据量大的时候,耗费时间长
复制数据的过成中,数据发生修改,导致数据的头尾产生差错
首先,ZFS 使用池存储模型,而不是传统的基于卷的模型。这意味着 ZFS 视存储为可根据需要动态分配(和缩减)的共享池。这优于传统模型,在传统模型中,文件系统位于卷上,使用独立卷管理器来管理这些资产。ZFS 内嵌入的是重要功能集(如快照、即写即拷克隆、连续完整性检查和通过 RAID-Z 的数据保护)的实现。更进一步,可以在 ZFS 卷的顶端使用您自己最喜爱的文件系统(如 ext4)。这意味着您可以获得那些 ZFS 的功能,如独立文件系统中的快照(该文件系统可能并不直接支持它们)。
卷组(volume group ,VG),物理卷(physical volume,PV),逻辑卷(logical volume,LV),物理区块(physical extent,PE),逻辑区块(logical extent ,LE)。
sda1 sdb1 (PVs 可以在分区上,也可以在整个磁盘上)
\ /
\ /
diskvg (VG)
/ | \
/ | \
usrlv rootlv varlv (LVs)
| | |
ext2 reiserfs xfs (文件系统)
物理设备组成底层的pysical volume(物理卷),简称PV,提供存储能力
多个PV组合成VG(Volume Group)
在VG上创建LV(logical volume),可作为存储文件系统
在一个VG上可以创建多个LV
两种边界:物理边界 逻辑边界(文件系统边界)
LVM支持动态增减
对LVM创建快照,快照的数据必须与LG在同一个VG当中
PV只有加入VG才会有PE
PV加入VG之后,会被分成许多PE,作为存储空间
在逻辑层面上,PE会变成LE,两者一样,在不同的角度开来名称不同
DM:LVM支持镜像的功能
VG是LVM的最高一级抽象。他把一系列的LVs和PVs组织为一个管理单元。
PV通常是一块硬盘,也可能是看起来像硬盘的东西(比如硬盘上的分区,或者软阵列)。
LV相当于非LVM系统中的磁盘分区。它属于标准块设备,因此可以包含一个文件系统。
每一个PV都被分成许多大小相同的数据块,这些数据块叫做PE。PE的大小和其所属VG的LE大小相同。
每一个LV都被分成许多大小相同的数据块,这些数据块叫做LE。一个VG的所有LV都具有相同数据块大小
假设我们要创建一个名为vg的卷组,它的PE大小是4M,包含/dev/sda1和/dev/sdb1两个磁盘(或分区)。这两个磁盘需要初始化为物理卷,我们不妨分别命名为pv1和pv2。每个PV都被分成许多个4M的区块,这也是vg的逻辑区块大小。两个磁盘容量不同,因此所包含的区块数量也不同,pv1有99个区块,pv2有248个区块。现在我们可以创建一个逻辑卷,它的大小可以是1区块至347(248+99)区块之间的任意数值。逻辑卷一旦创立,就定义了LE和PE间的映射关系。例如,逻辑区块1可映射为pv1的物理区块51,写入逻辑卷第一个4M区块中的内容,实际写入了pv1的第51区块。
条带化映射(Striped mapping) 会把逻辑区块内的“数据条带”(stripe,其大小可在lvcreate命令中指定)循环交错存储在每一个PV上。例如
LE[1]的第1个条带 -
>
PV1,
LE[1]的第2个条带 -
>
PV2,
LE[1]的第3个条带 -
>
PV3,
LE[1]的第4个条带 -
>
PV1,
......
通过这种方式可以从多个磁盘并行读写数据,从而改善逻辑卷的性能。
stripe,physical extent,logical extent: 在线性LV中不存在stripe,PE和LE一一对应;在条带化的LV中,LE和PE都被分为多个stripe,LE中的stripe和PE中的stripe一一对应。(查了很久,包括自己也在测试,但是无法获知stripe的具体映射方式,如果此理解有误欢迎指出。)
快照是一种特殊的逻辑卷。假设有一个逻辑卷lv0。我们在某天的21:30:59给它创建了一个快照lv0s(lv0被称作lv0s的原始卷),其实相当于创建了lv0在21:30:59这个时刻的虚拟镜像。如果lv0包含一个文件系统,我们可以挂载并查看lv0s的内容。若lv0s创建后,lv0的数据没有变化,那么lv0s和lv0上的数据相同;若lv0s创建后lv0的数据发生变化,lv0s的内容会保持不变,还是lv0在21:30:59时的内容。通常情况下,给快照分配原始卷15%-20%的空间就够了,因为这些空间只是用来存储快照创建后原始卷上发生变化的数据块。快照的空间一旦用尽——由于已无法记录原始卷的变化——就会损坏。快照的大小可以使用lvextend和lvreduce来调整。
LVM2中的快照是可写的。快照上发生变化的数据快会被加入排除列表,今后不管原始卷上相对应的数据块如何变化,都不会被保存到快照上。
基于快照的这些特性,它通常应用在以下几种场合:
镜像可在不同设备上维护相同的数据——写入第一个设备的数据同样也会写入第二个设备,也就是把数据“镜像”了。这为可能遇到的设备故障提供了一种保护措施。当镜像的一条“腿”断掉,逻辑卷会成为线性的,但仍然能被访问。
LVM可创建具有多个镜像的镜像逻辑卷(mirrored logical volume)。一旦创建了镜像逻辑卷,LVM确保写入一个PV的数据会被镜像到另一个PV。
LVM镜像通常会把被镜像的设备分为512KB的区域,并把与镜像同步的区域记录在一个小的日志中。这个日志可在内存中维护;还可存储在磁盘上,重启系统也不会消失。
---
| | 逻辑卷
---
^
|
---------------
| | 卷组
---------------
^
|
-------------------
| | |
--- --- ===
<
--日志
| | | | | |
--- --- ---
物理卷 物理卷 物理卷
(镜像腿1)(镜像腿2)
pvcreat 将物分区创建为pv
-f:强制创建PV
pvremove 抹除PV中的数据,之后被抹除数据的设备不再是PV
pvscan 扫描系统上的PV
pvmove:移走PV上的数据
pvdisplay(pvs) 查看PV的信息,pvs显示的信息比较简单,pvdisplay详细 后接设备文件名,可以查看单独的设备的PV的信息,默认查看全部的PV
vgcreat:vgcreat VG_NAME /PATH/TO/PV
例子:vgcreat vg01 /dev/sdb{1,2}
-s #:指定PE大小,默认为4M
vgremove:移除VG 在有LV的时候,VG不能随便删除
vgextend:在VG上扩展PV vgextend vg01 /dev/sdb1
vgreduce:在缩减VG之前,一定要把有需要移除的PV上的数据移走(pvmove)
例子: 移除vg01上的PV(/dev/sdb1)
pvmove /dev/sdb1
vgreduce vg01 /dev/sdb1
vgdisplay(vgs)
vgscan
lvcreate
-n 指定LV名称
-L 指定空间大小 以PE为单位进行划分,大小不足一个PE时,当作一个
VG_NAME 在VG_NAME中创建
lvs
lvdisplay
lvremove:首先要卸载LV,否则会有无法移除LV的提示
lvextend
/dev/VG_NAME/LV_NAME 是一个链接文件,指向/dev/mapper/相应的文件(VG_NAME-LV_NAME)
分区:物理边界
文件系统边界:逻辑边界,附着在物理边界上
扩展:先增加物理边界,再增加逻辑边界
缩减:先缩减逻辑边界,再减少物理边界
用于在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。
使用lvextend命令动态在线扩展磁盘空间,整个空间扩展过程对于应用程序来说是完全透明的。
-L [+]# /PATH/TO/LV :指定逻辑卷的大小,单位为“kKmMgGtT”字节
[+]# +扩展了#,否则扩展到#
-l:指定逻辑卷的大小(LE数)
用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。
如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核支持在线resize。
linux kernel 2.6支持在mount状态下扩容但仅限于ext3文件系统。
resize2fs DEVICE_FSNAME SIZE 扩展到SIZE
注意:
1、不能在线缩减,需要先卸载
2、确保所见后的空间大小能承载原有的数据大小
3、再缩减之前应该强行检查文件系统,确保文件系统处于一致性状态 e2fsck -f
首先缩减逻辑边界(文件系统)
resize2fs /PATH/TO/LV SIZE
减少物理边界(LV)
lvreduce -L [-]SIZE /PATH/TO/LV
1、快照卷不允许修改,模式为只读
2、生命周期为整个数据访问时长,在这段时间内,数据的增长量(变化量)不能超出快照卷大小,
如果超过,快照卷自行损毁,安全的做法 ,快照卷与原卷(中的书)一样大
3、快照卷与原卷在同一卷组内
数据只能备份到进行备份的时刻,不能回恢复到出故障之前的时刻
-s 创建快照卷
-p r|w 指定权限
lvcreate -L SIZE -n SLV_NAME -s -p r /PATH/TO/LV