Centos 7 менеджер виртуальных машин. Устанавливаем CentOS в VirtualBox. Устанавливаем KVM на наш сервер

У меня имеется только что установленный сервер с CentOS 7 на VDS с виртуализацией KVM.

Я расскажу о том, как сделать базовую настройку сервера для использования его в любом качестве на ваше усмотрение. Это может быть web сервер , vpn сервер , сервер мониторинг а.

Я расскажу о начальных настройках системы CentOS, которые повышают безопасность и удобство работы с сервером. Отмечу, что в 7-й версии системы произошли некоторые изменения по сравнению с предыдущими версиями.

  1. Введение
  2. Начальная настройка CentOS 7
  3. Указываем сетевые параметры
  4. Настраиваем firewall
  5. Настройка SSH в CentOS 7
  6. Настраиваем время
  7. Добавление репозиториев
  8. Заключение
  9. Видео по настройке CentOS 7

Введение

Начальная настройка CentOS 7

Итак, у нас имеется:

# uname -a
Linux zeroxzed.ru 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Первым делом обновим базовую систему:

# yum -y update

Для удобства администрирования, я всегда устанавливаю Midnight Commander, или просто mc:

# ifconfig

И увидите ответ:

Bash: ifconfig: command not found

По крайней мере я, когда впервые это увидел, прилично удивился. Подумал, что ошибся в написании команды, перепроверил все несколько раз, но без результата. Оказалось, что надо отдельно установить пакет для выполнения ifconfig и прочих сетевых утилит.

Вместо ifconfig в CentOS 7 теперь утилита ip . Я не понимаю, зачем пилить отдельные программы для управления сетевыми настройками, если ifconfig и так отлично справляется с задачей. К тому же мне всегда нравилось, что в различных дистрибутивах линукс все примерно одинаковое. С помощью ifconfig можно настроить сеть не только в linux, но и в freebsd. Это удобно. А когда в каждом дистрибутиве свой инструмент это неудобно. Так что предлагаю установить привычный ifconfig.

Сделаем это:

# yum -y install net-tools.x86_64

Теперь, чтобы у нас работали команды nslookup или, к примеру, host необходимо установить пакет bind-utils. Если этого не сделать, то на команду:

# nslookup

Будет вывод:

Bash: nslookup: command not found

Так что устанавливаем bind-utils:

# yum -y install bind-utils

Отключаем SELinux. Его использование и настройка отдельный разговор. Сейчас я не буду этим заниматься. Так что отключаем:

# mcedit /etc/sysconfig/selinux

меняем значение SELINUX=disabled

Чтобы изменения вступили в силу, перезагружаемся:

# reboot

Указываем сетевые параметры

Теперь произведем настройку сети в CentOS. Для этого открываем файл /etc/sysconfig/network-scripts/ifcfg-eth0

# mcedit /etc/sysconfig/network-scripts/ifcfg-eth0

В поле IPADDR вводим свой адрес, в NETMASK маску сети, в GATEWAY шлюз, DNS1 адрес днс сервера. Сохраняем файл и перезапускаем сеть для применения настроек:

# /etc/init.d/network restartНастраиваем firewall

Очень подробно вопрос настройки iptables в CentOS 7 я рассмотрел отдельно. Сейчас мы быстро и просто настроим firewall. В CentOS 7 в качестве фаервола выступает iptables. По-умолчанию он запущен. Чтобы посмотреть текущие правила, нужно ввести команду:

# iptables -L -v -n

Сразу хочу предупредить, что не имея доступа к консоли сервера, настраивать firewall плохая идея. Даже если вы очень хорошо понимаете что делаете и проделывали подобное много раз, все равно есть шанс остаться без доступа к серверу. Так что первым делом перед настройкой iptables проверяем доступ к консоли через KVM или физически.

В 7-й версии CentOS для управления iptables разработан новый инструмент под названием firewalld и все управление производится через него. Я не понял зачем это сделали, и не могу сказать, удобнее с ним стало или нет. По мне, так удобнее использовать одни и те же наработки по iptables. Мигрируя от сервера к серверу и от дистрибутива к дистрибутиву, я просто редактирую скрипт настроек фаервола.

