主机迁移上云 - 文件级别

Posted Carlton Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主机迁移上云 - 文件级别相关的知识,希望对你有一定的参考价值。

1. 需求描述


本地有一台自己的开发机器,底层是跑在VMware虚拟化上面,现在公司云化转型,减少重资产,需要将VMware需要做进一步的升级为私有云,VMware上面的开发机器已经运行好长时间了,不想重新部署,现将开发机器完全原封不动Rehost迁移到OpenStack虚拟化平台,目前规划是用tar + rsync指令来完成正常迁移,看看整个过程记录。

1.1. 迁移需求点

  • 全量数据同步
  • 增量数据同步
  • 断点续传
  • 数据压缩

2. 迁移环境信息


  • 待迁移源端开发机器信息
操作系统:CentOS7.6
IP地址:192.168.10.68
内核版本:3.10.0-514.el7.x86_64
CPU:4Core
内存:8Gb
磁盘:系统盘 sda 200G,数据盘 sdb 200G;
分区:sda1 boot分区 sda2 sdb1 组成一个pv,分出来两个lv,lv01用于home分区,lv02用户根分区

####### 源端分区信息如下 ########
(venv) [root@carltonxu-dev ~][10:21:45]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0           2:0    1     4K  0 disk
sda           8:0    0   200G  0 disk
├─sda1        8:1    0     1G  0 part /boot
└─sda2        8:2    0   199G  0 part
  ├─cl-root 253:0    0  93.4G  0 lvm  /
  ├─cl-swap 253:1    0   7.9G  0 lvm  [SWAP]
  └─cl-home 253:2    0 141.1G  0 lvm  /home
sdb           8:16   0   200G  0 disk
└─sdb1        8:17   0   200G  0 part
  └─cl-root 253:0    0  93.4G  0 lvm  /
  • 目标端接收数据机器信息

目标端当前是在OpenStack云平台创建一台linux的vm虚拟机,按照源端待迁移机器的磁盘规格,创建相应的云硬盘,然后挂载至vm虚拟机中用于进行数据同步的数据存放。

操作系统:CentOS7.5
IP 地址:192.168.10.177
cpu:2Core
内存:4G
磁盘:系统盘 vda;数据盘 vdb 200G、vdc 200G
分区:vda 系统盘;vdb、vdc 用户存放迁移数据的数据盘(后续会用来启动迁移系统)

目标端VM主要作用是用来接收待迁移主机的数据,等待数据传输完成之后,进行驱动的适配,适配完成之后,将数据盘从目标VM卸载,然后通过OpenStack的Boot from Volume接口将数据盘启动,完成最终的主机迁移。

3. 步骤分解


本次linux的主机迁移主要的步骤流程如下:

  1. 创建用于接收同步数据的VM虚拟机(下面简称:目标同步VM虚拟机)
  2. 获取待迁移主机相关信息
    • 获取系统盘引导类型
    • 获取待迁移磁盘信息
    • 获取待迁移磁盘分区信息
    • 获取待迁移LVM分区信息
  3. 创建云硬盘挂载至目标同步VM虚拟机
  4. 同步磁盘分区格式化
  5. 数据同步
    • 全量数据同步(tar 传输压缩)
    • 数据断点续传(tar + rsync)
    • 增量数据同步(rsync)
  6. 磁盘驱动修复(注入适用于KVM的virtio驱动)
  7. 卸载同步数据磁盘
  8. 云端启动主机

3.1. 断点续传迁移逻辑

使用tar + rsync 迁移系统的逻辑是,使用tar进行初次的全量数据同步,在tar执行初步数据同步时,会记录已经同步的index目录文件到目标主机文件中,如果在初次通过tar全量同步过程中出现中断,那么断点续传方式如下:

  1. 先通过rsync指令—include-from参数加载初次tar全量同步已经传输的index文件,目的现将断点前已经同步的文件,再通过rsync检查一次,会否有变动,如果有变动,则同步到目标端。
  2. 再通过tar指令,—exclude-from参数加载已经同步的文件,继续将剩下的数据传输完成。
  3. 后续通过rsync指令同步增量数据。

这里初次数据同步使用tar的目的是,tar可以在传输过程中进行数据压缩,同样的数据,tar传输效率要高于rsync,大概是3倍速率。

4. 操作步骤


4.1. 创建用于接收同步数据的VM虚拟机

可以按照自己需求,选择目标平台,例如:阿里云、华为云、腾讯云等。

前边讲到我这里是将源端VMware的CentOS7.x开发机器迁移到目标是OpenStack私有云平台,所以这里我会登陆到OpenStack平台创建一个接收同步数据的VM虚拟机,VM虚拟机的操作系统可以自由选择,需保证虚拟机可以支持SSH,并保持22端口可以访问,我这里暂时使用CentOS7.5系统版本的虚拟机

4.2. 获取待迁移主机相关信息 - 源端

获取待迁移主机磁盘目的是,需要在目标平台创建相同大小的磁盘用于挂载到接收同步数据的VM虚拟机做数据同步,源端可以自主查看源VM磁盘个数及大小,分区、LVM等相关信息。

下面用到的所有指令,输出的大小单位不太一致都有标识,如果想要得到Gb,想要进行划算,例如:fdisk -l 可以看到输出的磁盘大小Gb是将1Gb = 1000Mb来计算的,但是一般划算是1Gb = 1024M来换算的,所以fdisk -l查询结果看起来会比较大,我们在创建目标磁盘时可以自行的扩大缩小磁盘都可以,但是需要保证分区的数据可以正常存放到磁盘中。

4.2.1. 获取系统盘引导类型

磁盘的主引导扇区是系统启动,读取硬盘时所必须要读取的第一个扇区,主引导扇区有 MBR、GPT两种,获取引导扇区主要用来在目标格式化磁盘时,将磁盘类型进行设定。

## 第一块系统盘 ##
# parted -l 2>/dev/null | grep -E "^Disk.*/dev/|^Partition" | grep /dev/sda -A1
Disk /dev/sda: 215GB
Partition Table: msdos

## 第二块数据盘 ##
# parted -l 2>/dev/null | grep -E "^Disk.*/dev/|^Partition" | grep /dev/sdb -A1
Disk /dev/sda: 215GB
Partition Table: msdos

设置磁盘引导类型点击 4.4.1. 设置磁盘引导类型

4.2.2. 获取待迁移磁盘大小

用于在目标端创建相同大小的磁盘

获取磁盘大小是单位是 bytes 例:磁盘 sda 大小为:214748364800 bytes / 1024 / 1024 / 1024 = 200GiB

# fdisk -l 2>/dev/null |  grep "^Disk /dev/" | grep -v "/dev/mapper" | awk 'BEGINOFS="#"print $2, $5'
/dev/sda:#214748364800
/dev/sdb:#214748364800
/dev/sdc:#2147483648

创建同步磁盘点击 4.3. 创建云硬盘挂载至目标同步VM虚拟机

4.2.3. 获取待迁移磁盘标准分区大小

用于在接收同步数据的VM虚拟机中,对挂载的磁盘进行分区格式化

获取的磁盘及分区大小单位是 KiB 例:分区 sda1大小为:1048576 KiB / 1024 / 1024 = 1GiB

# cat /proc/partitions | grep '[0-9]' | grep -v 'fd[0-9]' | grep -v 'sr[0-9]' | grep -v 'cdrom' | grep -v 'dm-' | grep -v 'loop[0-9]' | awk 'BEGINOFS=":"print $1,$4,$3'
8:sda:209715200
8:sda1:1048576
8:sda2:208665600
8:sdb:209715200
8:sdb1:209714176

创建磁盘分区点击 4.4. 同步磁盘创建标准分区

4.2.4. 获取待迁移磁盘LVM分区大小

获取磁盘大小是单位是 bytes 例:磁盘 sda 大小为:214748364800 bytes / 1024 / 1024 / 1024 = 200GiB

注意:需要查看源机器是否是LVM分区,如果是需要获取

用户在分区的基础上进行LVM的建立,最终数据会同步到LVM分区中,可以按照源机器大小进行分配,也可以按需分配,因为后续LVM可以动态扩盘或缩盘动作。

  • 获取pv信息

pv下面有两个分区分配为/dev/sda2、/dev/sdb1全部加入到一个pv中


# pvs
PV         VG Fmt  Attr PSize   PFree
  /dev/sda2  cl lvm2 a--  199.00g      0
  /dev/sdb1  cl lvm2 a--  200.00g 156.64g

目标端创建PV点击 4.3.3. 同步磁盘创建LVM分区-创建PV

  • 获取vg信息

vg名字为cl,下面有2个pv,则/dev/sdb2、/dev/sdb1都加入cl这个pv

# vgdisplay
VG #PV #LV #SN Attr   VSize   VFree
  cl   2   3   0 wz--n- 398.99g 156.64g

vg PE大小获取

# vgdisplay cl --units B | grep 'PE Size' | awk 'print $3'
4194304

vg 有几个pv卷在里面

# vgdisplay
--- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               199.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              50943
  Free PE               0
  Allocated PE          50943
  PV UUID               txRJGx-EZp9-Uynl-mMnl-Awai-HyYz-H8eG5f

  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               cl
  PV Size               200.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              51199
  Free PE               40100
  Allocated PE          11099
  PV UUID               upxP1C-IZaX-O6y1-F8XY-Wq8R-Djof-iezRjm

目标端创建VG点击 4.3.3. 同步磁盘创建LVM分区-创建VG

  • 获取lv信息
# lvs
LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home cl -wi-ao---- 141.12g
  root cl -wi-ao----  93.36g
  swap cl -wi-ao----   7.88g

lv分区大小获取,这里使用df -TP指令进行获取,将$lv_mapper_path 替换为每一个lv卷地址,例如:/dev/mapper/cl-home、/dev/mapper/cl-root

获取的lvm分区大小单位是 KiB,需要进行换算,例如:21266324 KiB / 1024 / 1024 = 20GiB

##### /dev/mapper/cl-root 分区大小 #####
# lvdisplay /dev/mapper/cl-root --units B | grep 'LV Size' | awk 'print $3'
100243865600 # 总大小
#  df -TP --block-size=1024 | grep "/dev/mapper/cl-root[[:space:]].*" | head -n 1 | awk 'print $4":"$7'
71849920:/  # 已经使用的

##### /dev/mapper/cl-home 分区大小 #####
# lvdisplay /dev/mapper/cl-home --units B | grep 'LV Size' | awk 'print $3'
151523426304 # 总大小
# df -TP --block-size=1024 | grep "/dev/mapper/cl-home[[:space:]].*" | head -n 1 | awk 'print $4":"$7'
21266324:/home

##### /dev/mapper/cl-swap 分区大小 #####
# lvdisplay /dev/mapper/cl-swap --units B | grep 'LV Size' | awk 'print $3'
8455716864 # 总大小

目标端创建LV点击 4.3.3. 同步磁盘创建LVM分区-创建LV

4.2.5. 获取待迁移主机磁盘分区格式

/dev/sda1 分区、/dev/mapper/cl-root、/dev/mapper/cl-home、/dev/mapper/cl-swap

# blkid -s TYPE /dev/sda1 | tr -d '"' | awk -F "TYPE=" 'print $2' | tr -d ' '
xfs

# blkid -s TYPE /dev/mapper/cl-root | tr -d '"' | awk -F "TYPE=" 'print $2' | tr -d ' '
xfs

# blkid -s TYPE /dev/mapper/cl-home | tr -d '"' | awk -F "TYPE=" 'print $2' | tr -d ' '
xfs

# blkid -s TYPE /dev/mapper/cl-swap | tr -d '"' | awk -F "TYPE=" 'print $2' | tr -d ' '
swap

目标端磁盘分区格式化点击 4.4.4. 同步磁盘分区格式化

4.3. 创建云硬盘挂载至目标同步VM虚拟机

登陆OpenStack平台,按照获取的源端磁盘大小在平台创建对应的云硬盘进行挂载到目标同步VM虚拟机上。

4.4. 目标同步磁盘分区格式化

4.4.1. 设置磁盘引导类型

此操作需要登陆到目标同步VM虚拟机,找到相对应的同步磁盘,如果目标端是KVM虚拟化,那么系统内容除去系统盘,vdb应该就是第一块磁盘,vdc是用于同步的第二块磁盘,这里可以通过获取的同步磁盘大小与源端待迁移磁盘一一对应。

# parted -s /dev/vdb mklabel msdos
# parted -s /dev/vdc mklabel msdos

4.4.2. 同步磁盘创建标准分区

按照源端磁盘大小进行分区,源端分区信息如下,划算成MiB

## 源端磁盘分区信息 ##
8:sda:209715200
8:sda1:1048576       = 1024 MiB
8:sda2:208665600     = 203775 MiB
8:sdb:209715200
8:sdb1:209714176     = 204799 MiB

使用parted指令进行磁盘分区,执行如下

## 创建/dev/vdb1 第一个分区 ##
# parted -s /dev/vdb mkpart primary 1 1025MiB

## 创建/dev/vdb2 第二个分区 ##
# parted -s /dev/vdb mkpart primary 1025 203776MiB

## 创建/dev/vdc1 第一个分区 ##
# parted -s /dev/vdc mkpart primary 1 204800MiB

4.4.3. 同步磁盘创建LVM分区

  • 创建PV

按照源端PV信息进行创建PV,源端PV信息如下

## 源端磁盘PV信息 ##
PV         VG Fmt  Attr PSize   PFree
/dev/sda2  cl lvm2 a--  199.00g      0
/dev/sdb1  cl lvm2 a--  200.00g 156.64g

使用pvcreate创建目标PV,源端和目标端对应关系 sda2 —> vdb2,sdb1 —> vdc1

# pvcreate -f /dev/vdb2 /dev/vdc1

  • 创建VG

按照源端VG信息进行创建VG,源端VG信息如下

## 源端磁盘VG信息 ##
VG #PV #LV #SN Attr   VSize   VFree
cl   2   3   0 wz--n- 398.99g 156.64g

## 源端VG有几个PV ##
--- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               199.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              50943
  Free PE               0
  Allocated PE          50943
  PV UUID               txRJGx-EZp9-Uynl-mMnl-Awai-HyYz-H8eG5f

  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               cl
  PV Size               200.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              51199
  Free PE               40100
  Allocated PE          11099
  PV UUID               upxP1C-IZaX-O6y1-F8XY-Wq8R-Djof-iezRjm

使用vgcreate创建目标VG,vg 名字和 vg包含的 pv,可以根据源端信息获取

# vgcreate cl /dev/vdb1 /dev/vdc1

  • 创建LV

按照源端LV信息进行创建LV,源端LV信息如下

## 源端LV信息 ##
/dev/mapper/cl-root: 100243865600 B  =  95600M
/dev/mapper/cl-home: 151523426304 B = 144504M
/dev/mapper/cl-swap: 8455716864 B = 8064M

使用lvcreate创建目标LV

# lvcreate -n /dev/mapper/cl-root -L 95600M cl -W y -y
# lvcreate -n /dev/mapper/cl-home -L 144504M cl -W y -y
# lvcreate -n /dev/mapper/cl-swap -L 8064M cl -W y -y

4.4.4. 同步磁盘分区格式化

按照源端磁盘分区格式,分区格式信息如下

## 源端磁盘分区格式 ##
/dev/sda1:xfs
/dev/mapper/cl-root:xfs
/dev/mapper/cl-home:xfs
/dev/mapper/cl-swap:swap

