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

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

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

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

Перенести данные можно двумя способами:

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

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

Чтобы перенести данные:

  1. Создайте облачный сервер.
  2. Подготовьте Linux-сервер.
  3. Перенесите данные с помощью утилиты dd.
  4. Проверьте и переключите сервисы.

1. Создать облачный сервер

Используйте инструкцию Создать облачный сервер. Размер диска нового сервера должен быть не меньше исходного.

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

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

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

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

    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.
  4. За сутки до переключения снизьте TTL DNS-записей домена до 300 секунд.

3. Перенести данные с помощью утилиты dd

  1. Загрузите исходный и новый серверы в режим Rescue.

  2. Подключитесь к исходному и новому серверам в режиме Rescue.

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

    lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

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

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

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

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

    dd if=<source_disk> bs=32M status=progress | ssh root@<new_ip_address> "dd of=<target_disk> bs=32M"

    Укажите:

    • <source_disk> — имя диска на исходном сервере, которое вы посмотрели на шаге 3. Например, /dev/sda;
    • <new_ip_address> — публичный IP-адрес нового сервера;
    • <target_disk> — имя диска на новом сервере, которое вы посмотрели на шаге 3. Например, /dev/sdb.

    Если весь канал не должен быть занят под копирование, ограничьте скорость утилитой pv. Например:

    dd if=/dev/sda bs=32M status=progress | pv -qL 90M | ssh root@203.0.113.16 "dd of=/dev/sdb bs=32M"

    Здеcь 90M — ограничение скорости передачи данных до 90 МБ/с.

  5. Если копирование прервалось, возобновите передачу данных:

    5.1. Посмотрите числа полностью переданных блоков размером bs в выводе утилиты dd после прерывания копирования. Например:

    ^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 байта) и возьмите целую часть.

    5.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> — число полностью переданных блоков, которое вы получили на шаге 5.1;
    • <source_disk> — имя диска на исходном сервере;
    • <new_ip_address> — публичный IP-адрес нового сервера;
    • <target_disk> — имя диска на новом сервере.
  6. Выйдите из режима Rescue на новом сервере.

  7. Если ОС на новом сервере не загружается, проверьте UUID и имена разделов:

    7.1. Загрузите новый сервер в режим Rescue.

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

    blkid
    mount <root_partition> /mnt
    cat /mnt/etc/fstab

    Укажите <root_partition> — имя корневого раздела. Например, /dev/sda1.

    7.3. Исправьте UUID или имена разделов в файле /mnt/etc/fstab. 7.4. Опционально: чтобы восстановить загрузчик, переустановите его:

    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.

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

  9. Найдите файлы конфигураций, в которых указан публичный IP-адрес исходного сервера:

    grep -rl "<old_ip_address>" /etc

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

  10. В найденных файлах замените публичный IP-адрес исходного сервера на новый.

  11. Выйдите из режима Rescue на новом сервере.

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

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

4. Проверить и переключить сервисы

к сведению

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

  1. Проверьте работу сервисов на новом сервере до переключения DNS. Для этого добавьте на локальном компьютере в файл hosts запись с новым IP. Это позволит вам подключаться к сервисам на новом сервере, запросы пользователей продолжат направляться на исходный сервер:

    <new_ip_address> <domain> <subdomain>

    Укажите:

    • <new_ip_address> — публичный IP-адрес нового сервера;
    • <domain> — имя вашего домена. Например, example.com;
    • <subdomain> — имя вашего поддомена. Например, www.example.com.

    В Linux и macOS файл hosts находится по пути /etc/hosts, в Windows — по пути C:\Windows\System32\drivers\etc\hosts.

  2. Если сервисы обращаются к своему домену, добавьте такую же запись в файл hosts на новом сервере.

  3. Если вы нашли ошибки в работе сервисов, исправьте их и повторите шаг 1.

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

  5. Выполните финальную синхронизацию данных и баз.

  6. Переключите DNS-записи на новый IP.

  7. Проверьте работу сервисов еще 3 рабочих дня.

  8. Если все работает корректно, исходный сервер можно отключать.