Но CentOS зачем-то придумали firewalld, в Ubuntu стоит ufw, но суть одна и та же - это утилиты для конфигурирования iptables, который один и тот же во всех дистрибутивах. Я привык управлять iptables через самописный скрипт, который переношу от сервера к серверу и редактирую под конкретные потребности. Этим скриптом я и поделюсь. Так что для начала остановим и отключим firewalld:

# systemctl stop firewalld
# systemctl disable firewalld
rm "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service"
rm "/etc/systemd/system/basic.target.wants/firewalld.service"

Установим утилиты для iptables:

# yum -y install iptables-services

Включим автозапуск iptables:

# systemctl enable iptables

Теперь создадим файл /etc/iptables_rules.sh следующего содержания:

#!/bin/bash
#
# Объявление переменных
export IPT="iptables"

# Интерфейс который смотрит в интернет
export WAN=eth0
export WAN_IP=149.154.71.205

# Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# разрешаем локальный траффик для loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Разрешаем исходящие соединения самого сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT

# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
# Пропускать все уже инициированные соединения, а также дочерние от них
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Пропускать новые, а так же уже инициированные и их дочерние соединения
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить форвардинг для уже инициированных и их дочерних соединений
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
$IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Отбрасывать все пакеты, которые не могут быть идентифицированы
# и поэтому не могут иметь определенного статуса.
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Приводит к связыванию системных ресурсов, так что реальный
# обмен данными становится не возможным, обрубаем
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# Открываем порт для ssh
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
# Открываем порт для DNS
$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT
# Открываем порт для NTP
$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT

# Логирование
# Все что не разрешено, но ломится отправим в цепочку undef

$IPT -N undef_in
$IPT -N undef_out
$IPT -N undef_fw
$IPT -A INPUT -j undef_in
$IPT -A OUTPUT -j undef_out
$IPT -A FORWARD -j undef_fw

# Логируем все из undef

$IPT -A undef_in -j LOG --log-level info --log-prefix "-- IN -- DROP "
$IPT -A undef_in -j DROP
$IPT -A undef_out -j LOG --log-level info --log-prefix "-- OUT -- DROP "
$IPT -A undef_out -j DROP
$IPT -A undef_fw -j LOG --log-level info --log-prefix "-- FW -- DROP "
$IPT -A undef_fw -j DROP

# Записываем правила
/sbin/iptables-save > /etc/sysconfig/iptables

В принципе, добавить нечего, в файле даны все комментарии. В таком виде, логи всего заблокированного будут писаться в файл /var/log/messages и записей там будет очень много. Так что в обычной работе эти строки нужно закомментировать, и использовать только во время отладки. Более подробное описание правил и примеры настроек firewall в случае, когда ваш сервер является шлюзом локальной сети, приведено по ссылке в начале раздела.

Делаем файл c правилами исполняемым и запускаем:

# chmod 0740 /etc/iptables_rules.sh
# /etc/iptables_rules.sh

Проверяем, применились ли правила:

# iptables -L -v -n

При каждом запуске файла с правилами iptables, все изменения записываются в файл /etc/sysconfig/iptables и применяются при загрузке системы.

Настройка SSH в CentOS 7

Дальше внесем некоторые изменения в работу ssh для увеличения безопасности. По-умолчанию, сервис работает на 22 порту и если все оставить как есть, то мы получим огромное количество попыток авторизоваться. Боты сканят непрерывно интернет и подбирают пароли к ssh. Чтобы обезопасить себя от сканов простых ботов, изменим порт, на котором работает ssh. Можно выбрать любой пятизначный номер, это не принципиально. От автоматического сканирования это защитит.

Повесим демон ssh на 25333 порт. Для этого редактируем файл /etc/ssh/sshd_config

# mcedit /etc/ssh/sshd_config

Раскомментируем строку Port 22 и заменим значение 22 на 25333.

Так же я обычно разрешаю подключаться по ssh пользователю root. Мне так удобнее. Проблем с этим у меня никогда не возникало. Если вы считаете, что это не безопасно, не трогайте эту настройку. Чтобы разрешить пользователю root подключаться по ssh, раскомментируйте строку PermitRootLogin yes.

