Установка OpenVZ на Ubuntu Linux
by Bozaro on Мар.14, 2009, under Ubuntu
Решил озадачиться виртуализацией под Linux. Основная задача – разнести различные функции на различные виртуальные сервера на домашней машине (резервное копирование, мониторинг, DHCP, DNS, SubVersion и т.д.). Нужно это для следующих целей:
- Чтобы можно было обновлять/восстанавливать/переустанавливать все это по отдельности;
- Чтобы упростить борьбу с Firewall-ом, так как часть сервисов должна смотреть в Internet, а часть сугубо локальная;
- Для проведения экспериментов лучше виртуальной машины придумать что-то сложно.
Выбор остановился на OpenVZ по следующим причинам:
- OpenVZ почти не дает усадки по производительности;
- OpenVZ не требует процессора с поддержкой виртуализации.
Минусы у OpenVZ:
- Под OpenVZ можно запустить только Linux, причем специально подготовленный;
- В Ubuntu от OpenVZ отказываются в пользу KVM.
Установка OpenVZ
Все операции выполняем от имени root-а:
[HW]$ sudo bash
Из Ubuntu 8.10 OpenVZ был исключен в пользу KVM, поэтому надо подключать репощиторий пакетов от Ubuntu 8.04:
[HW]$ cat << EOF >> /etc/apt/sources.list deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse EOF
Далее просто устанавливаем OpenVZ:
[HW]$ apt-get update [HW]$ apt-get install linux-openvz vzctl
Так же для OpenVZ нужно установить пакет bridge-utils, иначе виртуальные машины не будут иметь доступа в локальную сеть:
[HW]$ apt-get install bridge-utils
Конфиг /etc/network/interfaces должен выглядеть где-то так:
auto lo iface lo inet loopback #Inet iface auto eth0 iface eth0 inet dhcp #eth1 - LAN auto br0 iface br0 inet static address 192.168.1.1 netmask 255.255.255.0 bridge_ports eth1
Для корректной работы в /etc/sysctl.conf пришлось дополнительно добавить следующие опции сети:
[VPS]$ cat >> /etc/sysctl.conf <<EOF #-- OpenVZ begin --# # 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 # 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 #-- OpenVZ end --# EOF
Затем меняем в /boot/grub/menu.lst дефолтовый вариант загрузки и перезагружаемся.
Подготовка образа для виртуальной машины
Сразу оговорюсь, что можно взять уже готовый образ с сайта: http://wiki.openvz.org/Download/template/precreated.
Но, так как данный образ нужно допиливать напильником (в нем нет русской локали и нет поддержки NFS), решено было изготовить свой образ с нуля.
Для этого нужно установить пакет debootstrap:
[HW]$ sudo apt-get install debootstrap
Затем создать директорию и установить в неё минимальный Ubuntu (ARCH нужно заменить на amd64 или i386 в зависимости от желаемой архитектуры):
[HW]$ mkdir intrepid-chroot [HW]$ sudo debootstrap [--arch ''ARCH''] intrepid intrepid-chroot
Затем создаем виртуальную машину:
[HW]$ sudo mv hardy-chroot /vz/private/101 [HW]$ sudo chown -R root /vz/private/101 [HW]$ sudo vzctl set 101 --applyconfig vps.basic --save [HW]$ echo "OSTEMPLATE=ubuntu-8.10" | sudo tee -a /etc/vz/conf/101.conf >/dev/null [HW]$ sudo vzctl set 101 --ipadd x.x.x.x --save [HW]$ sudo vzctl set 101 --nameserver x.x.x.x --save [HW]$ sudo rm /vz/private/101/etc/rcS.d/S10udev
Затем запускаем систему (в контейнере мы будем под root-ом):
[HW]$ sudo vzctl start 777 [HW]$ vzctl enter 777
Удаляем лишние пакеты:
[VPS]$ apt-get remove --purge busybox-initramfs console-setup dmidecode eject \ initramfs-tools klibc-utils laptop-detect libklibc libvolume-id0 module-init-tools \ ntpdate ubuntu-minimal udev xkb-data tasksel tasksel-data
Так же можно удалить DHCP:
[VPS]$ apt-get remove --purge --auto-remove dhcp3-client dhcp3-common
Меняем список источников:
[VPS]$ export COUNTRY=<YOURCOUNTRY>.
[VPS]$ export DISTRIB=intrepid
[VPS]$ cat >/etc/apt/sources.list <<EOF
# Binary
deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB} main restricted universe multiverse
deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB}-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu ${DISTRIB}-security main restricted universe multiverse
# Binary Canonical
# deb http://archive.canonical.com/ubuntu ${DISTRIB} partner
# Binary backport
# deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB}-backports main restricted universe multiverse
# Source
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB} main restricted universe multiverse
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB}-updates main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu ${DISTRIB}-security main restricted universe multiverse
# Source backport
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ ${DISTRIB}-backports main restricted universe multiverse
# Source Canonical
# deb-src http://archive.canonical.com/ubuntu ${DISTRIB} partner
EOF
Доставляем нужные пакеты:
[VPS]$ apt-get update && apt-get upgrade [VPS]$ apt-get install language-pack-ru nfs-common ssh mc
Если установили SSH, то нужно позаботиться о том, чтобы у каждого виртуального контейнера были свои ключи:
[VPS]$ rm -f /etc/ssh/ssh_host_* [VPS]$ cat << EOF > /etc/rc2.d/S15ssh_gen_host_keys #!/bin/sh ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N '' ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N '' rm -f \$0 EOF [VPS]$ chmod a+x /etc/rc2.d/S15ssh_gen_host_keys
Убираем файл mtab и делаем ссылкой на /pronc/mounts:
[VPS]$ rm -f /etc/mtab [VPS]$ ln -s /proc/mounts /etc/mtab [VPS]$ update-rc.d -f mtab.sh remove
Отключаем лишние службы:
[VPS]$ update-rc.d -f klogd remove
Так же желательно поменять локаль и часовой пояс:
[VPS]$ echo LANG="ru_RU.UTF8" > /etc/default/locale [VPS]$ echo Europe/Moscow > /etc/timezone [VPS]$ ln -s ../usr/share/zoneinfo/Europe/Moscow /etc/localtime
Убираем запуск терминалов:
В файлах /etc/event.d/tty* надо заменить «start on runlevel 2″ на «stop on runlevel 2″. Без этого в логах постоянно будет появляться сообщение о перезапуске терминала и постоянный запуск/падение getty будет давать ощутимую нагрузку на процессор.
Убираем следы жизнедеятельности:
[VPS]$ echo "localhost" > /etc/hostname [VPS]$ echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts [VPS]$ cd /dev && /sbin/MAKEDEV ptyp [VPS]$ > /etc/resolv.conf [VPS]$ apt-get clean [VPS]$ > /var/log/messages; > /var/log/auth.log; > /var/log/kern.log; > /var/log/bootstrap.log; \ > /var/log/dpkg.log; > /var/log/syslog; > /var/log/daemon.log; > /var/log/apt/term.log; rm -f /var/log/*.0 /var/log/*.1
Выходим из виртуальной машины:
[VPS]$ exit
И финальный шаг – архивирование образа виртуальной машины:
[HW]$ sudo tar -czf /var/lib/vz/template/cache/ubuntu-8.10-x86_64.tar.gz -C intrepid-chroot
Создание виртуальный машины
Для создания виртуальной машины достаточно выполнить команды (номера виртуальных машин от 0 до 100 зарезервированы):
[HW]$ sudo vzctl create 101 --ostemplate ubuntu-8.10-x86_64 --config vps.basic [HW]$ sudo vzctl set 101 --hostname vm-test --save [HW]$ sudo vzctl set 101 --ipadd x.x.x.x --save [HW]$ sudo vzctl set 101 --nameserver x.x.x.x --save [HW]$ sudo vzctl set 101 --features nfs:on --save [HW]$ sudo vzctl set 101 --onboot yes --save [HW]$ sudo vzctl start 101
Так же хочу обратить внимание на файл /proc/user_beancounters, который содержит в себе все лимиты, наложенные на виртуальную машину и информацию о том, сколько раз она за них пыталась выйти.
Исправление неполадок
После игр с виртуальными машинами одна из них перестала подключаться по SSH и через vzctl enter. Выдавалась ошибка: «Unable to open pty: No such file or directory».
Решилость это следующими командами:
[HW]$ vzctl exec veid update-rc.d -f udev remove [HW]$ vzctl restart veid
Март 19th, 2009 on 13:47
Спасибо.