一、前言
磁盘阵列,简单的说就是将多个硬盘通过一定的接口和协议连接起来,然后通过控制器或者磁盘管理设备来统一管理的存储设备。下图是磁盘阵列的实物图。
磁阵管理器可以设置存储的RAID类型,可以划分LUN,可以把LUN映射到服务器上,前提是在光纤交换机里划分ZONE来将主机的HBA卡跟磁阵的HBA绑定,光纤线路图可参见4.2节。
这里重点讲LVM的概念和操作,看完这篇文档,你会了解LVM是什么,里面有哪些概念,如何把LUN划分到LV挂载到服务器上,双机切换是怎么对存储进行处理的。至于存储如何跟服务器连上,如何做RAID策略,如何划分LUN,这里不涉及。
二、概念
2.1 LVM
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(Logical Volumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
2.2 LUN
LUN的全称是Logical Unit Number,也就是逻辑单元号。我们知道SCSI总线上可挂接的设备数量是有限的,一般为6个或者15个,我们可以用target ID(也有称为SCSI ID的)来描述这些设备,设备只要一加入系统,就有一个代号,我们在区别设备的时候,只要说几号几号就ok了。
而实际上我们需要用来描述的对象,是远远超过该数字的,于是我们引进了lun的概念,也就是说lun id的作用就是扩充了target id。每个target下都可以有多个lun device,我们通常简称lun device为lun,这样就可以说每个设备的描述就有原来的target X变成target x lun y了,那么显而易见的,我们描述设备的能力增强了。就好比,以前你给别人邮寄东西,写地址的时候,可以写:
xx市人民大街54号 xxx(收)
但是自从高楼大厦越来越多,你不得不这么写:
xx市人民大街54号xx大厦518室 xxx (收)
所以我们可以总结一下,LUN就是我们为了使用和描述更多设备及对象而引进的一个方法而已,一点也没什么特别的地方。
LUN ID不等于某个设备,只是个号码而已,不代表任何实体属性,在我们的实际环境里,我们碰到的LUN可能是磁盘空间,可能是磁带机,或者是media changer等等。
LUN的神秘之处(相对于一些新手来说)在于,它很多时候不是什么可见的实体,而是一些虚拟的对象。比如一个阵列柜,主机那边看作是一个target device,那为了某些特殊需要,我们要将磁盘阵列柜的磁盘空间划分成若干个小的单元给主机来用,于是就产生了一些什么逻辑驱动器的说法,也就是比target device级别更低的逻辑对象,我们习惯于把这些更小的磁盘资源称之为LUN0,LUN1,LUN2……什么的。而操作系统的机制使然,操作系统识别的最小存储对象级别就是LUN Device,这是一个逻辑对象,所以很多时候被称之为Logical Device。
2.3 PV
物理卷physical volume ,典型的物理卷是硬盘分区,但也可以是整个硬盘或已创建的Software RAID 卷。
2.4 VG
卷组volume group ,卷组是LVM中最高抽象层,是由一个或多个物理卷所组成的存储器池。
2.5 LV
逻辑卷logical volume ,逻辑卷相当于非LVM系统中的分区,它在卷组上建立,是一个标准的块设备,可以在其上建立文件系统。
3 磁阵操作实战:用LVM划分PV/VG/LV
3.1 修改磁盘的分区格式为lvm格式8e
查看硬盘空间,并创建分区(按以下命令逐行执行)
fdisk -l
fdisk /dev/sdb (如果每个lun一个分区,就可以不新建分区,只是修改分区格式)
p 查看当前分区情况
n 新建分区
p 主分区
2 建第2个主分区(根据实际情况)
+20G 设置分区大小
t 设置分区格式
8e 设置为linux lvm格式
w 保存设置
q 退出分区
3.2 建立PV
为把一个磁盘或分区作为PV,首先应使用 pvcreate 对其初始化,如对IDE硬盘/dev/hdb,
1) 使用整个磁盘,
# pvcreate /dev/hdb
这将在磁盘上建立VG的描述符。
2) 使用磁盘分区,如/dev/hdb1。
使用fdisk 的t 命令把/dev/hda1的分区类型设为0x8e,然后运行:
# pvcreate /dev/hdb1
这将在分区/dev/hda1上建立VG的描述符。
PV初始化命令pvcreate的一般用法为:
pvcreate PV1 [ PV2 ... ] 它的参数可以是整个磁盘、分区,也可以是一loop设备。
3.3 建立VG
在使用pvcreate 建立了PV后,可以用vgcreate 建立卷组,如有PV1、PV2分别是/dev/hda1与/dev/hdb1,使用
# vgcreate testvg /dev/hda1 /dev/hdb1
将建立一个名为testvg的卷组,它由两个PV:/dev/hda1与/dev/hdb1组成。vgcreate的一般用法为:
# vgcreate [options] VG_name PV1 [PV2 ...]
其中的可选项包括设置VG最大支持的LV数、PE大小(缺省为4MB)等。
注意:当使用devfs系统时,应使用设备的全名而不能是Symbol Link,如对上例应为:
# vgcreate testvg /dev/ide/host0/bus0/target0/lun0/part1
/dev/ide/host0/bus0/target1/lun0/part1
3.4 激活VG
在被激活之前,VG与LV是无法访问的,这时可用命令:
# vgchange -a y testvg
激活所要使用的卷组。当不再使用VG时,可用
# vgchange -a n testvg
使之不再可用。
vgchange可用来设置VG的一些参数,如是否可用( -a [y|n]选项)、支持最大逻辑卷数等。
3.5 移除VG
在移除一卷组前应确认卷组中不再有逻辑卷,首先休眠卷组:
# vgchange -a n testvg
然后可用vgremove移除该卷组:
# vgremove testvg
3.6 为VG增加新PV
当卷组空间不足时,可以加入新的物理卷来扩大容量,这时可用命令vgextend,如
# vgextend testvg /dev/hdc1 其中/dev/hdc1是新的PV,当然在这之前,它应使用pvcreate初始化。
3.7 从VG移除PV
在移除PV之前,应确认该PV没用被LV使用,这可用命令pvdisplay查看,如:
# pvdisplay /dev/hda1
--- Physical volume ---
PV Name /dev/hda1
VG Name testvg
PV Size 1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV# 1
PV Status available
Allocatable yes (but full)
Cur LV 1
PE Size (KByte) 4096
Total PE 499
Free PE 0
Allocated PE 499
PV UUID Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7
如这个PV仍在被使用,则应把数据传移到其它PV上。在确认它未被使用后,可用命令vgreduce把它从VG中删除,如:
# vgreduce testvg /dev/hda1
3.8 创建LV
在创建逻辑卷前,应决定LV使用哪些PV,这可用命令vgdisplay与pvdisplay查看当前卷组与PV的使用情况。在已有的卷组上创建逻辑卷使用命令lvcreate,如:
# lvcreate -L1500 -ntestlv testvg
将在卷组testvg上建立一个1500MB的线性LV,其命名为testlv,对应的块设备为/dev/testvg/testlv。
# lvcreate -i2 -I4 -l100 -nanothertestlv testvg
将在卷组testvg上建立名为anothertestlv的LV,其大小为100LE,采用交错方式存放,交错值为2,块大小为4KB。
如果需要LV使用整个VG,可首先用vgdisplay 查找 Total PE 值,然后在运行lvcreate时指定,如:
# vgdisplay testvg | grep "Total PE"
Total PE 10230
# lvcreate -l 10230 testvg -n mylv
将使用卷组testvg的全部空间创建逻辑卷mylv。
在创建逻辑卷后,就可在其上创建文件系统并使用它。
命令lvcreate的常用方法:
lvcreate [options] -n 逻辑卷名 卷组名 [PV1 ... ]
其中的常用可选项有: "-i Stripes :采用交错(striped)方式创建LV,其中Stripes指卷组中PV的数量。
-I Stripe_size :采用交错方式时采用的块大小(单位为KB),Stripe_size必须为2的指数:2N ,N=2,3...9。
-l LEs :指定LV的逻辑块数。
-L size :指定LV的大小,其后可以用K、M、G表示KB、MB、GB。
-s :创建一已存在LV的snapshot卷。
-n name :为LV指定名称。
3.9 删除LV
为删除一个逻辑卷,必须首先从系统卸载其上的文件系统,然后可用lvremove删除,如:
# umount /dev/testvg/testlv
# lvremove /dev/testvg/testlv
lvremove -- do you really want to remove "/dev/testvg/testlv"? [y/n]: y
lvremove -- doing automatic backup of volume group "testvg"
lvremove -- logical volume "/dev/testvg/testlv" successfully removed
3.10 LVM操作全流程演示
在本节中,将在3块SCSI硬盘:/dev/sda,/dev/sdb,/dev/sdc上按步建立LVM。
3.10.1 修改分区格式为lvm分区
fdisk /dev/sda (如果每个lun一个分区,就可以不新建分区,只是修改分区格式)
t 设置分区格式
8e 设置为linux lvm格式
w 保存设置
q 退出分区
3.10.2 准备分区
首先要做的是初始化硬盘,建立PV,这将会删除硬盘上的原有数据。在此,用整个硬盘为PV:
# pvcreate /dev/sda
# pvcreate /dev/sdb
# pvcreate /dev/sdc
pvcreate在每个硬盘的起始端建立卷组描述区( volume group descriptor area, VGDA)。
3.10.3 创建卷组
利用上面三个PV建立卷组:
# vgcreate test_vg /dev/sda /dev/sdb /dev/sdc/
然后可用vgdisplay 查看/验证卷组的信息:
# vgdisplay
--- Volume Group ---
VG Name test_vg
VG Access read/write
VG Status available/resizable
VG # 1
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 3
Act PV 3
VG Size 1.45 GB
PE Size 4 MB
Total PE 372
Alloc PE / Size 0 / 0
Free PE / Size 372/ 1.45 GB
VG UUID nP2PY5-5TOS-hLx0-FDu0-2a6N-f37x-0BME0Y
其中最重要的前三条要正确,且VG size是以上三个硬盘容量之和。
3.10.4 建立LV
在确定卷组test_vg正确后,就可在其上创建LV。LV的大小可在VG大小范围内任意选择,如同在硬盘上分区。
建立线性方式LV
在test_vg上建立一个大小为1GB的线性方式LV:
# lvcreate –L 1G –n test_lv test_vg
lvcreate -- doing automatic backup of "test_vg"
lvcreate -- logical volume "/dev/test_vg/test_lv" successfully created
建立交错方式LV
在test_vg上建立一个大小为1GB的交错方式LV,交错参数为4KB:
# lvcreate -i3 -I4 -L1G -ntest_lv test_vg
lvcreate -- rounding 1048576 KB to stripe boundary size 1056768 KB / 258 PE
lvcreate -- doing automatic backup of "test_vg"
lvcreate -- logical volume "/dev/test_vg/test_lv" successfully created
注意:如果使用 -i2参数,则LV将仅使用test_vg中的两块硬盘。
3.10.5 建立文件系统
在LV test_lv创建后,就可在其上建立文件系统,
如,ext2/ext3系统:
# mke2fs /dev/test_vg/test_lv
如,reiserfs:
#mkreiserfs /dev/test_vg/test_lv
3.10.6 测试文件系统
安装LV:
# mount /dev/test_vg/test_lv /mnt
# df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 1311552 628824 616104 51% /
/dev/test_vg/test_lv 1040132 20 987276 0% /mnt
则可以通过/mnt访问LV。
四、磁阵操作流程图和实物图
4.1 磁阵映射到服务器的流程图
每个笼子有15块磁盘,分出14块盘做raid10类的RAID Group,剩下一块磁盘做Hot Spare盘,当RAID Group中的某块磁盘坏掉的时候,Hot Spare盘就会自动顶替坏盘,Hot Spare盘是对所有RAID Group都可用的。
RAID 10(RAIS0 + RAID1)的示意图:
4.2 磁阵与服务器之间的光纤线路图
4.3 刀片机框
这个刀片机框的后面,刀片机有自己的管理器,而且有刀片机的光纤交换机,管理器和光纤交换机都有主备。
4.4 光纤插线板
刀片机,PC服务器器,光纤交换机,磁阵都是连在光纤插线板上的,各部件的连接是在光纤插线板上进行的:
4.5 光纤交换机
上下是主备光纤交换机,在光纤交换机里划分ZONE来将主机的HBA卡跟磁阵的HBA绑定,这样在磁阵的控制器里就可以看到主机了
4.6 磁阵
磁阵有自己的管理器,可以用笔记本连上,操作磁阵,做RAID策略和划分LUN。
磁阵管理器大图
4.7 磁阵双机管理相关脚本
以MDSP的双机脚本VGLVAgent.rar和出差期间的FS双机脚本vg.rar为例。从脚本来看双机切换对存储处理的整个主体流程为:
1)主机文件系统解挂载
umount /mdsp/mi
PS:此操作是main.cf文件里直接调用命令来执行,在上面的脚本里没有。
2)主机VG去激活
lvm vgchange -a n ${vgName} > /dev/null 2>&1
PS:如果LV绑定了裸设备需要用raw命令解除绑定
3)备机VG激活
lvm vgchange -a y ${vgName} > /dev/null 2>&1
PS:如果VG的状态不是exported状态的,则需要导入VG
lvm vgimport ${vgName} > /dev/null 2>&1
4)备机LV激活
lvm lvchange -a y /dev/${vgName}/${lvName} >/dev/null 2>&1
5)备机文件系统挂载
mount /dev/test_vg/test_lv /mdsp/mi
从脚本来看,双机操作的对象是VG和LV,不涉及LUN。