Сохраняем файл. Теперь обязательно изменяем настройки iptables, добавляем в разрешенные подключения вместо 22 порта 25333. Если этого не сделать, то после перезапуска sshd мы потеряем удаленный доступ к серверу. Итак, открываем /etc/iptables_rules.sh и меняем в строке

$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT

22 на 25333 и исполняем файл.

Наше текущее соединение не оборвется, так как оно уже установлено, но заново подключиться по ssh к 22 порту уже н получится.

Перезапускаем sshd:

# systemctl restart sshd

Проверяем какой порт слушает sshd:

# netstat -tulpn | grep sshd
tcp 0 0 0.0.0.0:25333 0.0.0.0:* LISTEN 1799/sshd
tcp6 0 0:::25333:::* LISTEN 1799/sshd

Если вывод такой же как у меня, то все в порядке, теперь к ssh можно подключаться по 25333 порту.

Настраиваем время

Узнать, какое время на сервере можно с помощью команды date:

Чтобы сменить часовой пояс, необходимо выбрать подходящий файл часовой зоны в /usr/share/zoneinfo. В случае, если у вас часовой пояс Москвы, выполните следующее:

# mv /etc/localtime /etc/localtime.bak
# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Устанавливаем утилиту синхронизации времени в CentOS:

# yum install -y ntp

Разово синхронизируем время:

# /usr/sbin/ntpdate pool.ntp.org

Если ntpdate не работает, посмотрите материал, может это ваш случай. Запустим демон синхронизации и запишем его запуск в автозагрузку:

# systemctl start ntpd
# systemctl enable ntpd
ln -s "/usr/lib/systemd/system/ntpd.service" "/etc/systemd/system/multi-user.target.wants/ntpd.service"

Теперь наши часы будут автоматически синхронизироваться с сервером времени.

Более подробно об этой теме написано отдельно в моем материале - установка, настройка и синхронизация времени в CentOS.

Добавление репозиториев

Для инсталляции различного софта необходимо подключить репозитории в CentOS. Наиболее популярные это EPEL и rpmforge, поэтому добавим их. Сначала ставим EPEL. С ним все просто, он добавляется из стандартного репозитория:

# yum -y install epel-release

Устанавливаем rpmforge:

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
# yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

Установка iftop, atop, htop на CentOS 7

И напоследок добавим несколько полезных утилит, которые могут пригодиться в процессе эксплуатации сервера.

iftop показывает в режиме реального времени загрузку сетевого интерфейса, может запускаться с различными ключами, не буду останавливаться на этом подробно, в интернете есть информация на эту тему. Ставим:

# yum -y install iftop

И два интересных диспетчера задач, я чаще всего пользуюсь htop, но иногда пригодится и atop. Ставим оба, сами посмотрите, разберетесь, что вам больше нравится, подходит:

# yum -y install htop
# yum -y install atop

Вот как выглядит htop:

На этом у меня все. Базовая настройка CentOS 7 закончена, можно приступать к установке и настройке основного функционала.

Видео по настройке CentOS 7

Заключение

Мы выполнили некоторые начальные шаги по настройке, которые я обычно делаю при подготовке сервера. Я не претендую на абсолютную истину, возможно что-то упускаю или делаю не совсем верно. Буду рад разумным и осмысленным комментариям и замечаниям с предложениями.

Полезно после настройки сразу же подключить сервер к системе мониторинга. Либо настроить ее, если у вас еще нет.

За информацию спасибо: http://serveradmin.ru

Последнее время стало модно использовать всюду виртуализацию.
Имеем сервер с установленной CentOS 7 minimal x64 и планируем использовать KVM .

Конечно, не плохо бы было убедится что наш сервер поддержит виртуализацию (но если у вас современный нормальный сервер то думаю что 100% он это поддерживает) .

Egrep "(vmx|svm)" /proc/cpuinfo

Устанавливаем KVM на наш сервер:

Устанавливаем необходимые пакеты и инструменты:

Yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install –y

не забываем добавить в автозагрузку:

