Перейти к основному содержимому

Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd

Вы можете перенести Linux-серверы в облачную платформу Selectel на базе OpenStack с помощью утилиты dd.

Утилита dd копирует диск целиком, блок за блоком. Новый сервер становится точной копией исходного: с той же ОС, настройками и данными. После переноса останется поправить только то, что зависит от оборудования и сети: идентификаторы разделов, сетевые настройки и IP-адреса в конфигурации сервисов.

Для Linux-серверов это основной способ переноса: самый точный результат и минимум ручных правок. Учтите, что на время копирования диски и сетевой канал будут полностью загружены.

Вы можете перенести полную копию диска двумя способами:

  • с остановкой исходного сервера — оба сервера загружаются в Rescue, данные во время копирования не меняются, копия получается полностью согласованной. Работы можно провести ночью или в выходные;
  • без остановки исходного сервера — исходный сервер продолжает работать, а базы данных и активно меняющиеся файлы переносятся отдельно после копирования диска.

Если на исходном сервере идет интенсивная запись на диск, мы рекомендуем перенести данные с помощью утилиты rsync. Подробнее в инструкции Перенести данные Linux-сервера на облачный сервер Selectel с помощью rsync.

1. Подготовить Linux-сервер

  1. Оцените время копирования, для этого разделите объем диска сервера на скорость канала между серверами. Скорость канала можно измерить утилитой iperf3. Например, диск 500 ГБ при 100 МБ/с копируется около полутора часов.

  2. Убедитесь, что диск нового сервера не меньше исходного.

  3. Сделайте резервную копию важных данных и баз на исходном сервере.

  4. За сутки до переключения снизьте TTL DNS-записей домена до 300 секунд.

  5. Сохраните список запущенных сервисов и открытых портов, чтобы сравнить его с новым сервером:

    systemctl list-units --type=service --state=running > <service_file_name>.txt
    ss -tulpn > <ports_file_name>.txt

    Укажите:

    • <service_file_name> — имя файла для сохранения списка сервисов. Например, services-before;
    • <ports_file_name> — имя файла для сохранения списка портов. Например, ports-before.

2. Перенести полную копию диска

  1. Загрузите исходный и новый серверы в режим Rescue. В этом режиме диски не используются ОС и не меняются во время копирования.

  2. Посмотрите имена дисков на обоих серверах:

    lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

    В ответе появится информация о дисках. Например:

    NAME SIZE TYPE MOUNTPOINT
    sda 8G disk
    ├─sda1 8G part /
    └─sda14 8M part
    sr0 488K rom

    Здесь sda — имя диска.

  3. Запустите копирование с исходного сервера:

    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. Если копирование прервалось, возобновить прерванное копирование:

    4.1. Найдите в выводе утилиты dd после прерывания строку records out — это число полностью переданных блоков размером bs. Например:

    ^C244234+0 records in
    244233+0 records out
    8195099590656 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> — имя диска на новом сервере.
  5. Если ОС на новом сервере не загружается, скорее всего изменились UUID или имена разделов. В режиме Rescue:

    5.1. Проверьте разделы и fstab:

    blkid
    mount <mount_point_name> /mnt
    cat /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; done
    chroot /mnt
    grub-install <target_disk>
    update-grub # в RHEL-подобных: grub2-mkconfig -o /boot/grub2/grub.cfg
    exit

    Укажите <target_disk> — имя диска на новом сервере. Например, /dev/sda.

  6. Обновите сетевые настройки под новый сервер: IP-адрес, маску, шлюз.

  7. Найдите сервисы, которые слушают старый публичный адрес, и замените его на новый:

    grep -rl "<old_ip_address>" /etc

    Укажите <old_ip_address> — публичный IP-адрес исходного сервера.

  8. Загрузите новый сервер в обычном режиме.

  9. Сравните список запущенных сервисов и открытых портов на новом сервере со списком, который вы сохранили на этапе 1.

  10. Опционально: настройте репликацию баз с исходного сервера, чтобы на время тестирования данные оставались актуальными.

3. Завершить миграцию

  1. Проверьте сервисы на новом сервере до переключения 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 на новом сервере.

  2. Исправьте найденные ошибки и проверьте снова.

  3. Протестируйте сервисы в течение 3 рабочих дней и устраните замечания.

  4. Выберите дату и время финальной синхронизации данных и баз. Мы рекомендуем финально синхронизировать данные и базы в часы минимальной нагрузки.

  5. Выполните финальную синхронизацию и переключите DNS-записи на новый IP.

  6. Последите за работой сервиса еще 3 рабочих дня. Если все работает штатно, перенос завершен, исходный сервер можно отключать.