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

Материал из ALT Linux Wiki
({{Historical}}: Похоже что mkve устарела, и для создания контейнеров сейчас правильнее использовать mkimage-profiles)
 
(не показано 9 промежуточных версий 4 участников)
Строка 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]])}}


=== Определения ===
=== Определения ===
Строка 24: Строка 25:
  [[#Файл hypervisors|hypervisors]]
  [[#Файл hypervisors|hypervisors]]
  [[#Файл versions/гипервизор|versions/''гипервизор'']]
  [[#Файл versions/гипервизор|versions/''гипервизор'']]
[[#Файл vendor/гипервизор|vendor/''гипервизор'']]
[[#Файл license/гипервизор|license/''гипервизор'']]
  [[#Файл packages-lists/гипервизор|packages-lists/''гипервизор'']]
  [[#Файл packages-lists/гипервизор|packages-lists/''гипервизор'']]
  [[#Файл hooks-lists/гипервизор|hooks-lists/''гипервизор'']]
  [[#Файл hooks-lists/гипервизор|hooks-lists/''гипервизор'']]
  [[#Папка hooks/*|hooks/*]]
  [[#Директория hooks/*|hooks/*]]
  [[#Папка conf/гипервизор/|conf/''гипервизор''/]]
  [[#Директория conf/гипервизор/|conf/''гипервизор''/]]
(здесь и далее ''гипервизор'' пробегает все значения, указанные в [[#Файл hypervisors|файле {{path|hypervisors}}]]).
(здесь и далее ''гипервизор'' пробегает все значения, указанные в [[#Файл hypervisors|файле {{path|hypervisors}}]]).
Мы подробно опишем это дерево в последующих секциях.
Мы подробно опишем это дерево в последующих секциях.
Строка 48: Строка 51:
  [user@xxx test]$ cat versions/openvz  
  [user@xxx test]$ cat versions/openvz  
  template_version=0.02
  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/''гипервизор''}} ===
Строка 67: Строка 93:
после установки пакетов.
после установки пакетов.


Программа {{prg|mkve-bundle}} по умолчанию будет искать хуки сначала в [[#Папка hooks/*|директории {{path|hooks/}}]],
Программа {{prg|mkve-bundle}} по умолчанию будет искать хуки сначала в [[#Директория hooks/*|директории {{path|hooks/}}]],
а затем в директории, указанной ей параметром {{term|--hooks}} (равным по умолчанию {{path|/usr/share/mkve/hooks}}).
а затем в директории, указанной ей параметром {{term|--hooks}} (равным по умолчанию {{path|/usr/share/mkve/hooks}}).


Строка 82: Строка 108:
  03-chkconfig_fbsetfont_off
  03-chkconfig_fbsetfont_off


=== Папка hooks/* ===
=== Директория hooks/* ===
Это папка, в которой программа {{prg|mkve-bundle}} будет в первую очередь искать хуки.
В этой директории, программа {{prg|mkve-bundle}} будет в первую очередь искать хуки.
Здесь можно, например, переписать дефолтные хуки или добавить хуки, нужные только для
Здесь можно, например, переписать дефолтные хуки или добавить хуки, нужные только для
этого конкретного шаблона. Все хуки должны быть исполняемыми файлами.
этого конкретного шаблона. Все хуки должны быть исполняемыми файлами.
Строка 95: Строка 121:




=== Папка {{path|conf/''гипервизор''/}} ===
=== Директория {{path|conf/''гипервизор''/}} ===
В некоторых случаях в bundle хочется упаковать дополнительные файлы конфигурации,
В некоторых случаях в bundle хочется упаковать дополнительные файлы конфигурации,
которые будут использоваться при создании контейнера. Эти файлы необходимо поместить
которые будут использоваться при создании контейнера. Эти файлы необходимо поместить
в папку [[#Папка conf/гипервизор/|{{path|conf/''гипервизор''/}}]].
в директорию [[#Директория conf/гипервизор/|{{path|conf/''гипервизор''/}}]].


==== Частный случай: {{path|conf/openvz/}} ====
==== Частный случай: {{path|conf/openvz/}} ====
Для гипервизора openvz в папку {{path|conf/openvz/}} можно добавить файл {{path|config}}.
Для гипервизора openvz в папку {{path|conf/openvz/}} можно добавить файл {{path|config}}.
В этом файле в формате {{term|vps.conf(5)}} можно перечислить дефолтные для данного
В этом файле в формате, описанном в [http://openvz.org/documentation/mans/vps.conf.5 {{term|vps.conf(5)}}]
контейнера значения.
можно перечислить дефолтные для данного контейнера значения, в частности дисковые квоты и остальные
beancounters.


'''Пример.'''
'''Пример.'''
Строка 111: Строка 138:
  OSTEMPLATE="pptp-server"
  OSTEMPLATE="pptp-server"
  DEVNODES="/dev/ppp:rw "
  DEVNODES="/dev/ppp:rw "
== Создание собственного шаблона ==
=== Утилита {{prg|mkve-template}} ===
Если вы собираетесь писать новый шаблон, то вы можете воспользоваться утилитой
{{prg|mkve-template}}. Ее задачи и синтаксис очень просты: команда
$ mkve-template --hypervisor ''гипервизор'' ''шаблон''
создаст директорию ''шаблон'' и поместит в ней скелет шаблона для указанного ''гипервизора''.
Если вы правильно прочитаете [[#Пакеты ve-*|следующую секцию]], то вам останется добавить
в шаблон только [[#Файл hooks-lists/гипервизор|хуки]],
и [[#Директория conf/гипервизор/|дополнительные конфиги]].
'''Пример.'''
[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 или контейнеров.
Они не содержат ни одного файла, но вытягивают указанные в них
пакеты по зависимостям. Имеется два типа таких пакетов.
Первый тип составляют пакеты {{pkg|ve-''сервис''}}. Они определяют
множество пакетов, необходимое для создания контейнера, предоставляющего
''сервис''. Например, пакет {{pkg|ve-ftp-server}} вытягивает множество
пакетов, необходимое для поднятия ftp-сервера в виртуальной машине.
Второй тип составляют пакеты {{pkg|ve-hypervisor-''гипервизор''}}. Они определяют
дополнительное множество пакетов, необходимое для запуска сервиса под конкретным
типом виртуализации. Если дополнительных пакетов не требуется (как, например,
в случае OpenVZ), то вытягиваемое множество пакетов может оказаться и пустым.
Таким образом, множество пакетов, требуемых для поднятия ''сервиса'' на виртуальной
машине под управлением ''гипервизора'' определяется "суммой"
{{pkg|ve-''сервис''}} "+" {{pkg|ve-hypervisor-''гипервизор''}}.
При такой договоренности содержимое файла [[#Файл packages-lists/гипервизор|{{path|packages-lists/''гипервизор''}}]]
для [[#Формат нативного шаблона для mkve-bundle|шаблона {{prg|mkve-bundle}}]] становится очень простым:
$ cat packages-lists/''гипервизор''
ve-''сервис''
ve-hypervisor-''гипервизор''
Утилита [[#Утилита mkve-template|{{prg|mkve-template}}]] создает именно такой файл.


== Создание bundle с помощью {{prg|mkve-bundle}} ==
== Создание bundle с помощью {{prg|mkve-bundle}} ==
Строка 192: Строка 275:
Теперь мы можем собирать наш bundle с помощью очень простой команды
Теперь мы можем собирать наш bundle с помощью очень простой команды
  $ mkve-bundle
  $ mkve-bundle
== Создание собственного шаблона ==
=== Пакеты ve-* ===
Эти пакеты предназначены для создания bundle или контейнеров.
Они не содержат ни одного файла, но вытягивают указанные в них
пакеты по зависимостям. Имеется два типа таких пакетов.
Первый тип составляют пакеты {{pkg|ve-''сервис''}}. Они определяют
множество пакетов, необходимое для создания контейнера, предоставляющего
''сервис''. Например, пакет {{pkg|ve-ftp-server}} вытягивает множество
пакетов, необходимое для поднятия ftp-сервера в виртуальной машине.
Второй тип составляют пакеты {{pkg|ve-hypervisor-''гипервизор''}}. Они определяют
дополнительное множество пакетов, необходимое для запуска сервиса под конкретным
типом виртуализации. Если дополнительных пакетов не требуется (как, например,
в случае OpenVZ), то вытягиваемое множество пакетов может оказаться и пустым.
Таким образом, множество пакетов, требуемых для поднятия ''сервиса'' на виртуальной
машине под управлением ''гипервизора'' определяется "суммой"
{{pkg|ve-''сервис''}} "+" {{pkg|ve-hypervisor-''гипервизор''}}.
При такой договоренности содержимое файла [[#Файл packages-lists/гипервизор|{{path|packages-lists/''гипервизор''}}]]
для [[#Формат нативного шаблона для mkve-bundle|шаблона {{prg|mkve-bundle}}]] становится очень простым:
$ cat packages-lists/''гипервизор''
ve-''сервис''
ve-hypervisor-''гипервизор''


== Формат bundle ==
== Формат bundle ==
== Утилита hsh-tarify ==
== Утилита mkve-cache ==
Для тех, кто привык не надеяться ни на кого, кроме себя и {{prg|hasher}}'а,
Эта утилита позволяет создать и упаковать
имеется утилита {{prg|hsh-tarify}}. Эта утилита позволяет создать и упаковать
hasher'овский chroot с нужным набором пакетов. Кроме этого, при создании chroot
hasher'овский chroot с нужным набором пакетов. Кроме этого, при создании chroot
можно запускать хуки, команды и копировать в chroot файлы.
можно запускать хуки, команды и копировать в chroot файлы.


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


'''Пример 2.'''
'''Пример 2.'''
  $ hsh-tarify --out ''файл'' --command 'chkconfig sshd on' ''пакеты''
  $ mkve-cache --out ''файл'' --command 'chkconfig sshd on' ''пакеты''
установит в дефолтный {{prg|hasher}}'овский chroot ''пакеты'',
установит в дефолтный {{prg|hasher}}'овский chroot ''пакеты'',
запустит в chroot'е команду
запустит в chroot'е команду
Строка 245: Строка 295:


'''Пример 3.'''
'''Пример 3.'''
  $ hsh-tarify -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.