如何轻松地将 OpenVZ 6 容器传输到 KVM 服务器

任何人一生中至少需要一次将 OpenVZ 容器转移到具有完全 KVM 虚拟化的服务器的人都遇到过一些问题:

  • 大多数信息已经过时,并且与早已过了 EOL 周期的操作系统相关
  • 总是为不同的操作系统提供不同的信息,并且从不考虑迁移过程中可能出现的错误
  • 有时您必须处理有时不希望在迁移后工作的配置

当您转移一台服务器时,您总是可以即时修复某些问题,但是当您转移整个集群时呢?

在本文中,我将尝试告诉您如何以最短的停机时间正确地将 OpenVZ 容器迁移到 KVM,并快速解决所有问题。

一个小教育程序:什么是 OpenVZ,什么是 KVM?

我们不会深入讨论术语,但会笼统地说:

OpenVZ的 - 操作系统级别的虚拟化,您甚至可以将其部署在微波炉上,因为主机上不需要CPU指令和虚拟化技术。

KVM - 成熟的虚拟化,利用CPU的所有能力,能够以任何方式虚拟化任何东西,纵向和横向切割。

与托管提供商中普遍认为 OpenVZ 会被超卖的看法相反,但 KVM 不会——幸运的是,对于后者来说,KVM 现在的超卖情况并不比它的兄弟更糟糕。

我们将继承什么?

作为转移的测试对象,我们必须使用 OpenVZ 上可用的整个操作系统:CentOS(6 和 7 版本)、Ubuntu(14、16 和 18 LTS)、Debian 7。

假设大多数 OpenVZ 容器已经在运行某种 LAMP,有些甚至有一些非常特定的软件。 最常见的是,这些是使用 ISPmanager、VestaCP 控制面板进行的配置(最常见的是,多年未更新)。 他们的转会请求也必须考虑在内。

迁移是在保留所转移容器的 IP 地址的同时进行的;我们假设容器拥有的 IP 保存在虚拟机上并且可以正常工作。

在转移之前,我们先确保手头上有所有东西:

  • OpenVZ 服务器,对主机的完全 root 访问权限,能够停止/安装/启动/删除容器
  • KVM 服务器、对主机的完全 root 访问权限以及它所暗示的一切。 假设一切都已配置并准备就绪。

让我们开始传输

在开始转移之前,让我们定义一些术语,以帮助您避免混淆:

KVM_节点 - KVM主机
VZ_NODE - OpenVZ主机
CTID - OpenVZ容器
VM - KVM虚拟服务器

准备迁移和创建虚拟机。

步骤1

由于我们需要将容器移动到某个地方,因此我们将创建 VM 具有类似的配置 KVM_节点.
重要的信息! 您需要在当前在 CTID 上运行的操作系统上创建 VM。 例如,如果CTID上安装了Ubuntu 14,则VM上必须安装Ubuntu 14。次要版本并不重要,它们的差异也不是那么严重,但主要版本应该相同。

创建 VM 后,我们将更新 CTID 和 VM 上的软件包(不要与更新操作系统混淆 - 我们不更新它,我们只更新软件包,如果它到达,则更新主操作系统中的操作系统版本)版本)。

对于 CentOS,这个过程看起来无害:

# yum clean all
# yum update -y

对于 Ubuntu 和 Debian 来说同样无害:

# apt-get update
# apt-get upgrade

步骤2

安装在 CTID, VZ_NODE и VM 效用 rsync的:

CentOS的:

# yum install rsync -y

Debian,Ubuntu:

# apt-get install rsync -y

我们不会在那里或那里安装任何其他东西。

步骤3

我们停下来 CTID VZ_NODE 团队

vzctl stop CTID

安装图像 CTID:

vzctl mount CTID

转到 /vz/root/ 文件夹CTID 并执行

mount --bind /dev dev && mount --bind /sys sys && mount --bind /proc proc && chroot .

在根目录下创建一个文件 /root/exclude.txt - 它将包含不会到达新服务器的异常列表

/boot
/proc
/sys
/tmp
/dev
/var/lock
/etc/fstab
/etc/mtab
/etc/resolv.conf
/etc/conf.d/net
/etc/network/interfaces
/etc/networks
/etc/sysconfig/network*
/etc/sysconfig/hwconf
/etc/sysconfig/ip6tables-config
/etc/sysconfig/kernel
/etc/hostname
/etc/HOSTNAME
/etc/hosts
/etc/modprobe*
/etc/modules
/net
/lib/modules
/etc/rc.conf
/usr/share/nova-agent*
/usr/sbin/nova-agent*
/etc/init.d/nova-agent*
/etc/ips
/etc/ipaddrpool
/etc/ips.dnsmaster
/etc/resolv.conf
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-ens3

