Как создать OpenVZ-шаблон Debian Wheezy (Testing)
Важно: инструкция рассчитана на хост OpenVZ на базе Debian. Все команды с root-привилегиями выполняйте на хосте или в контейнере в соответствии с шагами.
1 Предварительное примечание
Это руководство основано на общем процессе создания Debian-шаблонов для OpenVZ и адаптировано под Debian Wheezy (Debian Testing на момент написания). Я предполагаю, что у вас уже есть Debian-подобный OpenVZ-хост. Аналогичные шаги применимы для создания шаблонов Debian Lenny и некоторых версий Ubuntu, но могут потребоваться небольшие правки.
Важно: автор не гарантирует работоспособность на всех конфигурациях. Тестируйте в безопасной среде.
2 Подготовка хоста
Эти шаги выполняются на хост-системе.
Мы будем использовать debootstrap для установки гостевой системы Wheezy в каталог контейнера.
Установите debootstrap, если он не установлен:
apt-get install debootstrapУбедитесь, что /vz является символьной ссылкой на /var/lib/vz (если это необходимо в вашей конфигурации):
ln -s /var/lib/vz /vzТеперь установим 64-битную систему Debian Wheezy в каталог контейнера (в примере используется ID контейнера 777):
debootstrap --arch amd64 wheezy /vz/private/777 ftp://ftp.de.debian.org/debian/Если нужен i386, замените –arch на i386:
debootstrap --arch i386 wheezy /vz/private/777 ftp://ftp.de.debian.org/debian/Совет: используйте зеркала, ближайшие к вам (в примере: ftp.de.debian.org). Замените de на код вашей страны при необходимости.
После завершения откройте /etc/sysctl.conf на хосте:
vi /etc/sysctl.confи добавьте настройки OpenVZ (вставьте в конец файла):
| [...] ### OpenVZ settings # On Hardware Node we generally need packet # forwarding enabled and proxy arp disabled net.ipv4.conf.default.forwarding=1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.ip_forward=1 # Enables source route verification net.ipv4.conf.all.rp_filter = 1 # Enables the magic-sysrq key kernel.sysrq = 1 # TCP Explict Congestion Notification net.ipv4.tcp_ecn = 0 # we do not want all our interfaces to send redirects net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 |
Примените изменения:
sysctl -pДалее применим базовую конфигурацию OpenVZ к контейнеру:
vzctl set 777 --applyconfig basic --saveВы увидите предупреждение о том, что /etc/vz/conf/777.conf не найдено — его можно игнорировать; команда создаст конфигурационный файл.
Добавьте переменную OSTEMPLATE в созданный файл конфигурации контейнера:
sh -c 'echo OSTEMPLATE="debian-7.0"' >> /etc/vz/conf/777.confЗамените debian-7.0 на подходящую строку для вашей дистрибуции (например, debian-6.0 или ubuntu-11.04).
Назначьте свободный IP из вашей подсети и как минимум один DNS-сервер (пример — локальная сеть 192.168.0.x и Google DNS):
vzctl set 777 --ipadd 192.168.0.110 --save
vzctl set 777 --nameserver 8.8.8.8 --nameserver 8.8.4.4 --saveПроверьте наличие /var/lib/vz/private/777/dev/ptmx:
ls -l /var/lib/vz/private/777/dev/ptmxОжидаемый вывод примерно такой:
root@server1:~# ls -l /var/lib/vz/private/777/dev/ptmx
crw-rw-rw- 1 root tty 5, 2 Mar 4 12:53 /var/lib/vz/private/777/dev/ptmx
root@server1:~#Если файл отсутствует, создайте его:
mknod --mode 666 /var/lib/vz/private/777/dev/ptmx c 5 2Теперь стартуем контейнер и входим в него:
vzctl start 777
vzctl enter 7773 Подготовка контейнера
Эти команды выполняются внутри контейнера.
Установите корректный PATH для выполнения административных команд:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binОтредактируйте /etc/apt/sources.list и укажите зеркала близкие к вам:
vi /etc/apt/sources.listСодержимое примера:
| deb http://ftp.de.debian.org/debian wheezy main contrib deb http://security.debian.org wheezy/updates main contrib |
Обновите базу пакетов и установите обновления:
apt-get update
apt-get upgradeУстановите минимальный набор пакетов для шаблона (пример):
apt-get install ssh quota less vim-noxЗадайте правильные права для /root:
chmod 700 /rootЕсли вы хотите отключить логин root, выполните:
usermod -L rootАвтор предпочитает сохранять возможность входа как root, поэтому этот шаг опционален.
Отключите getty, запретите sync() для syslog и исправьте /etc/mtab:
sed -i -e '/getty/d' /etc/inittabsed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/*syslog.confrm -f /etc/mtab
ln -s /proc/mounts /etc/mtabУдалите пакеты, которые не хотите включать в шаблон (пример):
dpkg --purge modutils ppp pppoeconf pppoe pppconfig module-init-toolsУдалите системные ссылки автозагрузки для ряда сервисов:
update-rc.d-insserv -f klogd remove
update-rc.d-insserv -f quotarpc remove
update-rc.d-insserv -f exim4 remove
update-rc.d-insserv -f inetd removeКаждый контейнер должен иметь собственную пару SSH-ключей. Удалите ключи этого шаблона:
rm -f /etc/ssh/ssh_host_*Создайте скрипт, который сгенерирует новые ключи при первом запуске контейнера:
vi /etc/init.d/ssh_gen_host_keys| #!/bin/sh ### BEGIN INIT INFO # Provides: Generates new ssh host keys on first boot # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Generates new ssh host keys on first boot # Description: Generates new ssh host keys on first boot ### END INIT INFO ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N "" ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N "" insserv -r /etc/init.d/ssh_gen_host_keys rm -f \$0 |
Сделайте скрипт исполняемым и добавьте его в автозапуск:
chmod a+x /etc/init.d/ssh_gen_host_keys
insserv /etc/init.d/ssh_gen_host_keysНастройте часовой пояс:
dpkg-reconfigure tzdataОчистите кэш пакетов перед упаковкой шаблона:
apt-get --purge cleanВыйдите из контейнера:
exit4 Очистка, создание шаблона и тестирование
Эти шаги выполняются на хосте.
Удалите IP-адрес, nameserver и hostname из контейнера перед упаковкой:
vzctl set 777 --ipdel all --savecat /dev/null > /vz/private/777/etc/resolv.confrm -f /vz/private/777/etc/hostnameОстановите контейнер:
vzctl stop 777Перейдите в каталог контейнера и упакуйте его в шаблон:
cd /vz/private/777
# Обратите внимание на точку в конце!
tar --numeric-owner -zcf /vz/template/cache/debian-7.0-amd64-minimal.tar.gz .Проверьте содержимое каталога шаблонов:
ls -lh /vz/template/cacheПример вывода:
root@server1:/vz/private/777# ls -lh /vz/template/cache
total 194M
-rw-r--r-- 1 root root 80M Feb 7 2011 debian-6.0-amd64-minimal.tar.gz
-rw-r--r-- 1 root root 114M Sep 1 22:55 debian-7.0-amd64-minimal.tar.gz
root@server1:/vz/private/777#Поздравляем — у вас появился шаблон!
Создайте тестовый контейнер из шаблона (в примере ID 888):
vzctl create 888 --ostemplate debian-7.0-amd64-minimal
vzctl start 888Проверьте список процессов внутри тестового контейнера:
vzctl exec 888 ps axПример ожидаемого вывода:
root@server1:/vz/private/777# vzctl exec 888 ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 init [2]
316 ? Sl 0:00 /usr/sbin/rsyslogd -c5
326 ? Ss 0:00 /usr/sbin/cron
335 ? Ss 0:00 /usr/bin/dbus-daemon --system
344 ? Ss 0:00 /usr/sbin/sshd
358 ? Rs 0:00 ps ax
root@server1:/vz/private/777#Если контейнер работает как ожидается, остановите и удалите тестовый контейнер:
vzctl stop 888
vzctl destroy 888
rm /etc/vz/conf/888.conf.destroyedУдалите также контейнер, из которого вы делали шаблон (в примере 777):
cd
vzctl destroy 777
rm /etc/vz/conf/777.conf.destroyedЕсли вы хотите сделать новый шаблон шаблоном по умолчанию, укажите DEF_OSTEMPLATE в /etc/vz/vz.conf:
vi /etc/vz/vz.conf| [...] DEF_OSTEMPLATE="debian-7.0-amd64-minimal" [...] |
5 Полезные ссылки
- OpenVZ: http://openvz.org/
- Debian: http://www.debian.org/
Рекомендации по безопасности и поддержке
Важно выполнить дополнительные шаги безопасности перед использованием шаблона в продакшене:
- Обновляйте пакеты в шаблоне перед упаковкой (apt-get update && apt-get upgrade).
- Отключите пароли по умолчанию и настройте SSH (используйте протокол 2, отключите root-login по паролю, включите аутентификацию по ключам при необходимости).
- Ограничьте сервисы, запускаемые в шаблоне; чем меньше активных демонов — тем меньше поверхность атаки.
- Включите и протестируйте правила брандмауэра на хосте (iptables/nftables) для контейнерных сетей.
Пример быстрых настроек SSH в шаблоне (внутри контейнера перед упаковкой):
- Убедитесь, что в /etc/ssh/sshd_config: PermitRootLogin yes/no по вашему решению, Protocol 2.
- Удалите слабые алгоритмы и настройте только публичные ключи при необходимости.
Советы по отладке — когда что-то не работает
- Контейнер не стартует: проверьте vzctl start
вывод и /var/log/messages или /var/log/syslog хоста. - Проблемы с сетевыми интерфейсами: проверьте IP назначение (vzctl exec
ifconfig или ip addr) и маршрутизацию на хосте. - Проблемы с правами в /dev: проверьте наличие /dev/ptmx и корректность mknod.
- Если при создании шаблона вы видите пустой процесс-лист — контейнер не запустился; проверьте init и доступность /sbin/init.
Альтернативные подходы и совместимость
- Вместо debootstrap можно использовать распаковку готовой минимальной rootfs, но debootstrap удобен и прозрачен.
- Для более новых версий Debian/Ubuntu используйте соответствующие имена ostemplate (например, debian-8.0 или ubuntu-18.04) и актуальные зеркала.
- OpenVZ 6 (или более поздние реализации) может требовать других настроек; проверяйте документы конкретной версии OpenVZ.
Чек-листы по ролям
Администратор хоста:
- Установить debootstrap и необходимые утилиты.
- Проверить sysctl-опции и применить их.
- Создать контейнер, назначить IP/Nameserver.
- Упаковать и проверить шаблон.
DevOps-инженер/разработчик шаблонов:
- Настроить минимальный набор пакетов.
- Удалить ненужные демоны и ключи.
- Добавить скрипт генерации SSH-ключей при первом запуске.
- Тестировать разворачивание и мониторинг.
Малый глоссарий (1 строка)
- OpenVZ — контейнерная виртуализация на уровне ОС для Linux; предоставляет изолированные контейнеры (VE/CT).
- debootstrap — инструмент создания минимальной Debian-подсистемы «с нуля» в каталоге.
- OSTEMPLATE — метка/имя шаблона, используемая vzctl для создания контейнеров.
Критерии приёмки
- Шаблон успешно создан в /vz/template/cache и имеет компактный размер.
- Контейнер, созданный из шаблона, стартует и показывает список процессов.
- При первом старте контейнера генерируются новые SSH-ключи.
- Нет сохранённых уникальных сетевых настроек (IP, hostname, resolv.conf) в шаблоне.
Быстрое восстановление/откат
Если шаблон испорчен или содержит нежелательные данные, удалите/переименуйте файл в /vz/template/cache и сгенерируйте шаблон повторно из исходного контейнера.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента