CoreSystem/Virtualization/Создание bundle: различия между версиями

Материал из ALT Linux Wiki
({{Historical}}: Похоже что mkve устарела, и для создания контейнеров сейчас правильнее использовать mkimage-profiles)
 
(не показана 41 промежуточная версия 5 участников)
Строка 1: Строка 1:
{{Stub}}
{{Stub}}{{Historical}}


== Определения и workflow ==
== Определения и workflow ==
{{Attention|Похоже что {{prg|mkve}} устарела, и для создания контейнеров сейчас правильнее использовать {{prg|mkimage-profiles}} (см. [[Mkimage/Profiles/m-p/examples|примеры использования]] для [[Mkimage/Profiles/m-p/examples#OpenVZ_VE|OpenVZ VE]] и [[Mkimage/Profiles/m-p/examples#Qemu_VM|Qemu VM]])}}


=== Определения ===
=== Определения ===
Слово '''гипервизор''' является синонимом понятия «тип виртуализации». Так мы говорим о гипервизорах openvz, qemu, kvm и т. д.
* '''Контейнер''' — это готовая к работе виртуальная машина под управлением одного из гипервизоров.
* '''Bundle''' — это набор данных и метаданных определённого формата для автоматического создания контейнеров средствами {{prg|mkve}}.
* '''Шаблон''' — это набор данных определённого формата для автоматического создания bundle’ов средствами {{prg|mkve-bundle}}.


Слово '''гипервизор''' является синонимом понятия "тип виртуализации". Так мы говорим о гипервизорах openvz, qemu, kvm и т.д.
=== Workflow ===
Нашей конечной целью является создание bundle.
 
Для [[#Создание bundle с помощью mkve-bundle|создания bundle
средствами программы {{prg|mkve-bundle}}]] для начала необходимо
подготовить [[#Формат нативного шаблона для mkve-bundle|соответствующий шаблон]].
 
Для тех же, кому необходимо создавать bundle своими собственными средствами,
[[#Формат bundle|приводится]] описание его формата.
 
== Формат нативного шаблона для {{prg|mkve-bundle}} ==
Для создания шаблона для программы {{prg|mkve-bundle}} необходимо подготовить директорию определенного вида и содержания.
Вот полный список файлов, которые могут (но не обязательно должны) содержаться в шаблоне:
[[#Файл hypervisors|hypervisors]]
[[#Файл versions/гипервизор|versions/''гипервизор'']]
[[#Файл vendor/гипервизор|vendor/''гипервизор'']]
[[#Файл license/гипервизор|license/''гипервизор'']]
[[#Файл packages-lists/гипервизор|packages-lists/''гипервизор'']]
[[#Файл hooks-lists/гипервизор|hooks-lists/''гипервизор'']]
[[#Директория hooks/*|hooks/*]]
[[#Директория conf/гипервизор/|conf/''гипервизор''/]]
(здесь и далее ''гипервизор'' пробегает все значения, указанные в [[#Файл hypervisors|файле {{path|hypervisors}}]]).
Мы подробно опишем это дерево в последующих секциях.
 
=== Файл {{path|hypervisors}} ===
В первую очередь надо представить [[#Файл hypervisors|файл {{path|hypervisors}}]].
Этот файл содержит список поддерживаемых шаблоном гипервизоров, т.е. гипервизоров,
для которых можно собрать bundle из данного шаблона.
 
Две записи разделяются символом новой строки:
[user@xxx test]$ cat hypervisors
openvz
qemu
 
=== Файл {{path|versions/''гипервизор''}} ===
В папке {{path|versions}} хранится файл [[#Файл versions/гипервизор|{{path|versions/''гипервизор''}}]].
В этом файле указана версия шаблона для гипервизора ''гипервизор''.
 
'''Пример.'''
[user@xxx test]$ cat versions/openvz
template_version=0.02
 
=== Файл {{path|vendor/''гипервизор''}} ===
Этот файл служит для указания конторы, создавшей bundle из шаблона.
 
'''Пример.'''
[user@xxx test]$ cat vendor/openvz
vendor="ALT Linux"
 
=== Файл {{path|license/''гипервизор''}} ===
В этом файле может содержаться текст лицензии, под которой
распространяется собранный из шаблона bundle.
 
'''Пример.'''
[user@xxx test]$ cat license/openvz
[aspsk@localhost bin]$ head -7 license/openvz
                  GNU GENERAL PUBLIC LICENSE
                      Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
 
=== Файл {{path|packages-lists/''гипервизор''}} ===
В папке {{path|packages-lists/}} хранится в каком-то смысле главный файл в шаблоне —
[[#Файл packages-lists/гипервизор|{{path|packages-lists/''гипервизор''}}]]. Этот файл содержит список пакетов, которые будут
установлены в bundle. (См. также секцию [[#Пакеты ve-*|Пакеты ve-*]].)
 
'''Пример.'''
[user@xxx test]$ cat packages-lists/openvz
ve-pptp-server
alterator-net-eth
alterator-root
alterator-users
alterator-auth
 
=== Файл {{path|hooks-lists/''гипервизор''}} ===
В папке {{path|hooks-lists/}} может находиться [[#Файл hooks-lists/гипервизор|файл {{path|hooks-lists/''гипервизор''}}]].
Этот файл содержит список '''хуков''', т.е. программ, которые будут запущены "внутри bundle"
после установки пакетов.
 
Программа {{prg|mkve-bundle}} по умолчанию будет искать хуки сначала в [[#Директория hooks/*|директории {{path|hooks/}}]],
а затем в директории, указанной ей параметром {{term|--hooks}} (равным по умолчанию {{path|/usr/share/mkve/hooks}}).
 
'''Пример.'''
[user@xxx test]$ cat hooks-lists/openvz  
very-simple-hook
01-root
02-mtab
03-chkconfig_network_on
03-chkconfig_syslogd_on
03-chkconfig_random_on
03-chkconfig_pptpd_on
03-chkconfig_rawdevices_off
03-chkconfig_fbsetfont_off
 
=== Директория hooks/* ===
В этой директории, программа {{prg|mkve-bundle}} будет в первую очередь искать хуки.
Здесь можно, например, переписать дефолтные хуки или добавить хуки, нужные только для
этого конкретного шаблона. Все хуки должны быть исполняемыми файлами.
 
'''Пример.'''
[user@xxx test]$ ls -F hooks/
very-simple-hook*
[user@people test]$ cat hooks/very-simple-hook
#! /bin/sh
echo 'волки рыщут - пищу ищут!'
 
 
=== Директория {{path|conf/''гипервизор''/}} ===
В некоторых случаях в bundle хочется упаковать дополнительные файлы конфигурации,
которые будут использоваться при создании контейнера. Эти файлы необходимо поместить
в директорию [[#Директория conf/гипервизор/|{{path|conf/''гипервизор''/}}]].
 
==== Частный случай: {{path|conf/openvz/}} ====
Для гипервизора openvz в папку {{path|conf/openvz/}} можно добавить файл {{path|config}}.
В этом файле в формате, описанном в [http://openvz.org/documentation/mans/vps.conf.5 {{term|vps.conf(5)}}]
можно перечислить дефолтные для данного контейнера значения, в частности дисковые квоты и остальные
beancounters.
 
'''Пример.'''
[user@xxx test]$ ls conf/openvz
config
[user@xxx test]$ cat conf/openvz/config
OSTEMPLATE="pptp-server"
DEVNODES="/dev/ppp:rw "
 
== Создание собственного шаблона ==


'''Контейнер''' - это готовая к работе виртуальная машина под управлением одного из гипервизоров.
=== Утилита {{prg|mkve-template}} ===
Если вы собираетесь писать новый шаблон, то вы можете воспользоваться утилитой
{{prg|mkve-template}}. Ее задачи и синтаксис очень просты: команда
$ mkve-template --hypervisor ''гипервизор'' ''шаблон''
создаст директорию ''шаблон'' и поместит в ней скелет шаблона для указанного ''гипервизора''.
Если вы правильно прочитаете [[#Пакеты ve-*|следующую секцию]], то вам останется добавить
в шаблон только [[#Файл hooks-lists/гипервизор|хуки]],
и [[#Директория conf/гипервизор/|дополнительные конфиги]].


'''Bundle''' - это набор данных и метаданных определенного формата для автоматического создания контейнеров средствами {{prg|mkve}}.
'''Пример.'''
[user@xxx ~]$ mkve-template --hypervisor openvz /tmp/test
[user@xxx ~]$ find /tmp/test
/tmp/test
/tmp/test/packages-lists
/tmp/test/packages-lists/openvz
/tmp/test/versions
/tmp/test/versions/openvz
/tmp/test/hypervisors
[user@xxx ~]$ cat /tmp/test/hypervisors
openvz
[user@xxx ~]$ cat /tmp/test/versions/openvz
template_version=0.01
[user@xxx ~]$ cat /tmp/test/packages-lists/openvz
ve-test
ve-hypervisor-openvz
 
=== Пакеты ve-* ===


'''Шаблон''' - это набор данных определенного формата для автоматического создания bundle'ов средствами {{prg|mkve-bundle}}.
Эти пакеты предназначены для создания bundle или контейнеров.
Они не содержат ни одного файла, но вытягивают указанные в них
пакеты по зависимостям. Имеется два типа таких пакетов.


=== Workflow ===
Первый тип составляют пакеты {{pkg|ve-''сервис''}}. Они определяют
множество пакетов, необходимое для создания контейнера, предоставляющего
''сервис''. Например, пакет {{pkg|ve-ftp-server}} вытягивает множество
пакетов, необходимое для поднятия ftp-сервера в виртуальной машине.


Нашей конечной целью является создание bundle.
Второй тип составляют пакеты {{pkg|ve-hypervisor-''гипервизор''}}. Они определяют
дополнительное множество пакетов, необходимое для запуска сервиса под конкретным
типом виртуализации. Если дополнительных пакетов не требуется (как, например,
в случае OpenVZ), то вытягиваемое множество пакетов может оказаться и пустым.


Для создания bundle средствами программы {{prg|mkve-bundle}} необходимо подготовить шаблон формата [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D1.82_.D0.BD.D0.B0.D1.82.D0.B8.D0.B2.D0.BD.D0.BE.D0.B3.D0.BE_.D1.88.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD.D0.B0_.D0.B4.D0.BB.D1.8F_mkve-bundle]. Дальнейшая процедура очень проста и полностью описана в [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_bundle_.D1.81_.D0.BF.D0.BE.D0.BC.D0.BE.D1.89.D1.8C.D1.8E_mkve-bundle]. Можно также посмотреть примеры [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B].
Таким образом, множество пакетов, требуемых для поднятия ''сервиса'' на виртуальной
машине под управлением ''гипервизора'' определяется "суммой"
{{pkg|ve-''сервис''}} "+" {{pkg|ve-hypervisor-''гипервизор''}}.


Для тех, кому необходимо создавать bundle своими средствами, его формат описан в [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D1.82_bundle].
При такой договоренности содержимое файла [[#Файл packages-lists/гипервизор|{{path|packages-lists/''гипервизор''}}]]
для [[#Формат нативного шаблона для mkve-bundle|шаблона {{prg|mkve-bundle}}]] становится очень простым:
$ cat packages-lists/''гипервизор''
ve-''сервис''
ve-hypervisor-''гипервизор''
Утилита [[#Утилита mkve-template|{{prg|mkve-template}}]] создает именно такой файл.


== Формат нативного шаблона для {{prg|mkve-bundle}} ==
Вот полный список файлов для гипервизора hypervisor:
./version                    # версия шаблона
./packages/$hypervisor      # файл со списком пакетов, устанавливающихся в bundle
                              # при использовании гипервизора $hypervisor
./hooks-lists/$hypervisor    # [необ.] файл со списком хуков для гипервизора $hypervisor
./conf/$hypervisor/          # [необ.] директория, содержащая дополнительные файлы для упаковки
                              # в bundle для гипервизора $hypervisor
Таким образом, все, кроме версии зависит от типа виртуализации и единственным обязательным списком является список пакетов.


== Создание bundle с помощью {{prg|mkve-bundle}} ==
== Создание bundle с помощью {{prg|mkve-bundle}} ==
Строка 35: Строка 199:
Утилита {{prg|mkve-bundle}} используется следующим образом:
Утилита {{prg|mkve-bundle}} используется следующим образом:
  $ mkve-bundle [<опции>] <шаблон>
  $ mkve-bundle [<опции>] <шаблон>
Здесь {{term|<шаблон>}} - это либо путь к директории, содержащей шаблон [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D1.82_.D0.BD.D0.B0.D1.82.D0.B8.D0.B2.D0.BD.D0.BE.D0.B3.D0.BE_.D1.88.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD.D0.B0_.D0.B4.D0.BB.D1.8F_mkve-bundle], либо имя шаблона, содержащегося в директории {{path|/usr/share/mkve/templates}}.
Здесь {{term|<шаблон>}} это либо путь к директории, содержащей
[[#Формат нативного шаблона для mkve-bundle|шаблон]], либо имя
[[#Формат нативного шаблона для mkve-bundle|шаблона]],
содержащегося в директории {{path|/usr/share/mkve/templates}}.


Например, если у вас есть шаблон {{path|~/test}}, вы можете создать из него bundle следующим образом:
Например, если у вас есть шаблон {{path|~/test}}, то вы можете создать
  $ mkve-bundle $HOME/test
из него bundle следующим образом:
  $ mkve-bundle ~/test
А если вы установили свой шаблон в {{path|/usr/share/mkve/templates}}:
А если вы установили свой шаблон в {{path|/usr/share/mkve/templates}}:
  $ ls -d /usr/share/mkve/templates/test
  $ ls -d /usr/share/mkve/templates/test
Строка 45: Строка 213:
  $ mkve-bundle test
  $ mkve-bundle test


=== Опции ===
=== Обязательные параметры ===
 
==== Обязательные опции ====


Для нормальной работы mkve-bundle требует указания нескольких опций. Следующие две опции обязательны:
Для нормальной работы mkve-bundle требует указания нескольких опций. Следующие две опции обязательны:


;--hypervisor <гипервизор>: для какого гипервизора собирается bundle
;--hypervisor ''гипервизор'': для какого ''гипервизора'' собирается bundle
;--output <путь>: в этот файл bundle и будет записан
;--output ''путь'': в этот файл bundle и будет записан


Например, команда
Например, команда
  mkve-bundle --hypervisor openvz --output /tmp/test.bun ~/templates/test
  mkve-bundle --hypervisor openvz --output /tmp/test.bun ~/templates/test
соберет bundle из шаблона {{path|~/templates/test}} для гипервизора openvz и запишет его в файл {{path|/tmp/test.bun}}.
соберет bundle из шаблона {{path|~/templates/test}} для гипервизора openvz
и запишет его в файл {{path|/tmp/test.bun}}.


Обязательные опции могут быть указаны также и в конфигурационном файле [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB].
Обязательные опции могут быть указаны не только в командной строке,
но также и в [[#Конфигурационный файл|конфигурационном файле]].


==== Необязательные опции ====
=== Необязательные параметры ===


Следующие опции не являются обязательными:
Следующие опции не являются обязательными:
;--hooks <директория>: искать хуки [] в указанной директории. Эта опция по умолчанию равна {{path|/usr/share/mkve/hooks}}
;--hooks ''директория'': искать [[#Файл hooks-lists/гипервизор|хуки]] в указанной ''директории''. Значение этой опции по умолчанию равно {{path|/usr/share/mkve/hooks}}.
;--force-no-sign: ''не'' подписывать файл с метаинформацией
;--force-no-sign: ''не'' подписывать файл с метаинформацией


Строка 84: Строка 252:
мы соберем bundle из шаблона <template> для гипервизора openvz.
мы соберем bundle из шаблона <template> для гипервизора openvz.


Этот конфиг заодно является программой на {{prg|bash}}, так что вы можете сделать и что-то вроде
Конфигурационный файл заодно является программой на {{prg|bash}},
так что вы можете сделать и что-то вроде
  $ cat ~/.mkve/bundle-config
  $ cat ~/.mkve/bundle-config
  hypervisor=openvz
  hypervisor=openvz
Строка 91: Строка 260:
  output=~/bundles/mkve-bundle-$(date +%d%m%y).bun
  output=~/bundles/mkve-bundle-$(date +%d%m%y).bun


 
==== Пример: запуск {{prg|mkve-bundle}} при разработке шаблона ====
 
== Примеры ==
 
=== Сборка bundle из готового шаблона ===
Для того чтобы собрать bundle из готового шаблона {{term|<template>}}, необходимо выполнить следующие шаги:
* Убедиться, что вы можете собирать пакеты с помощью [[Hasher]]
* Установить пакет {{pkg|mkve}}
* Запустить команду
$ mkve-bundle --output <output> --hypervisor <hypervisor> <template>
 
=== Запуск {{prg|mkve-bundle}} при разработке шаблона ===
Представим, что нам хочется разработать шаблон ''template'', из которого должен собираться bundle для гипервизора openvz.
Представим, что нам хочется разработать шаблон ''template'', из которого должен собираться bundle для гипервизора openvz.


С хорошей вероятностью, при разработке шаблона нам не раз захочется запускать команду
С хорошей вероятностью, при разработке шаблона нам не раз захочется запускать команду
  mkve-bundle --hypervisor openvz --out /tmp/''template''.bun ~/packages/''template''
  mkve-bundle --hypervisor openvz --out /tmp/''template''.bun ~/packages/''template''
Для ускорения процесса нужно использовать конфигурационный файл [http://www.altlinux.org/CoreSystem/Virtualization/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_bundle#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB] следующего вида:
Для ускорения процесса нужно использовать [[#Конфигурационный файл|конфигурационный файл]] следующего вида:
  $ cat ~/.mkve/bundle-config
  $ cat ~/.mkve/bundle-config
  template=~/packages/''template''
  template=~/packages/''template''
Строка 118: Строка 276:
  $ mkve-bundle
  $ mkve-bundle


== Создание bundle/контейнеров собственными силами ==
== Формат bundle ==
 
== Утилита mkve-cache ==
=== Формат bundle ===
Эта утилита позволяет создать и упаковать
 
=== Пакеты ve-* ===
 
Эти пакеты предназначены для создания контейнеров. Они не содержат ни одного
файла, но вытягивают указанные в них пакеты по зависимостям. Имеется два типа
таких пакетов.
 
Первый тип составляют пакеты {{pkg|ve-<name>}}. Они определяют множество пакетов,
необходимое для создания контейнера для "сервиса" {{pkg|<name>}}. Например,
пакет {{pkg|ve-ftp-server}} вытягивает множество пакетов, необходимое для поднятия
ftp-сервера на "работающей" виртуальной машине.
 
Второй тип составляют пакеты {{pkg|ve-hypervisor-<hypervisor>}}. Они определяют
дополнительное множество пакетов, необходимое для запуска сервиса под конкретным
типом виртуализации. Этот пакет может оказаться и "пустым", если дополнительных
пакетов не требуется (как, например, в случае OpenVZ).
 
Таким образом, множество пакетов, требуемых для поднятия сервиса {{term|<service>}}
на виртуальной машине под управлением гипервизора {{term|<hypervisor>}} определяется
"суммой" {{pkg|ve-<service>}} + {{pkg|ve-hypervisor-<hypervisor>}}.
 
=== Утилита mkve-cache (aka hsh-?) ===
Для тех, кто привык не надеяться ни на кого, кроме себя и {{prg|hasher}}'а,
имеется утилита {{prg|mkve-cache}}. Эта утилита позволяет создать и упаковать
hasher'овский chroot с нужным набором пакетов. Кроме этого, при создании chroot
hasher'овский chroot с нужным набором пакетов. Кроме этого, при создании chroot
можно запускать хуки, команды и копировать файлы из host'а в chroot. Подробное описание
можно запускать хуки, команды и копировать в chroot файлы.
см. в {{term|mkve(1)}}.


'''Пример 1.'''
'''Пример 1.'''
  $ mkve-cache --out <file> <список пакетов>
  $ mkve-cache --out ''файл'' ''пакеты''
установит в дефолтный {{prg|hasher}}'овский chroot пакеты {{term|<список пакетов>}},
установит в дефолтный {{prg|hasher}}'овский chroot ''пакеты'' и после этого
и после этого запакует содержимое chroot'а в файл {{term|<file>}}.
запакует содержимое chroot'а в ''файл''.


'''Пример 2.'''
'''Пример 2.'''
  $ mkve-cache --out <file> --command 'chkconfig sshd on' <список пакетов>
  $ mkve-cache --out ''файл'' --command 'chkconfig sshd on' ''пакеты''
установит в дефолтный {{prg|hasher}}'овский chroot пакеты {{term|<список пакетов>}},
установит в дефолтный {{prg|hasher}}'овский chroot ''пакеты'',
запустит в chroot'е команду
запустит в chroot'е команду
  chkconfig sshd on
  chkconfig sshd on
и после этого запакует содержимое chroot'а в файл {{term|<file>}}.
и после этого запакует содержимое chroot'а в ''файл''.


'''Пример 3.'''
'''Пример 3.'''
  $ mkve-cache -z --tarify-only <путь к hasher'овскому chroot'у>
  $ mkve-cache -z --tarify-only ''путь к hasher'овскому chroot'у''
просто запакует указанный chroot в файл {{path|$TMPDIR/output.tar.gz}}.
просто запакует указанный chroot в файл {{path|$TMPDIR/output.tar.gz}}.


[[Категория:CoreSystem]]
[[Категория:CoreSystem]]

Текущая версия от 19:50, 6 августа 2015

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.
Small-pyramides.png
Архивная информация.
Описываемые в этой статье вещи больше не используются и оставлены только для обратной совместимости.


Определения и workflow

Внимание! Похоже что mkve устарела, и для создания контейнеров сейчас правильнее использовать mkimage-profiles (см. примеры использования для OpenVZ VE и Qemu VM)


Определения

Слово гипервизор является синонимом понятия «тип виртуализации». Так мы говорим о гипервизорах openvz, qemu, kvm и т. д.

  • Контейнер — это готовая к работе виртуальная машина под управлением одного из гипервизоров.
  • Bundle — это набор данных и метаданных определённого формата для автоматического создания контейнеров средствами mkve.
  • Шаблон — это набор данных определённого формата для автоматического создания bundle’ов средствами mkve-bundle.

Workflow

Нашей конечной целью является создание bundle.

Для создания bundle средствами программы mkve-bundle для начала необходимо подготовить соответствующий шаблон.

Для тех же, кому необходимо создавать bundle своими собственными средствами, приводится описание его формата.

Формат нативного шаблона для mkve-bundle

Для создания шаблона для программы mkve-bundle необходимо подготовить директорию определенного вида и содержания. Вот полный список файлов, которые могут (но не обязательно должны) содержаться в шаблоне:

hypervisors
versions/гипервизор
vendor/гипервизор
license/гипервизор
packages-lists/гипервизор
hooks-lists/гипервизор
hooks/*
conf/гипервизор/

(здесь и далее гипервизор пробегает все значения, указанные в файле hypervisors). Мы подробно опишем это дерево в последующих секциях.

Файл hypervisors

В первую очередь надо представить файл hypervisors. Этот файл содержит список поддерживаемых шаблоном гипервизоров, т.е. гипервизоров, для которых можно собрать bundle из данного шаблона.

Две записи разделяются символом новой строки:

[user@xxx test]$ cat hypervisors 
openvz
qemu

Файл versions/гипервизор

В папке versions хранится файл versions/гипервизор. В этом файле указана версия шаблона для гипервизора гипервизор.

Пример.

[user@xxx test]$ cat versions/openvz 
template_version=0.02

Файл vendor/гипервизор

Этот файл служит для указания конторы, создавшей bundle из шаблона.

Пример.

[user@xxx test]$ cat vendor/openvz 
vendor="ALT Linux"

Файл license/гипервизор

В этом файле может содержаться текст лицензии, под которой распространяется собранный из шаблона bundle.

Пример.

[user@xxx test]$ cat license/openvz 
[aspsk@localhost bin]$ head -7 license/openvz
                  GNU GENERAL PUBLIC LICENSE
                     Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.


Файл packages-lists/гипервизор

В папке packages-lists/ хранится в каком-то смысле главный файл в шаблоне — packages-lists/гипервизор. Этот файл содержит список пакетов, которые будут установлены в bundle. (См. также секцию Пакеты ve-*.)

Пример.

[user@xxx test]$ cat packages-lists/openvz 
ve-pptp-server
alterator-net-eth
alterator-root
alterator-users
alterator-auth

Файл hooks-lists/гипервизор

В папке hooks-lists/ может находиться файл hooks-lists/гипервизор. Этот файл содержит список хуков, т.е. программ, которые будут запущены "внутри bundle" после установки пакетов.

Программа mkve-bundle по умолчанию будет искать хуки сначала в директории hooks/, а затем в директории, указанной ей параметром --hooks (равным по умолчанию /usr/share/mkve/hooks).

Пример.

[user@xxx test]$ cat hooks-lists/openvz 
very-simple-hook
01-root
02-mtab
03-chkconfig_network_on
03-chkconfig_syslogd_on
03-chkconfig_random_on
03-chkconfig_pptpd_on
03-chkconfig_rawdevices_off
03-chkconfig_fbsetfont_off

Директория hooks/*

В этой директории, программа mkve-bundle будет в первую очередь искать хуки. Здесь можно, например, переписать дефолтные хуки или добавить хуки, нужные только для этого конкретного шаблона. Все хуки должны быть исполняемыми файлами.

Пример.

[user@xxx test]$ ls -F hooks/
very-simple-hook*
[user@people test]$ cat hooks/very-simple-hook 
#! /bin/sh
echo 'волки рыщут - пищу ищут!'


Директория conf/гипервизор/

В некоторых случаях в bundle хочется упаковать дополнительные файлы конфигурации, которые будут использоваться при создании контейнера. Эти файлы необходимо поместить в директорию conf/гипервизор/.

Частный случай: conf/openvz/

Для гипервизора openvz в папку conf/openvz/ можно добавить файл config. В этом файле в формате, описанном в vps.conf(5) можно перечислить дефолтные для данного контейнера значения, в частности дисковые квоты и остальные beancounters.

Пример.

[user@xxx test]$ ls conf/openvz
config
[user@xxx test]$ cat conf/openvz/config 
OSTEMPLATE="pptp-server"
DEVNODES="/dev/ppp:rw "

Создание собственного шаблона

Утилита mkve-template

Если вы собираетесь писать новый шаблон, то вы можете воспользоваться утилитой mkve-template. Ее задачи и синтаксис очень просты: команда

$ mkve-template --hypervisor гипервизор шаблон

создаст директорию шаблон и поместит в ней скелет шаблона для указанного гипервизора. Если вы правильно прочитаете следующую секцию, то вам останется добавить в шаблон только хуки, и дополнительные конфиги.

Пример.

[user@xxx ~]$ mkve-template --hypervisor openvz /tmp/test
[user@xxx ~]$ find /tmp/test
/tmp/test
/tmp/test/packages-lists
/tmp/test/packages-lists/openvz
/tmp/test/versions
/tmp/test/versions/openvz
/tmp/test/hypervisors
[user@xxx ~]$ cat /tmp/test/hypervisors
openvz
[user@xxx ~]$ cat /tmp/test/versions/openvz
template_version=0.01
[user@xxx ~]$ cat /tmp/test/packages-lists/openvz
ve-test
ve-hypervisor-openvz

Пакеты ve-*

Эти пакеты предназначены для создания bundle или контейнеров. Они не содержат ни одного файла, но вытягивают указанные в них пакеты по зависимостям. Имеется два типа таких пакетов.

Первый тип составляют пакеты ve-сервис. Они определяют множество пакетов, необходимое для создания контейнера, предоставляющего сервис. Например, пакет ve-ftp-server вытягивает множество пакетов, необходимое для поднятия ftp-сервера в виртуальной машине.

Второй тип составляют пакеты ve-hypervisor-гипервизор. Они определяют дополнительное множество пакетов, необходимое для запуска сервиса под конкретным типом виртуализации. Если дополнительных пакетов не требуется (как, например, в случае OpenVZ), то вытягиваемое множество пакетов может оказаться и пустым.

Таким образом, множество пакетов, требуемых для поднятия сервиса на виртуальной машине под управлением гипервизора определяется "суммой"

ve-сервис "+" ve-hypervisor-гипервизор.

При такой договоренности содержимое файла packages-lists/гипервизор для шаблона mkve-bundle становится очень простым:

$ cat packages-lists/гипервизор
ve-сервис
ve-hypervisor-гипервизор

Утилита mkve-template создает именно такой файл.


Создание bundle с помощью mkve-bundle

Знакомство

Утилита mkve-bundle используется следующим образом:

$ mkve-bundle [<опции>] <шаблон>

Здесь <шаблон> — это либо путь к директории, содержащей шаблон, либо имя шаблона, содержащегося в директории /usr/share/mkve/templates.

Например, если у вас есть шаблон ~/test, то вы можете создать из него bundle следующим образом:

$ mkve-bundle ~/test

А если вы установили свой шаблон в /usr/share/mkve/templates:

$ ls -d /usr/share/mkve/templates/test
/usr/share/mkve/templates/test

то вы можете сказать просто

$ mkve-bundle test

Обязательные параметры

Для нормальной работы mkve-bundle требует указания нескольких опций. Следующие две опции обязательны:

--hypervisor гипервизор
для какого гипервизора собирается bundle
--output путь
в этот файл bundle и будет записан

Например, команда

mkve-bundle --hypervisor openvz --output /tmp/test.bun ~/templates/test

соберет bundle из шаблона ~/templates/test для гипервизора openvz и запишет его в файл /tmp/test.bun.

Обязательные опции могут быть указаны не только в командной строке, но также и в конфигурационном файле.

Необязательные параметры

Следующие опции не являются обязательными:

--hooks директория
искать хуки в указанной директории. Значение этой опции по умолчанию равно /usr/share/mkve/hooks.
--force-no-sign
не подписывать файл с метаинформацией

Конфигурационный файл

Для того чтобы не указывать все время одни и те же опции, можно запомнить их значения в конфигурационном файле ~/.mkve/bundle-config. Для того, чтобы определить опцию с именем name нужно задать в этом файле переменную с именем name. Например, в конфиге

$ cat ~/.mkve/bundle-config
hypervisor=openvz
verbose=yes
force_no_sign=yes

мы сообщили программе mkve-bundle, что

  • в качестве гипервизора по умолчанию нужно использовать openvz
  • мы хотим иметь более подробный отчет
  • мы не хотим подписывать создаваемый bundle (например, при разработке)

Заметьте, что что минусы в имени опции --force-no-sign в конфиге превратились в знаки подчеркивания.

Теперь с помощью команды

$ mkve-bundle --output <output> <template>

мы соберем bundle из шаблона <template> для гипервизора openvz.

Конфигурационный файл заодно является программой на bash, так что вы можете сделать и что-то вроде

$ cat ~/.mkve/bundle-config
hypervisor=openvz

mkdir -p ~/bundles
output=~/bundles/mkve-bundle-$(date +%d%m%y).bun

Пример: запуск mkve-bundle при разработке шаблона

Представим, что нам хочется разработать шаблон template, из которого должен собираться bundle для гипервизора openvz.

С хорошей вероятностью, при разработке шаблона нам не раз захочется запускать команду

mkve-bundle --hypervisor openvz --out /tmp/template.bun ~/packages/template

Для ускорения процесса нужно использовать конфигурационный файл следующего вида:

$ cat ~/.mkve/bundle-config
template=~/packages/template
hypervisor=openvz
output=/tmp/template.bun

verbose=yes        # нам интересно знать почему сборка падает
force_no_sign=yes  # и мы не хотим каждый раз вбивать пароль

Теперь мы можем собирать наш bundle с помощью очень простой команды

$ mkve-bundle

Формат bundle

Утилита mkve-cache

Эта утилита позволяет создать и упаковать hasher'овский chroot с нужным набором пакетов. Кроме этого, при создании chroot можно запускать хуки, команды и копировать в chroot файлы.

Пример 1.

$ mkve-cache --out файл пакеты

установит в дефолтный hasher'овский chroot пакеты и после этого запакует содержимое chroot'а в файл.

Пример 2.

$ mkve-cache --out файл --command 'chkconfig sshd on' пакеты

установит в дефолтный hasher'овский chroot пакеты, запустит в chroot'е команду

chkconfig sshd on

и после этого запакует содержимое chroot'а в файл.

Пример 3.

$ mkve-cache -z --tarify-only путь к hasher'овскому chroot'у

просто запакует указанный chroot в файл $TMPDIR/output.tar.gz.