Systemctl enable libvirtd && systemctl start libvirtd

Создадим каталог для хранения образов виртуальных машин:

Mkdir /var/vm

Ну тут у нас два пути или добавляем соответствующий контекст для нашей директории что бы не ругался SElinux:

Semanage fcontext --add -t virt_image_t "/var/vm(/.*)?" restorecon -R -v /var/vm или просто его отключаем.

Ну в общем то готово. Остается только при необходимости произвести изменения настройки сети если такая необходимость есть.
Посмотреть список возможных сетей можно командой «virsh net-list »
По умолчанию имеем одну внутреннею сеть редактировать которую можно командой «virsh net-edit default » , где «default» название сети

Создадим виртуальную машину

Для примера (проверки) создадим первую виртуальную машину с простыми настройками и подключением к сети «default». Для начала скачаем образ OS которую будем ставить на сервер.

Virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/var/vm/vm1.img,size=20,format=qcow2 --graphics vnc,password=123 --cdrom /home/iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on

И так пройдемся немного по параметрам которые мы указываем:

  • --network network=default Подключаем виртуальную машину к виртуальной сети с именем default
  • --name Указываем название виртуальной машины
  • --ram= Указываем размер оперативной памяти который выделяем
  • --vcpus= Указываем количество процессоров которое мы выделяем
  • --disk Указываем расположение, формат и размер виртуального диска
  • --graphics vnc,password=123 Указываем пароль и возможность подключатся к терминалу виртуальной машины через VNC
  • --cdrom Указываем расположение образа с которого будем устанавливать систему
  • --boot Что подключено при загрузке
Указанные выше команды могут быть введены одной строкой: virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/var/vm/vm1.img,size=20,format=qcow2 --graphics vnc,password=123 --cdrom /home/iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on

и мы увидим:

Запуск установки... Выделение ресурсов «vm1.img»... | 10 GB 00:00:00 Создание домена... | 0 B 00:00:00 Установка домена продолжается. Ожидание до завершения установки...

Подключение к Виртуальной машине по VNC

Поскольку на нашем сервере нет оконного менеджера то что бы произвести установку и настройку нам необходимо как то подключится. В настройках при создании виртуалки «--graphics vnc,password=123» мы указали что можем подключатся к терминалу через VNC .

Нашей виртуальной машине был назначен порт VNC, узнать какой порт назначен конкретной виртуальной машине можно командой (где «vm1» название виртуальной машины):

Virsh vncdisplay vm1 127.0.0.1:0

Это означает, что порт VNC 5900+0=5900. Если бы результат был "127.0.0.1:1", порт VNC был бы 5901. И т.д. Подключатся к порту надо на хост (наш сервер который мы настраивали) виртуальных машин.

По умолчанию, хост виртуальных машин (у нас это CentOS 7 minimal) не должен позволять подключение к любому порту кроме ssh (22/tcp). Не советую вам открывать доступ к портам VNC из-вне. Это небезопасно. Для того, чтобы получить доступ к экрану виртуальной машины с рабочей станции Windows, с которой я все настраиваю, я сделал туннелирование порта в Putty: 5900 -> 127.0.0.1:5900.


После успешного логина по ssh, можно запустить TightVNC и указать порт 127.0.0.1::5900 (обратите внимание на двойное двоеточие).


Подключившись к виртуальной машине можем произвести установку ОС и последующую настройку.

Управление Виртуальной машиной:

Включение виртуальной машины

Virsh start vm1

Выключение виртуальной машины

Virsh shutdown vm1

Выдергивание кабеля питания:

Virsh destroy vm1

Приостановка работы:

Virsh suspend vm1

Подключить к виртуальной машине iso-образ в качестве cdrom

Virsh attach-disk vm1 /home/iso/CentOS-7-x86_64-Minimal-1503-01.iso hda --type cdrom --mode readonly

Virsh attach-disk vm1 "" hda --type cdrom --mode readonly

Для того, чтобы при перезапуске хоста виртуальная машина vm1 запускалась автоматически:

Virsh autostart vm1

Выключить автостарт для vm1:

Отключить iso-образ (не удалить устройство из гостя, а просто "извлечь cd-диск из привода"):

