Incus — менеджер системных контейнеров и виртуальных машин с единым интерфейсом командной строки и API. Проект вырос из LXD и сохранил главную идею: вы описываете экземпляр, профиль и хранилище, а инструмент сам создаёт контейнер или ВМ, выдаёт адрес и подключает диск. Для домашней лаборатории это удобная замена зоопарку из VirtualBox, Docker и ручных bridge-интерфейсов.
Чем Incus отличается от Docker
Docker запускает приложение в изолированном окружении и обычно хранит один процесс на контейнер. Incus управляет полноценной системой: внутри работает systemd, sshd, база данных и набор служб, как на обычном сервере.
- Контейнер Incus использует ядро хоста, стартует за секунды и почти не расходует память на оболочку.
- Виртуальная машина получает собственное ядро, подходит для другой ОС и полной изоляции.
- Профили задают лимиты, устройства и сеть одинаково для группы экземпляров.
- Снимки и экспорт позволяют быстро откатить изменения или перенести систему.
Для проверки сервиса удобен контейнер, для Windows, FreeBSD или недоверенного кода — виртуальная машина. Оба типа создаются одной командой и видны в общем списке.
Установка
В Ubuntu 24.04 и Debian 13 пакет есть в штатных репозиториях. На более старых выпусках используют backports или репозиторий проекта. После установки пользователя добавляют в группу incus-admin, иначе команды потребуют sudo.
sudo apt update
sudo apt install incus
sudo usermod -aG incus-admin $USER
newgrp incus-admin
incus version
Проверьте, что ядро поддерживает нужные возможности: cgroups v2, namespaces и AppArmor. Для виртуальных машин нужна аппаратная виртуализация VT-x или AMD-V; её наличие показывает lscpu | grep Virtualization.
Инициализация
Быстрый старт создаёт пул хранения на каталоге и сетевой мост. Для лаборатории этого достаточно; позже пул можно заменить на ZFS или LVM.
sudo incus admin init --minimal
incus storage list
incus network list
incus profile show default
Интерактивный incus admin init задаёт вопросы о размере пула, подсети и IPv6. Если машина уже использует 10.0.0.0/8 или другой мост, выберите свободную подсеть, чтобы не конфликтовать с домашней сетью.
Первый контейнер
Образы берутся с сервера images:. После запуска экземпляр получает адрес по DHCP, а внутрь можно войти через incus exec или по SSH.
incus launch images:debian/13 web1
incus list
incus info web1
incus exec web1 -- bash -c "apt update && apt install -y nginx"
incus exec web1 -- systemctl status nginx --no-pager
Для домашних задач удобно сразу создать пользователя и скопировать ключ. Команда incus file push передаёт файлы, incus file pull забирает журналы, а incus exec не требует SSH-сервера внутри. Клонирование удобно для быстрых экспериментов: incus copy web1 web1-test создаёт копию, а incus delete убирает её без остатка. Перед удалением проверьте, что на диске не осталось нужных файлов.
incus exec web1 -- mkdir -p /root/.ssh
incus file push ~/.ssh/id_ed25519.pub web1/root/.ssh/authorized_keys
incus exec web1 -- chmod 600 /root/.ssh/authorized_keys
incus list web1
Адрес экземпляра показан в выводе incus list; по нему и подключайтесь по SSH.
Виртуальная машина
Ключ --vm переключает тип экземпляра. ВМ требует больше памяти и времени на старт, зато получает собственное ядро.
incus launch images:ubuntu/24.04 vm1 --vm
incus list
incus console vm1 --type=vga
incus config set vm1 limits.memory 4GiB
incus restart vm1
Консоль VGA открывается в терминале и позволяет завершить установку или посмотреть загрузку. Для Windows понадобится образ с драйверами virtio; для минимальной ВМ достаточно cloud-init, который задаёт пользователя и SSH-ключ при первом запуске.
Лимиты и проброс портов
Профиль задаёт ресурсы для группы, а incus config set меняет параметры конкретного экземпляра. Для контейнеров лимиты действуют через cgroups, для ВМ — как ограничения гипервизора.
incus config set web1 limits.cpu 2
incus config set web1 limits.memory 2GiB
incus config set web1 limits.memory.enforce hard
incus config device add web1 http proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80
Проброс через proxy не требует правки сети внутри гостя. Проверьте, что порт на хосте свободен и что сервис слушает 127.0.0.1 или 0.0.0.0 внутри. Для SSH удобнее отдельное устройство с портом 2222, чтобы не менять конфигурацию sshd.
Хранилище и сеть
По умолчанию используется пул default и мост incusbr0. Список и параметры смотрятся командами incus storage list и incus network show incusbr0. Для нескольких дисков создайте пул и перенесите экземпляр:
incus storage create fast zfs size=100GiB
incus storage list
incus move web1 --storage fast
incus config device add web1 data disk source=/srv/data path=/data
ZFS даёт снимки и дешёвое клонирование, но требует установленных утилит и памяти. Для простой лаборатории подойдёт dir, но снимки и быстрое клонирование лучше доверить ZFS или Btrfs. Диск, подключённый устройством disk, виден внутри как обычный каталог или блочное устройство. Перед переносом экземпляра между пулами его лучше остановить.
Снимки, резервные копии и проекты
Снимок фиксирует состояние экземпляра перед обновлением. Экспорт создаёт архив, который можно перенести на другую машину.
incus snapshot create web1 before-upgrade
incus snapshot list web1
incus snapshot restore web1 before-upgrade
incus export web1 /backup/web1.tar.gz --compression=zstd
Проекты разделяют экземпляры, профили и образы по командам или арендаторам. Это удобно, когда на одном хосте живут учебный стенд и рабочие сервисы.
incus project create lab
incus project set lab limits.instances 10
incus launch images:debian/13 test1 --project lab
incus list --project lab
Диагностика
Если экземпляр не стартует, смотрите его журнал и состояние демона. Команда incus info показывает тип, адреса, профили и ошибки.
incus info web1
incus info --resources
incus exec web1 -- journalctl -xe --no-pager
sudo journalctl -u incus --since "1 hour ago" --no-pager
incus list -c n,s,4,m
Частые причины: конфликт подсети, нехватка места в пуле, отключённая виртуализация, занятый порт проброса. Для ВМ дополнительно проверьте /dev/kvm и права демона на это устройство.
Итог
Incus закрывает сразу две задачи: быстрые системные контейнеры для служб и полноценные ВМ для особых случаев. Единые профили, снимки и экспорт упрощают обслуживание лаборатории. Начните с минимальной инициализации, создайте один контейнер и одну ВМ, а затем вынесите повторяющиеся настройки в профиль.