|
|
содержание .. 3 4 5
Виртуализация
Оборудо
М
инимал
Ре
оменду
Примечания
Память
1 ГБ
4 ГБ
Дополнительная память позволит
выполнять больше гостевых образов,
большего размера
Диск
5400 об/
7200 об/
Узлы Eucalyptus интенсивно используют
мин IDE
мин SATA
диск; задержки операций ввода/вывода
или SCSI
скорее всего создадут проблемы
производительности
Дисковое
40 ГБ
100 ГБ
Образы будут кешированы локально;
пространство
Eucalyptus не любит нехватки дискового
пространства
Работа в
100
1000 Мбит/
Размер образов машин измеряется
сети
Мбит/с
с
сотнями мегабайт, и эти образы нужно
будет копировать по сети на узлы
3.3. Установка интерфейсного сервера облака/кластера/
хранения/Walrus
1. Скачайте образ диска Ubuntu 12.04 LTS Server и запишите его на
компакт-диск.
2. Во время загрузки, выберите Установить Ubuntu облако для
предприятий. Программа установки проверит наличие компонентов
Eucalyptus
3. Затем вы сможете выбрать компоненты, которые будут установлены,
основываясь на выбранной вами топологии15
4. Когда вам будет задан вопрос, хотите ли вы установить Кластер или
Узел, выберите Кластер
5. Во время установки вам будет задано ещё два вопроса относительно
облака
• Название вашего кластера
• например cluster1.
• Диапазон IP-адресов в локальной сети, которые облако может
назначать экземплярам
• например 192.168.1.200-192.168.1.249.
3.4. Установка контроллера узла(ов)
Установка контроллера узла даже проще. Просто убедитесь, что вы
подключены к сети, в которой уже работает контроллер облака/кластера
15
376
Виртуализация
1. Загрузитесь с того же образа на узле (узлах)
2. Когда загружаетесь, выберите “Установка Ubuntu облака для
предприятия”.
3. Выберите “Установка Ubuntu облака для предприятия”
4. Кластер будет обнаружен и будет выбран тип установки “Узел”
5. Подтвердите схему разделов
6. Остаток установки не требует вмешательства; завершите установку и
перезагрузите узел
3.5. Зарегистрируйте узел(ы)
1. Узлы - это системы внутри UEC, которые фактически выполняют
виртуальные экземпляры облака
Регистрация всех компонентов должна быть автоматической,
предполагающей:
a. Открытые ключи SSH были обменены правильно.
b. Сервисы сконфигурированы правильно
c. Соответствующий uec-component-listener выполняется.
d. Проверьте Регистрацию.
Шаги с a до e будут требоваться только если вы используете
метод UEC/PackageInstall16. В противоположном случае, если вы
следуете этому руководству, эти шаги уже должны быть выполнены
автоматически для вас, и соответственно вы можете пропустить с "a"
до "e".
2. Обменяйте публичные ключи
Пользователю контроллера облака eucalyptus нужен SSH доступ к
контроллеру Walrus, контроллеру кластера, и контроллеру хранения,
как пользователь eucalyptus.
Установите пользовательский публичный ssh ключ контроллера облака:
• На текущем контроллере временно установите пароль для
пользователя eucalyptus:
sudo passwd eucalyptus
• Затем, на контроллере облака:
16
377
Виртуализация
sudo -u eucalyptus ssh-copy-id -i ~eucalyptus/.ssh/id_rsa.pub \ eucalyptus@<IP_OF_NODE>
• Теперь, при желании, вы можете удалить пароль учётной записи
eucalyptus на данном контроллере:
sudo passwd -d eucalyptus
3.
Конфигурирование служб
На контроллере облака:
• Для регистрации контроллера кластера:
• Задайте переменную окружения CC_NAME в /etc/eucalyptus/eucalyptus-
cc.conf
• Задайте переменную окружения CC_IP_ADDR в /etc/eucalyptus/
eucalyptus-ipaddr.conf в виде списка одного или более IP-адресов,
разделённых пробелами
• Для регистрации контроллера Walrus:
• Задайте переменную окружения WALRUS_IP_ADDR в /etc/eucalyptus/
eucalyptus-ipaddr.conf в виде одного IP-адреса
На контроллере кластера:
• Для регистрации контроллера хранения:
• Задайте переменную окружения CC_NAME в /etc/eucalyptus/eucalyptus-
cc.conf
• Задайте переменную окружения SC_IP_ADDR в /etc/eucalyptus/
eucalyptus-ipaddr.conf в виде одного или более IP-адресов,
разделённых пробелами
4.
Публикация
Теперь запустите службы публикаций
• Контроллер Walrus:
sudo start eucalyptus-walrus-publication
• Контроллер кластера:
sudo start eucalyptus-cc-publication
• Контроллер хранения:
sudo start eucalyptus-sc-publication
• Контроллер узла:
378
Виртуализация
sudo start eucalyptus-nc-publication
5. Запустите процесс прослушивания
На контроллере облака и контроллере кластера запустите:
sudo start uec-component-listener
6. Проверьте регистрацию
cat /var/log/eucalyptus/registration.log
2010-04-08 15:46:36-05:00 | 24243 -> Calling node cluster1 node 10.1.1.75
2010-04-08 15:46:36-05:00 | 24243 -> euca_conf --register-nodes returned 0
2010-04-08 15:48:47-05:00 | 25858 -> Calling walrus Walrus 10.1.1.71
2010-04-08 15:48:51-05:00 | 25858 -> euca_conf --register-walrus returned 0
2010-04-08 15:49:04-05:00 | 26237 -> Calling cluster cluster1 10.1.1.71
2010-04-08 15:49:08-05:00 | 26237 -> euca_conf --register-cluster returned 0
2010-04-08 15:49:17-05:00 | 26644 -> Calling storage cluster1 storage 10.1.1.71
2010-04-08 15:49:18-05:00 | 26644 -> euca_conf --register-sc returned 0
Строки на вашей машине могут отличаться от
вышеприведённого примера
3.6. Получение данных учётной записи
После установки и загрузки контроллера облака пользователям облака
нужно будет получить данные их учётных записей. Это может быть
сделано либо через веб-браузер, либо через командную строку.
3.6.1. В браузере
1. С помощью веб-браузера (удалённо или на вашем сервере Ubuntu)
откройте следующий URL-адрес:
Необходимо использовать соединение с шифрованием данных,
так что убедитесь, что в адресе веб-браузера вы используете
"https", а не "http". Вы получите предупреждение о сертификате
безопасности. Нужно будет добавить исключение для просмотра
страницы. Если вы не примете предупреждение, вы не сможете
просматривать страницу конфигурации Eucalyptus
2. Используйте имя пользователя 'admin' и пароль 'admin' для того, чтобы
войти в первый раз (вам будет предложено сменить пароль)
3. Затем следуйте инструкциям на экране для обновления пароля
пользователя admin и адреса электронной почты
379
Виртуализация
4. Как только процесс первичной конфигурации будет завершен, нажмите
на закладку "Данные учётной записи", расположенную в левой верхней
части экрана
5. Нажмите на кнопку 'Загрузить данные учётной записи' для получения
ваших сертификатов.
6. Сохраните их в ~/.euca.
7. Распакуйте скачанный zip-файл в безопасное место (~/.euca).
unzip -d ~/.euca mycreds.zip
3.6.2. В командной строке
• Также, если вы в командной строке на контроллере облака, вы можете
выполнить:
mkdir -p ~/.euca
chmod 700 ~/.euca
cd ~/.euca
sudo euca_conf --get-credentials mycreds.zip
unzip mycreds.zip
ln -s ~/.euca/eucarc ~/.eucarc
cd -
3.6.3. Извлечение и использование данных вашей учётной записи
Теперь вам нужно установить EC2 API и инструменты AMI на ваш сервер,
используя сертификаты X.509.
1. Установите требуемые инструменты пользователя облака:
sudo apt-get install euca2ools
2. Для того, чтобы убедиться, что все сработало правильно, получите
детали доступности локального кластера:
. ~/.euca/eucarc
euca-describe-availability-zones verbose
AVAILABILITYZONE
myowncloud
192.168.1.1
AVAILABILITYZONE
|- vm types
free / max
cpu
ram disk
AVAILABILITYZONE
|- m1.small
0004 / 0004
1
128
2
AVAILABILITYZONE
|- c1.medium
0004 / 0004
1
256
5
AVAILABILITYZONE
|- m1.large
0002 / 0002
2
512
10
AVAILABILITYZONE
|- m1.xlarge
0002 / 0002
2
1024
20
AVAILABILITYZONE
|- c1.xlarge
0001 / 0001
4
2048
20
Результаты выполнения указанной выше команды на вашей
системe могут отличаться.
380
Виртуализация
3.7. Установка образа из хранилища
Следующее является наиболее простым способом установки образа.
Конечно, более опытных пользователей может заинтересовать Bundle their
own image17.
Простейший способ добавить образ к UEC - это установить его из
хранилища образов в веб-интерфейсе UEC.
1. Доступ к веб-интерфейсу может быть получен по следующему URL (не
забудьте указать https):
2. Введите ваше имя пользователя и пароль (если требуется, так как вы,
возможно, авторизовались ранее).
3. Нажмите на закладку Хранилище.
4. Выберите из списка доступных образов тот, что вам нужен
5. Нажмите Установить для желаемого выбранного образа
Как только образ будет скачан и установлен, вы можете нажать на "Как
запустить?", которая будет отображена ниже кнопки с рисунком для
просмотра команды для выполнения запуска (старта) этого образа. Образ
также появится в списке на закладке "Образ".
3.8. Запуск образа
Есть несколько способов запустить образ в UEC:
• Использовать командную строку.
• Использовать один из совместимых с UEC инструментов управления,
таких как Landscape
• Использовать дополнение ElasticFox18 для Firefox.
Здесь мы опишем процесс запуска из командной строки:
1. Перед запуском экземпляра вашего образа, вы сначала должны создать
ключевую пару (ключ ssh), который вы можете использовать, чтобы
зайти как root, как только ваш экземпляр загрузится. Ключ будет
сохранён, так что вам это нужно будет сделать только один раз.
Выполните следующую команду:
17
18
381
Виртуализация
if [ ! -e ~/.euca/mykey.priv ]; then
mkdir -p -m 700 ~/.euca
touch ~/.euca/mykey.priv
chmod 0600 ~/.euca/mykey.priv
euca-add-keypair mykey > ~/.euca/mykey.priv
fi
Вы можете назвать ваш ключ как хотите (в этом примере ключ
назван 'mykey'), но не забудьте, как вы его назвали. Если вы
забыли, вы всегда можете выполнить команду euca-describe-
keypairs для получения списка созданных ключей, хранимых на
данной системе.
2.
В вашем экземпляре вы должны открыть порт 22:
euca-authorize default -P tcp -p 22 -s 0.0.0.0/0
3.
Далее, вы можете создать экземпляры вашего зарегистрированного
образа:
euca-run-instances $EMI -k mykey -t m1.small
Если вы получили ошибку относительно image_id, вы можете
найти её на странице просмотра образов или нажав на "Как
выполнить" на странице Хранилище для просмотра образца
команды.
4.
Во время первого запуска экземпляра система установит кэш для
образа, из которого был создан экземпляр. Так как образы виртуальных
машин довольно велики в размере, первый запуск экземпляра может
занять некоторое время.
Для мониторинга состояния вашего экземпляра выполните:
watch -n5 euca-describe-instances
Вы увидите информацию об экземпляре, включая его состояние. Во
время первоначального кэширования состяние экземпляра будет
'ожидание'
5.
Как только экземпляр будет полностью запущен, его состояние
сменится на 'запущен'. Посмотрите, какой IP-адрес был назначен
экземпляру, и используейте этот адрес для подключения к экземпляру:
IPADDR=$(euca-describe-instances | grep $EMI | grep running | \ tail -n1 | awk '{print $4}')
ssh -i ~/.euca/mykey.priv ubuntu@$IPADDR
382
Виртуализация
6. После окончания работы с экземпляром, завершите соединение SSH,
затем остановите экземпляр:
INSTANCEID=$(euca-describe-instances | grep $EMI | grep running | \ tail -n1 | awk '{print $2}'
euca-terminate-instances $INSTANCEID
3.8.1. Первая загрузка
Пакет cloud-init
• Установка имени хоста
• Помещение предоставленных публичных ключей ssh в ~ubuntu/.ssh/
authorized_keys.
• Запуск сценария, предоставленного пользователем, или иное изменение
образа.
Это не так ужасно интересно устанавливать имя хоста и настраивать
систему, чтобы можно было просто запустить и войти в неё. Действительно
интересные вещи, которые можно сделать при помощи cloud-init,
можно совершить благодаря пользовательским данным (user-data)19,
предоставленным во время старта.
Вначале установите пакет cloud-init:
sudo apt-get install cloud-init
Если пользовательские данные (user-data) начинаются с '#!', то они будут
сохранены и выполнены от имени root на позднем этапе процесса первой
загрузки экземпляра (подобно традиционному сценарию 'rc.local'). Вывод из
сценария направляется в консоль.
Например, можно создать файл с именем ud.txt, содержащий:
#!/bin/sh
echo ========== Hello World: $(date) ==========
echo "I have been up for $(cut -d\ -f 1 < /proc/uptime) sec"
Теперь запустите экземпляр с опцией --user-data-file:
euca-run-instances $EMI -k mykey -t m1.small --user-data-file=ud.txt
Подождите, пока система загрузится, и будет доступна консоль. Чтобы
увидеть результат команд из файла данных, введите:
19
383
Виртуализация
euca-get-console-output $EMI | grep --after-context=1 Hello
==========
Hello World: Mon Mar 29 18:05:05 UTC 2010 ==========
I have been up for 28.26 sec
Ваш вывод может отличаться.
Показанный выше простой подход открывает огромные возможности. Файл
пользовательских данных (user-data) может содержать сценарий на любом
языке, интерпретатор которого уже содержится в образе (#!/bin/sh, #!/usr/
bin/python, #!/usr/bin/perl, #!/usr/bin/awk ... ).
Во многих случаях пользователь может быть не заинтересован в написании
программы. На этот случай cloud-init предоставляет "cloud-config" - подход
к настройке, основанный на конфигурационном файле. Для использования
синтаксиса cloud-config файл пользовательских данных (user-data) должен
начинаться с '#cloud-config'.
Например, можно создать файл с именем cloud-config.txt, содержащий:
#cloud-config
apt_upgrade: true
apt_sources:
- source: "ppa:ubuntu-server-edgers/server-edgers-apache "
packages:
- build-essential
- pastebinit
runcmd:
- echo ======= Hello World =====
- echo "I have been up for $(cut -d\ -f 1 < /proc/uptime) sec"
Создайте новый экземпляр:
euca-run-instances $EMI -k mykey -t m1.small --user-data-file=cloud-config.txt
Теперь, когда система загрузится, в ней будет:
• Добавлен Apache Edgers PPA
• Выполнено обновление
• Установлены пакеты 'build-essential' и 'pastebinit'
• Выведено сообщение, подобное имеющемуся в вышеописанном сценарии
Apache Edgers PPA из приведённого выше примера содержит
последнюю версию Apache из репозиториев исходного кода в
апстриме. Для версий пакета из PPA поддержка не предоставляется
384
Виртуализация
и, в зависимости от вашей ситуации, это может быть, а может и не
быть желательным. Дополнительный подробности смотрите на веб-
странице Ubuntu Server Edgers20.
Команды 'runcmd' запускаются на том же этапе загрузки, что и сценарий
'#!' из предыдущего примера. Это позволяет вам пользоваться всей мощью
языка сценариев, в то же время не отказываясь от cloud-config.
Для дополнительной информации о том, что можно сделать с помощью
cloud-config, смотрите doc/examples21 в исходном коде.
3.9. Дополнительная информация
Как использовать контроллер хранения22
Управление службами eucalyptus:
• sudo service eucalyptus [start|stop|restart] (на стороне CLC/CC/SC/Walrus)
• sudo service eucalyptus-nc [start|stop|restart] (на стороне узла)
Местонахождение некоторых важных файлов:
• Файл журнала
• /var/log/eucalyptus
• Файлы конфигурации:
• /etc/eucalyptus
• База данных:
• /var/lib/eucalyptus/db
• Ключи:
• /var/lib/eucalyptus
• /var/lib/eucalyptus/.ssh
Не забудьте источник вашей ~/.euca/eucarc перед запуском
клиентских средств.
3.10. Ссылки
• Информацию по загрузке экземпляров смотрите на странице Eucalyptus
Wiki23.
• Сайт проекта Eucalyptus (форум, документация, загрузки)24.
20
21
22
23
24
385
Виртуализация
• Eucalyptus на Launchpad (ошибки, исходный код)25.
• Поиск и устранение неисправностей Eucalyptus (1.5)26.
• Зарегистрировать облако с RightScale 27.
• Вы также можете получить помощь в IRC-каналах #ubuntu-virt,
#eucalyptus, и #ubuntu-server на Freenode28.
25
26
27
Register_with_RightScale
28
386
Виртуализация
4. Облако Ubuntu
Облачные вычисления (cloud computing) - это модель вычислений, которая
позволяет использовать распределять по запросу ресурсы из большого
общего объёма доступных ресурсов. Эти ресурсы, такие как хранилище,
вычислительная мощность, сеть и программное обеспечение, являются
абстрактными и могут предоставляться как сервис через Интернет в
любом месте и в любое время. Оплата этих сервисов производится за
использованное время, аналогично тому, как это делается для таких
общедоступных услуг, как электроснабжение, водоснабжение и телефон.
Облачная инфраструктура Ubuntu использует открытое программное
обеспечение OpenStack для создания масштабируемых решений в области
облачных вычислений как для открытых, так и для частных облаков.
4.1. Обзор
Это руководство показывает установку OpenStack с компакт-диска Ubuntu
12.04 LTS Server Edition и предполагает наличие базовой сетевой топологии
с единственной обслуживающей системой по принципу облачной системы
"всё в одном". Поскольку рассмотрение упрощено, данные инструкции как
есть не предназначены для построения промышленных серверов, а только
позволяют вам получить проверку концепции построения облака Ubuntu с
использованием OpenStack.
4.2. Необходимые требования
Для развертывания минимальной облачной инфраструктуры Ubuntu нужно,
как минимум, следующее:
• Одна выделенная система.
• Два сетевых диапазона адресов (частная сеть и сеть общего
пользования).
• Убедитесь, что хост имеет аппаратную поддержку виртуализации (VT),
так как мы будем использовать технологию виртуализации KVM. Другие
гипервизоры, такие как QEMU, UML, Vmware ESX / ESXi и XEN. LXC (Linux
Containers) также поддерживаются через Libvirt.
Проверьте, поддерживает ли ваша система kvm, набрав sudo kvm-ok в
терминале linux.
"Минимальной топологией", рекомендуемой для применения в
промышленных решениях, является использование трёх узлов: одного
главного сервера, на котором запущены службы nova (за исключением
387
Виртуализация
compute) и двух серверов, на которых запущена nova-compute. Эта
установка не является избыточной, и главный сервер является
единственной точкой отказа (SPoF).
4.3. Предварительная настройка сети
Прежде чем мы начнем установку OpenStack, мы должны убедиться, что у
нас установлена поддержка моста, базы данных MySQL, и служба времени
(ntp). Это будет гарантировать, что экземпляры и хосты синхронизированы.
В этом примере "частная сеть" будет находиться в диапазоне 10.0.0.0/24 на
eth1. Все внутренние связи между экземплярами будут производиться там,
а "сеть общего пользования" будет находиться в диапазоне 10.153.107.0/29
на eth0.
4.3.1. Установка поддержки моста
sudo apt-get install bridge-utils
4.3.2. Установка и настройка NTP
sudo apt-get install ntp
Добавьте следующие две строки в конце файла /etc/ntp.conf.
server 127.127.1.0
fudge 127.127.1.0 stratum 10
Перезапустите службу ntp
sudo service ntp restart
4.3.3. Установка и настройка MySQL
sudo apt-get install mysql-server
Создайте базу данных и пользователя mysql для OpenStack
sudo mysql -uroot -ppassword -e "CREATE DATABASE nova;"
sudo mysql -uroot -ppassword -e "GRANT ALL ON nova.* TO novauser@localhost \
IDENTIFIED BY 'novapassword' ";
Символ продолжения строки "\" подразумевает, что следующая строка
является частью текущей команды.
388
Виртуализация
4.4. Установка OpenStack Compute (Nova)
Вычислительный ресурс OpenStack (Nova) является диспетчером
облачного процесса вычислений (основной частью системы IaaS -
инфраструктура как сервис). Он написан на Python с использованием
оболочек Eventlet и Twisted и опирается на стандартный протокол
сообщений AMQP, а также SQLAlchemy для доступа к хранилищам данных.
Установите компоненты OpenStack Nova
sudo apt-get install nova-api nova-network nova-volume nova-objectstore nova-scheduler \
nova-compute euca2ools unzip
Перезапустите libvirt-bin, чтобы убедиться, что libvirtd знает о средстве
фильтрации пакетов ebtables.
sudo service libvirt-bin restart
Установите RabbitMQ - реализацию протокола AMQP (Advanced Message
Queuing Protocol)
sudo apt-get install rabbitmq-server
Отредактируйте /etc/nova/nova.conf, добавив следующее:
# Nova config FlatDHCPManager
--sql_connection=mysql://novauser:novapassword@localhost/nova
--flat_injected=true
--network_manager=nova.network.manager.FlatDHCPManager
--fixed_range=10.0.0.0/24
--floating_range=10.153.107.72/29
--flat_network_dhcp_start=10.0.0.2
--flat_network_bridge=br100
--flat_interface=eth1
--public_interface=eth0
Перезапустите службы OpenStack
for i in nova-api nova-network nova-objectstore nova-scheduler nova-volume nova-compute; \
do sudo stop $i; sleep 2; done
for i in nova-api nova-network nova-objectstore nova-scheduler nova-volume nova-compute; \
do sudo start $i; sleep 2; done
Выполните миграцию базы данных Nova из sqlite в MySQL. Это может занять
некоторое время.
389
Виртуализация
sudo nova-manage db sync
Определим отдельную частную сеть, в которой будут работать все ваши
элементы. Она будет использоваться с фиксированными адресами IP,
указанными в nova.conf .
sudo nova-manage network create --fixed_range_v4 10.0.0.0/24 --label private \
--bridge_interface br100
Определите конкретную сеть общего пользования и выделите 6 (полезных)
плавающих публичных IP-адреса для использования в случаях, начиная с
10.153.107.72.
sudo nova-manage floating create --ip_range=10.153.107.72/29
Создайте пользователя (user1), проект (project1), скачайте учётные данные
и файл конфигурации.
cd ; mkdir nova ; cd nova
sudo nova-manage user admin user1
sudo nova-manage project create project1 user1
sudo nova-manage project zipfile project1 user1
unzip nova.zip
source novarc
Проверьте установку OpenStack Compute, набрав:
sudo nova-manage service list
sudo nova-manage version list
Если службы Nova не отображаются корректно, перезапустите службу
OpenStack, как описано выше. Для получения дополнительной информации
обратитесь к разделу этого руководства, посвящённому поиску и
устранению неисправностей.
4.5. Установка сервиса управления образами (Glance)
Nova использует сервис Glance для управления образами операционных
систем, которые требуются для поднятия экземпляров системы. Glance
может использовать различные типы систем хранилищ, такие как
файловое хранение, S3 (Simple Storage Service) и пр. Glance состоит из
двух компонентов: glance-api and glance-registry. Они могут управляться с
использованием соответствующих задач загрузки сервисов. Для нашего
примера в качестве хранилища мы будем использовать mysql.
390
Виртуализация
Установите Glance
sudo apt-get install glance
Создайте базу данных и пользователя для glance
sudo mysql -uroot -ppassword -e "CREATE DATABASE glance;"
sudo mysql -uroot -ppassword -e "GRANT ALL ON glance.* TO glanceuser@localhost \
IDENTIFIED BY 'glancepassword' ";
Отредактируйте файл /etc/glance/glance-registry.conf, изменив содержимое
строки, которая содержит опцию "sql_connection =", на следующее:
sql_connection = mysql://glanceuser:glancepassword@localhost/glance
Удалите базу данных sqlite
rm -rf /var/lib/glance/glance.sqlite
Перезапустите glance-registry после того, как измените /etc/glance/glance-
registry.conf. База данных MySQL будет автоматически заполнена.
sudo restart glance-registry
Если возникли ошибки, взгляните на файлы журнала в /var/log/glance/api.log
и /var/log/glance/registry.log.
4.6. Запуск экземпляров
Прежде чем вы сможете использовать образы, необходимо сначала
установить учётные данные пользователя. После этого первого шага также
необходимо загрузить образы, которые вы хотите запустить в облака.
Если у вас есть эти образы, загруженные в облако, вы сможете работать
и подключаться к ним. Вот шаги, которым вы должны следовать, чтобы
получить запущенныe экземпляры OpenStack Nova:
Скачайте, зарегистрируйтесь и опубликуйте образы в облаке Ubuntu
distro=lucid
cloud-publish-tarball "$distro"-server-cloudimg-amd64.tar.gz "$distro"_amd64
Создайте ключевую пару для пользователя и подготовьте экземпляр
системы:
cd ~/nova
391
Виртуализация
source novarc
euca-add-keypair user1 > user1.priv
chmod 0600 user1.priv
Разрешите доступ по icmp (ping) и ssh к экземплярам:
euca-authorize default -P tcp -p 22 -s 0.0.0.0/0
euca-authorize -P icmp -t -1:-1 default
Запустите экземпляр
ami=`euca-describe-images | awk {'print $2'} | grep -m1 ami`
euca-run-instances $ami -k user1 -t m1.tiny
euca-describe-instances
Назначьте публичный адрес экземпляру.
euca-allocate-address
euca-associate-address -i instance_id public_ip_address
euca-describe-instances
Вы здесь должны ввести instance_id (ami) и public_ip_address, показанные
выше командами euca-describe-instances и euca-allocate-address.
Теперь вы должны добавить SSH к экземпляру
ssh -i user1.priv ubuntu@ipaddress
Для завершения экземпляра
euca-terminate-instances instance_id
4.7. Установите инфраструктуру хранения данных (Swift)
Swift является высокодоступным, распределённым, с согласованностью в
к конечном счёте (eventually consistent) хранилищем объектов/блобов. Он
используется OpenStack, как инфраструктура для обеспечения S3, подобно
облачным сервисам хранения данных. Он также S3 API совместимый с
Amazon.
Организации используют Swift для эффективного, безопасного и
недорогого хранения больших объёмов данных, при этом приложения
используют специальные API для взаимодействия между приложениями и
объектами, хранящимися в Swift.
Хотя вы можете установить Swift на единственный сервер, для
промышленных сред требуется установка на несколько серверов. Если вы
392
Виртуализация
хотите установить хранилище объектов OpenStack (Swift) на отдельный
сетевой сервер для разработки или тестирования, используйте инструкции
установки 'Swift всё в одном' на Ubuntu.
Для получения дополнительной информации смотрите: http://
swift.openstack.org/development_saio.html 29 .
4.8. Поддержка и устранение неисправностей
Поддержка сообщества
• Список рассылки OpenStack30
• Поиск в Wiki OpenStack31
• Сообщения об ошибках на Launchpad32
• Присоединитесь к каналу IRC #openstack на freenode.
4.9. Ресурсы
• Облачные вычисления - сервисные модели.33
• Вычисления OpenStack34
• Сервис образов OpenStack35
• Руководство администратора OpenStack Object Storage36
• Установка OpenStack Object Storage на Ubuntu37
4.10. Словарь терминов
Документация по облаку Ubuntu использует терминологию, которая может
быть непонятна некоторым читателям. Этот раздел предоставляет словарь
таких терминов и аббревиатур.
• Облако (Cloud) - объединённый набор физических машин, которые
предлагают вычислительные ресурсы с помощью виртуальных машин,
резервируемых и выделяемых динамически.
• IaaS (инфраструктура как сервис) - сервисы облачной инфраструктуры,
благодаря которым виртуальное окружение предоставляется
29
30
31
32
33
34
docs.openstack.org/trunk/openstack-compute/
35
36
OpenStack Object Storage Administration Guide
37
ubuntu.html
393
Виртуализация
провайдером в виде сервиса через интернет. Инфраструктура может
включать сервера, сетевое оборудование и программное обеспечение.
• EBS - Эластичное блочное хранилище.
• EC2 - Эластичное облако вычислений. Общедоступные облачные
вычисления, предоставляемые Amazon на основе почасовой или
погигабайтной оплаты.
• Узел (Node) - физическая машина, которая может запускать
виртуальные машины по команде контроллера узлов (node controller).
Для Ubuntu это в основном означает, что центральный процессор (CPU)
поддерживает расширения аппаратной виртуализации (VT) и может
запускать гипервизор KVM.
• S3 - Simple Storage Service (простой сервис хранения). Решение Amazon
для предоставления хранилища с погигабайтной оплатой для EC2.
• Ubuntu Cloud - облако Ubuntu. Решение облачных вычислений для
Ubuntu, основанное на OpenStack.
• VM - виртуальная машина.
• VT - технология виртуализации. Особенность некоторых современных
процессоров, позволяющая ускорять работу виртуальных машин.
394
Виртуализация
5. LXC
Контейнеры представляют из себя облегчённую технологию
виртуализации. Они больше похожи на chroot чем на полноценную
виртуализацию типа Qemu или VMware, поскольку они не эмулируют
оборудование, а также используют в разделяемом режиме ту же
операционную систему, что и основная система. Поэтому контейнеры
лучше сравнивать с зонами (zones) Solaris или изоляторами (jails) BSD. Linux-
vserver и OpenVZ - это две предыдущие разработки контейнеро-подобной
функциональности для Linux. На самом деле контейнеры получились, как
результат работы по слиянию функциональности vserver and OpenVZ.
Некоторая функциональность vserver и OpenVZ всё ещё отсутствует
в контейнерах, однако контейнеры могут загружаться множеством
дистрибутивов Linux и имеют то преимущество, что они могут запускаться
на неизменённом ядре.
Существует две реализации пользовательского пространства контейнеров,
каждая из которых использует те же самые возможности ядра. Libvirt
позволяет использовать контейнеры через драйвер LXC, подсоединяясь к
'lxc:///'. Это очень удобно, поскольку поддерживается то же использование,
что и для других драйверов. Другая реализация, называемая просто 'LXC',
несовместима с libvirt, но более гибкая с использованием дополнительных
утилит пользовательского пространства. Есть возможность переключаться
с одной на другую, хотя существуют особенности, которые могут привести
в замешательство.
В этом документе мы будем рассматривать в основном пакет lxc. Ближе к
концу будет описано, как использовать драйвер libvirt LXC.
В этом документе имя контейнера будет указано, как CN, C1, или C2.
5.1. Установка
Пакет lxc может быть установлен так
sudo apt-get install lxc
Это повлечет за собой обязательные и рекомендуемые зависимости,
в том числе cgroup-lite, lvm2, и debootstrap. Чтобы использовать libvirt-
lxc, установить libvirt-bin. LXC и libvirt-lxc могут быть установлены и
использоваться в одно и то же время.
395
Виртуализация
5.2. Настройка хоста
5.2.1. Основная структура LXC файлов
Ниже приводится описание файлов и каталогов, которые установлены и
используются LXC.
• Существует два задания отслеживания:
• /etc/init/lxc-net.conf: необязательное задание, которое запускается
только если в /etc/default/lxc определено USE_LXC_BRIDGE (по
умолчанию true). Оно устанавливает мост на основе NAT для
использования контейнером.
• /etc/init/lxc.conf: запускается если LXC_AUTO (по умолчанию true)
установлена в /etc/default/lxc.Оно отслеживает записи в /etc/lxc/auto/
которые являются символическими ссылками на файлы конфигураций
для контейнеров, которые должны быть запущены при загрузке
системы.
• /etc/lxc/lxc.conf: По умолчанию контейнер создается в конфигурационным
файле /etc/lxc/lxc.conf, который управляет контейнерами посредством
LXC bridge, созданным lxc-net при запуске upstart. Если при создании
контейнера не указан конфигурационный файл, то будет использован
конфигурационный файл по умолчанию.
• Примеры конфигурационных файлов других контейнеров находятся здесь
/usr/share/doc/lxc/examples. Они показывают, как создать контейнер без
частной сети или используя macvlan, vlan, или другие сетевые уровни.
• Административные утилиты для различных контейнеров находятся здесь
/usr/bin.
• /usr/lib/lxc/lxc-init - минимальная очень легковесная
инициализирующая программа, которая используется lxc-execute. Вместо
того, чтобы загружать весь контейнер, она вручную монтирует несколько
файловых систем, главным образом /proc, и отрабатывает их аргументы.
Вам нежелательно обращаться к этому файлу вручную.
• /usr/lib/lxc/templates/ содержит `шаблоны', которые можно использовать
для создания новых контейнеров для различных дистрибутивов
и разновидностей этих дистрибутивов. В настоящее время
поддерживаются не все шаблоны.
• /etc/apparmor.d/lxc/lxc-defaultсодержит профиль Apparmor доступа
по умолчанию, который обеспечивает защиту основной системы от
контейнеров. Дополнительную информацию смотрите в разделе
Раздел 5.2.6, «Apparmor» [398].
• /etc/apparmor.d/usr.bin.lxc-start содержит профиль для защиты основной
системы от lxc-start пока он устанавливает контейнер.
396
Виртуализация
• /etc/apparmor.d/lxc-containersзаставляет все профили, определенные в /etc/
apparmor.d/lxc, загружаться при старте системы.
• Существует множество man-страниц по по средствам администрирования
LXC, а также конфигурационному файлу контейнеров lxc.conf.
• /var/lib/lxc - здесь хранятся контейнеры и информация по их
настройкам.
• /var/cache/lxc - здесь кэшируются данные дистрибутивов для ускорения
создания множества контейнеров.
5.2.2. lxcbr0
Когда USE_LXC_BRIDGE установлена в true в файле /etc/default/lxc (как
впрочем по умолчанию), мост с именем lxcbr0 создаётся в процессе
старта. Этот мост получает частный адрес 10.0.3.1, а контейнеры его
использующие получат адреса из диапазона 10.0.3.0/24. Экземпляр
dnsmasq начинает прослушивать этот мост, поэтому если другой dnsmasq
получает связь со всеми интерфейсами до запуска отслеживающего
сервиса lxc-net, lxc-net рушится на старте и lxcbr0 не создается.
Если у вас есть другой мост, например, virbr0 по умолчанию от libvirt или
br0 для вашего основного сетевого интерфейса, вы можете использовать
его вместо lxcbr0 для ваших контейнеров.
5.2.3. Использование отдельной файловой системы для хранения
контейнеров
LXC сохраняет информацию контейнеров и корневую файловую систему
(с резервным хранилищем по умолчанию) в /var/lib/lxc. Также шаблоны
создания контейнеров предпочитают хранить кэшированную информацию
по дистрибутивам в /var/cache/lxc.
Если вы хотите использовать для /var, иную файловую систему, вы можете
смонтировать в этот каталог другую файловую систему большего объёма.
Если у вас есть диск, предназначенный для этих целей, вы можете просто
смонтировать его в /var/lib/lxc. Если вы предпочитаете использовать
другое расположение, такое как/srv, вы можете примонтировать его к
этому каталогу или создать символическую ссылку. Например, если /
srv является большой смонтированной файловой системой, создайте два
каталога и символьные ссылки на них:
sudo mkdir /srv/lxclib /srv/lxccache sudo rm -rf /var/lib/lxc /var/cache/lxc sudo ln -s /srv/lxclib
или, используя монтирование:
397
Виртуализация
sudo mkdir /srv/lxclib /srv/lxccache sudo sed -i '$a \ /srv/lxclib /var/lib/lxc none defaults,bind
5.2.4. Контейнеры с поддержкой lvm
Существует возможность использовать разделы LVM в качестве хранилища
для контейнеров. Преимуществом этого является, кроме прочего, гибкость
в управлении хранилищем и быстрое клонирование контейнеров. По
умолчанию используется VG (группа томов) с именем lxc, но могут
применяться и другие VG при использовании параметров командной
строки. Когда LV (логический том) используется для хранения контейнеров,
конфигурационный файл контейнера все еще /var/lib/lxc/CN/config, но
корневая точка входа в этом файле (lxc.rootfs) будет указывать на имя
блочного устройства логического тома, т.е. /dev/lxc/CN.
Контейнеры с деревом каталогов и LVM хранилищем могут сосуществовать
вместе.
5.2.5. Btrfs
Если основная система имеет /var размеченный как btrfs, средства
администрирования LXC распознают это и автоматически будут
использовать для клонирования контейнеров снимки btrfs.
5.2.6. Apparmor
LXC поставляется с профилем Apparmor, предназначенным для защиты
основной системы от случайного неправильного использования привилегий
внутри контейнера. Например, контейнер не должен иметь возможности
писать в каталог /proc/sysrq-trigger или менять большинство файлов в
каталоге /sys.
Профиль usr.bin.lxc-start используется при запуске lxc-start. Этот профиль
в основном предотвращает монтирование lxc-start новых файловых систем
вне корневой файловой системы контейнера. Перед инициализацией init
контейнера, LXC запрашивает переключение на профиль контейнера. По
умолчанию используется профиль lxc-container-defaultопределенный в /
etc/apparmor.d/lxc/lxc-default. Этот профиль запрещает контейнеру доступ к
многим опасным каталогам и монтирование большинства файловых систем.
Если вы обнаружили, что lxc-start падает из-за попытки легитимного
доступа, перекрытого политикой Apparmor, вы можете отключить профиль
lxc-start следующим образом:
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start
398
Виртуализация
sudo ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/
Это позволит запускать lxc-start без ограничений, но продолжит
ограничивать собственно контейнер. Если вы хотите также снять
ограничения с контейнера, в дополнение к блокировке использования
профиля usr.bin.lxc-start, вам потребуется в файл настроек контейнера
добавить:
lxc.aa_profile = unconfined
Если вы желаете запускать контейнер в собственном профиле, вы можете
создать новый профиль в /etc/apparmor.d/lxc/. Его имя должно начинаться
на lxc- чтобы lxc-start имел возможность переключения на этот профиль.
После создания политики, загрузите её, используя команду:
sudo apparmor_parser -r /etc/apparmor.d/lxc-containers
Профиль автоматически загрузится после перезагрузки системы, поскольку
его содержимое учтено в /etc/apparmor.d/lxc-containers. Наконец, чтобы
заставить контейнер CN использовать новый профиль lxc-CN-profile,
добавьте следующие строки в его файл настройки:
lxc.aa_profile = lxc-CN-profile
lxc-execute не просматривает профиль Apparmor, но контейнер, который
он порождает, будет ограничен.
5.2.7. Группы управления
Группы управления (cgroups) - это способность ядра предоставлять
возможность иерархической группировки задач, а также назначать и
ограничивать ресурсы для каждой cgroup. Они используются в контейнерах
для ограничения доступа к блочным и посимвольным устройствам (block
and character device) и для заморозки (приостановки) контейнеров. В
дальнейшем их можно использовать для ограничения используемой памяти
и блочного ввода/вывода, гарантированного минимума использования CPU
и для фиксирования определенных CPU за отдельными контейнерами. По
умолчанию LXC устанавливает зависимость на установку пакета cgroup-
lite, который предоставляет надлежащую инициализацию cgroup при
загрузке системы. Пакет cgroup-lite монтирует каждую cgroup подсистему
отдельно в /sys/fs/cgroup/SS, где SS - название подсистемы. Например,
подсистема freezer монтируется в /sys/fs/cgroup/freezer. Группы управления
LXC хранятся в /sys/fs/cgroup/SS/INIT/lxc,где INIT - инициализирующая
399
Виртуализация
группа управления задачи. По умолчанию это /, поэтому группа управления
freezer для контейнера CN будет/sys/fs/cgroup/freezer/lxc/CN.
5.2.8. Привилегии
Утилиты администрирования контейнерами должны запускаться с
привилегиями суперпользователя. Утилита с названием lxc-setup была
написана с намерением предоставлять инструменты с требуемыми
правами доступа к файлам, позволяя обычным пользователям запускать
эти инструменты с достаточными привилегиями. Однако, поскольку
суперпользователь не может пока быть надежно погружен в контейнер,
эта особенность бесполезна. Поэтому рекомендуется не использовать lxc-
setup и предоставлять администраторам LXC требуемые привилегии lxc-
setup, и предоставлять администраторам LXC требуемые привилегии
Пространство имен пользователя, которое предположительно будет
доступно к следующему LTS-выпуску, будет позволять ограничивать
(сдерживать) суперпользователя контейнера, также как будут
уменьшены привилегии, необходимые для создания и администрирования
контейнеров.
5.2.9. Отслеживающие задания LXC
Как отмечалось выше, пакет lxc включает два отслеживающих задания.
Первое, lxc-net, стартует всегда, когда другое, lxc, собирается стартовать
и останавливается, когда то останавливается. Если переменная
USE_LXC_BRIDGE установлена в /etc/defaults/lxc, то оно завершится
немедленно. Если переменная, и возникает ошибка организации LXC
моста, то задание lxc не стартует. lxc-net отключает LXC мост, когда
останавливается, хотя использующий его контейнер работает.
Задание lxc запускается на 2-5 уровне выполнения. Если переменная
LXC_AUTO установлена в true, оно ищет в /etc/lxc контейнеры, которые
должны запускаться автоматически. Когда задание lxc останавливается,
вручную или при установке уровня выполнения 0, 1 или 6, оно
останавливает эти контейнеры.
Для регистрации автоматического запуска контейнера создайте
символическую ссылку /etc/default/lxc/name.conf, указывающую на
конфигурационный файл контейнера. Например, конфигурационный файл
для контейнера CN - /var/lib/lxc/CN/config. Чтобы автоматически запускать
этот контейнер, используйте команду:
sudo ln -s /var/lib/lxc/CN/config /etc/lxc/auto/CN.conf
400
Виртуализация
5.3. Администрирование контейнеров
5.3.1. Создание контейнеров
Самый простой способ создать контейнер - использовать lxc-create. Этот
сценарий использует специфические для дистрибутива шаблоны в /usr/lib/
lxc/templates/ для установки дружественных контейнеру настроек chroots в /
var/lib/lxc/CN/rootfs, и инициализации конфигурации в /var/lib/lxc/CN/fstab и
/var/lib/lxc/CN/config, где CN - название контейнера.
Команда на создание простейшего контейнера будет выглядеть
следующим образом:
sudo lxc-create -t ubuntu -n CN
Она указывает lxc-create использовать шаблон ubuntu (-t ubuntu) и вызывать
контейнер CN (-n CN). Поскольку не указан файл настроек (что можно
сделать с помощью параметра `-f file'), будет использован файл настроек
по умолчанию /etc/lxc/lxc.conf. Это предоставит контейнеру единственный
сетевой интерфейс veth, подключенный к мосту lxcbr0.
Шаблоны создания контейнеров также могут воспринимать аргументы. Они
могут быть перечислены после --. Например:
sudo lxc-create -t ubuntu -n oneiric1 -- -r oneiric
передаёт параметры '-r oneiric1' шаблону ubuntu.
5.3.1.1. Справка
Справку по команде lxc-create можно увидеть, используя lxc-create -h.
Однако шаблоны также принимают свои собственные параметры. Если вы
выполните
sudo lxc-create -t ubuntu -h
то после общего экрана помощи lxc-create будет следовать вывод помощи,
касающийся шаблона ubuntu. Если не указывать шаблон, то будет показана
помощь только по lxc-create.
5.3.1.2. Шаблон ubuntu
Шаблон ubuntu может использоваться для создания контейнеров системы
Ubuntu любого выпуска, начиная с 10.04 LTS. Он использует debootstrap
для создания кэшированной файловой системы контейнера, с которой
будет создаваться копия при каждом создании контейнера. Кэшированный
401
Виртуализация
образ сохраняется и пересоздаётся только в том случае, если вы создаёте
контейнер с использованием передаваемой шаблону опции -F (flush), то
есть:
sudo lxc-create -t ubuntu -n CN -- -F
Версия Ubuntu, установленная в контейнер, будет той же самой, что и на
основной системе, если не указать опцию -r, то есть:
sudo lxc-create -t ubuntu -n CN -- -r lucid
Если вы хотите создать 32-битный контейнер на 64-битной системе,
передайте в контейнер параметр -a i386. Если у вас установлен пакет
qemu-user-static, то вы можете создать контейнер, используя любую
архитектуру, поддерживаемую qemu-user-static.
В контейнере будет присутствовать пользователь ubuntu с паролемubuntu,
входящий в группу sudo. Если вы хотите хотите добавить открытый ключ
для пользователя ubuntu, вы можете это сделать параметром -S sshkey.pub.
Вы можете связать bind пользователя основной системы (например) с
контейнером, используя опцию -b jdoe. Это позволит скопировать пароль
и shadow записи пользователя jdoe в контейнер, удостоверится, что его
группа по умолчанию и оболочка доступны, добавит его в группу sudo и
смонтирует связыванием (bind-mount) его домашний каталог в контейнер
при запуске контейнера.
После создания контейнера архив release-updates добавляется в файл
sources.list контейнера, и архив его пакетов будет обновлён. Если
операционная система в контейнере имеет версию старее 12.04 LTS,
то будет автоматически установлен пакет lxcguest. Но если указана
опция --trim, то пакет lxcguest не будет установлен и многие сервисы
будут удалены из контейнера. Результатом будет более быстрый запуск
контейнера, но, в то же время, ухудшение возможностей его обновления.
5.3.1.3. Шаблон ubuntu-cloud
Шаблон ubuntu-cloud создаёт контейнеры Ubuntu, загружая и извлекая
опубликованные образы для облака Ubuntu. Он воспринимает некоторые
из опций шаблона ubuntu, а именно -r release, -S sshkey.pub, -a arch,
и -F для сброса кешированных образов. Он воспринимает также
некоторые дополнительные опции. Опция -C создаёт cloud контейнер,
настроенный на использование с сервисом metedata. Опция -u позволяет
инициализирующему облачному файлу с пользовательскими данными
настраивать контейнер при старте. Если передается -L, то не будет
402
Виртуализация
установлено никаких национальных настроек. Опция -T может быть
использована для выбора размещения извлекаемой свёртки (tarball) вместо
использования опубликованной свёртки облачного образа. Наконец,
опция -i устанавливает id системы для cloud-init, который по умолчанию
приравнивается к случайной строке.
5.3.1.4. Другие шаблоны
Шаблоны ubuntu и ubuntu-cloud хорошо поддерживаются. Однако доступны
и другие шаблоны. Шаблон debian создаёт контейнер на основе Debian,
используя debootstrap почти также, как это делает шаблон ubuntu. По
умолчанию он устанавливает образ debian squeeze. Другие версии могут
быть выбраны установкой переменной окружения SUITE:
sudo SUITE=sid lxc-create -t debian -n d1
Поскольку debian не может быть безопасно загружен внутри контейнера,
контейнеры debian будут урезаны как при использовании опции --trim для
шаблона ubuntu.
Для очистки кэша образа контейнера вызывайте шаблон напрямую и
передавайте ему опцию --clean:
sudo SUITE=sid /usr/lib/lxc/templates/lxc-debian --clean
Существует шаблон fedora, создающий контейнеры на базе версий
fedora не выше 14. Выпуски fedora, начиная с 15, основаны на systemd,
который шаблоны пока не могут преобразовать в установку, загружаемую
в контейнере. Перед тем как запускать шаблон fedora, вам следует
убедиться, что установлены yum и curl. Контейнер с fedora 12 может быть
установлен следующим образом:
sudo lxc-create -t fedora -n fedora12 -- -R 12
Существует шаблон OpenSuSE, но он требует программу zypper
которая пока не имеет пакета. Таким образом, шаблон OpenSuSE не
поддерживаются.
Ещё два шаблона созданы в основном для экспериментальных целей.
Шаблон busybox создает очень маленький системный контейнер,
основанный целиком на busybox. Шаблон sshd создает контейнер
приложений, запускающий sshd в области имен частной сети. Каталоги
библиотек и двоичных файлов монтируются связыванием внутрь
контейнера, хотя не /home или /root. Для создания, запуска и соединения по
ssh с контейнером, вы можете использовать следующее:
403
Виртуализация
sudo lxc-create -t sshd -n ssh1 ssh-keygen -f id sudo mkdir /var/lib/lxc/ssh1/rootfs/root/.ssh sudo
5.3.1.5. Резервные хранилища
По умолчанию, lxc-create помещает корневую файловую систему
контейнера в каталог /var/lib/lxc/CN/rootfs. Другим вариантом является
использование логических томов LVM.Если существует группа томов lxc
вы можете создать контейнер на основе lvm с названием CN, используя
команду:
sudo lxc-create -t ubuntu -n CN -B lvm
Если вы хотите использовать группу томов с именем schroots с файловой
системой xfs на 5 Гб, вы можете использовать:
sudo lxc-create -t ubuntu -n CN -B lvm --vgname schroots --fssize 5G --fstype xfs
5.3.2. Клонирование
Для быстрой подготовки к работе вы можете решить изменить canonical
контейнер в соответствии с вашими требованиями и затем сделать
множество его копий. Это можно осуществить с помощью программы lxc-
clone. Дан существующий контейнер с именем C1, новый контейнер C2
может быть создан:
sudo lxc-clone -o C1 -n C2
Если файловой системой /var/lib/lxc является btrfs, то lxc-clone создаст
файловую систему C2 как снимок от C1. Если корневая файловая система
контейнера поддерживается lvm, то вы можете указать опцию -s для
создания новой rootfs как снимок lvm оригинала следующим образом:
sudo lxc-clone -s -o C1 -n C2
И lvm и btrfs снимки обеспечивают быстрое клонирование с очень
небольшим изначально использованием дискового пространства.
5.3.3. Запуск и остановка
Чтобы запустить контейнер, используйте lxc-start -n CN. По умолчанию
lxc-start выполнит /sbin/init внутри контейнера. Вы можете предоставить
другую программу для выполнения плюс аргументы, как дополнительные
аргументы для lxc-start:
404
Виртуализация
sudo lxc-start -n container /sbin/init loglevel=debug
Если вы не укажете опцию -d (daemon - сервис), то вы увидите консоль
(по поводу контейнерной /dev/console, смотрите секцию Раздел 5.3.5,
«Консоли» [407] для получения дополнительной информации) в
терминале. Если вы укажете опцию -d, то эту консоль вы не увидите, а lxc-
start завершится без ошибок немедленно, даже если дальнейшая часть
запуска контейнера завершится неудачей. Вы можете использовать lxc-
wait или lxc-monitor (смотрите Раздел 5.3.4, «Отслеживание статуса
контейнеров» [406]) для проверки, удачно или нет запустился контейнер.
Для получения отладочной информации LXC используйте -o filename -l
debuglevel, например:
sudo lxc-start -o lxc.debug -l DEBUG -n container
Наконец, вы можете указать параметры настройки, используя опцию -
s. Однако в общем случае рекомендуется вместо этого указывать их в
конфигурационном файле контейнера. Аналогичным образом можно
указать целиком иной файл настроек с помощью опции -f но это тоже в
общем случае не рекомендуется.
В то время как lxc-start запускает в контейнерный /sbin/init, lxc-
execute использует программу минимальной инициализации lxc-init,
которая пытается монтировать /proc, /dev/mqueue, и /dev/shm, выполняет
программы, указанные в командной строке, и ждёт их завершения. lxc-
start предназначена для использования system containers, в то время как
lxc-execute для использования application containers (смотрите this article38
для дополнительной информации).
Остановить контейнер вы можете разными способами. Вы можете
использовать shutdown, poweroff и reboot когда подсоединились к
контейнеру. Для чистого завершения работы контейнера извне (т.е. из
основной системы), вы можете выполнить команду sudo lxc-shutdown
-n CN. Она воспринимает необязательный параметр задержки. Если он
не указан, команда посылает сигнал SIGPWR в контейнер и немедленно
завершается. Если опция указана, как, например, sudo lxc-shutdown -n
CN -t 10, то команда ожидает указанное количество секунд завершения
работы контейнера. Затем, если контейнер всё ещё работает, она убивает
(kill) его, а также все работающие в нем приложения. Вы можете также
немедленно убить контейнер (не оставляя шансов для приложений
завершиться аккуратно), используя команду sudo lxc-stop -n CN. Наконец,
38
405
Виртуализация
lxc-kill может быть использована в общем случае для отправки любого
сигнала процедуре инициализации контейнера.
В процессе завершения работы контейнера вы можете получить несколько
(безопасных) сообщений об ошибке, как например:
$ sudo poweroff
[sudo] password for ubuntu: =
$ =
Broadcast message from ubuntu@cn1
(/dev/lxc/console) at 18:17 ...
The system is going down for power off NOW!
* Asking all remaining processes to terminate...
...done.
* All processes ended within 1 seconds
...done.
* Deconfiguring network interfaces...
...done.
* Deactivating swap...
...fail!
umount: /run/lock: not mounted
umount: /dev/shm: not mounted
mount: / is busy
* Will now halt
Кроме того, контейнер может быть "заморожен" командой sudo lxc-freeze
-n CN. Это заблокирует все его процессы до тех пор, пока он не будет
"разморожен" командой sudo lxc-unfreeze -n CN.
5.3.4. Отслеживание статуса контейнеров
Две команды доступны для отслеживания изменения статуса контейнера.
lxc-monitor отслеживает один или более контейнеров на любые изменения
статусов. Она как правило получает имя контейнера с помощью опции -n,
однако в этом случае имя контейнера может быть регулярным выражением
posix, чтобы позволять отслеживать желаемые наборы контейнеров. lxc-
monitor продолжает выполнение пока выводит статусы контейнеров.
Вторая команда lxc-wait ожидает специфического изменения статуса
контейнера и затем завершается. Например,
sudo lxc-monitor -n cont[0-5]*
будет выводить все изменения статусов контейнеров с именами,
попадающими под приведенное регулярное выражение, в то время как
406
Виртуализация
sudo lxc-wait -n cont1 -s 'STOPPED|FROZEN'
будет ожидать, пока контейнер cont1 не войдет в состояния STOPPED или
FROZEN и затем завершится.
5.3.5. Консоли
Контейнеры имеют настраиваемое количество консолей. Одна всегда
существует в контейнерном /dev/console. Она видна в терминале, из
которого вы запустили lxc-start, если не указана опция -d. Вывод в /dev/
console может быть перенаправлен в файл при использовании опции -c
console-file с lxc-start. Количество дополнительных консолей указывается
переменной lxc.tty, и обычно равно 4. Эти консоли видны как /dev/ttyN
(for 1 <= N <= 4). Для соединения с консолью 3 из основной системы
используйте
sudo lxc-console -n container -t 3
в противном случае, если -t N не указано, будет автоматически
выбрана неиспользуемая консоль. Для входа из консоли используйте
последовательность Ctrl-a q. Обратите внимание, что последовательность
не сработает в консоли при использовании lxc-start без опции -d.
Каждая консоль контейнера фактически является Unix98 pty
смонтированной в pty основной (не гостевой) системы через связанное
монтирование гостевых /dev/ttyN и /dev/console. Следовательно, если
гостевая система размонтирует их или с другой стороны попытается
получить доступ к символьному устройству 4:N, она не будет обслужена
getty на LXC консолях. (При настройках по умолчанию контейнер не сможет
получить доступ к этому символьному устройству и getty, соответственно,
завершится с ошибкой). Это может легко случиться, когда загрузочный
сценарий вслепую монтирует новые устройства в /dev.
5.3.6. Исследование контейнеров
Некоторые команды способны собирать информацию по созданным
контейнерам. lxc-ls выведет все существующие контейнеры в своей
первой строке вывода и все запущенные контейнеры во второй. lxc-list
предоставит ту же информацию в более развернутом формате, перечислив
запущенные контейнеры сначала и остановленные в конце. lxc-ps
предоставит список процессов в контейнере. Для передачи ps аргументов в
lxc-ps, предварите их --. Например, для получения списка всех процессов в
контейнере
sudo lxc-ps -n plain -- -ef
407
Виртуализация
lxc-info возвращает статус контейнера и pid его инициирующего процесса.
lxc-cgroup может быть использована для получения и установки
переменных ограничений и информации управляющих групп контейнера.
Это может оказаться более удобным, чем взаимодействие с файловой
системой cgroup. Например, для получения списка устройств, к которым
контейнер имеет доступ, вы можете использовать:
sudo lxc-cgroup -n CN devices.list
или для добавления прав доступа mknod, read и write к /dev/sda,
sudo lxc-cgroup -n CN devices.allow "b 8:* rwm"
и для ограничения памяти до 300M:
lxc-cgroup -n CN memory.limit_in_bytes 300000000
lxc-netstat выполняет netstat в запущенном контейнере, давая вам
представление о статусе его сети.
lxc-backup создаст резервные копии корневой файловой системы
всех существующих контейнеров (за исключением основанных на
lvm-based ), используя rsync для сохранения содержимого в /var/lib/
lxc/CN/rootfs.backup.1. Эти резервные копии могут использоваться для
восстановления с помощью lxc-restore Однако, lxc-backup и lxc-
restore неустойчивы благодаря модификациям и, соответственно, не
рекомендуются к использованию.
5.3.7. Уничтожение контейнеров
Используйте lxc-destroy для уничтожения контейнера.
sudo lxc-destroy -n CN
Если контейнер запущен, lxc-destroy завершится с сообщением о
возможности остановить и уничтожить контейнер с помощью команды
sudo lxc-destroy -n CN -f
5.3.8. Использование расширенного пространства имен
Одной из особенностей ядра Linux, используемой в LXC для создания
контейнеров, являются частные пространства имён. Пространства
имён позволяют ряду задач иметь частные отображения имен ресурсов
для таких вещей как пути и ID процессов. (Смотрите Раздел 5.9,
«Ресурсы» [418] для дополнительной информации). В отличие от
408
Виртуализация
групп управления и других особенностей монтирования, которые
также используются при создании контейнеров, пространствами имён
невозможно манипулировать при помощи интерфейса файловой системы.
Поэтому LXC поставляется с программой lxc-unshare которая большей
частью используется для тестирования. Она предоставляет возможность
создавать новую задачу в частном пространстве имён. Например,
sudo lxc-unshare -s 'MOUNT|PID' /bin/bash
создаст оболочку shell с частными pid и пространством имён монтирования.
В этой оболочке вы можете выполнить
root@ubuntu:~# mount -t proc proc /proc
root@ubuntu:~# ps -ef
UID
PID PPID C STIME TTY
TIME CMD
root
1
0
6 10:20 pts/9
00:00:00 /bin/bash
root
110
1
0 10:20 pts/9
00:00:00 ps -ef
притом, что ps покажет только задачи в вашем новом пространстве имён.
5.3.9. Недолговечные контейнеры
Недолговечные (эфемерные - ephemeral) контейнеры - это одноразовые
контейнеры. Имея созданный контейнер CN, вы можете выполнить команду
в недолговечном контейнере, созданном на основе CN, подсоединив
пользователя jdoe в контейнер, используя команду:
lxc-start-ephemeral -b jdoe -o CN -- /home/jdoe/run_my_job
После завершения задания, контейнер будет сброшен.
5.3.10. Команды для работы с контейнерами
Далее приведена таблица всех контейнерных команд:
Таблица 20.3. Команды для работы с контейнером
Команда
Описание
lxc-attach
(НЕ ПОДДЕРЖИВАЕТСЯ) Выполняет команду в
запущенном контейнере
lxc-backup
Создаёт резервную копию корневой системы для
всех контейнеров, основанных на lvm
lxc-cgroup
Просмотр и установка параметров групп управления
lxc-checkconfig
Проверка основной системы на поддержку
контейнеров
409
Виртуализация
Команда
Описание
lxc-checkpoint
(НЕ ПОДДЕРЖИВАЕТСЯ) Контрольная точка для
запущенного контейнера
lxc-clone
Создание копии существующего контейнера
lxc-console
Открытие консоли работающего контейнера
lxc-create
Создание нового контейнера
lxc-destroy
Уничтожение существующего контейнера
lxc-execute
Запуск команды в (незапущенном) контейнере
приложений
lxc-freeze
Приостановка работающего контейнера
lxc-info
Вывод информации о состоянии контейнера
lxc-kill
Передача сигнала в инициализирующий процесс
контейнера
lxc-list
Получение списка всех контейнеров
lxc-ls
Получение списка всех контейнеров с меньшим
выводом, чем у lxc-list
lxc-monitor
Отслеживание изменения состояния одного или
нескольких контейнеров
lxc-netstat
Выполнение команды netstat в запущенном
контейнере
lxc-ps
Просмотр информации по процессам в работающем
контейнере
lxc-restart
(НЕ ПОДДЕРЖИВАЕТСЯ) Сброс контейнера,
остановленного в контрольной точке
lxc-restore
Восстановление контейнеров из резервных копий,
сделанных lxc-backup
lxc-setcap
(НЕ РЕКОМЕНДУЕТСЯ) Установка характеристик
файлов (file capabilities) на инструменты LXC
lxc-setuid
(НЕ РЕКОМЕНДУЕТСЯ) Установка или сброс setuid
битов для инструментов LXC
lxc-shutdown
Безопасное завершение работы контейнера
lxc-start
Запуск остановленного контейнера
lxc-start-ephemeral
Запуск недолговечного (одноразового) контейнера
lxc-stop
Немедленная остановка работающего контейнера
410
Виртуализация
Команда
Описание
lxc-unfreeze
Восстановление работы приостановленного
контейнера
lxc-unshare
Инструмент тестирования вручную объединенных
пространств имён
lxc-version
Вывод версии инструментов LXC
lxc-wait
Ожидание перехода контейнера в определенное
состояние
5.4. Файл конфигурации
Контейнеры LXC очень гибкие. Пакет Ubuntulxc устанавливает умолчания
таким образом, чтобы создание контейнеров в системе Ubuntu было
настолько простым, насколько это возможно. Если вам требуется большая
гибкость, то в этой главе будет показано как сделать тонкую настройку
ваших контейнеров под ваши нужды.
Детальная информация доступна на странице lxc.conf(5) руководства man.
Обратите внимание, что конфигурации по умолчанию, созданные по ubuntu
шаблонам, подходят для системных контейнеров и не требуют настройки.
5.4.1. Выбор файлов и опций настройки
Установка контейнера управляется параметрами настроек LXC. Параметры
могут быть указаны в нескольких местах:
• В процессе создания контейнера можно указать конфигурационный
файл. Однако шаблоны создания часто вставляют собственные
опции настройки, поэтому на данном этапе мы обычно определяем
только опции настройки сети. Другие настройки лучше изменять
редактированием конфигурационного файла после создания контейнера.
• Файл /var/lib/lxc/CN/config, используемый по умолчанию при запуске
контейнера.
• lxc-start воспринимает альтернативный файл настроек с помощью
параметра -f filename
• Отдельные переменные настроек могут быть переопределены в команде
lxc-start с использованием параметра -s key=value. В общем случае
лучше редактировать конфигурационный файл.
5.4.2. Настройка сети
Настройки сети в LXC контейнерах очень гибкие. Они переключаются
lxc.network.type записями в файле настроек. Если таких записей
411
Виртуализация
нет, то контейнер будет разделять сетевой стек основной системы.
Сервисы и соединения, запущенные в контейнере, будут использовать
IP-адрес основной системы. Если хотя бы одна запись lxc.network.type
присутствует, то контейнер получит частный (уровня 2) сетевой стек.
Он будет иметь собственные сетевые интерфейсы и правила firewall.
Существует несколько опций для lxc.network.type:
• lxc.network.type=empty: Контейнер не будет иметь других сетевых
интерфейсов, кроме loopback.
• lxc.network.type=veth: Это выбор по умолчанию, когда используются
шаблоны ubuntu или ubuntu-cloud, и в этом случае создаётся veth сетевой
туннель. Один конец этого туннеля становится сетевым интерфейсом
внутри контейнера, другой подключается к интерфейсу моста основной
системы. Любое количество таких туннелей может быть создано
добавлением записей lxc.network.type=veth в конфигурационный
файл. Мост, к которому будут подсоединяться туннели, определяется с
помощью lxc.network.link = lxcbr0.
• lxc.network.type=phys Физический сетевой интерфейс (т.е. eth2)
передаётся в контейнер.
Еще две опции, которые можно использовать, это vlan и macvlan, однако
их использование более сложное и не будет здесь рассматриваться.
Существует еще несколько других сетевых параметров:
• lxc.network.flags может быть установлено только в up и требуется для
проверки, что сетевой интерфейс поднят.
• lxc.network.hwaddr определяет MAC-адрес для присвоения сетевой
карте внутри контейнера.
• lxc.network.ipv4 и lxc.network.ipv6 устанавливают соответствующие IP-
адреса, если они должны быть статичными.
• lxc.network.name определяет имя для присвоения внутри контейнера.
Если не определено, выбираются правильные умолчания (т.е. eth0 для
первой сетевой карты).
• lxc.network.lxcscript.up пределяет сценарий, который должен быть
вызван после поднятия сети со стороны основной системы. Смотрите
страницу lxc.conf(5) руководства man для деталей.
5.4.3. Настройка групп управления
Опции cgroup могут быть указаны с использованием записей llxc.cgroup.
lxc.cgroup.subsystem.item = value указывает LXC установить для
элемента item подсистемы subsystem значение value. Это возможно
проще реализовать, чем просто записать значение в файл группы
412
Виртуализация
управления контейнера для подсистемы. Например, чтобы установить
ограничение для памяти в 320M вам следует добавить
lxc.cgroup.memory.limit_in_bytes = 320000000
что заставит записать значение 320000000 в файл /sys/fs/cgroup/memory/lxc/
CN/limit_in_bytes.
5.4.4. Rootfs, элементы монтирования и fstab
Важной частью настройки контейнера является монтирование различных
файловых систем в надлежащее место. Далее приведена часть
конфигурационного файла в качестве примера для демонстрации часто
используемых опций настройки:
lxc.rootfs = /var/lib/lxc/CN/rootfs lxc.mount.entry=proc /var/lib/lxc/CN/rootfs/proc proc nodev,noe
Первая строка говорит, что корневая файловая система контейнера уже
смонтирована в /var/lib/lxc/CN/rootfs. Если файловая система является
блочным устройством (таким как логический том LVM), то вместо этого
потребуется указать путь до блочного устройства.
Каждая строка lxc.mount.entry должна содержать элемент для
монтирования в правильном формате fstab. Целевой каталог должен
предваряться /var/lib/lxc/CN/rootfs, даже если lxc.rootfs указывает на
блочное устройство.
Наконец, lxc.mount указывает на файл в формате fstab, содержащий
дополнительные элементы монтирования. Обратите внимание, что
все эти записи будут смонтированы основной системой до запуска
инициализации контейнера. Таким образом существует возможность
связанного монтирования различных каталогов из основной системы в
контейнер.
5.4.5. Другие опции настройки
• lxc.cap.drop может быть использована для предотвращения получения
контейнером указанных возможностей. Например, добавление
lxc.cap.drop = sys_admin
предотвратит возможность монтирования файловых систем, так же как
другие действия, которые требуют cap_sys_admin. Смотрите страницу
capabilities(7) руководства man для перечня возможностей и их
толкований.
413
Виртуализация
• lxc.aa_profile = lxc-CN-profile определяет специальные профили
Apparmor в которых запускать контейнер. Смотрите Раздел 5.2.6,
«Apparmor» [398] для дополнительной информации.
• lxc.console=/path/to/consolefile определяет что консольные сообщения
должны записываться в указанный файл.
• lxc.arch определяет архитектуру контейнера, например, x86 или x86_64.
• lxc.tty=5 определяет, что должны быть созданы 5 консолей (в
дополнение к /dev/console). Соответственно, будут доступны консоли от /
dev/tty1 до /dev/tty1. Шаблоны ubuntu устанавливают это значение в 4.
• lxc.pts=1024 определяет, что контейнер должен иметь смонтированную
частную (Unix98) файловую систему devpts. Если не указано, то контейнер
будет разделять (иметь в совместном доступе) /dev/pts с основной
системой, что редко бывает желательным. Число 1024 означает, что 1024
pty должны быть доступны в контейнере, однако это число в настоящее
время игнорируется. Перед запуском инициализации контейнера, LXC (по
существу) выполняет
sudo mount -t devpts -o newinstance devpts /dev/pts
внутри контейнера. Важно понимать, что контейнер не может
монтировать файловые системы devpts сам по себе. Он может
безопасно присоединить или переместить точки монтирования своих
смонтированных /dev/pts. Но если он выполнит
sudo mount -t devpts devpts /dev/pts
он перемонтирует экземпляры devpts основной системы. Если добавлена
опция монтирования newinstance, то это смонтирует новые частные
(пустые) экземпляры. Ни в одном случае он не может перемонтировать
экземпляры, определенные LXC. По этой причине и для предотвращения
использования контейнером pty основной системы, политика Apparmor по
умолчанию не позволяет контейнерам монтировать файловые системы
devpts после запуска инициализации контейнера.
• lxc.devttydir определяет каталог внутри /dev, в котором LXC будет
создавать свои консольные устройства. Если эта опция не определена,
то все pty будут монтироваться связыванием с /dev/console и /dev/ttyN.
Однако изредка обновления пакетов могут пытаться слепо выполнять
rm -f и затем mknod для этих устройств. Это будет приводить к сбоям
(поскольку используется монтирование связыванием), что приведет к
сбою установки обновлений. Когда lxc.devttydir установлен на LXC,
например, то LXC будет монтировать связыванием консоли pty в /dev/
lxc/console и /dev/lxc/ttyN и впоследствии символически связывают их
414
Виртуализация
с /dev/console и /dev/ttyN. Это позволит обновлениям пакетов удачно
устанавливаться, из-за риска последующего получения сбоя при
выполнении gettys на этих консолях до следующей перезагрузки. Эта
проблема идеально решается с помощью пространств имён устройств.
5.5. Обновления в контейнерах Ubuntu
Из-за некоторых ограничений, присутствующих в контейнерах, обновления
пакетов временами могут завершаться с ошибкой. Например, установка
или обновление пакета может закончиться неудачей, если не позволено
создавать или открывать блочные устройства. Это часто блокирует
все дальнейшие обновления, пока не разрешится данная проблема. В
некоторых случаях вы можете обойти проблему, используя chroot внутри
контейнера, чтобы обойти ограничения и завершить обновления внутри
chroot.
Некоторые известные специфические вещи, которые могут время от
времени препятствовать обновлению пакетов, включают:
• Изменения в контейнере, выполненные при создании контейнера с
помощью опции --trim.
• Действия, выполненные lxcguest. Например, если /lib/init/fstab
смонтирован связыванием с другим файлом, обновления mountall,
которые настаивают на замене этого файла, могут завершиться
неудачей.
• Перемонтированные консольные устройства с pty из основной системы
могут иметь проблемы с обновлениями udev.
• Политики Apparmor и ограничения cgroup для устройств могут мешать
обновлениям при выполнении определенных действий.
• Разрешения, сброшенные с помощью lxc.cap.drop, могут аналогично
остановить обновления пакетов при выполнении определенных действий.
5.6. Libvirt LXC
Libvirt является мощным решением по управлению гипервизорами
(программами управления операционными системами), с помощью которой
можно администрировать виртуальные машины под Qemu, Xen и LXC, как
локально так и удаленно. Драйвер libvirt LXC - это отдельная реализация
того, что мы обычно называем LXC. Вот некоторые отличия:
• Конфигурация сохраняется в формате XML
• Нет инструментов, облегчающих создание контейнера
• По умолчанию отсутствует консоль /dev/console
415
Виртуализация
• Не поддерживается (пока) перезагрузка или полная остановка
контейнеров
5.6.1. Преобразование контейнера LXC в libvirt-lxc
В разделе Раздел 5.3.1, «Создание контейнеров» [401] показано, как
создавать LXC контейнеры. Если вы создали рабочий LXC контейнер таким
способом, то вы можете управлять им при помощи libvirt. Загрузите xml
файл в качестве примера:
Отредактируйте этот файл, заменив название контейнера и расположение
корневой файловой системы. Затем вы можете зарегистрировать
контейнер командой:
virsh -c lxc:/// define o1.xml
5.6.2. Создание контейнера из облачного образа
Если вы предпочитаете создавать новые оригинальные контейнеры только
под LXC, вы можете загрузить образ для облака ubuntu, извлечь его и
указать его расположение в xml файле libvirt LXC. Например, найдем
адрес образа последней ежедневной корневой сборки Ubuntu 12.04 LTS
следующим образом:
url1=`ubuntu-cloudimg-query precise daily $arch --format "%{url}\n"` url=`echo $url1 | sed -e 's/.t
Распакуйте загруженный образ, например, так:
mkdir $HOME/c1 cd $HOME/c1 sudo tar zxf $filename
Загрузите шаблон xml:
В шаблоне замените o1 на c1 и каталог расположения /var/lib/lxc/o1/rootfs
на $HOME/c1. Затем зарегистрируйте контейнер с помощью:
virsh define o1.xml
5.6.3. Взаимодействие с контейнерами libvirt
Как мы видели, вы можете создавать libvirt-lxc контейнеры с помощью:
416
Виртуализация
virsh -c lxc:/// define container.xml
Для запуска контейнера с именем container используйте:
virsh -c lxc:/// start container
Для остановки запущенного контейнера:
virsh -c lxc:/// destroy container
Обратите внимание, что хотя команда lxc-destroy уничтожает контейнер,
команда virsh destroy только останавливает работающий контейнер. Для
удаления регистрации контейнера используйте:
virsh -c lxc:/// undefine container
Для получения консоли работающего контейнера используйте:
virsh -c lxc:/// console container
Для выхода из консоли нажмите комбинацию Ctrl-].
5.7. Пакет lxcguest
В выпусках Ubuntu 11.04 (Natty) и 11.10 (Oneiric) был представлен пакет
lxcguest. Немодифицированный коревой образ не может быть безопасно
загружен внутри контейнера, однако образ с установленным пакетом
lxcguest может быть загружен как контейнер на голом железе или под
виртуальной машиной Xen, kvm или VMware.
Что касается выпуска 12.04 LTS, функции, выполнявшиеся ранее пакетом
lxcguest, были возложены на пакеты ядра, а пакет lxcguest был удалён.
Как результат, оригинальный образ 12.04 LTS без изменений может
быть загружен в качестве контейнера как на голом железе, так и под
виртуальными машинами Xen, kvm или VMware. Использование более
ранних выпусков всё ещё требует использования пакета lxcguest .
5.8. Защита
Пространство имен сопоставляет идентификаторы с ресурсами. Чтобы
не предоставлять доступ контейнерам к любым идентификаторам (id),
указывающим на ресурсы, ресурсы должны быть защищены. Это является
основой некоторой безопасности, предоставляемой пользователям
контейнеров. Например, пространство имён IPC (взаимодействия между
процессами) полностью изолировано. Однако другие пространства имён
417
Виртуализация
имеют различные уязвимости, которые позволяют получать неправильно
предоставленные привилегии из одного контейнера в другой или в
основную систему.
По умолчанию LXC контейнеры запускаются под управлением политики
Apparmor для ограничения некоторых действий. Несмотря на то, что более
строгая безопасность является задачей следующих редакций, в 12.04 LTS
задачей политики Apparmor является не прекращение злонамеренных
действий, а предупреждения случайных повреждений основной системы из
гостевой.
Смотрите LXC security wiki39 для дополнительной актуальной информации.
5.8.1. Используемые системные вызовы
Возможность совместного использования ядра системы контейнерами
является базовой особенностью. Поэтому, если ядро содержит некоторые
потенциально опасные вызовы, контейнеры также могут их использовать.
Как только контейнер сможет контролировать ядро системы, он сможет
полностью управлять любыми ресурсами, доступными основной системе.
5.9. Ресурсы
• Статья в DeveloperWorks LXC: Linux container tools40 является введением в
использование контейнеров.
• Secure Containers Cookbook41 демонстрирует использование модулей
безопасности с целью сделать контейнеры более безопасными.
• Страницы руководств могут быть найдены по данным ссылкам:
capabilities4342
lxc.conf45.44
• Страница проекта LXC на Sourceforge46.
• Проблемы безопасности приведены и обсуждаются на странице the LXC
Security wiki page47
• Для дополнительной информации по пространствам имен в Linux
смотрите: S.Bhattiprolu, E.W.Biederman, S.E.Hallyn, and D.Lezcano. Virtual
39
40
41
43
42
45
44
46
47
418
Виртуализация
Servers and Checkpoint/Restart in Mainstream Linux. SIGOPS Operating
Systems Review, 42(5), 2008.
419
Глава 21. Кластеризация
420
Кластеризация
1. DRBD
Распределённое копируемое блочное устройство (Distributed Replicated
Block Device - DRBD) создаёт зеркало между блочными устройствами
нескольких систем. Копирование незаметно (прозрачно) для других
приложений на этих системах. Любые блочные устройства: жёсткие диски,
разделы, RAID устройства, логические тома и т.п. могут зеркалироваться.
Перед началом использования drbd установим необходимые пакеты.
Введите в терминале:
sudo apt-get install drbd8-utils
Если вы используете виртуальное ядро как часть виртуальной
машины, вам потребуется вручную скомпилировать модуль drbd.
Возможно, более простым способом окажется установка пакета
linux-server внутри виртуальной машины.
В этом разделе рассматривается установка drbd для репликации отдельных
/srv разделов с файловой системой ext3 между двумя системами. Размер
разделов не имеет особого значения, но оба раздела должны иметь
одинаковый размер.
1.1. Конфигурация
Две системы в этом примере будут называться drbd01 и drbd02. Им
потребуется разрешение имён, настроенное через DNS или с помощью
файла /etc/hosts. Подробности смотрите в разделе Глава 8, Служба
доменных имён (DNS) [158].
• Для настройки drbd на первой системе отредактируйте /etc/drbd.conf:
global { usage-count no; }
common { syncer { rate 100M; } }
resource r0 {
protocol C;
startup {
wfc-timeout
15;
degr-wfc-timeout 60;
}
net {
cram-hmac-alg sha1;
shared-secret "secret";
}
on drbd01 {
device /dev/drbd0;
421
Кластеризация
disk /dev/sdb1;
address 192.168.0.1:7788;
meta-disk internal;
}
on drbd02 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.2:7788;
meta-disk internal;
}
}
Существует множество других опций в /etc/drbd.conf, но для
данного примера прекрасно подходят их значения по умолчанию.
• Теперь скопируем /etc/drbd.conf на вторую систему:
scp /etc/drbd.conf drbd02:~
• И на drbd02 переместим файл в /etc:
sudo mv drbd.conf /etc/
• Теперь с помощью утилиты drbdadm инициализируем хранилище
метаданных. На каждом сервере выполним:
sudo drbdadm create-md r0
• Далее на обеих системах запустим сервис drbd:
sudo /etc/init.d/drbd start
• На drbd01 или той системе, которую вы хотите сделать основной, введите
следующее:
sudo drbdadm -- --overwrite-data-of-peer primary all
• После выполнения вышеприведённой команды данные начнут
реплицироваться на вторую систему. Чтобы наблюдать за процессом, на
drbd02 введите следующее:
watch -n1 cat /proc/drbd
Для остановки просмотра нажмите Ctrl+c.
• Наконец, установите файловую систему на /dev/drbd0 и смонтируйте ее:
sudo mkfs.ext3 /dev/drbd0
sudo mount /dev/drbd0 /srv
422
Кластеризация
1.2. Тестирование
Чтобы убедиться, что данные действительно синхронизируются между
системами, скопируйте несколько файлов на drbd01 (основной системе) в
каталог /srv:
sudo cp -r /etc/default /srv
Далее, отсоедините /srv:
sudo umount /srv
Установите первичному серверу роль вторичного:
sudo drbdadm secondary r0
Теперь установите вторичному серверу роль первичного role:
sudo drbdadm primary r0
Наконец, монтируем раздел:
sudo mount /dev/drbd0 /srv
Используя ls вы сможете увидеть /srv/default, скопированный с бывшего
первичного сервера drbd01.
1.3. Ссылки
• Для дополнительной информации по DRBD посетите DRBD web site1.
• Страница руководства drbd.conf man page2 содержит подробности по
опциям, не описанным в данном руководстве.
• Также посмотрите страницу руководства по drbdadm3.
• Дополнительную информацию также содержит страница DRBD Ubuntu
Wiki4.
423
Глава 22. VPN
OpenVPN - гибкое, надёжное и безопасное решение для создания
виртуальной частной сети (VPN), которое доступно в репозиториях Ubuntu.
Оно относится к семейству стеков SSL/TLS VPN (отличается от IPSec VPN).
Эта глава посвящена установке и настройкеOpenVPN для создания VPN.
424
VPN
1. OpenVPN
Если вы хотите больше, чем просто pre-shared ключи OpenVPN облегчает
установку и использование инфраструктуры открытых ключей
(PKI), использующих SSL/TLS сертификаты для аутентификации и
обмена ключами между VPN-сервером и клиентами. OpenVPN может
использоваться в маршрутизирующим или мостовым VPN режиме и может
быть настроен для использования либо UDP или TCP. Номер порта может
быть сконфигурирован как угодно, но официальный порт 1194. Один порт
используется для всех коммуникаций. VPN сервер доступны практически
для чего угодно, включая все дистрибутивы Linux, OS X, Windows и WLAN-
маршрутизаторах на основе OpenWRT.
1.1. Установка сервера
Для установки openvpn наберите в терминале:
sudo apt-get install openvpn
1.2. Настройка инфраструктуры открытых ключей
Первый шаг в построении конфигурации OpenVPN является создание
инфраструктуры открытых ключей (Public Key Infrastructure). PKI состоит из:
• отдельного сертификата (также известного как открытый ключ) и
закрытого ключа для сервера и каждого клиента, и
• центра сертификации (CA), сертификата и ключа, который используется
для входа каждого сервера и клиентских сертификатов.
OpenVPN поддерживает двунаправленную аутентификацию на основе
сертификатов, что означает, что клиент должен проверить подлинность
сертификата сервера и сервер должен проверить подлинность
сертификата клиента перед установлением взаимного доверия.
И сервер и клиент аутентифицируют друг друга сначала проверяя,
что представленный сертификат подписан главным сертификатом
центра сертификатов, а затем проверяя информацию в заголовке свеже-
аутентифицированного сертификата, такую как общее имя или тип
сертификата (клиент или сервер).
1.2.1. Установка центра сертификации
Чтобы установить ваш собственный центр сертификации (CA) и
сгенерировать сертификаты и ключи для OpenVPN сервера и нескольких
425
VPN
клиентов необходимо сначала скопировать easy-rsa в каталог /etc/openvpn.
Это будет гарантировать, что любые изменения в сценарии не будут
потеряны при обновлении пакета. В терминале зайдите под пользователем
root и:
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
Затем отредактируйте /etc/openvpn/easy-rsa/vars, настроив следующее под
свою рабочую среду:
export KEY_COUNTRY="US"
export KEY_PROVINCE="NC"
export KEY_CITY="Винстон-Салем"
export KEY_ORG="Example Company"
export KEY_EMAIL="steve@example.com"
Введите следующее для создания главного сертификата центра
сертификации (CA) и ключа:
cd /etc/openvpn/easy-rsa
Переменные в исходном коде
./clean-all
./build-ca
1.2.2. Сертификаты сервера
Далее, мы будем генерировать сертификат и закрытый ключ для сервера:
./build-key-server myservername
Как и в предыдущем шаге, для большинства параметров можно оставить
значения по умолчанию. Два других запроса требуют положительного
ответа: "Sign the certificate? [y/n]" и "1 out of 1 certificate requests certified,
commit? [y/n]".
Для сервера OpenVPN необходимо использовать алгоритм Диффи -
Хеллмана
./build-dh
Все сертификаты и ключи были сгенерированы в подкаталоге keys/. Обычно
их копируют в /etc/openvpn/:
cd keys/
426
VPN
cp myservername.crt myservername.key ca.crt dh1024.pem /etc/openvpn/
1.2.3. Сертификаты клиента
Клиенту VPN также будет необходим сертификат для самоаутентификации
на сервере. Обычно вы создаёте свой сертификат для каждого клиента.
Для создания сертификата, введите следующую команду в терминале,
будучи пользователем root:
cd /etc/openvpn/easy-rsa
Переменные в исходном коде
./build-key client1
Скопируйте следующие файлы на клиент с помощью безопасного метода:
• /etc/openvpn/ca.crt
• /etc/openvpn/easy-rsa/keys/client1.crt
• /etc/openvpn/easy-rsa/keys/client1.key
Все клиентские сертификаты и ключи необходимы только на клиентском
компьютере, вы должны удалить их с сервера.
1.3. Простая конфигурация сервера
Вместе с установкой OpenVPN вы получили примеры этиих
конфигурационных файлов (и многих других, если вы посмотрите):
root@server:/# ls -l /usr/share/doc/openvpn/examples/sample-config-files/
total 68
-rw-r--r-- 1 root root 3427 2011-07-04 15:09 client.conf
-rw-r--r-- 1 root root 4141 2011-07-04 15:09 server.conf.gz
Начните с копирования и распаковки server.conf.gz в /etc/openvpn/
server.conf.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz
Отредактируйте /etc/openvpn/server.conf так, чтобы убедиться, что
следующие строки указывают на сертификаты и ключи, которые вы
создали в предыдущем разделе.
ca ca.crt
cert myservername.crt
key myservername.key
dh dh1024.pem
427
VPN
Это минимальная настройка для получения рабочего сервера OpenVPN. Вы
можете использовать все настройки по умолчанию в файле конфигурации
server.conf. Теперь запустите сервер. Вы найдете общий отчет и сообщения
об ошибках в вашем системном журнале syslog.
root@server:/etc/openvpn# /etc/init.d/openvpn start
* Starting virtual private network daemon(s)...
*
Autostarting VPN 'server'
[ OK ]
Теперь проверьте, что OpenVPN создал интерфейс tun0:
root@server:/etc/openvpn# ifconfig tun0
tun0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
[...]
1.4. Простая конфигурация клиента
Существуют различные реализации клиента OpenVPN с GUI и без него. Вы
можете прочитать больше о клиентах в одном из следующих разделов.
Сейчас мы используем клиент OpenVPN для Ubuntu, который представляет
собой тот же исполняемый файл, что и сервер. Поэтому вы должны снова
установить пакет openvpn на клиентском компьютере:
sudo apt-get install openvpn
В этот раз скопируйте файл примера client.conf в каталог /etc/openvpn/:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
Скопируйте ключи и сертификат CA клиента, созданный в предыдущем
разделе, например, в /etc/openvpn/ и отредактируйте /etc/openvpn/client.conf,
чтобы убедиться, что следующие строки указывают на эти файлы. Если
ваши файлы находятся в /etc/openvpn/, можно не указывать путь.
ca ca.crt
cert client1.crt
key client1.key
И вы должны определить по крайней мере имя или адрес сервера OpenVPN.
Убедитесь, что в конфигурационном файле присутствует ключевое слово
client. Оно включает режим клиента.
428
VPN
client
remote vpnserver.example.com 1194
Затем запустите клиент OpenVPN:
root@client:/etc/openvpn# /etc/init.d/openvpn start
* Starting virtual private network daemon(s)...
*
Autostarting VPN 'client'
[ OK ]
Проверьте, создан ли интерфейс tun0:
root@client:/etc/openvpn# ifconfig tun0
tun0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.6 P-t-P:10.8.0.5 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
Проверьте командой ping доступность сервера OpenVPN:
root@client:/etc/openvpn# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.920 ms
Сервер OpenVPN всегда использует первый доступный адрес в
сети клиента, и только этот IP адрес будет откликаться на ping.
Например, если вы настроили сетевую маску клиента /24, то будет
использован адрес, оканчивающийся на .1. Адрес P-t-P, который вы
видите в выводе ifconfig выше, обычно не отвечает на запросы ping.
Проверьте свои маршруты:
root@client:/etc/openvpn# netstat -rn
Kernel IP routing table
Destination
Gateway
Genmask
Flags
MSS Window irtt Iface
10.8.0.5
0.0.0.0
255.255.255.255 UH
0 0
0 tun0
10.8.0.1
10.8.0.5
255.255.255.255 UGH
0 0
0 tun0
192.168.42.0
0.0.0.0
255.255.255.0
U
0 0
0 eth0
0.0.0.0
192.168.42.1
0.0.0.0
UG
0 0
0 eth0
1.5. Первые поиски и устранения неисправностей
Если что-то из того, что рассмотрено выше, у вас не работает, проверьте
следующее:
• Проверьте ваш системный журнал, например, с помощью grep -i vpn /var/
log/syslog
• Может ли клиент подключиться к серверу? Может быть, брандмауэр
блокирует доступ? Проверьте системный журнал на сервере.
429
VPN
• Клиент и сервер должны использовать тот же протокол и порт, например.
UDP порт 1194, смотрите порт и опцию proto в config
• Клиент и сервер должны использовать один и тот же алгоритм сжатия,
смотрите опцию comp-lzo в config
• Клиент и сервер должны использовать одну и ту же конфигурацию
относительно режима мости режима маршрутизации, смотрите server и
server-bridge в config
1.6. Дополнительные настройки
1.6.1. Расширенная настройка VPN на сервере в режиме маршрутизации
Выше рассмотрена очень простая работающая настройка VPN. Клиент
имеет доступ к сервисам на машине VPN сервера через зашифрованный
канал. Если вы хотите получить доступ к большему количеству серверов
или к чему-то в других сетях, добавьте несколько маршрутов на клиенте.
Например, если сеть вашей компании в целом может быть описана как
192.168.0.0/16, вы можете добавить этот маршрут на клиенте. Но вам
придется также изменить маршрут для обратного направления - ваши
сервера должны знать как проложить маршрут до сети VPN клиента.
Или вы можете указать шлюз по умолчанию для всех клиентов чтобы
посылать весь их трафик сначала на VPN сервер, а от него через защитный
сервер (firewall) компании в интернет. В этом разделе вы увидите
некоторые возможные варианты настроек.
Передать маршрут клиенту чтобы разрешить ему доступ к другим частным
подсетям за сервером. Помните, что эти частные сети также должны
знать как построить маршрут до диапазона адресов клиента OpenVPN
(10.8.0.0/24), находящегося за OpenVPN сервером:
push "route 10.0.0.0 255.0.0.0"
Если указана, то такая директива настроит всех клиентов на
перенаправление их сетевых шлюзов по умолчанию через VPN, что заставит
весь трафик, такой как просмотр страниц интернет-сайтов или DNS
запросы, проходить через VPN (машине OpenVPN сервера или вашему
центральному firewall может потребоваться маскировать с помощью NAT
интерфейсы TUN/TAP в сторону интернета, чтобы они работали правильно):
push "redirect-gateway def1 bypass-dhcp"
Настройте режим сервера и предоставьте подсеть VPN, откуда OpenVPN
будет брать адреса клиентов. Сервер возьмёт себе адрес 10.8.0.1, а
430
VPN
остальные могут использоваться для предоставления клиентам. Каждый
клиент будет иметь возможность подключиться к серверу по адресу
10.8.0.1. Закомментируйте эту строку, если используете режим сетевого
моста:
server 10.8.0.0 255.255.255.0
Сохраните записи соответствий клиентов с их виртуальными IP-адресами
в указанном файле. Если OpenVPN выключается или перегружается,
повторно подключившиеся клиенты получат те же виртуальные IP-адреса,
что и в прошлый раз:
ifconfig-pool-persist ipp.txt
Передать настройки на DNS сервера клиенту:
push "dhcp-option DNS 10.0.0.2"
push "dhcp-option DNS 10.1.0.2"
Разрешите связь между клиентами.
client-to-client
Включите сжатие в VPN канале.
comp-lzo
Директива keepalive обеспечивает отправку сообщений типа ping вперёд
и назад через соединение для того, чтобы каждая сторона знала, когда
другая сторона становится недоступна. Проверка выполняется раз в
секунду; предполагается, что что удалённый узел не отвечает, если ответ
не получен в течение 3 секунд.
keepalive 1 3
Неплохая идея - понизить привилегии демона OpenVPN после
инициализации.
user nobody
group nogroup
OpenVPN 2.0 включает в себя функцию, которая позволяет серверу
OpenVPN безопасным способом получить имя пользователя и пароль от
подключаемого клиента, и использовать эту информацию в качестве
431
VPN
основы для аутентификации клиента. Чтобы использовать этот метод
аутентификации, сначала добавьте директиву auth-user-pass для настройки
клиента. Это укажет клиенту OpenVPN запросить у пользователя "имя
пользователя/пароль" для передачи на сервер по защищенному TLS-каналу.
# client config!
auth-user-pass
Это заставит сервер OpenVPN проверить имя пользователя/пароль,
полученный от клиента, используя логин PAM-модуля. Полезно, если у вас
есть централизованная аутентификация, например Kerberos.
plugin /usr/lib/openvpn/openvpn-auth-pam.so login
Пожалуйста, ознакомьтесь с дополнительными мерами
безопасности в руководстве по усиленной безопасности1 OpenVPN.
1.6.2. Расширенная настройка VPN на сервере в режиме сетевого моста
OpenVPN может быть установлен либо для маршрутизации либо в режиме
моста VPN. Иногда это называют OSI Layer-2 по сравнению с Layer-3 VPN.
В режиме моста VPN все кадры Layer-2, например все Ethernet кадры
отправляются в VPN канал, а в режиме маршрутизации в VPN канал
отправляются Layer-3 пакеты. В режиме моста весь трафик, включая
трафик локальной сети, как Broadcast, DHCP-запросы, ARP запросы и т.д.,
направляются в VPN канал, тогда как в режиме маршрутизации он будет
отфильтрован.
1.6.2.1. На сервере предварительно сконфигурируйте интерфейс для
режима моста
Убедитесь, что у вас установлен пакет bridge-utils:
sudo apt-get install bridge-utils
Перед вами настройки для OpenVPN в режиме моста, вы должны изменить
ваши настройки интерфейса. Давайте предположим, что ваш сервер имеет
интерфейс eth0 подсоединен к Интернет и интерфейс eth1 подключен
к локальной сети, вы хотите, чтобы он работал в режиме моста. Ваш
файл конфигурации должен быть выгляжеть примерно так /etc/network/
interfaces:
auto eth0
432
VPN
iface eth0 inet static
address 1.2.3.4
netmask 255.255.255.248
default 1.2.3.1
auto eth1
iface eth1 inet static
address 10.0.0.4
netmask 255.255.255.0
Эта простая конфигурация должна быть изменена для режима моста,
где конфигурация интерфейса eth1 переходит на новый интерфейс br0.
Плюс мы настроим, что br0 будет привязан к интерфейсу eth1. Мы также
должны убедиться, что интерфейс eth1 всегда в «неразборчивом» режиме,
в котором сетевая плата позволяет принимать все пакеты независимо от
того, кому они адресованы.
auto eth0
iface eth0 inet static
address 1.2.3.4
netmask 255.255.255.248
default 1.2.3.1
auto eth1
iface eth1 inet manual
up ip link set $IFACE up promisc on
auto br0
iface br0 inet static
address 10.0.0.4
netmask 255.255.255.0
bridge_ports eth1
На этом этапе вы должны перезагрузить сеть. Будьте готовы, что это
может работать не так, как ожидалось, и что вы потеряете удаленного
подключения. Убедитесь, что вы можете решить проблемы, имея
локальный доступ.
sudo /etc/init.d/network restart
1.6.2.2. Подготовить конфигурацию сервера для режима моста
Отредактируйте /etc/openvpn/server.conf изменяя следующие настройки на:
;dev tun
dev tap
up "/etc/openvpn/up.sh br0 eth1"
;server 10.8.0.0 255.255.255.0
server-bridge 10.0.0.4 255.255.255.0 10.0.0.128 10.0.0.254
433
VPN
Далее, создайте вспомогательный скрипт, чтобы добавить tap интерфейс к
мосту, и обеспечте, чтобы интерфейс eth1 был в «неразборчивом» режиме.
Создайте /etc/openvpn/up.sh:
#!/bin/sh
BR=$1
ETHDEV=$2
TAPDEV=$3
/sbin/ip link set "$TAPDEV" up
/sbin/ip link set "$ETHDEV" promisc on
/sbin/brctl addif $BR $TAPDEV
Затем сделайте его исполняемым:
sudo chmod 755 /etc/openvpn/up.sh
После настройки сервера, перезапустите openvpn, введя:
sudo /etc/init.d/openvpn restart
1.6.2.3. Настройка клиента
Сначала установите openvpn на стороне клиента:
sudo apt-get install openvpn
После окончания конфигурирования сервера и копирования клиентского
сертификата в папку /etc/openvpn/, создайте файл конфигурации клиента,
используя приведенный пример. В окне терминала на клиентской машине
введите:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn
Теперь отредактируйте /etc/openvpn/client.conf, изменив следующие
параметры:
dev tap
;dev tun
Наконец, перезапустите openvpn:
sudo /etc/init.d/openvpn restart
Теперь вам должна быть доступна возможность подсоединения к
удалённой сети через VPN.
434
VPN
1.7. Реализации клиентского программного обеспечения
1.7.1. Графический интерфейс сетевого менеджера Linux для OpenVPN
Многие дистрибутивы Linux, включая варианты Ubuntu для настольных
компьютеров, поставляются с Network Manager - удобным графическим
интерфейсом для настройки параметров сети. Он также может управлять
вашими VPN-соединениями. Убедитесь, что у вас установлен пакет network-
manager-openvpn. Здесь вы видите, что устанавливаются также и другие
необходимые пакеты:
root@client:~# apt-get install network-manager-openvpn
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
liblzo2-2 libpkcs11-helper1 network-manager-openvpn-gnome openvpn
Suggested packages:
resolvconf
The following NEW packages will be installed:
liblzo2-2 libpkcs11-helper1 network-manager-openvpn
network-manager-openvpn-gnome openvpn
0 upgraded, 5 newly installed, 0 to remove and 631 not upgraded.
Need to get 700 kB of archives.
After this operation, 3,031 kB of additional disk space will be used.
Do you want to continue [Y/n]?
Чтобы информировать network-manager о новых установленных пакетах,
вам придется перезапустить его:
root@client:~# restart network-manager
network-manager start/running, process 3078
Откройте Network Manager, выберите VPN, затем нажмите "Добавить".
Выберите OpenVPN на вкладке VPN и нажмите "Создать". В следующем
окне добавьте OpenVPN сервер как " Шлюз" и установите "Сертификаты
(TLS)" в пункте " Сертификат Пользователя", чтобы использовать
сертификат пользователя, "CA Сертификат", чтобы использовать
сертификат CA и "Закрытый ключ", чтобы использовать закрытый ключ.
Используйте кнопку дополнительно, на которой вы можете включить
сжатие или другие специальные настройки, установленные на сервере.
Теперь попробуйте подключиться по VPN.
1.7.2. OpenVPN с GUI для Mac OS X: Tunnelblick
Tunnelblick - это отличная бесплатная, свободная реализации GUI OpenVPN
для OS X. Домашняя страница проекта http://code.google.com/p/tunnelblick/.
435
VPN
Скачайте оттуда последнюю версию для OS X и установите её. Затем
поместите конфигурационный файл client.ovpn вместе с сертификатами
и ключами в /Users/username/Library/Application Support/Tunnelblick/
Configurations/ и запустите Tunnelblick
# sample client.ovpn for Tunnelblick
client
remote blue.example.com
port 1194
proto udp
dev tun
dev-type tun
ns-cert-type server
reneg-sec 86400
auth-user-pass
auth-nocache
auth-retry interact
comp-lzo yes
verb 3
ca ca.crt
cert client.crt
key client.key
1.7.3. OpenVPN с GUI для Win 7
Сначала скачайте и установите последнюю версию OpenVPN Windows
Installer2. На момент написания данного руководства это была версия
OpenVPN 2.2.1. Дополнительно скачайте альтернативный графический
интерфейс для Open VPN под Windows. OpenVPN MI GUI с http://openvpn-mi-
gui.inside-security.de кажется вполне подходящим для Windows 7. Скачайте
последнюю версию, на момент написания руководства это была версия
20110624.
Вы должны запустить службу OpenVPN. Путь: Пуск> Компьютер>
Управление> Службы и приложения> Службы. Найдите OpenVPN службу
и запустить ее. Установите тип ее запуска автоматически. Когда вы
запускаете OpenVPN GUI MI первый раз вам нужно запустите ее с правами
администратора. Вы должны щелкнуть правой кнопкой мыши по нему и вы
увидите дополнительные опции.
Вам придется написать свой конфигурационный файл OpenVPN в текстовом
файле и поместить его в C:\Program Files\OpenVPN\config\client.ovpn вместе с
сертификатами CA. Вы можете установить сертификат пользователя в его
домашний каталог, как в следующем примере.
436
VPN
# C:\Program Files\OpenVPN\config\client.ovpn
client
remote server.example.com
port 1194
proto udp
dev tun
dev-type tun
ns-cert-type server
reneg-sec 86400
auth-user-pass
auth-retry interact
comp-lzo yes
verb 3
ca ca.crt
cert "C:\\Users\\username\\My Documents\\openvpn\\client.crt"
key "C:\\Users\\username\\My Documents\\openvpn\\client.key"
management 127.0.0.1 1194
management-hold
management-query-passwords
auth-retry interact
1.7.4. OpenVPN для OpenWRT
OpenWRT описывается в виде дистрибутива Linux для встраиваемых
устройств, таких как WLAN маршрутизаторы. Есть определенные типы
WLAN-маршрутизаторов, которые могут быть прошиты в OpenWRT. В
зависимости от доступной памяти на вашем OpenWRT маршрутизаторе, вы
можете запустить программное обеспечение, как OpenVPN и вы могли бы,
например поставить в небольшой филиал недорогой маршрутизатор для
соединений по VPN в центральный офис. Больше информации о OpenVPN на
Войдите в свой OpenWRT маршрутизатор и установите OpenVPN:
opkg update
opkg install openvpn
Найдите /etc/config/openvpn и поместите в него ваши настройки клиента.
Скопируйте сертификаты и ключи в /etc/openvpn/.
config openvpn client1
option enable 1
option client 1
#
option dev tap
option dev tun
option proto udp
option ca /etc/openvpn/ca.crt
437
VPN
option cert /etc/openvpn/client.crt
option key /etc/openvpn/client.key
option comp_lzo 1
Перезапустите OpenVPN:
/etc/init.d/openvpn restart
Вы должны видеть, если вам нужно настроить маршруты, маршрутизацию
и правила брандмауэра.
1.8. Ссылки
• Обращайтесь на сайт OpenVPN4 за дополнительной информацией.
• Руководство усиленной по безопасности OpenVPN5
• Также, хорошим подспорьем будет руководство издательства Pakt:
OpenVPN: Building and Integrating Virtual Private Networks6.
438
Глава 23. Другие полезные
приложения
Существует множество очень полезных приложений, разработанных
командой Ubuntu Server Team и другими разработчиками, интегрированных
в Ubuntu Server Edition, но которые могут быть не очень хорошо известны.
Эта глава демонстрирует несколько полезных приложений, которые
делают управление сервером Ubuntu (или множеством Ubuntu серверов)
более простым.
439
Другие полезные приложения
1. pam_motd
При входе на сервер Ubuntu вы можете заметить информативное
сообщение дня (Informative Message Of The Day - MOTD). Эта информация
собирается и отображается с использованием пары пакетов:
• landscape-common:: предоставляет основные библиотеки для landscape-
client, который может использоваться для управления системой с
помощью веб-приложения Landscape. Пакет включает утилиту /usr/
bin/landscape-sysinfo, которая используется для сбора информации,
выводимой в MOTD.
• update-notifier-common:: используется для автоматического обновления
MOTD через модуль pam_motd.
pam_motd выполняет сценарии в /etc/update-motd.d в порядке чисел,
предваряющих имена файлов. Вывод сценариев записывается в /var/run/motd
с сохранением порядковых номеров и затем объединяется с /etc/motd.tail.
Вы можете добавить вашу собственную динамическую информацию в
MOTD. Например, чтобы добавить информацию о местной погоде:
• Сначала установите пакет weather-util:
sudo apt-get install weather-util
• Утилита weather использует данные METAR из National Oceanic and
Atmospheric Administration и прогнозы от National Weather Service. Чтобы
найти информацию для вашего региона вам потребуется 4-хсимвольный
индикатор местоположения ICAO. Он может быть определен при заходе
на сайт National Weather Service1 .
Несмотря на то, что National Weather Service является правительственным
агентством США, оно имеет доступ к данным от погодных станций
по всему миру. Однако локальная информация о погоде может
предоставляться не для всех мест за пределами США.
• Создайте файл /usr/local/bin/local-weather, простейший shell сценарий,
использующий weather с вашим ICAO индикатором местоположения:
#!/bin/sh
#
#
# Prints the local weather information for the MOTD.
#
#
440
Другие полезные приложения
# Replace KINT with your local weather station.
# Local stations can be found here: http://www.weather.gov/tg/siteloc.shtml
echo
weather -i KINT
echo
• Сделайте сценарий исполняемым:
sudo chmod 755 /usr/local/bin/local-weather
• Создайте символьную ссылку в /etc/update-motd.d/98-local-weather:
sudo ln -s /usr/local/bin/local-weather /etc/update-motd.d/98-local-weather
• Наконец, выйдите из сервера и войдите повторно, чтобы увидеть новое
сообщение MOTD.
Теперь вы будете получать приветствия с некоторой полезной
информацией и информацией о погоде, которая может быть не такой
полезной. Надеемся, пример с application>local-weather
441
Другие полезные приложения
2. etckeeper
etckeeper позволяет легко сохранять содержимое каталога /etc в
репозиторий системы контроля версий (VCS). Он отслеживает когда apt
автоматически сохраняет изменения в /etc при установке или обновлении
пакетов. Помещение /etc под контроль версий сейчас рассматривается
как лучшая практика в индустрии, и назначение etckeeper - сделать этот
процесс безболезненным, насколько это возможно.
Установите etckeeper, введя следующую команду в терминале:
sudo apt-get install etckeeper
Основной файл конфигурации, /etc/etckeeper/etckeeper.conf, достаточно
простой. Основной опцией является выбор какую VSC использовать. По
умолчанию etckeeper настроен на использование в качестве системы
контроля версий bzr. Хранилище автоматически инициализируется (и
сохраняет начальное состояние) в процессе установки. Есть возможность
отменить это, выполнив следующую команду:
sudo etckeeper uninit
По умолчанию etckeeper будет сохранять незафиксированные изменения в /
etc ежедневно. Это может быть отменено использованием опции настройки
AVOID_DAILY_AUTOCOMMITS. Он также будет автоматически сохранять
изменения до и после установки пакетов. Для более точного отслеживания
изменений рекомендуется фиксировать изменения вручную, добавляя
описание фиксации следующим образом:
sudo etckeeper commit "..Reason for configuration change.."
С помощью команд VCS Вы можете просмотреть логи о файлах в /etc:
sudo bzr log /etc/passwd
Чтобы показать интеграцию с системой управления пакетами, установите
postfix:
sudo apt-get install postfix
После завершения установки, все postfix конфигурационные файлы должны
быть записаны в репозиторий:
Committing to: /etc/
added aliases.db
442
Другие полезные приложения
modified group
modified group-
modified gshadow
modified gshadow-
modified passwd
modified passwd-
added postfix
added resolvconf
added rsyslog.d
modified shadow
modified shadow-
added init.d/postfix
added network/if-down.d/postfix
added network/if-up.d/postfix
added postfix/dynamicmaps.cf
added postfix/main.cf
added postfix/master.cf
added postfix/post-install
added postfix/postfix-files
added postfix/postfix-script
added postfix/sasl
added ppp/ip-down.d
added ppp/ip-down.d/postfix
added ppp/ip-up.d/postfix
added rc0.d/K20postfix
added rc1.d/K20postfix
added rc2.d/S20postfix
added rc3.d/S20postfix
added rc4.d/S20postfix
added rc5.d/S20postfix
added rc6.d/K20postfix
added resolvconf/update-libc.d
added resolvconf/update-libc.d/postfix
added rsyslog.d/postfix.conf
added ufw/applications.d/postfix
Committed revision 2.
В качестве примера, как etckeeper отслеживает изменения вручную,
добавьте новую систему в /etc/hosts. Используя /etc/hosts вы сможете
увидеть какие файлы были изменены:
sudo bzr status /etc/
modified:
hosts
Теперь сохраните изменения:
sudo etckeeper commit "new host"
Дополнительную информацию по bzr смотрите в разделе Раздел 1,
«Bazaar» [308].
443
Другие полезные приложения
3. Byobu
Наиболее используемым приложением любого системного администратора
является screen. Оно позволяет выполнять несколько оболочек в одном
терминале. Чтобы сделать некоторые расширенные возможности screen
более дружественными и предоставить некоторую полезную информацию о
системе, был создан пакет byobu.
При выполнении byobu нажатие клавиши F9 выдаст меню настройки. Это
меню позволит вам:
• Посмотреть меню помощи
• Изменить цвет фона Byobu
• Изменить цвет переднего плана Byobu
• Изменить состояние статусных уведомлений
• Изменить набор связанных клавиш
• Изменить последовательность для выхода
• Создавать новые окна
• Управлять окнами по умолчанию
• Byobu не запускается при входе в систему (включить)
Связанные клавиши определяют такие вещи, как последовательность для
выхода, открытие нового окна, изменение окна и т.д. Можно выбирать
между двумя наборами связанных клавиш: f-keys и screen-escape-keys. Если
вы собираетесь использовать оригинальные последовательности, выберите
набор none.
byobu предоставляет меню, которое показывает версию Ubuntu,
информацию о процессоре, о памяти, а также дату и время. Создается
эффект меню рабочего стола.
Использование опции "Byobu на данный момент не загружаться при входе
(включить)" позволит byobu выполняться каждый раз, когда открывается
терминал. Изменения для byobu выполняются для каждого пользователя
отдельно и не влияют на настройки других пользователей системы.
Одно из различий при использовании byobu является режим прокрутки.
Нажмите клавишу F7 для входа в режим прокрутки. Режим прокрутки
позволяет вам передвигаться по последнему выводу с использованием
команд, аналогичных vi. Здесь короткий список команд перемотки:
• h - перемещает курсор влево на один символ
• j - перемещает курсор вниз на одну строку
444
Другие полезные приложения
• k - перемещает курсор вверх на одну строку
• l - перемещает курсор вправо на один символ
• 0 - перемещает курсор в начало текущей строки
• $ - перемещает курсор в конец текущей строки
• G - выполняет переход на заданную строку (по умолчанию в конец
буфера)
• / - поиск по тексту
• ? - Поиск в обратном направлении
• n - Переход к следующему результату поиска, в зависимости от
направления поиска
445
Другие полезные приложения
4. Ссылки
• Смотрите страницу руководства man для update-motd2 по
дополнительным опциям для update-motd.
• Статья из Debian Package of the Day weather3 содержит дополнительные
детали об использовании утилиты weather.
• Посетите сайт etckeeper4 чтобы узнать подробности использования
etckeeper.
• etckeeper на Ubuntu Wiki5
• Последние новости и информацию о bzr смотрите на сайте bzr6
• Дополнительная информация по screen доступна на сайте screen7.
• Информация о screen на Ubuntu Wiki8.
• Также посетите страницу проекта byobu 9 для дополнительной
информации.
446
Приложение A. Дополнение
447
Дополнение
1. Уведомление об ошибках в Ubuntu Server
Edition
Хотя проект Ubuntu старается свести к минимуму количество ошибок
в выпускаемым им программном обеспечении, ошибки всё равно
встречаются. Вы можете помочь их исправить, отправляя проекту отчёты
об обнаруженных ошибках. Проект Ubuntu использует Launchpad1 для
отслеживания отчётов о своих ошибках. Чтобы сообщить об ошибке в
Ubuntu Server на Launchpad, вам потребуется создать учётную запись2.
1.1. Уведомление об ошибках с помощью ubuntu-bug
Предпочтительным способом отправить отчет об ошибке является
использование команды ubuntu-bug. Утилита ubuntu-bug собирает
информацию о системе, полезную разработчикам при диагностике
описываемой проблемы, которая затем будет включена в отчёт об ошибке,
зарегистрированный на Launchpad. Отчёты об ошибках в Ubuntu требуют
указания программного пакета, поэтому имя пакета, в котором произошла
ошибка, должно быть передано ubuntu-bug:
ubuntu-bug ИМЯ_ПАКЕТА
Например, чтобы сообщить об ошибке в пакете openssh-server, нужно
набрать:
ubuntu-bug openssh-server
Вы можете указать для ubuntu-bug как двоичный пакет, так и пакет
исходного кода. Опять же, используя openssh-server в качестве примера,
вы можете создать отчёт по пакету исходного кода для openssh-server,
openssh:
ubuntu-bug openssh
Чтобы узнать больше о пакетах в Ubuntu, смотрите Глава 3,
Управление пакетами [24].
Команда ubuntu-bug собирает информацию об упомянутой системе,
возможно, включая специфическую информацию для указанного пакета, и
затем спрашивает что вы собираетесь делать с собранной информацией:
448
Дополнение
ubuntu-bug postgresql
*** Collecting problem information
The collected information can be sent to the developers to improve the
application. This might take a few minutes.
*** Send problem report to the developers?
After the problem report has been sent, please fill out the form in the
automatically opened web browser.
What would you like to do? Your options are:
S: Send report (1.7 KiB)
V: View report
K: Keep report file for sending later or copying to somewhere else
C: Cancel
Please choose (S/V/K/C):
Доступными вариантами являются:
• Send Report. Выбор отправки отчёта отправит собранную информацию
на Launchpad, как часть процесса регистрации отчёта об ошибке. Вы
получаете возможность описать ситуацию, которая привела к появлению
ошибки.
*** Uploading problem information
The collected information is being sent to the bug tracking system.
This might take a few minutes.
91%
*** To continue, you must visit the following URL:
You can launch a browser now, or copy this URL into a browser on another
computer.
Choices:
1: Launch a browser now
C: Cancel
Please choose (1/C):
Если вы выберете запуск браузера, по умолчанию будет запущен
текстовый веб-браузер w3m для завершения регистрации отчёта об
ошибке. В качестве альтернативы вы можете скопировать указанный URL
в уже запущенный веб-браузер.
449
Дополнение
• View Report. Выбор просмотра отчёта приведёт к показу собранной
информации в терминале для проверки.
Package: postgresql 8.4.2-2
PackageArchitecture: all
Tags: lucid
ProblemType: Bug
ProcEnviron:
LANG=en_US.UTF-8
SHELL=/bin/bash
Uname: Linux 2.6.32-16-server x86_64
Dependencies:
adduser 3.112ubuntu1
base-files 5.0.0ubuntu10
base-passwd 3.5.22
coreutils 7.4-2ubuntu2
После просмотра отчёта вы будете снова перенаправлены в меню с
вопросом о том, что вы собираетесь делать с отчётом.
• Keep Report File. Выбор сохранения файла отчёта приведёт к записи в
файл собранной информации. Этот файл может быть использован для
дальнейшей регистрации отчёта об ошибке или передан для отправки
отчёта в другую систему Ubuntu. Чтобы передать файл отчёта, просто
укажите его в качестве аргумента команды ubuntu-bug:
What would you like to do? Your options are:
S: Send report (1.7 KiB)
V: View report
K: Keep report file for sending later or copying to somewhere else
C: Cancel
Please choose (S/V/K/C): k
Problem report file: /tmp/apport.postgresql.v4MQas.apport
ubuntu-bug /tmp/apport.postgresql.v4MQas.apport
*** Send problem report to the developers?
• Cancel. Выбор отмены приведёт к тому, что собранная информация будет
сброшена.
1.2. Уведомление о сбоях приложений
Пакет программ, который предоставляет утилиту ubuntu-bug (apport),
может быть настроен на срабатывание при падении приложений. По
умолчанию это отключено, поскольку захват сбоев может быть достаточно
450
Дополнение
ресурсоёмким в зависимости от количества памяти, которую использовало
упавшее приложение, а apport захватывает и обрабатывает память ядра.
Настройка apport на захват информации о падении приложений требует
выполнения пары шагов. Сначала требуется установить gdb; он не
установлен по умолчанию в Ubuntu Server Edition.
sudo apt-get install gdb
Смотрите раздел Глава 3, Управление пакетами [24] для дополнительной
информации об управлении пакетами в Ubuntu.
Как только вы убедитесь, что gdb установлен, откройте файл /etc/default/
apport в вашем текстовом редакторе и измените настройку enabled в 1, как
показано ниже:
# set this to 0 to disable apport, or to 1 to enable it
# you can temporarily override this with
# sudo service apport start force_start=1
enabled=1
# set maximum core dump file size (default: 209715200 bytes == 200 MB)
maxsize=209715200
После того, как завершите редактирование /etc/default/apport, запустите
службу apport:
sudo start apport
После падения приложения используйте команду apport-cli для поиска
информации о сохраненном отчёте о сбое приложения:
apport-cli
*** dash closed unexpectedly on 2010-03-11 at 21:40:59.
If you were not doing anything confidential (entering passwords or other
private information), you can help to improve the application by
reporting
the problem.
What would you like to do? Your options are:
R: Report Problem...
I: Cancel and ignore future crashes of this program version
C: Cancel
Please choose (R/I/C):
451
Дополнение
Выбор Report Problem (сообщить о проблеме) проведёт вас по шагам,
аналогичным использованию ubuntu-bug. Одним важным отличием будет
то, что отчёт о сбое будет помечен как частный (private) при регистрации
на Launchpad, то есть он будет виден только ограниченному количеству
сортировщиков. Эти сортировщики просмотрят собранные данные на
наличие частной информации перед тем, как отчёт об ошибке станет
публично доступным.
1.3. Ресурсы
• Посетите wiki страницу Reporting Bugs3.
• Также, страница Apport4 содержит некоторую полезную информацию.
Часть информации касается использования графического интерфейса.
452
|