Оригинал: Сборка шаблона cloud-init на ZFS — Кирилл Решетников, 1 июля 2026. Лицензия CC BY-NC-SA 4.0 . Публикуется с сохранением авторства и лицензии.

Введение

Статья рассматривает создание Cloud-Init шаблонов в Proxmox VE при использовании ZFS. Материал основан на практическом опыте миграции с mdadm + LVM на ZFS. Проблема возникла при развёртывании ВМ через Terraform: перестал корректно работать dynamic inventory в Ansible. Причина — несовместимость модели хранения ZFS (zvol) и формата qcow2.

Использованное ПО:

Проблематика: ZFS и QCOW2

В Proxmox VE с ZFS диски ВМ размещаются в zvol (блочное устройство), а Cloud-Init образы распространяются в формате qcow2 (файл). Это создаёт архитектурный конфликт.

Основная проблема — двойной Copy-on-Write:

Последствия:

В документации Proxmox VE не рекомендуется использовать qcow2 на ZFS.

Различия между форматами

QCOW2

Файловый формат с поддержкой Copy-on-Write, снапшотов, сжатия и thin provisioning. Требует наличия файловой системы. На ZFS создаёт двойной CoW.

RAW

Линейный образ без дополнительной логики:

Преимущества: минимальные накладные расходы и предсказуемая производительность для ZFS.

ZVOL

Блочное устройство внутри ZFS:

Ключевой параметр — volblocksize (размер блока). В Proxmox VE по умолчанию zvol создаётся с блоком 16K, что оптимально для дисков ВМ.

Типичные значения:

ZFS Dataset

Файловая система внутри ZFS:

Почему возникает конфликт

При попытке использовать файловый образ (qcow2) как источник для блочного устройства (zvol) Proxmox импортирует qcow2, конвертирует в raw и записывает результат в zvol.

Типичная ошибка:

BASH
qm importdisk 7777 ./debian-13-generic-amd64.qcow2 storage --format qcow2
Нажмите, чтобы развернуть и увидеть больше

Результат: диск импортируется с ошибками, Cloud-Init не инициализируется, ВМ в неконсистентном состоянии.

Варианты решения

Подход 1: ZFS Dataset (directory storage)

Создайте dataset с файловой системой:

PLAINTEXT
rpool/data/images
Нажмите, чтобы развернуть и увидеть больше

Плюсы: простая настройка, совместимость с инструкциями. Минусы: двойной CoW, деградация производительности на HDD.

Вывод: допустимо, но не оптимально.

Подход 2 (рекомендуемый): использование RAW

На этапе импорта укажите формат raw:

BASH
qm importdisk <VMID> <image> <storage> --format raw
Нажмите, чтобы развернуть и увидеть больше

Например:

BASH
qm importdisk 7777 ./debian-13-generic-amd64.qcow2 storage --format raw
Нажмите, чтобы развернуть и увидеть больше

Плюсы: нет двойного CoW, максимальная производительность, корректная работа Cloud-Init.

Сборка Cloud-Init шаблона на ZFS

1. Импорт образа

Шаг 1. Увеличиваем размер диска:

BASH
qemu-img resize ./debian-13-generic-amd64.qcow2 32G
Нажмите, чтобы развернуть и увидеть больше

Шаг 2. Создаём ВМ без диска:

BASH
qm create 9998 --name "debian-13-ci" --memory 2048 --cores 2 --net0 virtio,bridge=vnet01
Нажмите, чтобы развернуть и увидеть больше

Расшифровка:

Шаг 3. Импортируем образ в формате RAW (ключевое отличие):

BASH
qm importdisk 9998 debian-13-generic-amd64.qcow2 vm-hdd --format raw
Нажмите, чтобы развернуть и увидеть больше

Шаг 4. Ставим SCSI-контроллер и добавляем диск:

BASH
qm set 9998 --scsihw virtio-scsi-single --scsi0 vm-hdd:vm-9998-disk-0,discard=on
Нажмите, чтобы развернуть и увидеть больше

Шаг 5. Обновляем порядок загрузки:

BASH
qm set 9998 --boot order=scsi0
Нажмите, чтобы развернуть и увидеть больше

Шаг 6. Добавляем Cloud-Init диск:

BASH
qm set 9998 --ide1 vm-hdd:cloudinit
Нажмите, чтобы развернуть и увидеть больше

Шаг 7. Настраиваем пользователя и SSH:

BASH
# Создание пользователя
qm set 9998 --ciuser ansible
qm set 9998 --cipassword <ПАРОЛЬ>

# Добавление SSH ключа
qm set 9998 --sshkeys ~/.ssh/id_ed25519.pub

# Сетевые настройки (DHCP)
qm set 9998 --ipconfig0 ip=dhcp

# Или статический IP
qm set 9998 --ipconfig0 ip=10.10.10.254/24,gw=10.10.10.1
qm set 9998 --nameserver 10.10.10.15
qm set 9998 --searchdomain infra.lan

# Обновления при запуске
qm set 9998 --ciupgrade 1
Нажмите, чтобы развернуть и увидеть больше

Шаг 8. Добавляем последовательный порт:

BASH
qm set 9998 --serial0 socket --vga serial0
Нажмите, чтобы развернуть и увидеть больше

Шаг 9. Включаем QEMU Guest Agent:

BASH
qm set 9998 --agent enabled=1
Нажмите, чтобы развернуть и увидеть больше

Шаг 10. Сохраняем как шаблон:

BASH
qm template 9998
Нажмите, чтобы развернуть и увидеть больше

Шаги 11–12. Создаём клон для проверки и запускаем тестовую машину.

2. Добавление Cloud-Init в готовый шаблон

Если шаблон уже существует:

  1. Сделайте полную копию (Full Clone).
  2. Подключитесь через VNC или SSH.
  3. Переключитесь на root:
    BASH
    sudo -i
    Нажмите, чтобы развернуть и увидеть больше
  4. Обновите систему:
    BASH
    apt update && apt full-upgrade -y
    Нажмите, чтобы развернуть и увидеть больше
  5. Установите qemu-guest-agent и cloud-init:
    BASH
    apt install -y qemu-guest-agent cloud-init
    Нажмите, чтобы развернуть и увидеть больше
  6. Создайте конфигурацию /etc/cloud/cloud.cfg.d/99-pve.cfg:
    PLAINTEXT
    datasource_list: [ NoCloud, ConfigDrive ]
    Нажмите, чтобы развернуть и увидеть больше
  7. Очистите журналы и machine-id:
    BASH
    cloud-init clean --logs
    rm -f /etc/machine-id
    truncate -s 0 /etc/machine-id
    Нажмите, чтобы развернуть и увидеть больше
  8. Опционально очистите журналы:
    BASH
    journalctl --rotate
    journalctl --vacuum-time=1s
    apt clean
    Нажмите, чтобы развернуть и увидеть больше
  9. Выключите машину:
    BASH
    poweroff
    Нажмите, чтобы развернуть и увидеть больше
  10. На гипервизоре добавьте Cloud-Init диск:
    BASH
    qm set <VMID> --ide2 <storage>:cloudinit
    Нажмите, чтобы развернуть и увидеть больше
  11. Добавьте последовательный порт:
    BASH
    qm set <VMID> --serial0 socket --vga serial0
    Нажмите, чтобы развернуть и увидеть больше
  12. Включите агента:
    BASH
    qm set <VMID> --agent enabled=1
    Нажмите, чтобы развернуть и увидеть больше
  13. Сохраните как шаблон:
    BASH
    qm template <VMID>
    Нажмите, чтобы развернуть и увидеть больше

Типичные ошибки

Вывод

Оптимальная схема для Proxmox VE с ZFS:

ZFS уже реализует CoW, снапшоты и thin provisioning. Использование qcow2 поверх ZFS дублирует эти механизмы и приводит к деградации производительности и усложнению архитектуры.

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/cloud-init-template-zfs/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша