Как перенести Ubuntu с VPS на Hyper-V (или другую платформу виртуализации)

уставший разработчик оттягивается за монитором, монитор, часы, чел, американецПоявилась у меня потребность чуточку «поиграться» с настройками сервера, который крутится у провайдера на VPS сервере. Изменять параметры на «боевом» сервере можно, если они не глобальные и отменить их можно очень быстро. Но вот если требуется произвести более значимые изменения, то лучше попробовать их сначала в тестовом окружении, проверить, все ли будет работать, разработать план отката изменений, если вдруг что-то пойдет не так. И только потом прибегать к изменениям на «боевом» сервере.

Самым четким способом, на мой взгляд, по организации тестового сервера, есть снятие полной копии боевого сервера и разворачивание этой копии на тестовой архитектуре. Так как мой боевой сервер крутится на VPS, то имеет смысл снять его полную копию и развернуть ее уже на тестовой системе виртуализации. К сожалению, из интерфейса панели управления VPS моего провайдера снять образ системы нельзя. Сам сервер VPS крутится на Ubuntu под системой виртуализации XEN, а в тестовой среде гипервизором у меня будет выступать уже Microsoft Hyper-V. Осталось только понять как снять образ диска и подключить его к новой виртуальной машине.

Создаем образ диска на VPS

В операционных системах семейства Unix издревле (с 1974 года, автору программы уже под 80) существует специализированная программа dd (data definition). Программа dd имеет множество функций, одна из которых — возможность копирования полностью всего блочного устройства (диска) в файл. Таким образом, при помощи dd можно создать образ диска системы, который крутится на моем VPS. Причем не просто образ диска, а образ диска самой операционной системы изнутри (dd будет запущен в работающей системе и сделать копию диска, с которого запущена система). Формат такого образа будет raw, т.е. сырой набор байт, полностью соответствующий диску-источнику.

Как правило, для создания образа диска рекомендуется поступать иначе — загрузиться с Live CD и уже оттуда сформировать образ диска. Иначе, некоторые файлы могут быть повреждены, так как за время создания образа файлы на диске изменяются (работает операционная система и прикладное программное обеспечение в ней) и есть риск, что в образе будут находиться данные, измененные в разные периоды времени. Примером таких коллизий могут быть файлы протоколов (логов), с этим можно смириться, а вот базы данных могут быть повреждены существенно. Но, поскольку задача состоит в том, чтобы поднять тестовую среду, то с потерей некоторой целостности базы данных можно смириться, тем более что базы данных, обычно, делают весьма устойчивыми к повреждениям и их можно попытаться восстановить. А если и не получится, то можно снять еще одну копию системы или же восстановить базу данных из резервной копии отдельно на тестовом сервере.

А вот куда складывать образ диска, который будет формироваться программой dd? Записывать его на тот же диск, копия которого создается программой, конечно «можно», но есть вариант получше. Многие знают, что при помощи ssh можно создавать туннели и передавать по ним данных. Аналогично можно поступить и с создаваемым образом диска. Его можно через ssh записывать сразу на другой сервер. В качестве получателя будет выступать мой домашний сервер, работающий аналогично под Ubuntu. Но в качестве получателя может выступать и машина под Windows, если задействовать на ней подсистему Unix (WSL).

dd if=/dev/xvda bs=10M status=progress | gzip -c | ssh vlad@192.168.1.11 "dd of=/home/vlad/vps_131222.img.gz"

Выше приведена команда, которая создает образ диска в сжатом виде и записывает его сразу на мой сервер в мою домашнюю папку. Разберем немного подробнее всю команду. Она состоит из трех частей.

Часть dd if=/dev/xvda bs=10M status=progress отвечает за «съем» данных с диска VPS боевого сервера. Параметр if определяет входящий интерфейс, в качестве которого выступает физическое устройство xvda. Пользователи физических серверов привыкли, что физические диски называются примерно так sda, sdb, sdc и т.п., но у меня сервер VPS, поэтому «физический» диск там xvda. Более того, он разбит на два раздела, на одном располагается загрузочный раздел (xvda1), а на втором LVM группа (xvda2). LVM без ущерба скопируется вместе с разделом, за него переживать не стоит. Параметр bs=10M означает размер блока, которым происходит считывание данных с устройства. В указанном случае это 10 мегабайт. Чем больше блок, тем быстрее будет происходить операция, но тем больше нужно памяти на его обработку. Параметр подбирается эмпирическим путем в зависимости от характеристик VPS. Следующий параметр status=progress позволяет отображать статус выполнения операции. В старых версиях dd такого параметра не было и пользователю приходилось просто смотреть в экран и ждать, гадая, идет там процесс или не особо. Заменить параметр status=progress можно на команду pv, тогда запуск dd может выглядеть примерно так dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096.

