[Документация Yandex Cloud](../../index.md) > [Yandex Cloud Marketplace](../index.md) > Партнерам > Концепции > Требования к продуктам Marketplace > Создание образа продукта на базе Linux

# Создание образа продукта на базе Linux для загрузки в Cloud Marketplace

Чтобы добавить в Marketplace продукт для Yandex Compute Cloud, нужно загрузить образ в Yandex Cloud. Продукты могут быть созданы на базе ОС Linux. Этот раздел поможет создать образ на базе ОС Linux.

Если вы хотите добавить продукт для Yandex Managed Service for Kubernetes, воспользуйтесь [соответствующей инструкцией](kubernetes-product.md).

## Создать образ {#create}

Образы продуктов, размещаемых в Marketplace, должны соответствовать [требованиям](compute-product.md#requirements).

Если у вас нет образа ВМ, создайте его:

* [с помощью Packer](../../tutorials/infrastructure-management/packer-quickstart.md). Тогда образ автоматически загрузится в Compute Cloud.<br>Рекомендации по созданию образа:
    * В качестве базового используйте образ из [публичного каталога](../../compute/operations/images-with-pre-installed-software/get-list.md) Yandex Cloud.
    * Посмотрите [примеры packer-рецептов](https://github.com/yandex-cloud-examples/yc-marketplace-vm-image-packer/packer).
    * [Автоматизируйте](../../tutorials/infrastructure-management/jenkins.md) сборку образов с помощью Jenkins.
* используя другие удобные для вас инструменты. Тогда вам потребуется самостоятельно [загрузить](../../compute/operations/image-create/upload.md) образ в Compute Cloud.

Поддерживаемые форматы: `Qcow2`, `VMDK`, `RAW` и `VHD`.

## Требования к образу {#requirements}

Для образов загрузочного диска должны выполняться следующие требования:

* Установлены драйверы `virtio-net`, `virtio-blk` и `virtio-pci`. Если вы собираетесь подключать к [виртуальной машине](../../compute/concepts/vm.md) [файловые хранилища](../../compute/concepts/filesystem.md), также должен быть установлен драйвер `virtiofs`. Смотрите [инструкцию](../../compute/operations/image-create/custom-image.md#virtio).
* Терминал `ttyS0` (порт COM1) настроен в качестве [серийной консоли](../../compute/concepts/serial-console.md). Смотрите [инструкцию](../../compute/operations/image-create/custom-image.md#serial-console).
* Сетевой интерфейс корректно запускается при старте ВМ и получает [IP-адрес](../../vpc/concepts/address.md) по DHCP.
* Пакет `cloud-init` установлен и настроен для работы с нашим [сервисом метаданных](../../compute/operations/vm-info/get-info.md#inside-instance). Установить пакет для CentOS можно с помощью команды `sudo yum install cloud-init`, для Debian или Ubuntu — `sudo apt update && sudo apt install -y cloud-init`.
* Если образ создан на основе Amazon Machine Image (AMI), в настройках `cloud-init` отключена проверка облачной платформы, на которой запускается ВМ. Смотрите [инструкцию](../../compute/operations/image-create/custom-image.md#ec2).
* В настройках системного файрвола открыт необходимый минимум портов для работы ваших приложений, а также порт для доступа по [SSH](../../glossary/ssh-keygen.md) (по умолчанию это порт 22 TCP).
* SSH-сервер запускается автоматически при старте ВМ.
* Сервисы с вашим приложением устойчивы к перезагрузке ВМ.

* В зависимости от [поколения оборудования](../../compute/concepts/hardware-generations.md), которое будет закреплено за создаваемым образом, для загрузочного диска должны использоваться разные форматы размещения таблиц разделов жесткого диска:

    * поколения `Gen 1.1` и `Gen 1.2` — для загрузочного диска используется [MBR](https://ru.wikipedia.org/wiki/Главная_загрузочная_запись)-разбивка;
    * поколение `Gen 2` — для загрузочного диска используется [GPT](https://ru.wikipedia.org/wiki/Таблица_разделов_GUID)-разбивка.

* Диск смонтирован по UUID, а не по имени.
* Файловая система не зашифрована.

Инструкции по настройке ОС для соответствия требованиям приведены в разделе [Подготовить свой образ диска](../../compute/operations/image-create/custom-image.md).

Чтобы образ можно было использовать для продукта в Marketplace, также выполните следующие действия:
1. Очистите:
   * директории `/tmp`, `/var/tmp`, `/var/log`;
   * кеши пакетного менеджера;
   * `.bash_history` всех пользователей;
   * данные о ранее полученных конфигурациях по DHCP (`dhcp.leases`, `dhcp.log`);
   * файл `/etc/machine-id`.

1. Убедитесь, что:
   * в образе нет системных пользователей, кроме нужных приложениям.
   * доступ через [SSH](../../glossary/ssh-keygen.md) по паролю запрещен для всех пользователей и возможен только по ключу, который получен из [сервиса метаданных](../../compute/operations/vm-info/get-info.md#inside-instance).
   * в образе нет заранее сгенерированных SSH-ключей и паролей.

      {% note warning %}

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

      {% endnote %}

   * в файле `/etc/sudoers*` не настроены лишние привилегии для пользователей.

1. Примените дополнительные рекомендации по настройке образов для Marketplace:
   * в файле конфигурации `/etc/fstab` отсутствуют строки, подключающие swap.

## Проверить образ {#check-image}

Вы можете выполнить очистку и необходимые проверки системы помощью скрипта [yc-image-cleanup.sh](https://github.com/yandex-cloud/marketplace/blob/master/products-prepare/linux/yc-image-cleanup.sh).

Скрипт `yc-image-cleanup.sh` нужно запускать внутри образа под пользователем `root`.

Скрипт `yc-image-cleanup.sh` не проверяет образ продукта на соответствие всем требованиям и совместим не со всеми дистрибутивами. Перед загрузкой образа в Marketplace вам потребуется самостоятельно провести дополнительные проверки. Чтобы узнать, поддерживает ли `yc-image-cleanup.sh` ваш дистрибутив, запустите скрипт с ключом `-o`. Для поддерживаемых дистрибутивов скрипт выводит название и версию дистрибутива и определяет пакетный менеджер. Если дистрибутив не поддерживается, в результате появится строка  `Unsupported OS/distribution; can't determine package manager type`.

Чтобы очистить ВМ перед созданием образа из нее, выполните команду:

```bash
./yc-image-cleanup.sh -c
```

{% note warning %}

Команда очистки удаляет некоторые файлы и директории. Перед ее выполнением убедитесь, что у вас есть резервные копии важных данных.

{% endnote %}

Перед очисткой ВМ вы можете задать переменную окружения `YCCLEANUP_SYS_USER`, указав в ней имя системного пользователя, которого в процессе очистки необходимо удалить вместе с домашним каталогом. Например, в Ubuntu системный пользователь `ubuntu`, в CentOS — `centos`. В некоторых случаях системным пользователем может быть `cloud-user` или какой-либо другой. В переменной `YCCLEANUP_SYS_USER` можно задать даже пользователя, исполняющего скрипт. В этом случае будет выведено сообщение об ошибке, но пользователь всё равно будет удалён. Если переменная `YCCLEANUP_SYS_USER` не задана, никакой пользователь удалён не будет.

Чтобы проверить образ на соответствие части [требований](#requirements), выполните команду:

```bash
./yc-image-cleanup.sh -d
```

Чтобы проверить ВМ, которую [создали](../../compute/operations/image-create/upload.md#create-vm-from-user-image) из образа, выполните команду:
    
```bash
./yc-image-cleanup.sh -t
```

Если дизайн вашей системы не позволяет провести какую-либо проверку при запуске с ключом `-t`, эту проверку можно отключить. Список отключаемых проверок передается с помощью ключа `-s` в формате: `yc-image-cleanup.sh -s <spec1>,<spec2> -t`. Проверки можно отключить с помощью спецификаторов:

  * `users-locked-nocheck` — отключает проверку, что аутентификация по паролю выключена для всех пользователей, и зайти на ВМ можно только по ключу. 
  * `empty-history-nocheck` — отключает проверку, что история bash пуста у всех пользователей.
  * `one-auth-user-nocheck` — отключает проверку, что только у одного пользователя, кроме `root`, есть запись в `authorized_keys`. Таким пользователем может быть только пользователь, заданный в metadata. 
  * `one-auth-key-nocheck` — отключает проверку, что каждый пользователь имеет не более одной записи в `authorized_keys`. Эта проверка не пройдет, если в исходном образе не был удален какой-либо пользователь с записью в `authorized_keys`. 
  * `no-private-keys-nocheck` — отключает проверку, что ни у одного пользователя не осталось файлов пары "публичный ключ — приватный ключ" в папке `.ssh` домашнего каталога. 
  * `no-passwords-nocheck` — отключает проверку, что аутентификации по паролю в файле конфигурации `sshd` выключена.

Скрипт `yc-image-cleanup.sh` с ключом `-t` может быть запущен в режиме `verbose` для вывода детализации выполнения проверки. При запуске с детализацией для каждого этапа проверки будет выведен список пользователей, которые не прошли проверку, или недопустимые значения параметров конфигурации. Режим детализации поддерживает только уровень `normal`. Чтобы запустить скрипт проверки в режиме детализации, выполните команду (ключи должны следовать в указанном порядке):
  
 ```bash
 ./yc-image-cleanup.sh -v normal -t
 ```

Чтобы посмотреть все доступные параметры скрипта и все переменные окружения, влияющие на его исполнение, запустите команду:

 ```bash
 ./yc-image-cleanup.sh -h
 ```