如何輕鬆地將 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 保存在 VM 上並且可以正常運作。

在轉移之前,我們先確保手邊有所有東西:

  • 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 中檢查載入進度,理想情況下,所有內容都會順利載入。 儘管遷移後可能會出現一些特定問題,但這些問題超出了本文的討論範圍,將在出現時予以修正。

我希望這些資訊有用! 🙂

來源: www.habr.com

添加評論