使用mkfs对目标同步磁盘进行分区格式化

# mkfs.xfs -f /dev/vdb1
# mkfs.xfs -f /dev/mapper/cl-root
# mkfs.xfs -f /dev/mapper/cl-home
# mkswap /dev/mapper/cl-swap

4.5. 同步磁盘挂载点配置

涉及同步的磁盘分区都已经格式化完成,需要将格式化的分区挂载到相应的目录,后续可以直接将数据同步到相应的分区下,完成数据迁移动作;源端有数据的分区,应该是如下几个:

## 分区挂载点规划 ## 
/boot分区:  /dev/vdb1 --> /mnt/vdb1
/ 分区:     /dev/mapper/cl-root --> /mnt/mapper/cl-root
/home 分区: /dev/mapper/cl-home --> /mnt/mapper/cl-home

4.5.1. 创建同步挂载点

按照规划创建相应的挂载点目录

# mkdir -p /mnt/vdb1,mapper/cl-home,cl-root

4.5.2. 挂载同步分区

按照规划的同步挂载点将同步分区挂载到相应的目录

# mount /dev/vdb1 /mnt/vdb1
# mount /dev/mapper/cl-root /mnt/mapper/cl-root
# mount /dev/mapper/cl-home /mnt/mapper/cl-home

4.6. 数据同步

4.6.1. 全量数据同步(tar 传输压缩)

使用nice命令调整优先级, --index-file 将传输的详细记录输出在目标机器指定目录下,这部分输出比较重要,后续会直接用来做断点续传的内容输入。

  • nice 指令解析
-n # 命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)
  • tar 指令所用参数解析
--one-file-system # 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制
--delay-directory-restore # 直到解压结束才设置修改时间和所解目录的权限
--no-delay-directory-restore # 取消解压结束才设置修改时间和所解目录的权限
--xattrs # 归档时保留文件的扩展性信息
--xattrs-include # 指定包含归档时保留文件的扩展性涉及的范围
--sparse # 高效处理稀疏文件,如果不加入此参数,稀疏文件中的空洞将被填满
--numeric-owner  # 以用户识别码及群组识别码取代用户名称和群组名称,还原归档文件的数字所有者,而不是匹配您正在还原的环境中的任何用户名。这是因为您要恢复的系统中的用户标识不一定与您用于还原的系统(例如,Live CD)相匹配
--index-file # 将传输的详细输出到文件
  • [/boot] 目录数据同步
# nice -n 0 tar --one-file-system --xattrs --xattrs-include=* --sparse -C /boot -cf - . | ssh -p 22 root@192.168.10.177 tar --xattrs --xattrs-include=* --numeric-owner --no-delay-directory-restore --index-file=/data/migration_boot.log -C /mnt/vdb1 -xvf -
  • [/home] 目录数据同步
# nice -n 0 tar --one-file-system --xattrs --xattrs-include=* --sparse -C /home -cf - . | ssh -p 22 root@192.168.10.177 tar --xattrs --xattrs-include=* --numeric-owner --no-delay-directory-restore --index-file=/data/sms_home.log -C /mnt/mapper/cl-home -xvf -
  • [/] 目录数据
# nice -n 0 tar --one-file-system --xattrs --xattrs-include=* --sparse -C / -cf - . | ssh -p 22 root@192.168.10.177 tar --xattrs --xattrs-include=* --numeric-owner --no-delay-directory-restore --index-file=/data/sms_.log -C /mnt/mapper/cl-root -xvf -

4.6.2. 数据断点续传(tar + rsync)

断点续传:首先断点续传是在首次全量同步过程中,由于某种不可预估的因素导致数据传输中断,导致待传输的数据没有正常传输完毕,所以这个时候断点续传需要做到接着上次中断的位置继续传输后续的数据,无需从头传输。避免数据重复传输来大大减少数据传输时间。

传输的断点续传操作,这里以[/]目录为例进行示例操作演示,如果在真是环境中,应该将所有挂载的目录都进行一次断点续传动作,保证数据的一致性。

  • [/] 目录断点续传

步骤逻辑:

如果在初次使用tar进行增量过程中出现了中断,首先使用rsync指令指定tar —include-from=<tar初次传输记录的文件>将已经传输的目录进行差异传输。

# rsync -avHPX --sparse --one-file-system --numeric-ids --stats --include-from=/root/sms_home.log --exclude=/* -e ssh -p 22 -i config/sms_ssh_rsa /home root@192.168.10.177:/mnt/mapper/cl-home

传输完成之后,再次通过tar指令–exclude-from=<排除断点前tar已经传输记录的文件>

# tar --one-file-system  --xattrs --xattrs-include=*  --sparse  --exclude-from=/root/sms_.log -C / --exclude=./proc/* --exclude=./sys/* --exclude=./lost+found/* --exclude=./va    r/lib/ntp/proc/* -cf - . | ssh -p 22 -i config/sms_ssh_rsa  root@192.168.10.177 tar --xattrs --xattrs-include=* --numeric-owner --no-delay-directory-restore --index-file=/data/sms_.log -C /mnt/mapper    /cl-root -xvf -

4.6.3. 增量数据同步(rsync)

增量数据传输rsync指令参数解析,由于rsync参数较多,这里只是解析到了使用到的一部分,如果还需要用到rsync的其他能力,可以通过man rsync指令来获取相关的参数解析。

## rsync 指令所用参数解析 ## 

-a --archive # 参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去
-v # 表示输出细节
-H --hard-links # 同步到目标保持硬链接
-P # --progress 参数表示显示进展 和 --partial 允许恢复中断的传输,这两个参数的结合
-X --xattrs # 保留扩展属性
-e # 指定所要执行的 SSH 命令
--delete # 默认rsync只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果使得目标目录成为源目录的镜像副本,需要添加--delete参数
--inplace # 原地更新目标文件
-x --one-file-system # 不要跨越文件系统边界,同步的源和目标目录必须与rsync指令执行时所处的文件系统相同
--numeric-ids # 不要把uid/gid值映射为用户/组名
--exclude # 同步时排除某些文件或目录

后续增量数据同步,直接通过rsync指令同步即可,也可以使用–exclude=<排除文件/目录>来排除不需要传输的文件或目录即可。

  • 增量 / 分区
# nice -n 0 rsync -avHPX --delete --inplace --one-file-system --numeric-ids  -e 'ssh -p 22 -i config/sms_ssh_rsa' --exclude=proc/* --exclude=sys/* --exclude=lost+found/* --exclude=var/lib/ntp/proc/* --exclude=boot/* --exclude=boot/efi/* --exclude=etc/fstab --exclude=etc/* --exclude=etc/X11/* --exclude=root/initrd_bak/* --exclude=boot/grub2/x86_64-efi/* --exclude=boot/grub2/i386-pc/* / root@192.168.10.177:/mnt/mapper/cl-root
  • 增量 /boot分区
# nice -n 0 rsync -avHPX --delete --inplace --one-file-system --numeric-ids  -e 'ssh -p 22 -i config/sms_ssh_rsa' --exclude=* --exclude=efi/* --exclude=grub2/x86_64-efi/* --exclude=grub2/i386-pc/* /boot/ root@192.168.10.177:/mnt/vdb1
  • 增量 /home 分区
# nice -n 0 rsync -avHPX --delete --inplace --one-file-system --numeric-ids  -e 'ssh -p 22 -i config/sms_ssh_rsa' /home/ root@192.168.10.177:/mnt/mapper/cl-home

4.7. 磁盘驱动修复(注入适用于KVM的virtio驱动)

