Перенос образа диска Yandex Compute Cloud в S3-совместимое хранилище стороннего провайдера
Вы можете сохранить побайтовую копию диска Compute Cloud в объектном хранилище другого провайдера. Такая копия позволяет хранить данные за пределами Yandex Cloud и использовать их для восстановления.
В этой инструкции вы создадите диск из снимка, подключите его к вспомогательной ВМ на Linux и выгрузите образ диска или раздела с помощью s3fs, dd и gzip. Результат — сжатый образ в файле .img.gz. Создание и запуск ВМ у другого провайдера потребуют отдельного восстановления.
Примечание
В примере используется приватный бакет Selectelru-7. Для другого S3-совместимого хранилища замените параметры подключения и проверьте требования провайдера к доступу и размеру объектов.
Чтобы перенести образ диска в S3-совместимое хранилище стороннего провайдера:
- Подготовьте бакет и доступ к нему.
- Подготовьте копию диска и вспомогательную ВМ.
- Установите утилиты и сохраните ключ.
- Подключите бакет.
- Выберите устройство и выгрузите образ.
- Проверьте образ в хранилище.
- Завершите перенос.
- Восстановите образ на отдельный диск.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте бакет и доступ к нему
-
Создайте
бакет в Selectel:-
Укажите имя, например
disk-snapshot-dr-bucket. Если имя занято, выберите другое и замените его в командах ниже. -
Выберите приватный доступ.
-
Выберите тип адресации
Path-Style, который используется в команде подключения бакета ниже. -
Выберите холодный класс хранения.
Важно
Перед загрузкой ознакомьтесь с условиями тарификации
, включая чтение данных и минимальный срок хранения.
-
-
На вкладке Подключение создайте
ключ S3 с именемdisk-snapshot-bucket-key. В поле владельца ключа выберите Мне для разового переноса либо отдельного сервисного пользователя Selectel для постоянного использования. -
Для сервисного пользователя предоставьте доступ к нужному проекту и бакету:
- чтение и запись объектов;
- просмотр содержимого бакета;
- операции составной загрузки (multipart upload).
Требования к ролям приведены в инструкции по подключению s3fs
. -
Сохраните
Access keyиSecret keyв защищенном месте. Они понадобятся на вспомогательной ВМ.
Подготовьте копию диска и вспомогательную ВМ
- Если у вас еще нет снимка диска, образ которого вы хотите перенести к другому облачному провайдеру, создайте его.
- Создайте вспомогательную ВМ с Ubuntu или Debian либо используйте существующую. У ВМ должен быть HTTPS-доступ к эндпоинту Selectel.
- Создайте диск из снимка в той же зоне доступности, что и вспомогательная ВМ.
- Подключите созданный диск к вспомогательной ВМ как дополнительный.
- Подключитесь к вспомогательной ВМ по SSH.
Важно
s3fs использует временные файлы и локальный кеш. Запись через gzip не гарантирует отсутствие локальной буферизации. Проверьте свободное место в /tmp или в каталоге, заданном параметром tmpdir утилиты s3fs: планируйте запас вплоть до размера загружаемого сжатого образа.
Установите утилиты и сохраните ключ
Следующие команды до завершения выгрузки выполняйте на вспомогательной ВМ в одной сессии Bash от имени root.
-
Откройте сессию и установите утилиты:
sudo -i apt-get update apt-get install -y s3fs gzip set -o pipefail umask 077pipefailпозволит обнаружить ошибкуdd, даже если следующая командаgzipзавершится успешно. -
Введите ключи доступа к внешнему бакету:
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.
Подключите бакет
-
Создайте каталог монтирования:
mkdir -p /dr-s3mount -
Смонтируйте бакет:
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 (url) с параметрами на вкладке подключения вашего бакета. Для другого провайдера замените имя бакета, регион и эндпоинт. Описание остальных параметров s3fs приведено в справочнике проекта.
Продолжайте только после успешной проверки mountpoint.
Выберите устройство и выгрузите образ
-
Посмотрите подключенные устройства:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIALСверьте размер и идентификатор с информацией о диске. Устройство
/dev/vda1обозначает только раздел, а/dev/vda— весь диск, включая таблицу разделов. На вспомогательной ВМ имя подключенного диска может отличаться. -
Выгрузите образ. В примере выбран раздел
/dev/vda1: замените значениеSOURCEна проверенный путь к нужному диску или разделу.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в имени файла относится к вспомогательной ВМ. Отдельно запишите идентификатор исходного диска.
Проверьте образ в хранилище
-
Размонтируйте бакет:
cd /root umount /dr-s3mountЕсли размонтирование завершилось с ошибкой, устраните ее, прежде чем продолжать.
-
Снова подключите бакет командой из раздела Подключите бакет. Повторное подключение позволяет проверить сохраненный объект, а не данные локального кеша предыдущего монтирования.
-
В панели управления Selectel убедитесь, что объект появился в бакете, имеет ненулевой размер и выбранный класс хранения.
-
На другой целевой ВМ можно проверить целостность скачанного архива:
gzip -t "img_file.gz"Вместо
img_file.gzукажите имя скачанного файла. Команда читает архив целиком и проверяет его целостность. Это может занять время; учитывайте стоимость чтения и исходящего трафика у внешнего провайдера.
Завершите перенос
На вспомогательной ВМ размонтируйте бакет:
umount /dr-s3mount
Сохраните имя объекта, устройство-источник, размер диска и время копирования. Перед удалением исходного диска выполните пробное восстановление на отдельный диск: целостность gzip сама по себе не доказывает способность системы корректно загружаться.
Восстановите образ на отдельный диск
Этот способ побайтово записывает содержимое образа на целевое устройство. Образ целого диска восстанавливайте на целый диск, а образ раздела — на отдельный раздел. Размер целевого диска или раздела должен быть не меньше исходного.
Внимание
Все данные целевого устройства будут перезаписаны. При восстановлении образа целого диска будет перезаписана и его таблица разделов. Образ отдельного раздела не содержит таблицу разделов исходного диска.
-
Скачайте
.img.gzна ВМ с Linux, подключите целевой диск и определите его имя:lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIALУбедитесь, что выбран дополнительный диск, а не загрузочный диск ВМ. Диск и его разделы не должны быть смонтированы. Размонтируйте их перед записью.
-
Выполните команды в Bash. Вместо значения
IMAGEукажите имя скачанного архива. Замените/dev/REPLACE_MEна целевой диск, например/dev/vdc, если сохранен образ целого диска, или на целевой раздел, например/dev/vdc1, если сохранен образ раздела: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 "Запись образа на диск завершена."
Как удалить временные ресурсы
После успешной проверки восстановления вы можете удалить неиспользуемые ресурсы: