一、前言
因OS改造涉及LVM卷,且vg卷包含磁盘数量较多,lv中数据较大(100T左右),因此要在OS改造中确保LVM卷信息完整不丢失,保证其上数据安全尤为重要。本文旨在探讨lvm信息存储及迁移,以指导完成OS改造及数据迁移提供参考。
相关资源:LVM管理、LVM配置说明
二、LVM信息存储
在每个LVM物理卷(PV)上都包含三个部分:LVM标签、元数据区域、数据区域。
1、LVM元数据信息存储在块设备上的前四个扇区(读入内存):LVM的卷组配置信息即元数据存储在VG中的每个PV的元数据区域,每个PV都维护一份相同的VG元数据副本,副本内容以ASCII.格式存储,核心元数据存储在ASCII中;新版已采用LVM2,兼容lvm1;PV创建时,它的label 默认会存在块设备磁盘上第2个512字节的扇区上;当然也可选择性地放置在前四个扇区中的任何一个上,因为扫描物理卷标签的LVM工具会检查前四个扇区,PV标签以字符串LABELONE开头。具体PV labei包含:PV的 UUID、块设备的字节大小、以NULL结尾的数据区域位置列表、以NULL结尾的元数据区域位置列表。
2、含多个PV的VG维护多份副本时低效的,我们在pvcreate命令中可以使用–metadatacopies 0指定创建pv时,不存储任何副本,选择0个副本可以更快应用配置更新;注意:设定后创建的PV是无法再更改副本数的;然而为了VG安全,在任何时候,每个卷组都应必须至少包含一个具有元数据区域的物理卷(除非配置了允许在文件系统中存储VG元数据的高级配置设置),建议PV创建时最少1个副本;元数据区域就是一个循环缓冲区,可以用–metadatasize指定元数据区域的大小,新的元数据被附加到旧的元数据上,然后指向其开始的指针被更新。
3、元数据位置存储包含2部分:偏移量和大小(以字节为单位)。标签中有大约15个位置的空间,但LVM工具目前使用3个位置:一个数据区域加上最多两个元数据区域。
4、VG的元数据:有关创建方式和时间的信息+VG的配置说明信息(VG的UUID和名称,元数据版本号(每当元数据更新时都会增加),读/写或可调整大小的配置类信息,pv和lv的数量和配置的信息,数据块大小(以传统512字节的扇区为单位,最新的为4K扇区,这里1extent=几个扇区),PV的无序列表比如UUID用于确认组成VG的块设备成员即pv的相关属性比如是否还可分配、到PV内第一个数据块起点的偏移量(以扇区为单位),lv的无序列表:吕段的有序列表,pv和lv的映射关系)
5、官方VG:myvg元数据内容示例:
# Generated by LVM2: Tue Jan 30 16:28:15 2007
contents = "Text Format Volume Group"
version = 1
description = "Created *before* executing 'lvextend -L+5G /dev/myvg/mylv /dev/sdc'"
creation_host = "tng3-1" # Linux tng3-1 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686
creation_time = 1170196095 # Tue Jan 30 16:28:15 2007
myvg {
id = "0zd3UT-wbYT-lDHq-lMPs-EjoE-0o18-wL28X4"
seqno = 3
status = ["RESIZEABLE", "READ", "WRITE"]
extent_size = 8192 # 4 Megabytes
max_lv = 0
max_pv = 0
physical_volumes {
pv0 {
id = "ZBW5qW-dXF2-0bGw-ZCad-2RlV-phwu-1c1RFt"
device = "/dev/sda" # Hint only
status = ["ALLOCATABLE"]
dev_size = 35964301 # 17.1491 Gigabytes
pe_start = 384
pe_count = 4390 # 17.1484 Gigabytes
}
pv1 {
id = "ZHEZJW-MR64-D3QM-Rv7V-Hxsa-zU24-wztY19"
device = "/dev/sdb" # Hint only
status = ["ALLOCATABLE"]
dev_size = 35964301 # 17.1491 Gigabytes
pe_start = 384
pe_count = 4390 # 17.1484 Gigabytes
}
pv2 {
id = "wCoG4p-55Ui-9tbp-VTEA-jO6s-RAVx-UREW0G"
device = "/dev/sdc" # Hint only
status = ["ALLOCATABLE"]
dev_size = 35964301 # 17.1491 Gigabytes
pe_start = 384
pe_count = 4390 # 17.1484 Gigabytes
}
pv3 {
id = "hGlUwi-zsBg-39FF-do88-pHxY-8XA2-9WKIiA"
device = "/dev/sdd" # Hint only
status = ["ALLOCATABLE"]
dev_size = 35964301 # 17.1491 Gigabytes
pe_start = 384
pe_count = 4390 # 17.1484 Gigabytes
}
}
logical_volumes {
mylv {
id = "GhUYSF-qVM3-rzQo-a6D2-o0aV-LQet-Ur9OF9"
status = ["READ", "WRITE", "VISIBLE"]
segment_count = 2
segment1 {
start_extent = 0
extent_count = 1280 # 5 Gigabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv0", 0
]
}
segment2 {
start_extent = 1280
extent_count = 1280 # 5 Gigabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv1", 0
]
}
}
}
}
6、如果系统盘未采用lvm,数据盘lvm在OS改造中只需要做好/etc/lvm的备份(lvm元数据在文件系统上的副本),就可直接卸载挂载点后,对OS重装,系统重启可自动扫描PV元数据区域来获取当前lvm的信息,之后重新挂载即可。如果涉及跨主机迁移,请参考步骤3.
三、LVM迁移过程
针对跨主机迁移的LVM,这里借用LVM2工具集中的两个命令vgexport和vgimport:
1、关停使用LVM的服务;
2、备份存在文件系统中的VG元数据配置:/etc/lvm目录;或执行:vgcfgbackup -f <卷组名>-backup <卷组名>,对应恢复命令为:vgcfgrestore -f <卷组名>-backup;
3、卸载LV的挂载点
4、注销卷组在OS的信息:vgexport vg_name,该命令将VG转为 exported 状态(离线/不可用状态声明);从而确保VG和组成它的PV不可再用直到vgimport重新注册;这对于将VG 磁盘组安全迁移到另一个系统里是非常有用的。vgexport为VG提供了一层保护,防止LV被意外使用或还没准备好之前被自动化应用或系统使用,导致占用或数据写报错或丢失;vgexport时会等待VG中所有LV都处于inactive时才能成功,该命令会清楚VG的原有/当前系统ID,待迁移后,再新的主机系统里使用vgimport再重新注册满足新系统的新vg-ID;
5、重启和关闭源系统,或执行sync落盘;
6、迁移lvm的元数据到新的OS里释放,或将含有该数据得磁盘整体迁移到新的主机上;
7、vgimport重新注册vg,让新的主机获取到lvm信息;
8、激活vg:执行vgchang -ay vg_name,激活后lvs检查状态为available,其中vgchang -an是取消激活。
9、重新创建挂载点,挂载使用,并进入挂载目录,验证数据,待确认正常后,写入fstab文件即可。
四、附录
1)相关概念回顾
- 物理区域-----PE(Physical Extent):物理区域是物理卷中可用于分配的最小存储单元,创建卷组的过程实际就是将物理卷所对应的设备空间分割成一个个具有唯一编号物理区域,物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致。
- 逻辑区域-----LE(Logical Extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小,在同一个卷组中,LE和PE可以是一一对应的,也可以是一个LE对应多个PE,对应多个PE的时候又分为几种情况,一种是多个PE组成一个大的LE像RAID0一样,另一种是一个LE对应几份PE这几份PE互为镜像类似于RAID1,就是因为这个原因我们的LVM才可以创建支持RAID功能的LV。
- 卷组描述区域-----(Volume Group Descriptor Area):卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中的逻辑卷及逻辑卷中物理区域的分配等所有信息,卷组描述区域是在使用pvcreate建立物理卷时建立的。
- extend(区块):卷组中的每个卷都被分割成固定大小的小块,称为extents。extents的大小由卷组决定(组中的所有卷的extents大小相同)。物理卷上的extents称为physical extents,而逻辑卷的extents称为logical extents。逻辑卷仅仅是LVM在logical extents和physical extents之间维护的映射。鉴于这种映射关系,extents大小代表LVM可以分配的最小空间。LVM向上呈现的物理设备其logical extents是连续的,但真实情况对应的physical extents却可以是分散的。LVM可以复制和重新组织构成逻辑卷的physical extents,而不会对用户造成任何中断。通过在逻辑卷上添加或删除extents,也可以轻松扩展或收缩逻辑卷。
2)LVM写入方式:
1、线性模式(linear)—将多个分区的空间拼接起来使用,如一个lv跨度了/dev/sda1和/dev/sda2两个分区,当存储数据的时候先写入到/dev/sda1,当其写满的时再使用/dev/sda2,这种方式下如果某个分区坏掉,则数据并不会完全损坏。
2、交错模式(triped)—将数据交错存储,如一个lv跨度了/dev/sda1和/dev/sda2,保存一个包含四个数据块大小的文件,第一个数据块保存在/dev/sda1,第二个数据块保存在/dev/sda2,第三个保存在/dev/sda1,依次类推。这种方式下若lv跨度了两个磁盘/dev/sda1和/dev/sdb1,此时性能会有提升,但要是追求这种性能最好使用硬件raid来实现。而且这种模式下若某个分区坏掉,数据会损坏。所以lvm默认存储模式是线性模式(linear)
注意事项:LVM最主要的用途是在实现一个可以弹性调整容量的文件系统上,而不是在新建一个以性能为主的磁盘上,所以我们应该利用的是LVM可以弹性管理整个分区大小的用途上,而不是着眼在性能上。因此,LVM默认的读写模式是线性模式。如果你使用triped模式,要注意,当任何一个分区出现故障,所有的数据都会损坏。所以不是很适合使用这种模式。
3)创建raid卷组
lvcreate --type raid1 -m 1 -L 1G -n raid1lv1 raidvg /dev/sdc1 /dev/sdb1 #--type用来指定RAID的级别;-m 用来指定镜像的数量,1表示源数据有一个镜像数据;raidvg卷组后面的两个物理卷用来指明,在这两个物理卷上创建源数据和镜像数据
#条带
lvcreate --type raid0 -L 1G -n raid0lv1 raidvg /dev/sdc1 /dev/sdb1 ##使用默认的条带的大小我们可以用--stripesize参数来制定条带的大小,默认stripesize 64.00 KiB.