Virsh attach-disk vm1 "" hda --type cdrom --mode readonly

Solaris, Haiku, REACT OS and much more.

KVM can be managed using a command line or available graphical tools. Virt-Manager (Virtual Machine Manager) is the most widely used application for managing KVM based virtual machines. It supports creating, editing, starting, and stopping KVM-based virtual machines, as well as the live or cold migration of guest machines between hosts.

Prerequisites

Install KVM on CentOS 7

Issue the following command to install latest qemu package and also virt-manager which provides a graphical interface to manage virtual machines.

Yum install -y qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer

  • qemu-kvm = QEMU emulator
  • qemu-img = QEMU disk image manager
  • virt-install = Command line tool to create virtual machines.
  • libvirt = Provides libvirtd daemon that manages virtual machines and controls hypervisor.
  • libvirt-client = provides client-side API for accessing servers and also provides the virsh utility which provides command line tool to manage virtual machines.
  • virt-viewer – Graphical console

Create Virtual Machine

Once you have installed KVM and other tools, it is all set to start creating virtual machines. We will look be looking at creating virtual machines both in command-line and graphical mode.

Command Line Mode

virt-install is used to create virtual machines using the command line mode, and this command needs multiple inputs from us to create a virtual machine such as CPU, Memory, disk, network, installation media location, OS variant and more.

Virt-install --name=itzgeekguest --ram=1024 --vcpus=1 --cdrom=/tmp/CentOS-6.5-x86_64-minimal.iso --os-type=linux --os-variant=rhel6 --network bridge=br0 --graphics=spice --disk path=/var/lib/libvirt/images/itzgeekguest.dsk,size=4

Note: The above command uses bridged networking “br0” for allowing virtual machines to communicate with outside network, you can find a tutorial on creating bridged networking with Virt Manager.

–name – Name of the Virtual machine

–ram – Memory size in MB

–vcpus – Virtual CPU’s in numbers

–cdrom – Location of the ISO image

–os-type – OS types like Linux, Windows, etc.

–os-variant – OS variant like RHEL 6, Solaris

–network – Networking

–graphics – Guest display settings

–disk path – Location of the disk with size of 4 GB

Once you’ve issued the above command, virt-install will create a virtual machine and starts virt viewer console for OS installation.


Install KVM (QEMU) on CentOS 7 – Guest Installation command Line Virt Viewer

Graphical Mode

Type the following command in the terminal in GUI mode.

Virt-manager

Application >> System Tools >> Virtual Machine Manager.

You may be asked to enter a password if you don’t have root access.

Once it is opened, right-click on localhost(QEMU) and Click on New. Virtual Machine Manager will start a new wizard for creating a virtual machine. You will find no difficulty in using this graphical mode.

Step 1 : You would require naming your virtual machine, in the same window, you would be asked to choose how would you like to install the operating system. Here I chose to install it from ISO image or CD-ROM.

Install KVM (QEMU) on CentOS 7 – Virt Manager – Create VM

Step 2 : Enter the location of ISO image as the physical CD-ROM pass through is not supported by the hypervisor, do not forget to choose operating system type and version.


Install KVM (QEMU) on CentOS 7 – Virt Manager – Installation Media

Step 3 : Configure CPU and memory for the virtual machine.


Install KVM (QEMU) on CentOS 7 – Virt Manager – Memory and CPU

Step 4 : You have to mention the amount of storage that you want to assign to a virtual machine, Uncheck on “Allocate entire disk now “, this will prevent from allocating full disk at the VM creation.

Disk size will be allocated dynamically depending on the virtual machine usage.


Install KVM (QEMU) on CentOS 7 – Virt Manager – Allocating Storage

Step 5 : Summary of all the settings, click on advanced settings to select bridged networking to allow the virtual machine to communicate outside the network.

Click on Finish.

Install KVM (QEMU) on CentOS 7 – Virt Manager – Summary

Step 6 : KVM will start to create a virtual machine depends on our input, once VM is created. Virt manager will start a console for OS installation.

The following screen shows the installation screen of .


Install KVM (QEMU) on CentOS 7 – Virt Manager – VM Console

