Еще раз попробую объяснить
Если у вас дикий энтерпрайз, а именно
- Выделяются деньги на железо и софт
- Выделяются деньги на штат специалистов
- Имеются повышенные требования к безопасности
- Стоимость минуты простоя очень высокая
- Требуется максимальная совместимость
То однозначно следует выбирать VM т.к. она позволяет
- Максимально качественно разделить хост и гостевое окружение на уровне ядра, процессов, памяти (в том числе)
- Обеспечить паравиртуализацию ресурсов на уровне гипервизора
- Иметь возможность мигрировать виртуалки с машины на машину без даунтайма за счет копирования содержимого оперативной памяти
- Устанавливать необходимые модули ядра, монтировать SMB и NFS шары, менять ядро, тюнить его, например, менять планировщик
- Резервировать ресурсы (CPU и RAM) под виртуалку (на самом деле, переиспользование незанятой оперативки это целый механизм драйверов гостевой системы)
- Устанавливать различные версии ядра и вообще операционки, например, совмещать windows и linux
- Настраивать сетевые интерфейсы внутри виртуальной машины
- Передавать специфичные устройства типа TPU чипов, UEFI,
Если у вас самохостинг и
- Какой-нить мини ПК, списанный сервак или мащинист на Z99
- На приказ ФСТЭК №21, оценка безопасности КИИ и ГОСТ Р ИСО/МЭК 27001-2021 у вас только одна реакция
- Вы играючи монтируется папки с хоста PVE в ваши контейнеры
- Быстроподнятое упавшим не считается, а если не быстроподнятое, то можно словить"опять у тебя ничего не работает!" из соседней комнаты
- Вы даже не знаете какой дистрибутив развернут в LXC контейнере с immich т.к. он создавался автоматически хелпер скриптом
- У вас нет 6 млн рублей на покупку видеокарты с аппаратной виртуализацией и возможностью независимого проброса в виртуалки
То LXC будет однозначно предпочтительней т.к.
- Выдает минимальный оверхед
- Быстрее создается
- Быстрее запускается
За счет того, что LXC в отиличе от KVM
- Использует одно ядро ОС
- Использует общий файловый буфер
- Использует общие файлы и процессы, изоляция производится при помощи механизма cgroups, как и в docker, между прочим
- Ограничение доступных ресурсов RAM и CPU является скорее дополнительным функционалом (в PVE обязателен, а вот в чистом LXC/LXD при создании контейнера не требует указания RAM и CPU и даже диска т.к. может использовать общую ФС (тут у меня был прикол, когда 10 lxc контейнеров с docker исчерпали лимиты по inode хостовой файловой системы)
- Создает контейнер из шаблона без фактической установки операционной системы, поэтому и нет cloudinit для CT
- За счет пункта 3 я, например, пробросил в CT USB принтеры просто на уровне USB шины
И отличие при работе с устройствами, например, вы пробрасываете видеокарту в гостевую систему, то
- В qemu/KVM (VM) - устройство или полностью, если не умеет, или частично, если имеет соответствущие аппаратные возможности (например, для CPU это AMD-V и VTx, которые должны быть в процессоре и включены в BIOS) убираются из хоста и передаются в бинарном виде в гостевую систему, а гостевая система при помощи драйверов работает с этим устройством
- В LXC (CT) - процессам в группе процессов, в простонародье называемыми LXC контейнером предоставляется доступ к логическому устройству (например видеокодер
/dev/dri/renderD128), при этом само устройство обслуживаеся драйверами, находящимися в ядре хоста (а ядро то и там всего одно)
Например
Alpine linux в CT ходит за информацией не туда, куда следует и команда top показывает количество CPU и RAM хоста, а не те значения, которые вы указали в настройках контейнера