Думаю, что наиболее правильно в таком случае будет использовать опыт разработчиков устройств с встроенным ПО — firmware. То есть, поставляя виртуалку, включаете в неё необновляемый раздел с «загрузчиком» firwmare — к примеру, сильно урезанный и стабильный Linux, или что-нибудь ещё по выбору, раздел с собственно firmware — образ ОС вместе с ПО, и раздел с пользовательскими данными. Потом рассылаете новую версию firmware, для обновления перезапустить систему с «загрузчика» и выбрать опцию «обновить». Что-то в этом духе.
А поставлять софт на VM — хорошо, да. Утяжеление требований значительно компенсируется стабильностью системы — ведь, по сути, внутри любой VM работают одни и те же драйвера устройств, вне зависимости от реального «железа» сервера. То есть, виртуалка, проверенная в лаборатории, будет абсолютно одинаково работать в любых условиях. А не так, что ваш софт может внезапно сконфликтовать с драйвером мыши, написанном левой ногой.