{"id":18794089,"url":"https://github.com/yandex-cloud-examples/yc-disk-export-tool","last_synced_at":"2025-10-07T02:20:32.749Z","repository":{"id":249280850,"uuid":"831041801","full_name":"yandex-cloud-examples/yc-disk-export-tool","owner":"yandex-cloud-examples","description":"Выполнение экспорта диска ВМ или образа диска из облачного каталога в Yandex Object Storage. В результате в Object Storage создается файл с образом диска в формате qcow2.","archived":false,"fork":false,"pushed_at":"2025-04-27T06:11:44.000Z","size":27,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-08-07T16:29:47.521Z","etag":null,"topics":["backup","bash","disk","image","jq","yandex-cloud","yandexcloud","yc-cli"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yandex-cloud-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-07-19T14:22:48.000Z","updated_at":"2025-07-02T08:46:04.000Z","dependencies_parsed_at":"2025-04-27T07:20:51.371Z","dependency_job_id":"b4986fa9-c533-4d9c-a3b2-9f81060f5133","html_url":"https://github.com/yandex-cloud-examples/yc-disk-export-tool","commit_stats":null,"previous_names":["yandex-cloud-examples/yc-disk-export-tool"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yandex-cloud-examples/yc-disk-export-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-disk-export-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-disk-export-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-disk-export-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-disk-export-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yandex-cloud-examples","download_url":"https://codeload.github.com/yandex-cloud-examples/yc-disk-export-tool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-disk-export-tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278708010,"owners_count":26031932,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backup","bash","disk","image","jq","yandex-cloud","yandexcloud","yc-cli"],"created_at":"2024-11-07T21:28:06.429Z","updated_at":"2025-10-07T02:20:32.717Z","avatar_url":"https://github.com/yandex-cloud-examples.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Yandex Cloud Disk Export Tool\n\n## Оглавление\n* [Обзор](#overview)\n* [Описание процесса](#description)\n* [Права доступа и роли](#roles)\n* [Подготовка инструмента к работе](#install)\n* [Порядок использования](#userguide)\n* [Примеры использования](#examples)\n  * [Инициализация](#example-init)\n  * [Экспорт диска ВМ](#example-disk)\n  * [Экспорт образа диска](#example-image)\n* [*Проверка созданного образа (необязательно)*](#test)\n* [*Подключение к Export Helper ВМ по SSH (при необходимости)*](#diag)\n\n\n## Обзор \u003ca id=\"overview\"/\u003e\u003c/a\u003e\n\nИнструмент может:\n* Экспортировать загрузочный [диск ВМ](https://yandex.cloud/ru/docs/compute/concepts/disk) в [Yandex Object Storage](https://yandex.cloud/ru/docs/storage).\n* Экспортировать [образ ВМ](https://yandex.cloud/ru/docs/compute/concepts/image) в [Yandex Object Storage](https://yandex.cloud/ru/docs/storage).\n\nВ результате работы инструмента в указанном [bucket](https://yandex.cloud/ru/docs/storage/concepts/bucket) S3-хранилища будет создан файл с образом диска в формате [qcow2](https://ru.wikipedia.org/wiki/Qcow2).\n\n\n## Описание процесса \u003ca id=\"description\"/\u003e\u003c/a\u003e\n\nЭкспорт работает следующим образом:\n\n1. Создаётся диск для ВМ из [снимка диска](https://yandex.cloud/ru/docs/compute/concepts/snapshot) или из [образа диска](https://yandex.cloud/ru/docs/compute/concepts/image) (в зависимости от выбранного режима работы инструмента).\n\n2. В каталоге заданном при инициализации создаётся `Export Helper ВМ` к которой подключается диск, созданный на первом этапе.\n\n3. В ВМ выполнется чтение данных с дополнительного диска и создание его образа с помощью инструмента [qemu-img](https://www.qemu.org/docs/master/tools/qemu-img.html).\n\n4. Полученный образ диска загружается в [Yandex Object Storage](https://yandex.cloud/ru/docs/storage) с помощью инструмента [Amazon CLI version 2](https://docs.amazonaws.cn/en_us/cli/latest/userguide/getting-started-version.html).\n\n5. После выполнения всех вышеописанных действий ВМ самоликвидируется с помощью [API вызова](https://yandex.cloud/ru/docs/compute/api-ref/Instance/delete).\n\nПо мере выполнения задач в рамках процесса инструмент пишет диагностические сообщения в [группу Default](https://yandex.cloud/ru/docs/logging/concepts/log-group) сервиса [Cloud Logging](https://yandex.cloud/ru/docs/logging/). \n\n\n## Права доступа и роли \u003ca id=\"roles\"/\u003e\u003c/a\u003e\n\nДля развёртывания инструмента и его запуска требуется определенный набор [полномочий (ролей)](https://yandex.cloud/ru/docs/iam/roles-reference) в Yandex Cloud.\n\nПри подготовке инструмента к работе, в указанном при инициализации каталоге создаётся [Service Account](https://yandex.cloud/ru/docs/iam/concepts/users/service-accounts) со следуюшим набором ролей:\n* [compute.editor](https://yandex.cloud/ru/docs/iam/roles-reference#compute-editor) - для удаления `Export Helper ВМ` после завершения экспорта.\n* [storage.uploader](https://yandex.cloud/ru/docs/iam/roles-reference#storage-uploader) - для загрузки созданного образа диска в [Object Storage](https://yandex.cloud/ru/docs/storage/).\n* [lockbox.payloadViewer](https://yandex.cloud/ru/docs/iam/roles-reference#lockbox-payloadViewer) - для получения секретов для работы с [Object Storage](https://yandex.cloud/ru/docs/storage/).\n* [logging.writer](https://yandex.cloud/ru/docs/iam/roles-reference#logging-writer) - для логирования хода процесса экспорта в [Cloud Logging](https://yandex.cloud/ru/docs/logging/).\n\nДалее этот SA привязывается к `Export Helper ВМ`.\n\n\n## Подготовка инструмента к работе \u003ca id=\"install\"/\u003e\u003c/a\u003e\n\nДля работы инструмента необходимо использовать операционную систему Linux или MacOS. \n\nРабота инструмента в среде [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/) не гарантируется!\n\nПеред использованием инструмент нужно развернуть и подготовить к работе (выполнить инциализацию). Для этого необходимо:\n\n1. Убедиться, что все необходимые инструменты установлены и настроены:\n* `yc CLI` - [установлен](https://yandex.cloud/ru/docs/cli/operations/install-cli) и [настроен](https://yandex.cloud/ru/docs/cli/operations/profile/profile-create#create).\n* `jq` - [установлен](https://jqlang.github.io/jq/download/).\n* `bc` - установлен. Устанавливается командой `sudo apt install bc`.\n\n\n2. Загрузить решение из репозитория на [github.com](https://github.com/yandex-cloud-examples/yc-disk-export-tool):\n```bash\ngit clone https://github.com/yandex-cloud-examples/yc-disk-export-tool.git\n```\n\n3. Перейти в папку с инструментом\n```bash\ncd yc-disk-export-tool\n```\n\n4. Запустить инициализацию инструмента\n\nИнициализация выполняется только один раз, выполнять его перед каждым запуском инструмента не нужно!\n\n```bash\n./init.sh \u003cfolder-id\u003e \u003cbucket-name\u003e \u003csa-name\u003e \u003csubnet-name\u003e \u003cconfig-file\u003e\n```\n\nДля инциализации нужно указать следующие обязательные параметры:\n* [folder-id](https://yandex.cloud/ru/docs/resource-manager/concepts/resources-hierarchy#folder) - идентификатор каталога облачных ресурсов в Yandex Cloud где будут развернуты ресурсы, необходимые для работы инструмента. У пользователя, запускающего процесс инициализации, должны быть права администратора в данном каталоге.\n* [bucket-name](https://yandex.cloud/ru/docs/storage/concepts/bucket) - название bucket (*имя папки*) в Yandex Object Storage куда будут загружаться резервные копии.\n* [sa-name](https://yandex.cloud/ru/docs/iam/concepts/users/service-accounts) - имя сервисной учетной записи, которая будет привязана к `Export Helper ВМ` от имени которой будут выполняться операции по работе с S3 bucket.\n* [subnet](https://yandex.cloud/ru/docs/overview/concepts/geo-scope) - имя подсети к которой будет подключаться `Export Helper ВМ`.\n* `config-file` - имя файла конфигурации (полный путь, если нужно) в формате [JSON](https://www.json.org/json-ru.html), в который будут записаны все нужные для работы инструмента параметры. Путь к файлу конфигурации нужно будет указывать при запуске инструмента.\n\n\n## Порядок использования \u003ca id=\"userguide\"/\u003e\u003c/a\u003e\n\nПеред началом использования, убедитесь, что [инструмент подготовлен к работе](#install).\n\n```bash\n./yc-disk-export.sh \u003csource-type\u003e \u003cfolder-id\u003e \u003csource-name\u003e \u003cconfig-file\u003e\n```\n\nУ пользователя, запускающего инструмент, должны быть права на чтение в соответствующем каталоге, для ресурса который будет экспортироваться.\n\nПри запуске инструмента необходимо указать следующие обязательные параметры:\n* `source-type` - тип источника данных. Определяет режим работы инструмента. Может принимать значения: `disk` или `image` в зависимости от типа ресурса для которого будет выполняться резервное копирование.\n* `folder-id` - [идентификатор каталога]((https://yandex.cloud/ru/docs/resource-manager/concepts/resources-hierarchy#folder)) облачных ресурсов в Yandex Cloud где находится источник данных.\n* `source-name` - имя ресурса источника данных в указанном каталоге облачных ресурсов:\n  - для источника типа `disk` - это `название ВМ`\n  - для источника типа `image` - это `название образа`\n* `config-file` - путь к файлу конфигурации, созданный при инициализации инструмента.\n\n\n## Примеры использования \u003ca id=\"examples\"/\u003e\u003c/a\u003e\n\n### Инициализация \u003ca id=\"example-init\"/\u003e\u003c/a\u003e\n```bash\n./init.sh b1g22jx2133dpa3yvxc3 my-s3-bucket disk-export-sa subnet-a ./disk-export.cfg\n```\n\n### Экспорт диска ВМ \u003ca id=\"example-disk\"/\u003e\u003c/a\u003e\n```bash\n./yc-disk-export.sh disk b1g22jx2133dpa3yvxc3 my-vm ./disk-export.cfg\n```\n\n### Экспорт образа диска \u003ca id=\"example-image\"/\u003e\u003c/a\u003e\n```bash\n./yc-disk-export.sh image b1g22jx2133dpa3yvxc3 win-image ./disk-export.cfg\n```\n\n\n## *Проверка созданного образа (необязательно)* \u003ca id=\"test\"/\u003e\u003c/a\u003e\n\nПри необходимости можно проверить созданный образ на работоспособность, развернув ВМ из этого образа локально.\n\nНиже представлен пример запуска ВМ из образа на компьютере с ОС `MacOS` и инструментом [qemu](https://www.qemu.org/):\n\n```bash\nqemu-system-x86_64 -name my-test-vm \\\n  -machine accel=hvf,type=q35 -cpu host -m 4G -nographic \\\n  -device virtio-net-pci,netdev=net0 \\\n  -netdev user,id=net0,hostfwd=tcp::2222-:22 \\\n  -drive if=virtio,format=qcow2,file=my-vm.qcow2\n```\n\nПосле запуска ВМ к ней можно будет подключиться как через консоль, так и по протоколу SSH - `ssh -p 2222 admin-user@localhost`.\n\n\n## Подключение к Export Helper ВМ по SSH \u003ca id=\"diag\"/\u003e\u003c/a\u003e\n\nВ случае возникновения нестандартных ситуаций может потребоваться доступ к `Export Helper ВМ` по протоколу SSH. По умолчанию доступ к ВМ по протоколу SSH отключен.\n\nДля организации доступа к ВМ по протоколу SSH, перед запуском иструмента необходимо:\n1. Раскомментировать часть `users:` в файле шаблона создания ВМ - [vm-init.tpl](./vm-init.tpl) (строки 7-12).\n2. Задать имя пользователя и SSH-ключ для доступа через переменные окружения, как показано в примере ниже.\n\n```bash\n# Задать переменные окружения для доступа к Export Helper VM по SSH\nexport USER_NAME=admin\nexport USER_SSH_KEY=$(cat ~/.ssh/id_ed25519.pub)\n\n# Запустить инструмент\n./yc-disk-export.sh disk b1g22jx2133dpa3yvxc3 my-vm ./disk-export.cfg\n\n# Подключиться к Export Helper VM\nssh admin@\u003chelper-vm-public-ip\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-disk-export-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyandex-cloud-examples%2Fyc-disk-export-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-disk-export-tool/lists"}