---
title: 'Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd'
sidebar_label: 'Перенести данные Linux-сервера на облачный сервер Selectel с помощью dd'
sidebar_position: 11
description: 'Как перенести данные Linux-сервера на облачный сервер Selectel с помощью утилиты dd'
---

import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'
import Formbricks from '@theme/MDXComponents/Formbricks'

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

Вы можете перенести Linux-серверы в [облачную платформу](/cloud-servers/) Selectel на базе OpenStack с помощью утилиты `dd`.

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

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

Вы можете [перенести полную копию диска](#full-disk-copy) двумя способами:

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

Если на исходном сервере идет интенсивная запись на диск, мы рекомендуем перенести данные с помощью утилиты `rsync`. Подробнее в инструкции [Перенести данные Linux-сервера на облачный сервер Selectel с помощью rsync](/migrations/migrate-linux-servers-with-rsync.mdx).

## 1. Подготовить Linux-сервер \{#prepare-linux-server}

1. Оцените время копирования, для этого разделите объем диска сервера на скорость канала между серверами. Скорость канала можно измерить утилитой `iperf3`. Например, диск 500 ГБ при 100 МБ/с копируется около полутора часов.
2. Убедитесь, что диск нового сервера не меньше исходного.
3. Сделайте резервную копию важных данных и баз на исходном сервере.
4. За сутки до переключения снизьте TTL DNS-записей домена до 300 секунд.
5. Сохраните список запущенных сервисов и открытых портов, чтобы сравнить его с новым сервером:

   ```bash
   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. Перенести полную копию диска \{#full-disk-copy}

<Tabs queryString="copy">
  <TabItem value="with-downtime" default>
    <TabItemLabel>
      С остановкой исходного сервера
    </TabItemLabel>

    1. Загрузите исходный и новый серверы в режим [Rescue](/cloud-servers/troubleshooting/boot-to-rescue.mdx). В этом режиме диски не используются ОС и не меняются во время копирования.

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

       ```bash
       lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
       ```

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

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

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

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

       ```bash
       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`. Например:

       ```bash
       ^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. Продолжите передачу данных:

       ```bash
       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`:

       ```bash
       blkid
       mount <mount_point_name> /mnt
       cat /mnt/etc/fstab
       ```

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

       5.2. Исправьте UUID или имена разделов в файле `/mnt/etc/fstab`.
       5.3. Опционально: переустановите загрузчик:

       ```bash
       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. [Обновите сетевые настройки](/cloud-servers/cloud-networks/update-network-settings.mdx) под новый сервер: IP-адрес, маску, шлюз.

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

       ```bash
       grep -rl "<old_ip_address>" /etc
       ```

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

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

    9. Сравните список запущенных сервисов и открытых портов на новом сервере со списком, который вы [сохранили на этапе 1](#prepare-linux-server).

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

  <TabItem value="without-downtime">
    <TabItemLabel>
      Без остановки исходного сервера
    </TabItemLabel>

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

    1. Загрузите новый сервер в режим [Rescue](/cloud-servers/troubleshooting/boot-to-rescue.mdx).

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

       ```bash
       lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
       ```

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

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

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

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

       ```bash
       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/sda`.

    4. Если копирование прервалось, возобновить прерванное копирование:

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

       ```bash
       ^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. Продолжите передачу данных:

       ```bash
       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>` — число полностью переданных блоков, которое вы получили на шаге 4.1.;
       * `<source_disk>` — имя диска на исходном сервере;
       * `<new_ip_address>` — публичный IP-адрес нового сервера;
       * `<target_disk>` — имя диска на новом сервере.

    5. Попробуйте загрузить новый сервер в обычном режиме. Если во время копирования на диск активно писались данные, ОС может не загрузиться или загрузиться с ошибками — повторите копирование, как правило, вторая попытка проходит нормально.

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

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

       ```bash
       blkid
       mount <mount_point_name> /mnt
       cat /mnt/etc/fstab
       ```

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

       6.2. Исправьте UUID или имена разделов в файле `/mnt/etc/fstab`.
       6.3. Опционально: переустановите загрузчик:

       ```bash
       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`.

    7. [Обновите сетевые настройки](/cloud-servers/cloud-networks/update-network-settings.mdx) под новый сервер: IP-адрес, маску, шлюз.

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

    9. Сравните список запущенных сервисов и открытых портов на новом сервере со списком, который вы [сохранили на этапе 1](#prepare-linux-server).

    10. Удалите на новом сервере все базы и залейте их из свежего дампа исходного сервера:

        * `pg_dump` и `pg_restore` для PostgreSQL;
        * `mysqldump` для MySQL.

        При побайтовом копировании работающей СУБД файлы баз почти наверняка окажутся повреждены.

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

    12. Досинхронизируйте данные приложения, которые могли измениться за время копирования, через утилиту `rsync`, например, файлы сайтов, загрузки пользователей, домашние каталоги. Пример для каталога сайта:

        ```bash
        rsync -aAXH --numeric-ids --progress root@<old_ip_address>:/var/www/ /var/www/
        ```

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

## 3. Завершить миграцию \{#complete-migration}

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

   ```bash
   <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 рабочих дня. Если все работает штатно, перенос завершен, исходный сервер можно отключать.

<Formbricks />