待数据全量 + 增量都传输完成之后,这时候也到异构迁移最重要的一个步骤,也是云迁移和云容灾必不可少的步骤,做驱动的转换,驱动的转换主要做了什么动作那,将源机器在VMware或者物理机使用的iscsi、sata、ide等相关磁盘驱动、vmxnet3等网卡驱动替换为云平台测虚拟化驱动类型,比如:OpenStack私有云,底层虚拟化使用的KVM,那么我们就需要在磁盘中加入可以在KVM虚拟化下驱动磁盘和网卡的virtio驱动,这样在虚拟机启动时才可以识别到磁盘,正常引导进入系统启动流程,不然就会出现找不到磁盘的情况

4.7.1. 卸载同步分区

将已经同步完成的挂载分区进行卸载,卸载后进行驱动加载动作

# umount /mnt/vdb1
# umount /mnt/mapper/cl-home
# umount /mnt/mapper/cl-root

4.7.2. 创建目录并挂载修复分区

# mkdir /mnt/root

### 将修复分区按照正常系统启动挂载点进行挂载 ###
# mount /dev/vdb1 /mnt/boot
# mount /dev/mapper/cl-root /mnt/root
# mount /dev/mapper/cl-home /mnt/root/home

### 挂载本地动态设备目录到修复目录 ###
# mount -o bind /sys /mnt/root/sys
# mount -o bind /proc /mnt/root/proc
# mount -o bind /dev /mnt/root/dev

### 挂载本地lvm运行的服务socket目录到修复目录 解决chroot后l,执行v相关指令出现warning信息###
# mkdir -p /mnt/root/run/lvm
# mount -o bind /run/lvm /mnt/root/run/lvm

4.7.3. 执行驱动加载指令

驱动加载指令,对应不同的Linux系统操作版本,也会有相应的不同,加载驱动的前提有以下几点:

1)操作系统内核需要支持加载的驱动

2)系统内有需要加载的驱动程序文件

3)检查临时文件是否包含 Virtio 驱动

以上几点内容详细信息,这里不做过多的介绍,详细讲解Linux 系统检查Virtio驱动

  • 执行驱动加载指令

对于CentOS7.x的驱动加载指令,上面的连接内部也有讲到,使用mkinitrd来完成驱动加载,加载virtio_blk,virtio_pci,virtio_net 这个三个驱动

### 切换到修复/分区 ###
# chroot /mnt/root/

### 执行加载驱动动作 ###
# mkinitrd -f --with=virtio_blk --with=virtio_pci --with=virtio_net /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64

驱动注入是否成功查看,lsinitrd指令可以查看在临时文件系统中已经加载了virtio的驱动,如果有以下输出则表示已经成功加载,可以正常启动。

# lsinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img | grep virtio
Arguments: -f --add-drivers ' virtio_blk virtio_pci virtio_net'
-rw-r--r--   1 root     root        27885 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/block/virtio_blk.ko
-rw-r--r--   1 root     root        53709 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/char/virtio_console.ko
-rw-r--r--   1 root     root        49757 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/net/virtio_net.ko
-rw-r--r--   1 root     root        29253 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/virtio_scsi.ko
drwxr-xr-x   2 root     root            0 Apr 21 09:43 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/virtio
-rw-r--r--   1 root     root        17997 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/virtio/virtio.ko
-rw-r--r--   1 root     root        35781 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/virtio/virtio_pci.ko
-rw-r--r--   1 root     root        22765 Nov 23  2016 usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/virtio/virtio_ring.ko

4.8. 系统引导修复

4.8.1. 安装grub引导

/dev/vdb是系统盘的boot引导分区,可以根据自己环境情况进行查看,grub是系统引导必不可少的过程,所以需要重新安装grub引导。

# grub2-install --no-floppy /dev/vdb

4.8.2. 编辑分区表及引导文件

引导修复完成之后,需要查看分区表是否正常填写相关信息,如果挂载分区使用了UUID方式,那么需要将UUID替换为新的,这里建议使用分区的UUID替换设备名称,例如:xxxxx —> /dev/vda1

源迁移机器fstab内容

### 源迁移机器fstab内容 ###

