Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd
Вы можете перенести Linux-серверы в облачную платформу Selectel на базе OpenStack с помощью утилиты dd.
Утилита dd копирует диск целиком, блок за блоком. Новый сервер становится точной копией исходного: с той же ОС, настройками и данными. После переноса останется поправить только то, что зависит от оборудования и сети: идентификаторы разделов, сетевые настройки и IP-адреса в конфигурации сервисов.
Для Linux-серверов это основной способ переноса: самый точный результат и минимум ручных правок. Учтите, что на время копирования диски и сетевой канал будут полностью загружены.
Вы можете перенести полную копию диска двумя способами:
- с остановкой исходного сервера — оба сервера загружаются в Rescue, данные во время копирования не меняются, копия получается полностью согласованной. Работы можно провести ночью или в выходные;
- без остановки исходного сервера — исходный сервер продолжает работать, а базы данных и активно меняющиеся файлы переносятся отдельно после копирования диска.
Если на исходном сервере идет интенсивная запись на диск, мы рекомендуем перенести данные с помощью утилиты rsync. Подробнее в инструкции Перенести данные Linux-сервера на облачный сервер Selectel с помощью rsync.
1. Подготовить Linux-сервер
-
Оцените время копирования, для этого разделите объем диска сервера на скорость канала между серверами. Скорость канала можно измерить утилитой
iperf3. Например, диск 500 ГБ при 100 МБ/с копируется около полутора часов. -
Убедитесь, что диск нового сервера не меньше исходного.
-
Сделайте резервную копию важных данных и баз на исходном сервере.
-
За сутки до переключения снизьте TTL DNS-записей домена до 300 секунд.
-
Сохраните список запущенных сервисов и открытых портов, чтобы сравнить его с новым сервером:
systemctl list-units --type=service --state=running > <service_file_name>.txtss -tulpn > <ports_file_name>.txtУкажите:
<service_file_name>— имя файла для сохранения списка сервисов. Например,services-before;<ports_file_name>— имя файла для сохранения списка портов. Например,ports-before.
2. Перенести полную копию диска
С остановкой исходного сервера
Без остановки исходного сервера
-
Загрузите исходный и новый серверы в режим Rescue. В этом режиме диски не используются ОС и не меняются во время копирования.
-
Посмотрите имена дисков на обоих серверах:
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTВ ответе появится информация о дисках. Например:
NAME SIZE TYPE MOUNTPOINTsda 8G disk├─sda1 8G part /└─sda14 8M partsr0 488K romЗдесь
sda— имя диска. -
Запустите копирование с исходного сервера:
dd if=<source_disk> bs=32M status=progress | ssh root@<new_ip_address> "dd of=<target_disk> bs=32M"Укажите:
<source_disk>— имя диска на исходном сервере, которое вы посмотрели на шаге 2. Например,/dev/sda;<new_ip_address>— публичный IP-адрес нового сервера;<target_disk>— имя диска на новом сервере, которое вы посмотрели на шаге 2. Например,/dev/sdb.
Блок 32 МБ на практике дает оптимальную скорость. Если канал нужно оставить и для других задач, ограничьте скорость утилитой pv - например,
| pv -qL 90M |в середине конвейера ограничит передачу 90 МБ/с. -
Если копирование прервалось, возобновить прерванное копирование:
4.1. Найдите в выводе утилиты dd после прерывания строку
records out— это число полностью переданных блоков размеромbs. Например:^C244234+0 records in244233+0 records out8195099590656 bytes (8.2 TB, 7.5 TiB) copied, 271390 s, 30.2 MB/sЗдесь
244233— число полностью переданных блоков размеромbs.Если диск копировался в файл образа, а вывод утилиты
ddне сохранился, разделите размер файла в байтах на размер блока (32 МБ = 33 554 432 байта) и возьмите целую часть.4.2. Продолжите передачу данных:
dd bs=32M skip=<records_out> if=<source_disk> status=progress | ssh root@<new_ip_address> "dd bs=32M seek=<records_out> of=<target_disk>"Укажите:
<records_out>— число полностью переданных блоков, которое вы получили на шаге 1;<source_disk>— имя диска на исходном сервере;<new_ip_address>— публичный IP-адрес нового сервера;<target_disk>— имя диска на новом сервере.
-
Если ОС на новом сервере не загружается, скорее всего изменились UUID или имена разделов. В режиме Rescue:
5.1. Проверьте разделы и
fstab:blkidmount <mount_point_name> /mntcat /mnt/etc/fstabУкажите
<mount_point_name>— имя корневого раздела. Например,/dev/sda1.5.2. Исправьте UUID или имена разделов в файле
/mnt/etc/fstab. 5.3. Опционально: переустановите загрузчик:for d in dev proc sys; do mount --bind /$d /mnt/$d; donechroot /mntgrub-install <target_disk>update-grub # в RHEL-подобных: grub2-mkconfig -o /boot/grub2/grub.cfgexitУкажите
<target_disk>— имя диска на новом сервере. Например,/dev/sda. -
Обновите сетевые настройки под новый сервер: IP-адрес, маску, шлюз.
-
Найдите сервисы, которые слушают старый публичный адрес, и замените его на новый:
grep -rl "<old_ip_address>" /etcУкажите
<old_ip_address>— публичный IP-адрес исходного сервера. -
Загрузите новый сервер в обычном режиме.
-
Сравните список запущенных сервисов и открытых портов на новом сервере со списком, который вы сохранили на этапе 1.
-
Опционально: настройте репликацию баз с исходного сервера, чтобы на время тестирования данные оставались актуальными.
3. Завершить миграцию
-
Проверьте сервисы на новом сервере до переключения DNS. Для этого добавьте на своем компьютере в файл hosts запись с новым IP, чтобы вы могли проверить новый сервер, а пользователи продолжать работать со старым:
<new_ip_address> <domain> <subdomain>Укажите:
<new_ip_address>— публичный IP-адрес нового сервера;<domain>— имя вашего домена. Например,example.com;<subdomain>— имя вашего поддомена. Например,www.example.com.
В Linux и macOS это
/etc/hosts, в Windows -C:\Windows\System32\drivers\etc\hosts. Если сервисы обращаются к своему домену, добавьте такую же запись в/etc/hostsна новом сервере. -
Исправьте найденные ошибки и проверьте снова.
-
Протестируйте сервисы в течение 3 рабочих дней и устраните замечания.
-
Выберите дату и время финальной синхронизации данных и баз. Мы рекомендуем финально синхронизировать данные и базы в часы минимальной нагрузки.
-
Выполните финальную синхронизацию и переключите DNS-записи на новый IP.
-
Последите за работой сервиса еще 3 рабочих дня. Если все работает штатно, перенос завершен, исходный сервер можно отключать.