Но вернемся к нашей строке. Поскольку большая часть данных на диске составляет различного рода текстовые файлы, прочие хорошо сжимаемые файлы и пустое место, то для ускорения операции снятия образа и передачи его на другой сервер, выдачу имеет смысл заархивировать. Для этого используется перенаправления вывода | на архиватор gzip. Архиватор gzip умеет работать с потоковыми данными, что нам и требуется. Параметр -c означает, что сжатые данные далее будут передаваться в стандартный вывод, который опять же перенаправляется далее, уже на программу ssh, которая инициирует подключение к серверу 192.168.1.11 с применением пользователя vlad. И одновременно на той стороне все принимаемые данные передаются программе dd, но здесь уже используется параметр of, означающий куда записывать получаемые данные. При первом подключении по ssh, программа попросит подтвердить прием ключей шифрования от удаленного сервера, а затем попросит ввести пароль пользователя, под которым происходит подключение. Подключаться можно и без ввода пароля, если настроить аутентификацию на основе сертификатов.

Скорость передачи и время отработки зависит напрямую от размера копируемого диска и пропускной способности сети между серверами. Применение сжатия, обычно позволяет сократить объем образа раза в четыре, что благотворно сказывается и на времени передачи образа между серверами.

Далее, когда образ диска VPS уже снят, необходимо его подключить к тестовой виртуальной машине. Но сперва заархивированный образ необходимо разархивировать (применяем команду gunzip). Некоторые исследователи дополнительно убирают из образа всё пустое пространство (там, где нет никаких файлов и прочего), но я подобное не делаю, мне необходимо воссоздать как можно более точную копию моего VPS.

Подключить образ диска, созданный программой dd напрямую к Hyper-V нельзя. Так как Hyper-V работает с образами дисков в формате VHD (и VHDX для дисков объемом свыше 2000 Гб), а у нас формат RAW. VHD немного отличается от образа полученного через dd. Как минимум там есть служебная информация, а не просто набор данных с начала диска и до его конца. Поэтому образ от dd необходимо сконвертировать в то, что понимает Hyper-V. Я провожу эту операцию при помощи скрипта dd2vhd. Скрипт работает на Python3, соответственно может запускаться везде, где установлен этот интерпретатор.

dd2vhd vps_131222.img

И в результате получаем файл в формате VHD, который уже можно «скармливать» Hyper-V. Не лишним будет заметить, что dd2vhd может провести и обратную операцию — превратить VHD диск обратно в образ dd (по сути, в raw-образ диска).

Создаем виртуальную машину в Hyper-V и подключаем образ VHD

После получения VHD Образа диска VPS можно приступить к созданию виртуальной машины под управлением Hyper-V. Машина создается совершенно обычным образом, но в качестве поколения я выбираю Generation 1. Количество процессоров и объем ОЗУ устанавливаются равными таковым на VPS. Подключается полученный VHD. Память и объем диска оставляем фиксированными, а не динамическими.

hyper-v, vps, generation 1

Пример настройки типа поколения виртуальной машины Hyper-V

По началу я не подключаю сеть к виртуальной машине. Захожу через консоль и выключаю/удаляю все сенситивные программы, которые взаимодействуют с внешними сайтами. Настраиваю сеть под новую локацию и только после этого подключаю виртуальную машину к сети. Результат получается вполне работоспособным и достаточный для тестирования системы и отработки изменений.

Прочие возможности конвертации RAW-образа в VHD

Помимо варианта конвертации образа в VHD через скрипт dd2vhd можно воспользоваться и другими способами. Например, через конвертацию средствами утилиты VBoxManage из системы виртуализации VirtualBox. Команда выглядит следующим образом VBoxManage convertfromraw myfile.dd myfile.vhd --format VHD. В сети присутствует достаточно подробная инструкция.

Произвести конвертацию можно и с помощью утилиты qemu-img из комплекта виртуализации QEMU. Команда в этом случае выглядит примерно так qemu-img.exe convert source.img -O vpc -o subformat=dynamic dest.vhd. В сети присутствует достаточно подробная инструкция по выполнению данной операции конвертации.

Проблематика съема образа на «живой» системе

Выше я упомянул, что идеально было бы выключить VPS и загрузиться в нем с Live CD, и оттуда снять образ системы. В таком случае данные (в логах и базах) не будут рассинхронизированны. Но, если остановить сервер нет возможности, на выручку может прийти механизм снятия снимка системы (snapshot). К сожалению, dd не умеет работать со снимками, поэтому с его помощью нельзя снять полностью достоверный и непротиворечивый образ диска с работающей системой. Однако, если применяется LVM или используется файловая система с поддержкой снимков (BTRFS, ZFS), то можно сделать снимок диска их средствами. Но. В этом случае не получится снять снимок всего диска, так как, например, загрузочный раздел обычно использует простую файловую систему и не входит в тома LVM. Обычно это не проблема, если поддерживать одинаковыми «загрузочные» файлы в boot на боевом и тестовом серверах, а обмениваться образами (снимками) всех остальных дисков.

У Microsoft тоже есть встроенный в систему механизм создания снимков и есть способ создания образов дисков из работающей системы без рассинхронизации и повреждения данных в образах. Например, подобную процедуру можно проделать через программу disk2vhd. На выходе получается образ диска совместимый с Hyper-V и прочими гипервизорами.



Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии