Unikernel — это компьютерная программа, статически связанная с кодом операционной системы , от которой она зависит. Unikernels создаются с помощью специализированного компилятора , который идентифицирует службы операционной системы, используемые программой, и связывает ее с одной или несколькими библиотечными операционными системами , которые их предоставляют. Такая программа не требует отдельной операционной системы и может работать вместо этого как гостевая программа гипервизора . [1]
Архитектура unikernel основана на концепциях, разработанных Exokernel и Nemesis в конце 1990-х годов.
В библиотечной операционной системе границы защиты смещены на самые нижние аппаратные уровни, что приводит к:
Архитектура библиотечной ОС имеет несколько преимуществ и недостатков по сравнению с традиционными конструкциями ОС. Одним из преимуществ является то, что, поскольку имеется только одно адресное пространство, нет необходимости в повторных переходах привилегий для перемещения данных между пользовательским пространством и пространством ядра. Таким образом, библиотечная ОС может обеспечить улучшенную производительность, предоставляя прямой доступ к оборудованию без необходимости перехода между пользовательским режимом и режимом ядра (в традиционном ядре этот переход состоит из одной инструкции TRAP [2] и не является тем же самым, что и переключение контекста [3] ). Повышение производительности может быть достигнуто за счет устранения необходимости копирования данных между пользовательским пространством и пространством ядра, хотя это также возможно с драйверами устройств Zero-copy в традиционных операционных системах.
Недостатком является то, что из-за отсутствия разделения попытка запустить несколько приложений бок о бок в библиотечной ОС, но с сильной изоляцией ресурсов, может стать сложной. [4] Кроме того, для конкретного оборудования, на котором работает библиотечная ОС, требуются драйверы устройств. Поскольку оборудование быстро меняется, это создает бремя регулярной переписывания драйверов для поддержания их актуальности.
Виртуализация ОС может преодолеть некоторые из этих недостатков на стандартном оборудовании. Современный гипервизор предоставляет виртуальным машинам процессорное время и строго изолированные виртуальные устройства. Библиотечной ОС, работающей как виртуальная машина, требуется только реализовать драйверы для этих стабильных виртуальных аппаратных устройств и может зависеть от гипервизора для управления реальным физическим оборудованием. Однако библиотеки протоколов по-прежнему необходимы для замены служб традиционной операционной системы. Создание этих библиотек протоколов — это то, где лежит основная часть работы при реализации современной библиотечной ОС. [1] Кроме того, зависимость от гипервизора может снова привести к накладным расходам производительности при переключении между unikernel и гипервизором, а также при передаче данных на виртуальные устройства гипервизора и с них.
Уменьшая объем развернутого кода, unikernels неизбежно уменьшают вероятную поверхность атаки и, следовательно, обладают улучшенными свойствами безопасности. [5] [6]
Пример клиента обмена сообщениями на базе Unikernel имеет размер около 4% от эквивалентной кодовой базы, использующей Linux. [7]
Благодаря своей конструкции, можно выполнять оптимизацию всей системы в драйверах устройств и логике приложений, тем самым улучшая специализацию. [8] [9] [10] Например, готовые приложения, такие как nginx, SQLite и Redis, работающие на Unikernel, показали улучшение производительности в 1,7–2,7 раза. [11]
Было показано, что Unikernels регулярно загружаются чрезвычайно быстро, успевая отвечать на входящие запросы до истечения времени ожидания запросов. [12] [13] [14]
Unikernels подходят для создания систем, которые следуют сервисно-ориентированной или микросервисной программной архитектуре.
Высокая степень специализации означает, что unikernels не подходят для многопользовательских вычислений общего назначения, для которых используются традиционные операционные системы. Добавление дополнительных функций или изменение скомпилированного unikernel, как правило, невозможно, и вместо этого подход заключается в компиляции и развертывании нового unikernel с желаемыми изменениями.
. . . почти все системные вызовы [вызываются] из программ на языке C путем вызова библиотечной процедуры . . . Библиотечная процедура . . . выполняет инструкцию TRAP для переключения из пользовательского режима в режим ядра и запуска выполнения . . .