#
# /etc/fstab
# Created by anaconda on Mon Jan 21 06:05:07 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=63a11d54-b980-4d48-9f5f-95686fad974e /boot                   xfs     defaults        0 0
/dev/mapper/cl-home     /home                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

替换成如下,将通过blkid获取对应的分区UUID,然后进行替换,其他LVM分区可以替换,也可以不替换,我这里就保留原有的,只替换boot分区,因为boot分区的UUID有变化需要替换成新的,不然启动时会无法找到boot分区设备。

### 设备分区UUID 获取 ###

# blkid
/dev/mapper/cl-root: UUID="7b3c5ebb-b7e0-4eac-aeea-467958d38d1d" TYPE="xfs"
/dev/vdb2: UUID="4913yh-y4ew-hLz3-jiFy-eU1E-Zbmm-NVTxLz" TYPE="LVM2_member"
/dev/vdc1: UUID="XxqSeR-5PsM-MmWI-1GrZ-Phvn-h5hv-Rgv0IK" TYPE="LVM2_member"
/dev/vdb1: UUID="feb7b68d-8145-464a-ad24-31c84827fa2d" TYPE="xfs"
/dev/vda1: UUID="8c1540fa-e2b4-407d-bcd1-59848a73e463" TYPE="xfs"
/dev/mapper/cl-swap: UUID="114c2dec-5256-450b-b554-2996ba910fc1" TYPE="swap"
/dev/mapper/cl-home: UUID="2b31b56e-27e8-49a2-9a8f-734ceb8d2f42" TYPE="xfs"

#### 编辑/etc/fstab修改成如下内容 ###

#
# /etc/fstab
# Created by anaconda on Mon Jan 21 06:05:07 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=feb7b68d-8145-464a-ad24-31c84827fa2d /boot                   xfs     defaults        0 0
/dev/mapper/cl-home     /home                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

4.8.3. 卸除文件系统挂载

以上操作都执行完毕之后,就可以将同步磁盘进行卸除文件系统挂载。

# umount /mnt/root/dev
# umount /mnt/root/sys
# umount /mnt/root/proc
# umount /mnt/root/run/lvm

# umount /mnt/root/home
# umount /mnt/root/boot
# umount /mnt/root/

4.9. 云端启动主机

4.9.1. 卸载同步数据磁盘

将用于数据同步的磁盘从接收同步数据VM虚拟机上卸载,登陆到OpenStack私有云平台,将挂载的同步磁盘进行分离操作。

4.9.2. 系统磁盘设置为可启动

创建的同步磁盘均为数据盘,数据盘在OpenStack平台是否无法直接启动的,所以我们需要将同步的系统磁盘设置为可启动,这样在创建虚拟机时才可以选择卷启动,找到迁移过来的磁盘卷进行启动。

4.9.3. 启动迁移系统

在启动系统时,选择我们已经同步完成的系统卷作为启动源。
待系统启动完成后,记得将数据盘也挂载到已经启动好的虚拟机上,不然无法正常引导启动。

系统启动正常查看

5. 总结


整个迁移动作流程到此结束,整个过程看起来还比较复杂,其他中间的好多过程我们完成可以通过编写自动化脚本来完成这些使用,减少我们中间的工作量及人工操作失误的概率。从本次测试我们也可以看出,tar、rsync 命令还是可以组合做什么多事情,并且支持的参数能力也很多,rsync 也可以作为我们日常数据备份能力,定时的增量备份。

这次迁移流程不光验证来数据同步的全量、增量、断点续传等功能点的实现,还了解了Linux 系统开机启动引导的流程,已经如果更换底层虚拟化平台,需要修改那么内容,才可以做到正常的引导启动。

以上是关于主机迁移上云 - 文件级别的主要内容,如果未能解决你的问题,请参考以下文章

阿里云专有宿主机,构建公共云上的专有资源池

如何开始上云迁移

Openstack迁移DDH最佳实践

轻松上云系列之一:本地数据迁移上云

迁移上云|开局一张图,技能靠爬坑

近期做项目上云迁移的一些状况与感想