# Работа с виртуализацией: QEMU/KVM. Часть 1

#### Задание 0. Построение стенда
Схема виртуального лабораторного стенда
<center>
<div drawio-diagram="452"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/beSh872NSqiLOeKq-drawing-3-1701074435.png"></div>

Рисунок 1. Схема стенда</center>

1. Создать виртуальные машины для работы

|Название виртуальной машины|Источник |Тип инстанса|Сети для внешнего подключения |Размер диска |
|-|-|-|-|-|
|labnode-1|Образ-Ubuntu-server20.04|small|external-net|10GB|

Так же нужно проверить развернутую инфраструктуру на соответствие схеме на рисунке 1.


####  Задание 1. Установка QEMU.
На <b>labnode-1</b>:
1. Установить эмулятор аппаратного обеспечения различных платформ:
```bash
sudo apt update
sudo apt install qemu-kvm qemu-system qemu-utils -y
```
2. Убедиться, что модуль KVM загружен (с помощью команд lsmod и grep):
```bash
lsmod | grep -i kvm
```
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/vmuLKsi2DLiBR8r2-image-1701069186884.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/vmuLKsi2DLiBR8r2-image-1701069186884.png)

#### Задание 2. Управление образами дисков при помощи qemu-img.
Чтобы запускать виртуальные машины, QEMU требуются образы для хранения определенной файловой системы данной гостевой ОС. Такой образ сам по себе имеет тип некоторого файла, и он представляет всю гостевую файловую систему, расположенную в некотором виртуальном диске. QEMU поддерживает различные образы и предоставляет инструменты для создания и управления ими. Можно построить пустой образ диска с помощью утилиты qemu-img, которая должна быть установлена.

1. Проверить какие типы образов поддерживаются qemu-img:
```bash
sudo qemu-img -h | grep Supported
```
2. Создать образ qcow2 с названием system.qcow2 и размером 5 ГБ:
```bash
sudo qemu-img create -f qcow2 system.qcow2 5G
```
3. Проверить что файл был создан:
```bash
ls -lah system.qcow2
```
4. Посмотреть дополнительную информацию о данном образе:
```bash
sudo qemu-img info system.qcow2
```
#### Задание 3. Изменение размера образа.
Не все типы образов поддерживают изменение размера. Для изменения размера такого образа сначала нужно преобразовать его в образ raw с помощью команды qemu-img convert.
1. Конвертировать образ диска из формата qcow2 в raw:
```bash
sudo qemu-img convert -f qcow2 -O raw system.qcow2 system.raw
```
2. Добавить дополнительно 5 ГБ к образу:
```bash
sudo qemu-img resize -f raw system.raw +5G
```
3. Проверить новый текущий размер образа:
```bash
sudo qemu-img info system.raw
```
4. Конвертировать образ диска обратно из raw в qcow2:
```bash
sudo qemu-img convert -f raw -O qcow2 system.raw system.qcow2
```
#### Задание 4. Загрузка образа OpenWRT.
Для загрузки образов с общедоступных репозиториев требуется утилита <b>curl</b>. Загрузить
необходимый образ, воспользовавшись <b>curl</b>:
```bash
curl -L https://s3.resds.ru/itt/openwrt.img -o /tmp/openwrt.raw
```
#### Задание 5. Создание виртуального окружения с помощью qemu-system.
1. Для того чтобы подключиться к виртуальной машине по протоколу удаленного рабочего стола <b>VNC</b>, нужно открыть порт <b>5900</b>. В группе безопасности
2. Посмотреть ip адрес вашего сервера 
```bash
ip address
```
3. Запустить систему при помощи qemu-system:
```bash
sudo qemu-system-x86_64 -hda /tmp/openwrt.raw -m 1024 -vga cirrus -vnc 0.0.0.0:0
```
4. Установите и откройте программу (Remmina). И подключитесь по протоколу `VNC` к гипервизору

5. Набрать команду <b>uname -a</b>. Посмотреть на версию ядра ОС. Выключить виртуальную машину, набрав 
  ```bash 
  poweroff
  ```
#### Задание 6. Установка Libvirt и Virsh.

```bash
sudo apt install -y libvirt-daemon-system virtinst
```
#### Задание 7. Настройка моста.