我们连接到 KVM_节点 并启动我们的 VM以便它可以工作并且可以通过网络访问。

现在一切准备就绪,可以进行转移了。 去!

步骤4

仍然在咒语下,我们表演

rsync --exclude-from="/root/exclude.txt" --numeric-ids -avpogtStlHz --progress -e "ssh -T -o Compression=no -x" / root@KVM_NODE:/

rsync 命令将执行传输,我们希望密钥是明确的 - 传输是在保留符号链接、访问权限、所有者和组的情况下进行的,并且禁用加密以提高速度(您可以使用一些更快的密码,但是这对于此任务来说并不那么重要),并且压缩被禁用。

完成rsync后,退出chroot(按ctrl+d)并执行

umount dev && umount proc && umount sys && cd .. && vzctl umount CTID

步骤5

让我们执行几个步骤,帮助我们在从 OpenVZ 传输后启动 VM。
在服务器上 Systemd 让我们执行一个命令来帮助我们登录到常规控制台,例如通过 VNC 服务器屏幕

mv /etc/systemd/system/getty.target.wants/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

在服务器上 CentOS 6的 и CentOS 7的 确保安装新的内核:

yum install kernel-$(uname -r)

可以从中加载服务器,但传输后它可能会停止工作或被删除。

在服务器上 CentOS 7的 你需要对 PolkitD 应用一个小修复,否则服务器将永远崩溃:

getent group polkitd >/dev/null && echo -e "e[1;32mpolkitd group already existse[0m" || { groupadd -r polkitd && echo -e "e[1;33mAdded missing polkitd groupe[0m" || echo -e "e[1;31mAdding polkitd group FAILEDe[0m"; }

getent passwd polkitd >/dev/null 
&& echo -e "e[1;32mpolkitd user already existse[0m" || { useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd && echo -e "e[1;33mAdded missing polkitd usere[0m" || echo -e "e[1;31mAdding polkitd user FAILEDe[0m"; }

rpm -Va polkit* && echo -e "e[1;32mpolkit* rpm verification passede[0m" || { echo -e "e[1;33mResetting polkit* rpm user/group ownership & permse[0m"; rpm --setugids polkit polkit-pkla-compat; rpm --setperms polkit polkit-pkla-compat; }

在所有服务器上,如果安装了 Apache 的 mod_fcgid,我们将执行一个带有权限的小修复,否则使用 mod_fcgid 的站点将崩溃并出现错误 500:

chmod +s `which suexec` && apachectl restart

最后一件事对于 Ubuntu 和 Debian 发行版很有用。 该操作系统可能会因错误而陷入永久启动

循环太快。 稍微限制执行

令人不快,但很容易修复,具体取决于操作系统版本。

Debian 9的 修复如下所示:

我们进行

dbus-uuidgen

如果我们收到错误

/usr/local/lib/libdbus-1.so.3:找不到版本“LIBDBUS_PRIVATE_1.10.8”

检查 LIBDBUS 是否存在

ls -la /lib/x86_64-linux-gnu | grep dbus
libdbus-1.so.3 -> libdbus-1.so.3.14.15 
libdbus-1.so.3.14.15 <-- нужен этот
libdbus-1.so.3.14.16

如果一切顺利,我们就这么做

cd /lib/x86_64-linux-gnu
rm -rf libdbus-1.so.3
ln -s libdbus-1.so.3.14.15  libdbus-1.so.3

如果没有帮助,请尝试第二个选项。

问题的第二种解决方案 稍微限制执行 适用于几乎所有 Ubuntu 和 Debian 发行版。

我们执行

bash -x /var/lib/dpkg/info/dbus.postinst configure

Ubuntu的14, Debian 7的 此外,我们执行:

adduser --system --home /nonexistent --no-create-home --disabled-password --group messagebus

rm -rf /etc/init.d/modules_dep.sh 

我们做了什么? 我们恢复了运行 Debian/Ubuntu 时缺失的 messagebus,并删除了来自 OpenVZ 并干扰许多内核模块加载的 module_dep。

步骤6

我们重新启动虚拟机,在 VNC 中检查加载进度,理想情况下,所有内容都会顺利加载。 尽管迁移后可能会出现一些特定问题,但它们超出了本文的范围,将在出现时予以纠正。

我希望这些信息有用! 🙂

来源: habr.com

添加评论