记一次 CentOS 7 迁移到 Proxmox VE(P2V)


一、前言

最近由于工作需要接触了裸机虚拟化技术,然后突然就对裸机虚拟化技术上瘾了。

用来用去还是最喜欢开源免费的 Proxmox VE。

突然想到家里的服务器在裸跑 CentOS 7,有点浪费……

于是趁着这几天在家就把家里的服务器换成了 Proxmox VE,然后把原来的 CentOS 7 迁移到 Proxmox VE 上。

整个迁移过程其实都是在迁移磁盘,虚拟机的配置倒非常简单。

现在我就把整个磁盘迁移过程整理后写成了这篇文章,有需要的朋友可以参考下。

说明
• 本文不涉及理论知识。


二、操作环境

2.1 物理机配置

说明
• 这里的物理机使用虚拟机来模拟。

  • CPU:Intel Core i7-3770K
  • 内存:4G * 1
  • 磁盘:2T * 1
  • 操作系统(迁移前):CentOS 7.6.1810

2.2 需要准备的东西

  • U 盘
  • CentOS 7 系统 ISO
  • Proxmox 系统 ISO
  • 一台装有 Linux 系统且磁盘剩余空间充足的电脑(下面称为临时主机)

三、迁移过程

3.1 确定磁盘分区结构

先看下物理机的磁盘分区结构。

[[email protected] ~]# parted /dev/sda p
Model: ATA VMware Virtual S (scsi)
Disk /dev/sda: 2147GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name                  标志
 1      1049kB  211MB   210MB   fat16           EFI System Partition  启动
 2      211MB   2147GB  2146GB  ext4
 3      2147GB  2147GB  862MB   linux-swap(v1)

可以看出,磁盘使用的是 GPT 分区表,一共有 3 个分区:第一个分区是 EFI 分区,第二个分区是系统分区,第三个分区是 SWAP 分区。

所以,在迁移磁盘之前,必须删除 SWAP 分区然后把系统分区缩小。

3.2 删除 SWAP 分区

先卸载 SWAP 分区。

[[email protected] ~]# swapoff /dev/sda3

然后删除 SWAP 分区。

[[email protected] ~]# parted /dev/sda rm 3
信息: You may need to update /etc/fstab.

最后记得删除 /etc/fstab 中自动挂载 SWAP 分区的条目。

3.3 缩小系统分区

由于 ext4 文件系统必须在没有挂载的状态下缩小,所以下面需要在 CentOS 安装盘的系统下操作。

启动到 CentOS 7 安装盘之后,选择 「Troubleshooting」 -> 「Rescue a CentOS system」。

到这里按 3 回车进入 Shell。

P1

先检查下系统分区。

P2

没问题之后我们先尝试把磁盘空间缩小到一个很小的数值。

P3

不用说,肯定是失败的。

这里的目的是为了获取磁盘缩小的极限。

这里是 6,567,464 个块大小,那我们就把磁盘缩小到 6,567,464 个块大小吧。

P4

缩小分区成功,这里显示每个块的大小为 4KB。

这时候就要计算并记录一下缩小后系统分区的实际大小。

缩小后系统分区的实际大小 = 块数 * 每个块的大小

所以缩小后系统分区的实际大小就是 6,567,464 * 4 * 1,024 = 26,900,332,544B

3.4 记录磁盘分区信息 & 确定磁盘切割点

我们再看下磁盘的分区结构。不过这次把容量单位设置为字节,这样可以做到精准定位。

P5

先把结果记录下来。

现在磁盘的最后一个分区为系统分区,那么整个磁盘的实际使用空间 = 210,763,776 + 26,900,332,544 = 27,111,096,320B,这个应该不难理解吧。

那就切 27,111,096,320B 咯?不是。要知道 GPT 格式的磁盘末尾是有 16,384B 分区表的,所以要切多 16,384B 用于放置分区表。

那就是 27,111,096,320 + 16,384 = 27,111,112,704B

是的,但最好确认下该数字能被 4,096 整除(4K 对齐),否则可能会影响性能(未测试)。

27,111,112,704 % 4,096 = 0,没问题。

最后确定把磁盘的前 27,111,112,704B 切下来。

3.5 制作裸磁盘映像

这里我们使用网络把物理机上的磁盘内容直接发送给临时主机,临时主机接收之后直接将其保存为裸磁盘映像文件。

这里使用 nc 工具来完成此操作。

先让临时主机监听相应的端口(注意设置好防火墙),并把等会接收到的内容保存为裸磁盘映像文件。

[[email protected] ~]# nc -l -p 9000 > phy.img

然后配置好物理机的网络,开始传输数据,耐心等待一段时间。

P6

这一步完成之后,物理机就可以安装 Proxmox VE 了。

3.6 重建分区表

先在临时主机上“挂载”裸磁盘映像为 Loop 设备。

[[email protected] ~]# losetup -P /dev/loop0 phy.img

然后根据 3.4 记下的磁盘分区信息用 parted 重建分区表。

需要注意的是,系统分区的 End 位置需要设置为 3.4 中系统分区的 Start 位置 + 缩小后系统分区的实际大小

[[email protected] ~]# parted /dev/loop0 mklabel gpt
Information: You may need to update /etc/fstab.

[[email protected] ~]# parted /dev/loop0 mkpart fat16 1048576b 210763775b
Information: You may need to update /etc/fstab.

[[email protected] ~]# parted /dev/loop0 set 1 boot on
Information: You may need to update /etc/fstab.

[[email protected] ~]# parted /dev/loop0 mkpart ext4 210763776b 27111096320b
Information: You may need to update /etc/fstab.

重建分区表完成之后,检查一下系统分区的完整性。

[[email protected] ~]# fsck.ext4 -f /dev/loop0p2 
e2fsck 1.43.4 (31-Jan-2017)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0p2: 25974/1646592 files (0.3% non-contiguous), 5532966/6567464 blocks

很好,分区完好无损。现在可以卸载 Loop 设备了。

[[email protected] ~]# losetup -D

最后把这个裸磁盘映像上传到 Proxmox VE 中,然后转成 qcow2 格式后就可以供虚拟机使用了!


四、注意事项

迁移之后我遇到了一个坑:CentOS 在启动过程中偶尔会卡死在三色进度条界面(如下图)。

解决方法是去掉启动参数中的 rhgb quiet。至于为什么会有这个坑我也搞不清楚……

发表评论

电子邮件地址不会被公开。