суббота, 22 декабря 2012 г.

CentOS 6 и KVM. Запуск виртуалки.

Необходимо было запустить виртуалку с Ubuntu на хосте с CentOS6 (64 bit). Собственно, небольшое описание того, что было сделано. Во-первых, хочу отметить, что при настройке надо быть внимательным, иначе получаются весьма забавные вещи. В моем случае, не обратил внимание на вывод команды ip addr show, где было state DOWN для интерфейса в составе моста - из-за чего и было потрачено много времени впустую. Виртуалка была поднята на хосте с Gentoo и переезжала на хост с CentOS ввиду загруженности машины с Gentoo.

1. Проверяем, что процессор поддерживает необходимые инструкции:

egrep '(svm|vmx)' /proc/cpuinfo

2. Проверяем загружены ли необходимые модули:

lsmod | grep kvm

3. Сервер имеет 2 сетевых интерфейса (на самом деле есть еще один, но он отдан под IPMI). Подключаем оба в сеть, копируем /etc/sysconfig/network-scripts/ifcfg-eth0 в /etc/sysconfig/network-scripts/ifcfg-br0. Приводим ifcfg-eth0 к виду (mac-адрес, ip-адрес, маску, шлюз, адрес днс-сервера поменяйте на свои):

DEVICE="eth0"
BRIDGE="br0"
NM_CONTROLLED="no"
ONBOOT=yes
HWADDR=00:25:90:78:74:8C

Файл ifcfg-br0 в таком виде:

DEVICE="br0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Bridge"
DELAY=0
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"
IPADDR=192.168.1.XX
NETMASK=255.255.255.0
GATEWAY=192.168.1.Z
DNS1=192.168.1.XY

Файл ifcfg-eth1:

DEVICE="eth1"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
UUID="7a455c42-2ceb-4cf2-a13c-a86baf7d42ef"
HWADDR=00:25:90:78:74:8D
PEERDNS=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"
IPADDR=192.168.1.XZ
NETMASK=255.255.255.0


В данном случае eth1 будет использоваться под нужды сервера, eth0 будет входить в состав моста br0 и обслуживать виртуалку(и).

4. Устанавливаем нужные пакеты для работы с мостом и виртуальными TUN/TAP интерфейсами:
sudo yum -y install tunctl bridge-utils

5. Рестартуем сеть командой:
sudo service network restart

6. Проверяем состояние интерфейсов (должны быть в UP):
ip addr show | grep eth | grep state

2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

7. Проверяем загружен ли модуль tun:
lsmod | grep tun
Если нет - то:
modprobe tun

Модуль tun - это универсальный TUN/TAP драйвер, позволяющий создавать программные сетевые устройства (программная сетевая карта). TAP симулирует Ethernet устройство и работает на канальном уровне, а TUN работает на сетевом уровне. 
Пакет, посылаемый операционной системой через TUN/TAP устройство, обрабатывается программой, которая контролирует это устройство, в данном случае qemu (см. команду в конце заметки).

Создаем виртуальное устройство tap0:
tunctl -b

8. Поднимаем устройство tap0:
ifconfig tap0 up

9. Проверить/установить параметры в файле sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

10. Проверить правила iptables, чтоб не блокировали нужный трафик (в моем случае iptables не использовался). Например, командой:

iptables -I RH-Firewall-1-INPUT -i br0 -j ACCEPT

11. Добавляем интерфейсы в состав моста:

brctl addif br0 eth0
brctl addif br0 tap0

12. Стартуем виртуалку:
/usr/libexec/qemu-kvm -hda /some/path/ubuntu10.04_2.img -m 6144 \
-net nic,macaddr=00:1a:dd:d8:bc:b6 -net tap,ifname=tap0,script=no,downscript=no \
-vnc :0 -name ubuntu -smp 4 -daemonize 

Литература:
http://www.linux-kvm.org/page/Networking
https://wiki.archlinux.org/index.php/QEMU#Networking
https://wiki.archlinux.org/index.php/KVM