
У меня следующая проблема: у нас есть выделенный (голый) аппаратный сервер (Debian 10), к которому у нас нет прямого физического доступа. Теперь я хочу перенести все данные и приложения, которые находятся на этом сервере, на виртуальную машину и запустить ее на хосте KVM.
Почему я не устанавливаю приложение прямо в VM? Установка этого приложения (Perl-вещи с веб-сервером Apache, работающим на одном сервере около 10 лет) настолько сложна, что вы бы предпочли что-нибудь сломать. Поэтому никто не осмеливается это сделать. Но теперь нам нужно переехать, и по этой причине нам нужен какой-то умный обходной путь.
Я думал отключить все службы Perl и Apache и перенести жесткий диск по dd
сети, но проблема в том, что на целевом хосте KVM меньше места, чем sda
на физическом сервере (в итоге он использует меньше места, чем доступно, sda
просто слишком большой).
Второй вариант — установить те же пакеты на KVM с точно такими же номерами версий (согласно dpkg --list
), отключить все службы на сервере bare metal (чтобы данные были согласованы) и поместить /etc
, /var/
, /usr
и все остальное, что важно с сервера bare metal, в tarball и просто распаковать его на KVM. Конечно, я мог бы сделать это и через rsync, но принцип более или менее тот же.
Что вы думаете о последней идее?
У тебя есть другие идеи?
Как бы вы выполнили такую задачу?
решение1
Какбеспокойствопопросили меня сделать это, я сам отвечу на свой вопрос :) Мое решение было не таким уж и сложнымбеспокойство's, но я все равно хотел бы поделиться этим с вами.
На самом деле я сначала проверил размеры инодов и блоков в обеих файловых системах, чтобы убедиться, что они идентичны друг другу (используя tune2fs
).
Затем я отключил все службы, кроме экзистенциальных, таких как SSHd.
После этого я решил использовать apt-clone
, а не копировать пакеты и двоичные файлы с одной машины на другую:
# on the physical machine:
apt-get install apt-clone
apt-clone clone packages
# on the virtual machine:
apt-get install apt-clone
apt-clone clone packages.apt-clone.tar.gz
# check on the VM:
vimdiff <(dpkg --list) physical_mchine_packages.txt
Далее я синхронизировал данные с помощью rsync
. Каталоги, которые я синхронизировал:
/root
/etc
(Я исключил такие файлы, какhostname
,fstab
,/default/grub
,/network/interfaces
и множество других каталогов, связанных с kernel/initram/lvm)/usr
(не все, зависит от используемого вами программного обеспечения)/var
(не все, зависит от используемого вами программного обеспечения)
Последним шагом была проверка того, указано ли имя хоста или IP-адрес старой физической машины в некоторых файлах конфигурации:
find . ! \( -path "*proc*" -o -path "*sys*" -o -path "*var/mail*" -o -path "*var/spool/mqueue*" -o -path "*var/log*" \) -type f -exec grep -iH -- "x.x.x.x" {} \;
Вот и все. Теперь все работает в VM. Надеюсь, я смог кому-нибудь помочь :)
решение2
(В этом ответе обсуждаетсяуровень блочного устройстваальтернатива, это наиболее подходящий вариант, если вы хотите сохранить нетронутыми конфигурацию разделов и менеджера загрузки при миграции на виртуальную машину)
Проблема, которую вы описываете, не обязательно возникает на практике. Яслучайнонедавно избегал этого:
но проблема в том, что целевой хост KVM имеет меньше места, чем sda с сервера bare metal
Вполне допустимо создавать, монтировать и редактировать разделы вредкийфайл, который (даже существенно) больше, чем файловая система хоста, — до тех пор, пока вы не сделаете ничего, что фактически запишет данные в пропущенные области файла.
То, что я сделал, было примерно fstrim / && systemctl stop appserver && mount -o remount,ro / && sync && dd bs=64k if=/dev/nvme0n1 | ssh vmhost dd bs=64k conv=sparse of=..
. Затем на хосте vm с помощью losetup
я сделал изображение доступным для fdisk
и resize2fs
для изменения его (виртуального) размера. Поскольку изображение уже содержало только нули в большей части своего конца, мои операции над ним не сильно увеличили его фактический размер.
В худшем случае потребность в пространстве для этого самого простого подхода будет в 3 раза больше содержимого данных старого сервера. Один раз для копирования разреженного образа, один раз для изменения размера (т. е. для перемещения всего его содержимого в начало без проделывания новых дыр в конце), а затем еще раз для преобразования необработанного образа диска в формат (или для перемещения тогдашнего образа на основе файла в его собственный логический том), используемый управлением виртуальной машины.
Некоторые моменты, на которые следует обратить внимание:
- Способ выполнения этой операции должен зависеть от программного обеспечения/настроек планируемой виртуализации (например, если ваша текущая система загружается через EFI, но ваша виртуализация не поддерживает это, какой смысл делатькопия дискакогда вам вообще придется переделывать вещи, связанные с загрузчиком?)
- fstrim (особенно в сочетании с плохими SSD или RAID) может быть опасным с точки зрения потери данных. Если вы не уверены, что это безопасная операция для вашей конфигурации, выполнитезапись огромного файла, содержащего только нулевые байтыальтернатива - нас интересует только возможность обнаружения неиспользуемых областей (обнуление), а не то, знает ли об этом диск.
- Простое указание root readly выполняет работу, но дает результаткак будто сервер вышел из строя до перезапуска на виртуальной машине. Если вы копируете изображение после остановки приложений, это может бытьдостаточно хорошо: в конце концов вы ожидаете, что ваш сервер сможет продолжить работу после сбоя.