OS国产化改造中LVM卷迁移指导

news2025/1/16 7:49:46

一、前言

因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.
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用R语言生成频数分布表

概要 使用R语言生成频数分布表 在R语言中&#xff0c;可以使用freq()函数来生成频数分布表。首先&#xff0c;将需要分组的数据存储在一个向量中。然后&#xff0c;使用freq()函数将这个向量作为参数输入&#xff0c;即可生成频数分布表。以下是一个示例&#xff1a; 示例 …

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本&#xff08;Y4tacker这个师傅的&#xff09; # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

123.Mit6.S081-实验1-Xv6 and Unix utilities

今天我们来进行Mit6.S081实验一的内容。 实验任务 一、启动xv6(难度&#xff1a;Easy) 获取实验室的xv6源代码并切换到util分支。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git checkout util Branch util …

Qt - 窗口

目录 1. 前言 2. 菜单栏(QMenuBar) 2.1. 创建菜单栏 2.1.1. 方式一 2.1.2. 方式二 2.2. 在菜单栏中添加菜单和创建菜单项 2.3. 在菜单项之间添加分割线 2.4. 综合示例 3. 工具栏(QToolBar) 3.1. 创建工具栏 3.2. 设置停靠位置 3.2.1. 方式一 3.2.2. 方式二 3.3. 设…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统&#xff0c;目前已在多家三级级医院应用&#xff0c;并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

2024-4-22 群讨论:微服务启动预热相关

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 Hotspot JVM 进程启动后&#xff0c;流量到来的时候 JIT 吃掉很多 CPU&#xff0c;如何观察到&#xff1f; 很多途径都能观察到&#xff1a; top -Hp&#xff1a;这个需…

前端开发攻略---封装日历calendar组件(纯手搓),可以根据您的需求任意改变,可玩性强

1、演示 2、代码 <template><div class"box" v-if"startMonth.year"><div class"left"><div class"top"><span class"iconfont" click"changeMonth(-1)">左</span><span&…

JTAG访问xilinx FPGA的IDCODE

之前调试过xilinx的XVC&#xff08;Xilinx virtual cable&#xff09;&#xff0c;突然看到有人搞wifi-JTAG&#xff08;感兴趣可以参考https://github.com/kholia/xvc-esp8266&#xff09;&#xff0c;也挺有趣的。就突然想了解一下JTAG是如何运作的&#xff0c;例如器件识别&…

关于开设RT-DETR专栏及更新内容的一些说明

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

jsp实验10 JavaBean

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握javabean的用法。【参考课本 上机实验 5.5.1 】 三、源代码以及执行结果截图&#xff1a; 源代码&#xff1a; Fraction.java package sea.water; public class Fraction { public double numbe…

【北京迅为】《iTOP-3588开发板系统编程手册》-第19章 V4L2摄像头应用编程

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Skill Check: Build an LLM Application using OCI Generative AI Service

Skill Check: Build an LLM Application using OCI Generative AI Service

数据清洗:异常值检测方法

异常值检测方法总结 一、基于分布1、3σ原则2、Z_score方法3、boxplot一、基于分布 1、3σ原则 3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常…

贪心算法练习day.1

理论基础 贪心算法是一种常见的解决优化问题的方法&#xff0c;其基本思想就是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部的最优决策&#xff0c;以此得到全局的最优解&#xff0c;例如在十张面额不同的钞票&#xff0c;让我们…

ctfshow 每周大挑战RCE极限挑战

讨厌SQl看到这个了想来玩玩 rce1 <?phperror_reporting(0); highlight_file(__FILE__);$code $_POST[code];$code str_replace("(","括号",$code);$code str_replace(".","点",$code);eval($code);?>括号过滤点过滤&…

查找算法之分块查找

目录 前言一、查找算法预备知识二、分块查找三、总结3.1 查找性能3.2 适用场景3.3 优缺点 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

家用洗地机哪款好用?盘点618值得买的洗地机品牌

对于工作忙碌或家里养了宠物的很多朋友来说&#xff0c;洗地机它集合吸尘清扫湿拖的功能&#xff0c;很大程度上解放了家庭清洁劳动的繁琐&#xff0c;让人们腾出更多的时间休息&#xff0c;那么&#xff0c;市场上有很多牌子的洗地机&#xff0c;价格也各不相同&#xff0c;那…

HarmonyOS应用性能分析工具CPU Profiler的使用指南

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

前言 泛型是一种编程概念&#xff0c;它允许我们编写可以适用于多种数据类型的代码。通过使用泛型&#xff0c;我们可以在编译时期将具体的数据类型作为参数传递给代码&#xff0c;从而实现代码的复用和灵活性。 在传统的编程中&#xff0c;我们通常需要为不同的数据类型编写不…