[Документация Yandex Cloud](../../../index.md) > [Yandex Compute Cloud](../../index.md) > [Пошаговые инструкции](../index.md) > Диски > Управление > Перенести образ диска в стороннее S3-хранилище

# Перенос образа диска Yandex Compute Cloud в S3-совместимое хранилище стороннего провайдера

Вы можете сохранить побайтовую копию [диска](../../concepts/disk.md) Compute Cloud в объектном хранилище другого провайдера. Такая копия позволяет хранить данные за пределами Yandex Cloud и использовать их для восстановления.

В этой инструкции вы создадите диск из [снимка](../../concepts/snapshot.md), подключите его к вспомогательной ВМ на Linux и выгрузите образ диска или раздела с помощью `s3fs`, `dd` и `gzip`. Результат — сжатый образ в файле `.img.gz`. Создание и запуск ВМ у другого провайдера потребуют отдельного восстановления.

{% note info %}

В примере используется приватный бакет [Selectel](https://selectel.ru/) в регионе `ru-7`. Для другого S3-совместимого хранилища замените параметры подключения и проверьте требования провайдера к доступу и размеру объектов.

{% endnote %}

Чтобы перенести образ диска в S3-совместимое хранилище стороннего провайдера:

1. [Подготовьте бакет и доступ к нему](#prepare-bucket).
1. [Подготовьте копию диска и вспомогательную ВМ](#prepare-disk).
1. [Установите утилиты и сохраните ключ](#install-tools).
1. [Подключите бакет](#mount-bucket).
1. [Выберите устройство и выгрузите образ](#upload-image).
1. [Проверьте образ в хранилище](#verify-image).
1. [Завершите перенос](#finish-transfer).
1. [Восстановите образ на отдельный диск](#restore-image).

Если созданные ресурсы вам больше не нужны, [удалите](#cleanup) их.

## Подготовьте бакет и доступ к нему {#prepare-bucket}

1. [Создайте](https://docs.selectel.ru/s3/buckets/create-bucket/) бакет в Selectel:

   * Укажите имя, например `disk-snapshot-dr-bucket`. Если имя занято, выберите другое и замените его в командах ниже.
   * Выберите приватный доступ.
   * Выберите тип адресации `Path-Style`, который используется в команде подключения бакета ниже.
   * Выберите холодный класс хранения.

     {% note warning %}

     Перед загрузкой ознакомьтесь с [условиями тарификации](https://docs.selectel.ru/s3/about/payment/#storage-types), включая чтение данных и минимальный срок хранения.

     {% endnote %}

1. На вкладке **Подключение** [создайте](https://docs.selectel.ru/access-control/manage/edit-user-data-or-role/#issue-s3-key) ключ S3 с именем `disk-snapshot-bucket-key`. В поле владельца ключа выберите **Мне** для разового переноса либо отдельного [сервисного пользователя Selectel](https://docs.selectel.ru/access-control/manage/add-user/#add-service-user) для постоянного использования.
1. Для сервисного пользователя предоставьте доступ к нужному проекту и бакету:
    * чтение и запись объектов;
    * просмотр содержимого бакета;
    * операции составной загрузки (_multipart upload_).

    Требования к ролям приведены в [инструкции по подключению s3fs](https://docs.selectel.ru/s3/tools/s3fs/).

1. Сохраните `Access key` и `Secret key` в защищенном месте. Они понадобятся на вспомогательной ВМ.

## Подготовьте копию диска и вспомогательную ВМ {#prepare-disk}

1. Если у вас еще нет снимка диска, образ которого вы хотите перенести к другому облачному провайдеру, [создайте](create-snapshot.md) его.
1. [Создайте](../vm-create/create-linux-vm.md) вспомогательную ВМ с Ubuntu или Debian либо используйте существующую. У ВМ должен быть HTTPS-доступ к эндпоинту Selectel.
1. [Создайте](../disk-create/from-snapshot.md) диск из снимка в той же [зоне доступности](../../../overview/concepts/geo-scope.md), что и вспомогательная ВМ.
1. [Подключите](../vm-control/vm-attach-disk.md#attach) созданный диск к вспомогательной ВМ как дополнительный.
1. [Подключитесь](../vm-connect/ssh.md) к вспомогательной ВМ по SSH.

{% note warning %}

`s3fs` использует временные файлы и локальный кеш. Запись через `gzip` не гарантирует отсутствие локальной буферизации. Проверьте свободное место в `/tmp` или в каталоге, заданном параметром `tmpdir` утилиты `s3fs`: планируйте запас вплоть до размера загружаемого сжатого образа.

{% endnote %}

## Установите утилиты и сохраните ключ {#install-tools}

Следующие команды до завершения выгрузки выполняйте на вспомогательной ВМ в одной сессии Bash от имени `root`.

1. Откройте сессию и установите утилиты:

   ```bash
   sudo -i
   apt-get update
   apt-get install -y s3fs gzip
   set -o pipefail
   umask 077
   ```

   `pipefail` позволит обнаружить ошибку `dd`, даже если следующая команда `gzip` завершится успешно.

1. Введите ключи доступа к внешнему бакету:

   ```bash
   read -r -p "Access key: " S3_ACCESS_KEY
   read -r -p "Secret key: " S3_SECRET_KEY
   printf "\n"
   printf "%s:%s\n" "$S3_ACCESS_KEY" "$S3_SECRET_KEY" \
     > "$HOME/.passwd-s3fs"
   unset S3_ACCESS_KEY S3_SECRET_KEY
   chmod 600 "$HOME/.passwd-s3fs"
   ```

   В этой сессии файл `~/.passwd-s3fs` находится по пути `/root/.passwd-s3fs`.

## Подключите бакет {#mount-bucket}

1. Создайте каталог монтирования:

   ```bash
   mkdir -p /dr-s3mount
   ```

1. Смонтируйте бакет:

   ```bash
   s3fs disk-snapshot-dr-bucket /dr-s3mount \
     -o passwd_file="$HOME/.passwd-s3fs" \
     -o endpoint=ru-7 -o url=https://s3.ru-7.storage.selcloud.ru \
     -o use_path_request_style -o max_dirty_data=512 -o ensure_diskfree=2048
   mountpoint /dr-s3mount
   ```

   Сверьте регион (`endpoint`) и [эндпоинт S3 API](https://docs.selectel.ru/s3/manage/domains/#s3-api-domains) (`url`) с параметрами на вкладке подключения вашего бакета. Для другого провайдера замените имя бакета, регион и эндпоинт. Описание остальных [параметров s3fs](https://github.com/s3fs-fuse/s3fs-fuse/blob/master/doc/man/s3fs.1.in) приведено в справочнике проекта.

Продолжайте только после успешной проверки `mountpoint`.

## Выберите устройство и выгрузите образ {#upload-image}

1. Посмотрите подключенные устройства:

   ```bash
   lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
   ```

   Сверьте размер и идентификатор с [информацией о диске](get-info.md). Устройство `/dev/vda1` обозначает только раздел, а `/dev/vda` — весь диск, включая таблицу разделов. На вспомогательной ВМ имя подключенного диска может отличаться.

1. Выгрузите образ. В примере выбран раздел `/dev/vda1`: замените значение `SOURCE` на проверенный путь к нужному диску или разделу.

   ```bash
   SOURCE=/dev/vda1
   IMAGE="$(hostname).$(basename "$SOURCE").$(date -u +%Y%m%dT%H%M%SZ).img.gz"
   export IMAGE

   dd if="$SOURCE" bs=4M status=progress | gzip -c > "/dr-s3mount/$IMAGE"
   ```

   `pipefail` позволяет обнаружить ошибку `dd`, даже если `gzip` завершился успешно. При сбое объект может остаться неполным — не используйте его для восстановления.

   `hostname` в имени файла относится к вспомогательной ВМ. Отдельно запишите идентификатор исходного диска.

## Проверьте образ в хранилище {#verify-image}

1. Размонтируйте бакет:

   ```bash
   cd /root
   umount /dr-s3mount
   ```

   Если размонтирование завершилось с ошибкой, устраните ее, прежде чем продолжать.

1. Снова подключите бакет командой из раздела [Подключите бакет](#mount-bucket). Повторное подключение позволяет проверить сохраненный объект, а не данные локального кеша предыдущего монтирования.
1. В панели управления Selectel убедитесь, что объект появился в бакете, имеет ненулевой размер и выбранный класс хранения.
1. На другой целевой ВМ можно проверить целостность скачанного архива:

   ```bash
   gzip -t "img_file.gz"
   ```

   Вместо `img_file.gz` укажите имя скачанного файла. Команда читает архив целиком и проверяет его целостность. Это может занять время; учитывайте стоимость чтения и исходящего трафика у внешнего провайдера.

## Завершите перенос {#finish-transfer}

На вспомогательной ВМ размонтируйте бакет:

```bash
umount /dr-s3mount
```

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

## Восстановите образ на отдельный диск {#restore-image}

Этот способ побайтово записывает содержимое образа на целевое устройство. Образ целого диска восстанавливайте на целый диск, а образ раздела — на отдельный раздел. Размер целевого диска или раздела должен быть не меньше исходного.

{% note alert %}

Все данные целевого устройства будут перезаписаны. При восстановлении образа целого диска будет перезаписана и его таблица разделов. Образ отдельного раздела не содержит таблицу разделов исходного диска.

{% endnote %}

1. Скачайте `.img.gz` на ВМ с Linux, подключите целевой диск и определите его имя:

   ```bash
   lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
   ```

   Убедитесь, что выбран дополнительный диск, а не загрузочный диск ВМ. Диск и его разделы не должны быть смонтированы. Размонтируйте их перед записью.

1. Выполните команды в Bash. Вместо значения `IMAGE` укажите имя скачанного архива. Замените `/dev/REPLACE_ME` на целевой диск, например `/dev/vdc`, если сохранен образ целого диска, или на целевой раздел, например `/dev/vdc1`, если сохранен образ раздела:

   ```bash
   set -o pipefail
   IMAGE="node3.vdb.20261012T082919Z.img.gz"
   TARGET="/dev/REPLACE_ME"

   # Проверить целостность архива перед записью.
   gzip -t "$IMAGE" || exit 1

   # Распаковать непосредственно на диск, без промежуточного .img.
   if ! gzip -dc "$IMAGE" |
     sudo dd of="$TARGET" bs=4M iflag=fullblock conv=fsync status=progress
   then
     echo "Ошибка восстановления. Целевой диск может быть записан частично."
     exit 1
   fi
   echo "Запись образа на диск завершена."
   ```

## Как удалить временные ресурсы {#cleanup}

После успешной проверки восстановления вы можете удалить неиспользуемые ресурсы:

* [вспомогательную ВМ](../vm-control/vm-delete.md);
* [копии дисков](delete.md);
* [снимки](../snapshot-control/delete.md).