Manage Virtual Machine

With the Virtual Machine Manager, you can perform VM’s life cycle actions such as start, power off, reset, clone and migration by right-clicking on the selected virtual machine.


Install KVM (QEMU) on CentOS 7 – Virt Manager

Managing virtual machine using virt manager is very simple, you can just click on “bulb” icon in the VM console. Here you can add, modify and remove devices.


Install KVM (QEMU) on CentOS 7 – Virt Manager – Managing VM

В продолжение игрищ с организацией виртуальной винды на выделенном серваке, решил попробовать на вкус KVM, ибо до этого момента как то всегда за глаза хватало продуктов VMware и VirtualBox. А тут на одном из форумов вычитал гневную тираду какого то товарища на счет того, что только идиоты ставят VirtualBox там где можно поставить KVM.

Ну и решил посмотреть. Надо сказать, что в моем понимании, VIrtualBox ставится чуть муторней чем KVM, но управляется проще и нет геморроев с настройкой сетки, хотя функциональностью он возможно и уступает. Чего не скажешь про ESXi. Но обо всем по порядку.

Ставил стандартно на CentOS 6.7, т.ч телодвижения начинаем с обновления системы:
# yum -y update

Смотрим поддерживается ли процессором аппаратная виртуализация, т.к KVM для своей работы требует поддержки Intel VT или AMD-V
# egrep -i "vmx|svm" --color=always /proc/cpuinfo
в выводе должен присутствовать либо vmx либо svm

Смотрим статус контроля доступа SELinux
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted

теоретически он может помешать при доступе к дискам, поэтому его надо либо корректно настроить на работу с папкой имиджей, либо отрубить, что мне естественно проще – в файле /etc/selinux/config меняем значение параметра SELINUX на disabled и перегружаем машину
SELINUX=disabled

Импортируем GPG ключи для пакетов
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*
Ставим весь фарш: сам kvm, API управления виртуалками libvirt, приблуду для создания виртуалок virtinst и гипервизор qemu-kvm
# yum -y install kvm libvirt python-virtinst qemu-kvm

Запускаем libvirt и прописываем модуль автозагрузку
# /etc/init.d/libvirtd start
# chkconfig libvirtd on

Проверяем как KVM установился и стартанул (в выводе должно быть 0 ошибок)
# virsh -c qemu:///system list
Id Name State
—————————————————-

Устанавливаем сетевой мост, для подключения гостевых машин к внешней сетке и ужасному, страшному энторнету
# yum install bridge-utils

Создаем конфиг сетевого моста, аналогичный настройкам сетевого интерфейса, но с небольшой разницей:
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0

###### /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=bridge
ONBOOT=yes
BOOTPROTO=none
NM_CONTROLLED=yes
IPADDR=SERVER_IP
PREFIX=24
GATEWAY=GW_IP
DNS1=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System br0″
##################
затем редактируем настройки основного интерфейса, комментируя парметры BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1 и прописывая сетевой мост
###### /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
#BOOTPROTO=none
HWADDR=01:2e:32:ab:9f:1e
#IPADDR=SERVER_IP
#PREFIX=24
#GATEWAY=GW_IP
#DNS1=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System eth0″
BRIDGE=br0
##################

Теперь рестартим сетку и смотрим что получилось - у нас должны показываться 4 интерфейса:
br0 с основным IP
eth0 без IP
lo 127.0.0.1
virbr0 с внутренним IP виртуального рутера

проверяем состояние нашего сетевого моста:
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.002215ab999d no eth0
virbr0 8000.52540052c0e1 yes virbr0-nic

теоретически можно ускорить работу сетевого моста, добавлением в файл /etc/sysctl.conf следующих параметров:
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

Теперь переходим к созданию директории для хранения имиджей виртуалок и образов дистов iso
# mkdir /usr/vm/iso
# mkdir /usr/vm/vm-images

по дефолту все имиджи машин, образы дисков и прочее хранится в /var/lib/libvirt/ но я решил выпендриться и порезал диск в лучших олдскульных традициях разбиения, поэтому учитывайте этот момент при установке сервера, либо же придется удалять оригинальные хранилища и линковать, как мне, на /usr

# rm -Rf /var/lib/libvirt/images
# ln -s usr/vm/iso /var/lib/libvirt/images

После всей этой подготовки, пытаемся создать виртуальную машину под Windows 7 с 2 виртуальными процами, 4Gb оперативки, 30Gb HDD, хранения имиджа в папке /usr/vm/vm-images и имиджем windows7.iso который мы скачали ранее в папку /usr/vm/iso

# virt-install --connect=qemu:///system -n win7 -r 4096 --vcpus=2 --disk path=/usr/vm/vm-images/win7.img,size=30 -c /usr/vm/iso/windows7.iso --vnc --noautoconsole --os-type windows --os-variant win7 --accelerate --network=bridge:br0 --hvm

Если все нормально, то увидим процесс создания диска. На этой торжественной ноте можно переходить к настройке машины, и тут кроется самая настоящая засада, т.к если вы работаете из под винды, то из вариантов есть либо управление через ming сквозь putty-ssh, но для этого требуются X Windows на стороне сервера, либо же совершенно не понятная тулза virtual viewer, которуя я так и не смог заставить работать. Поэтому все что я смог найти- это либо этот внешний сервис, позволяющий подцепить свою KVM к их админке; либо же ставить свою веб-админку на базе Webmin Cloudmin GPL.

Тут надо заметить, что строка инициализиции сетки –network=bridge:br0 позволит использовать на виртуальной машине паблик IP, тогда как если вы хотите сидеть в виртуальной локалке и выходить из неё в инет, то надо ставить другой оператор –network=bridge:virbr0 что я упустил при установке, т.ч потом пришлось менять руками в файле настройки виртуальной машины /etc/libvirt/qemu/win7.xml.

Управление машиной в CLI осуществляется через virsh (virtual shell) в который мы попадаем из командной строки shell:
# virsh --connect qemu:///system
Welcome to virsh, the virtualization interactive terminal.
Type: ‘help’ for help with commands
‘quit’ to quit
virsh # list –all
Id Name State
—————————————————-
2 win7 running
virsh # shutdown win7
Domain win7 is being shutdown
virsh # start win7
Domain win7 started

KVM — это инфраструктура виртуализации для Linux, для которой процессор с аппаратным расширением виртуализации может принимать гостевые системы.

KVM — это удобное решение для тестирования различных операционных систем, если у вас нет возможности приобретать дорогостоящие и энергоемкие физические устройства.

В приведенном ниже руководстве представлена установка и настройка KVM (QEMU) вместе с конфигурацией Linux Bridge в операционной системе CentOS7 / RedHat7.

1. Проверьте поддержку виртуализации оборудования процессора

Наш процессор должен поддерживать аппаратную виртуализацию (VT-x), чтобы стать Hypervisor KVM и хостом виртуальных машин (гостевые операционные системы):

# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 42 Model name: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz Stepping: 7 CPU MHz: 800.000 BogoMIPS: 4988.58 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 3072K NUMA node0 CPU(s): 0-3

2. Отключите и остановите NetworkManager

Известно, что NetworkManager вызывает проблемы при работе с Linux Bridge, поэтому для нас лучше отключить его:

# systemctl stop NetworkManager # systemctl disable NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.

3. Установите пакеты, связанные с KVM

# yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer virt-manager

4. Запустите и включите демон libvirtd

# systemctl enable libvirtd # systemctl start libvirtd

5. Установите общесистемные привилегии для KVM

Нам нужно добавить нашего обычного пользователя tuxfixer в группу kvm, чтобы он мог запустить virt-manager

# usermod -a -G kvm tuxfixer

Нам также необходимо установить правила polkit (policy kit) для KVM.
Редактируем файл 49-polkit-pkla-compat.rules:

# vim /etc/polkit-1/rules.d/49-polkit-pkla-compat.rules

и добавьте следующее:

Polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.isInGroup("kvm")) { return polkit.Result.YES; } });

6. Создайте мост KVM Linux Bridge (модемный сетевой интерфейс гипервизора KVM с сетевыми интерфейсами VM)

