ZeroVM

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:48, 19 мая 2019.
Версия от 16:48, 19 мая 2019; p.yastrebceva (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
ZeroVM Zero-vm-logo.png
Автор(ы) Камю Гилядов, Константин Пересыпкин и Дмитрий Борток
Разработчик LiteStack, пробретенный Rackspace
Предварительная версия 0.9.4/26 Ноября 2013(5 лет назад)
Статус Активный
Написанный на C
Операционная система Linux
Платформа x86-64
Тип Виртуализация приложений
Лицензия Apache License 2.0
Сайт zerovm.org

ZeroVM - технология виртуализации на уровне ОС и песочница с открытым исходным кодом. Она виртуализирует один процесс, используя платформу Google Native Client. Поскольку виртуализируется только один процесс (вместо целой операционной системы), задержка запуска составляет порядка 5 мс. [1]

Песочница

ZeroVM создает песочницу для одного процесса, используя технологию, основанную на Google Native Client (NaCl). Благодаря песочнице, запущенное приложение не может получить доступ к данным операционной системы хоста, а значит, можно безопасно запускать сторонний код. Программы, запущенные в ZeroVM, должны быть сначала кросскомпилированны для NaCl платформы. ZeroVM может выполнять только NaCl код, скомпилированный для x86-64 платформы, не формата портативного Native Client (PNaCl).

Код, выполняемый в ZeroVM, не может вызвать нормальные системные вызовы и первоначально не может взаимодействовать со средой хоста. Все коммуникации с внешним миром происходят через канал, которые должны быть объявлены до того, как запустится программа. Вне песочницы канал может быть соединен с локальным файлом, с конвейером или другим экземпляром ZeroVM. Внутри песочницы программа видит канал как файловый дескриптор. Программа в песочнице может читать/писать данные из/в канал, но она не знает, куда подключен канал в хосте.

Программы, скомплированные для ZeroVM могут дополнительно использовать ZeroVM Runtime library, называемую ZRT. Эта библиотека предназначена для обеспечения программ средой POSIX . Для этого заменяются части стандартной библиотеки C. В частности, ZRT заменяет функции C ввода/вывода файла, такие как fopen и opendir, версиями, способными функционировать с файловой системой в оперативной памяти. Корневая файловая система представлена как tarball. Это позволяет программе "видеть" нормальную среду Unix.

ZRT также заменяет функции C даты и времени, такие как time, чтобы предоставлять программам фиксированную и "определенную" среду. Поскольку входные данные зафиксированы, гарантированно, что каждый запуск приведет к одним и тем же результатам. Даже нефункциональные программы становятся "определенными" в этой ограниченной среде. Это позволяет легко отлаживать программы, поскольку их поведение зафиксировано. [2]


Интеграция с Swift

ZeroVM объединена со Swift , компонентом распределенного хранения объектов. При установке промежуточного ZeroCloud в Swift , клиент может сделать запрос к Swift, содержащий программу ZeroVM. Программа будет выполнена прямо на узлах хранения. Это значит, что программа имеет прямой доступ к данным.

Изоляция и безопасность

ZeroVM имеет два ключевых компонента безопасности: статическую бинарную проверку и ограниченное API системных вызовов.

Статическая бинарная проверка работает благодаря тому, что сторонний код не выполняет никаких небезопасных инструкций. Все переходы должны быть нацелены на "начало блоков, выровненных по 32 байта и инструкции не разрешены для обхода этих блоков". Большим преимуществом такого подхода является то, проверка может быть выполнена только один раз перед выполнением сторонней программы и никакая дальнейшая проверка или интерпретация не требуются. Все это обеспечивается с помощью Native Client и не является уникальной особенностью ZeroVM.

Вторая составляющая безопасности - ограниченное API системных вызовов - является главным отличием обычного NaCl и ZeroVM. В ZeroVM доступны только 6 системных вызовов:

  • pread
  • pwrite
  • jail
  • unjail
  • fork
  • exit

Это минимизирует потенциальные угрозы, облегчает аудит безопасности механизма изоляции ядра, в отличие от NaCl, который имеет больше 50 стандартных системных вызовов. [3]

Каналы и I/O

Все I/O в ZeroVM моделируются с помощью абстракции, называемой "каналы". Каналы действуют как соединение между операционной системой хоста и экземпляром ZeroVM. На стороне хоста, канал может представлять из себя: файл, конвейер, символьное устройство или TCP сокет. Внутри экземпляра ZeroVM все каналы выглядят как файлы. .

Ограничения каналов

Наиболее важно, что каналы должны быть объявлены до запуска экземпляра ZeroVM. Это сделано не случайно и является важным применением безопасности. Например, невозможно, чтобы пользовательский код (рассматриваемый, как "ненадежный") смог открыть и записать информацию в сокет, пока сокет не будет заранее объявлен. Тоже самое касается и файлов, хранящихся на хосте; нет никакой возможности прочитать или записать файлы хоста, пока каналы файлов не будут предварительно объявлены.

Каналы также имеют несколько атрибутов для дальнейшего контроля поведения . Каждое определение канала должно декларировать:

  1. число операций чтения
  2. число операций записи
  3. общее число байтов для чтении
  4. общее число байтов для записи

Если ограничение превышено во время выполнения, доверенный код ZeroVM вызовет ошибку EDQUOT (превышение квоты).

Определения каналов

В дополнение к ограничениям чтения/записи, определения каналов имеют и несколько других атрибутов. Полный список атрибутов канала, включая ограничения I/O :

  1. uri: Определение устройства в операционной системе хоста. Это может быть обычный файл, TCP-сокет, канал или символьное устройство.
    Для файлов, конвейеров и символьных устройств значение uri представляет собой просто путь к файлу, например, /home/me/foo.txt.

Определения TCP сокета имеют следующий формат: tcp:<host>:<port>, где <host> - это IP адрес или имя машины, а <port> - это TCP порт.

  1. alias: Файловый псевдоним внутри ZeroVM, который соединен с устройством, указывается на хосте с помощью uri. Вне зависимости от типа устройства хоста, все выглядит как файл внутри экземпляра ZeroVM. То есть, даже сокет будет представлен как файл внутри виртуальной файловой системы в оперативной памяти, например /dev/mysocket. Псевдонимы могут определяться произвольно.
  2. type: Выбирается из следующего списка:
    • 0 (последовательное чтение / последовательная запись)
    • 1 (случайное чтение / последовательная запись)
    • 2 (последовательное чтение / случайная запись)
    • 3 (случайное чтение / случайная запись)
  3. etag: Обычно выключен (). Когда включен (), записывается и сообщается контрольная сумма всех данных, проходящих через канал (при чтении и записи).
  4. gets: Ограничение на число операций чтения для этого канала.
  5. get_size: Ограничение на общее число байтов, которые могут быть прочитаны из этого канала.
  6. puts: Ограничение на число операций записи для этого канала.
  7. put_size: Ограничение на общее число байтов, которые могут быть записаны в этот канал.

Ограничения каналов должны быть целым числом от 1 до 4294967296 (). Если файл манифеста ZeroVM (простой текстовый файл), то каналы объявляются в следующем формате:

Channel = <uri>,<alias>,<type>,<etag>,<gets>,<get_size>,<puts>,<put_size>

Вот несколько примеров:

Channel = /home/me/python.tar,/dev/1.python.tar,3,0,4096,4096,4096,4096

Channel = /dev/stdout,/dev/stdout,0,0,0,0,1024,1024

Channel = /dev/stdin,/dev/stdin,0,0,1024,1024,0,0

Channel = tcp:192.168.0.10:27175,/dev/myserver,3,0,65536,65536,65536,65536 [4]


Манифест ZeroVM

Файл манифеста является самой примитивной частью входных данных, которые должны быть предоставлены ZeroVM.

Вот пример манифеста:

Version = 20130611
Timeout = 50
Memory = 4294967296,0
Program = /home/me/myapp.nexe
Channel = /dev/stdin,/dev/stdin,0,0,8192,8192,0,0
Channel = /dev/stdout,/dev/stdout,0,0,0,0,8192,8192
Channel = /dev/stderr,/dev/stderr,0,0,0,0,8192,8192
Channel = /home/me/python.tar,/dev/1.python.tar,3,0,8192,8192,8192,8192
Channel = /home/me/nvram.1,/dev/nvram,3,0,8192,8192,8192,8192

Файл состоит из базовых конфигураций ZeroVM и одного или более каналов. Необходимы атрибуты:

  • Version: Версия формата манифеста..
  • Timeout: Максимальное время жизни для экземпляра ZeroVM (в секундах). Если пользовательская программа (недоверенный код) превышает ограничение по времени, программа ZeroVM вернет ошибку.
  • Memory: Содержит два 32-битных целых значения, разделенных запятой. Первое значение определяет количество памяти (в байтах), доступное для пользовательской программы, максимально 4294967296 байт (4 Гб). Второе значение (0 - выключено, 1 - включено) устанавливает метки объектов памяти (эта особенность не задокументирована).
  • Program: Пусть к недоверенному исполняемому файлу (кросс-компилированного для NaCl) в файловой системе хоста.

Ограничения определения каналов

Манифест может определять максимально 10915 каналов.

История

ZeroVM была разработана LiteStack, израильским стартапом. В ноябре 2011 был добавлен первый коммит в zerovm Git репозитории. LiteStack был приобретен Rackspace в октябре 2013. ZeroVM принимала участие в программе по развитию Techstars Cloud 2013 и получила начальное финансирование в размере $500,000. В январе 2014 была проведена первая встреча по разработке ZeroVM в университете Техаса в Сан-Антонио.


Процесс установки

Согласно инструкции с сайта ZeroVM на GitHub необходимо на ОС Ubuntu12.04 добавить репозиторий проекта c пометкой "latest":

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:zerovm-ci/zerovm-latest
sudo apt-get update

Затем установить пакет zerovm-zmq:

sudo apt-get install zerovm-zmq

После необходимо настроить среду для дальнейшей компиляции программы в среде Eclipse IDE for C/C++ Developers. Настройка производится посредством установки согласно данной ссылке. Устанавливаем необходимые пакет:

sudo apt-get install libc6-dev-i386 libglib2.0-dev pkg-config git \  build-essential automake autoconf libtool g++-multilib texinfo \ flex bison groff gperf texinfo subversion \  zerovm-zmq-dev

Настраиваем переменные окружения:

export ZVM_PREFIX=$HOME/zvm-root
export ZRT_ROOT=$HOME/zrt
export LD_LIBRARY_PATH=/usr/lib64
export CPATH=/usr/x86_64-nacl/include

Скачиваем необходимые файлы с GitHub:

git clone https://github.com/zerovm/zrt.git $ZRT_ROOT
git clone https://github.com/zerovm/toolchain.git $HOME/zvm-toolchain
cd $HOME/zvm-toolchain/SRC
git clone https://github.com/zerovm/linux-headers-for-nacl.git
git clone https://github.com/zerovm/gcc.git
git clone https://github.com/zerovm/glibc.git
git clone https://github.com/zerovm/newlib.git
git clone https://github.com/zerovm/binutils.git

Производим сборку Toolchain:

cd $HOME/zvm-toolchain
make -j8 ZEROVM=`which zerovm`  # e.g., '/usr/bin/zerovm'

Если что-то пойдёт не так, нужно запустить следующие процедуры:

cd $HOME/zvm-toolchain
make clean
cd $ZVM_PREFIX
rm -rf *
cd $ZEROVM_ROOT
make install PREFIX=$ZVM_PREFIX

Устанавливаем Debugger:

sudo apt-get install flex bison groff libncurses5-dev libexpat1-dev
cd $HOME/zvm-toolchain/SRC
git clone https://github.com/zerovm/gdb.git
cd gdb
mkdir BUILD
cd BUILD
../configure --program-prefix=x86_64-nacl- --prefix=$ZVM_PREFIX
make -j4
make install


После этого шага необходимо загрузить на систему Eclipse IDE for C/C++ Developers: заходим сюда и загружаем пакет необходимой разрядности. Распаковываем архив и запускаем бинарный файл. Заходим на страницу установки EGit и перетаскиваем кнопку Install из браузера в запущенную программу. Произойдёт установка плагина. После того, как процесс завершится, и линкуем ссылку на проект в плагине и затем выбираем пункт создать новый C++ проект с уже существующим Makefile. Запускаем сборку, после завершения которой остаётся запустить скомпилированный объект, который как раз и будет рабочим ZeroVM[5]

$ cd ~/zerovm
$ ./zerovm

ZeroVM tag1 lightweight VM manager, build 2013-10-08

Usage: <manifest> [-l#] [-v#] [-T#] [-stFPQ]

 -l <gigabytes> file size limit (default 4Gb)

 -s skip validation

 -t <0..2> report to stdout/log/fast (default 0)

 -v <0..3> log verbosity (default 0)

 -F quit right before starting user session

 -P disable channels space preallocation

 -Q disable platform qualification

 -T enable time/call tracing

Данный процесс на видео:


Источники

  1. What is ZeroVM?// hub.packtpub.com [2019]. Дата обновления: 30.06.2014. URL: https://hub.packtpub.com/what-zerovm/ (дата обращения: 17.05.2019).
  2. ZeroVM// Википедия [2019]. Дата обновления: 24.12.2018. URL: https://en.wikipedia.org/wiki/ZeroVM (дата обращения: 19.05.2019).
  3. Isolation and Security// docs.zerovm.org [2014]. Дата обновления: 2014. URL: http://docs.zerovm.org/zerovm/isolation_security.html (дата обращения: 19.05.2019).
  4. Channels and I/O// docs.zerovm.org [2014]. Дата обновления: 2014. URL: http://docs.zerovm.org/zerovm/channels_io.html (дата обращения: 19.05.2019).
  5. Running ZeroVM and samples// github.com [2019]. Дата обновления: 24.04.2014. URL: https://github.com/zerovm/zerovm/blob/master/README.md (дата обращения: 19.05.2019).