Установить пакет <b>bridge-utils</b>:
```bash
sudo apt install -y bridge-utils
```
Вывести на экран имеющиеся интерфейсы:
```bash
ip -c address
```
Открыть файл <b>/tmp/labnet.xml</b>:
```bash
sudo vi /tmp/labnet.xml
```
И заполнить по примеру
```yaml
<network>
  <name>labnet</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='labnet' stp='on' delay='0'/>
  <ip address='192.168.22.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.22.2' end='192.168.22.254'/>
    </dhcp>
  </ip>
</network>
```
Добавляем сеть и запускаем ее:
```bash
sudo virsh net-define /tmp/labnet.xml
sudo virsh net-start labnet
sudo virsh net-autostart labnet
```
#### Задание 8. Создание виртуальной машины.
Переместить образ <b>openwrt</b> в <b>/var/lib/libvirt/images/</b>
```bash
sudo mv /tmp/openwrt.raw /var/lib/libvirt/images/
```
Следующая команда создаст новую KVM виртуальную машину
```bash
sudo virt-install --name openwrt \
--ram 1024 \
--disk path=/var/lib/libvirt/images/openwrt.raw,cache=none \
--boot hd \
--vcpus 1 \
--network network=labnet \
--graphics vnc,listen=0.0.0.0 \
--wait 0
```

<i>Символ \ - обратная косая черта используется для экранирования специальных символов в строковых и символьных литералах. В данном случае нужна, чтобы переместить каретку на новую строку, для наглядности. После ее добавления в команду можно нажать Enter, но строка не отправится на выполнение, а ввод команды продолжится.</i> При ошибке в наборе команды, можно не набирать ее заново, а нажать стрелку вверх, исправить ее, и снова нажать `Enter`
Подробнее о параметрах:

| Название параметра  | Описание параметра  |
|---|---|
|name | Имя виртуальной машины, которое будет отображаться в virsh|
|  ram |  Размер оперативной памяти в МБ | 
|  disk |  Диск, который будет создан и подключен к виртуальной машине |  
| vcpus | Количество виртуальных процессоров, которые нужно будет настроить для гостя | 
| os-type | Тип операционной системы |
| os-variant | Название операционной системы| 
| network | Определение сетевого интерфейса, который будет подключен к виртуальной машине | 
| graphics | Определяет графическую конфигурацию дисплея. |
| cdrom | CD ROM устройство |

Далее необходимо подключиться к гипервизору через программу <b>Remmina</b>.

Открыть её (название - Remmina). Подключиться по адресу виртуальной машины, выбрав протокол VNC.Вернуться в консоль <b>labnode-1</b>. Проверить состояние гостевой системы, используя команду
(Если в консоли написано “Domain installation still in progress”, то нажмите `^C`):
```bash
sudo virsh list --all
```
#### Задание 9. Операции с виртуальной машиной.

<div drawio-diagram="453"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/85PNnh5N6sVzHiot-drawing-3-1701084312.png"></div>

Рассмотрим работу утилиты <b>virsh</b>. Чтобы подключиться к ВМ по протоколу удаленного доступа, используется следующая команда:
```bash
sudo virsh domdisplay openwrt
```
Результатом исполнения этой команды будет адрес для подключения к графическому интерфейсу ВМ, с указанием номера порта.
Получить информацию о конкретной ВМ можно так:
```bash
sudo virsh dominfo openwrt
```
В результате чего будет выведена информация, об основных параметрах виртуальной машины.
Выключить/включить ВМ можно с помощью команды:
```bash
sudo virsh destroy openwrt
sudo virsh start openwrt
```
Зайти в консоль виртуальной машины можно с помощью команды:
```bash
sudo virsh console openwrt
```
Посмотрите размер разделов
```bash
df -h
```
Выйдите из виртуальной машины

Добавление ВМ в автозапуск происходит следующим образом:
```bash
sudo virsh autostart openwrt
```
Теперь, виртуальная машина будет автоматически запускаться, после перезагрузки сервера.
Кроме того, может потребоваться отредактировать XML конфигурацию ВМ:
```bash
sudo virsh edit openwrt
```
Необходимо выгрузить конфигурацию ВМ в XML в файл, используя команду:
```bash
sudo virsh dumpxml openwrt | tee openwrt.xml
```
Необходимо удалить ВМ, и убедиться, что её нет в списке виртуальных машин:
```bash
sudo virsh undefine openwrt
sudo virsh destroy openwrt
sudo virsh list --all
```

Увеличиваем размер диска на 1GB
```bash
sudo qemu-img resize -f raw /var/lib/libvirt/images/openwrt.raw +1G
```

Для создания ВМ из XML существует следующая команда:

```bash
sudo virsh define openwrt.xml
sudo virsh list --all
```

После запуска виртуальной машины необходимо увеличить размер основного раздела с помощью fdisk:
```bash
fdisk /dev/sda
```
После этого необходимо увеличить размер файловой системы:
```bash
BOOT="$(sed -n -e "/\s\/boot\s.*$/{s///p;q}" /etc/mtab)"
DISK="${BOOT%%[0-9]*}"
PART="$((${BOOT##*[^0-9]}+1))"
ROOT="${DISK}${PART}"
LOOP="$(losetup -f)"
losetup ${LOOP} ${ROOT}
fsck.ext4 -y -f ${LOOP}
resize2fs ${LOOP}
reboot
```
Проверить размер разделов
```bash
df -h
```