В этом уроке мы хотим, чтобы виртуальные машины получали свои IP-адреса из той же сети, где подключен хост KVM Hypervisor, поэтому мы подключим его основной сетевой интерфейс (em1) к сетевым интерфейсам VM.

Для этого нам нужно создать Linux Bridge из интерфейса em1 на хосте KVM Hypervisor.

Текущая конфигурация сети Hypervisor (сразу после установки KVM):

# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6::1/128 scope host valid_lft forever preferred_lft forever 2: em1: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether d0:67:e5:33:15:3f brd ff:ff:ff:ff:ff:ff inet 192.168.2.3/24 brd 192.168.2.255 scope global dynamic em1 valid_lft 73193sec preferred_lft 73193sec inet6 fe80::d267:e5ff:fe33:153f/64 scope link valid_lft forever preferred_lft forever 3: wlp3s0: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 00:24:d7:f4:dc:e8 brd ff:ff:ff:ff:ff:ff 4: virbr0: mtu 1500 qdisc noqueue state DOWN link/ether 52:54:00:b7:22:b3 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500 link/ether 52:54:00:b7:22:b3 brd ff:ff:ff:ff:ff:ff

Файл конфигурации ifcfg-em1 (до создания моста KVM Linux Bridge):

# cat /etc/sysconfig/network-scripts/ifcfg-em1 DEVICE="em1" TYPE="Ethernet" BOOTPROTO="none" NAME="em1" ONBOOT="yes" HWADDR="D0:67:E5:33:15:3F" IPADDR=192.168.2.3 PREFIX=24 GATEWAY=192.168.2.1 PEERDNS="no" NM_CONTROLLED="no"

Для настройки сети KVM мы будем использовать приложение virt-manager, которое является удобным интерфейсом GUI для интерфейса командной строки KVM.

Примечание. Интерфейс virbr0 был создан автоматически вместе с установкой KVM и представляет виртуальную сеть, существующую «внутри» среды KVM с NAT (трансляция сетевых адресов).

Поскольку мы не нуждаемся в NAT в среде KVM (мы хотим скрыть интерфейс Hypervisor), мы можем удалить существующую виртуальную сеть KVM на основе интерфейса virbr0.

Запустите virt-manager от пользователя root:

# virt-manager

… должно появиться окно virt-manager:

Правый щелчок на QEMU/KVM -> Details -> Virtual Networks -> Disable network: “default” -> Delete network: “default” based on virbr0

Теперь мы можем подключить интерфейс Hypervisor KVM (em1):

Щелкните правой кнопкой мыши:QEMU/KVM -> Details -> Network Interfaces -> Add Interface :

  • Interface type: Bridge
  • Interface name: br-em1
  • Start mode: on boot
  • Activate now: enabled
  • IP settings: copy configuration from ’em1′
  • Bridge settings: STP on, delay 0.00 sec

… нажмите Finish, чтобы переопределить существующую конфигурацию и создать KVM Linux Bridge.

Теперь мы можем проверить вновь созданный Linux Bridge (br-em1):

Проверьте текущую конфигурацию IP (теперь IP назначается br-em1, а em1 действует теперь только как интерфейс):

# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6::1/128 scope host valid_lft forever preferred_lft forever 2: em1: mtu 1500 qdisc pfifo_fast master br-em1 state UP qlen 1000 link/ether d0:67:e5:33:15:3f brd ff:ff:ff:ff:ff:ff 3: wlp3s0: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 00:24:d7:f4:dc:e8 brd ff:ff:ff:ff:ff:ff 6: br-em1: mtu 1500 qdisc noqueue state UP link/ether d0:67:e5:33:15:3f brd ff:ff:ff:ff:ff:ff inet 192.168.2.3/24 brd 192.168.2.255 scope global br-em1 valid_lft forever preferred_lft forever inet6 fe80::d267:e5ff:fe33:153f/64 scope link valid_lft forever preferred_lft forever

Проверьте настройку моста:

# brctl show bridge name bridge id STP enabled interfaces br-em1 8000.d067e533153f yes em1

Теперь KVM Linux мост настроен, и мы можем продолжить установку виртуалки.