Установка Mikrotik CHR на виртуальную машину Proxmox
Не так давно мы рассказывали о виртуальном роутере Mikrotik CHR (Cloud Hosted Router), который представляет собой специальную версию RouterOS для виртуальных сред. Это дает возможность использовать все возможности Mikrotik без оглядки на производительность и физические ограничения роутеров официальной линейки. Сегодня мы поговорим о том, как установить CHR на виртуальную машину Proxmox, ничего сложного в этом процессе нет и даже есть соответствующая статья в официальной Wiki, но гладко было на бумаге...
Онлайн-курс по MikroTik
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на
углубленном курсе по администрированию MikroTik.
Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента.
В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Изначально мы не собирались писать эту статью. Какой смысл переписывать то, что есть в официальной документации, тем более что там представлен готовый скрипт. Как говориться: нажми на кнопку и получи результат. Хотя сами мы его никогда не использовали, предпочитая все делать вручную. На самом деле процесс несложный: скачать и сконвертировать образ диска, затем создать виртуальную машину с ним. Но недавно с таким вопросом к нам обратился коллега и мы дали ему ссылку на официальную документацию.
А вот дальше все пошло не так. Скрипт оказался фактически нерабочим, кроме того, содержащим достаточно грубые ошибки. Начнем по порядку.
URL для скачивания образа диска указан неверно, при попытке перехода по нему нас ждет сообщение:
1<Error>
2<Code>AccessDenied</Code>
3<Message>Access Denied</Message>
Но скрипт игнорирует ошибку получения образа и продолжает свою работу, создавая виртуальную машину без жесткого диска.
Следующая ошибка - перед предложением указать свободный VM ID выводится список только виртуальных машин, существующие контейнеры игнорируются. И хотя Proxmox не даст создать еще одну виртуалку с существующим VM ID, но мусор в виде образа диска в системе останется.
После указания VM ID проверка на существование виртуальной машины производится некорректно, проверяется наличие каталога с образом диска, в то время как современные виртуалки могут использовать Thin LVM. Правильно будет проверять наличие конфигурационного файла виртуалки. При этом логика самой проверки неверна, установив наличие существующего образа скрипт предложит ввести новое значение VM ID, но новое значение проверяться никак не будет. Т.е. можно два раза указать неверное значение и скрипт продолжит свою работу.
С учетом всего вышесказанного мы серьёзно переработали скрипт и добавили в него новые функции. Наш скрипт выполняет следующие действия:
- Скачивает образ Mikrotik CHR указанной версии и проверяет успешность этого действия
- Выводит список всех виртуальных машин и контейнеров
- Проверяет введенный VM ID на существование виртуальной машины или контейнера с таким идентификатором
- Конвертирует образ и изменяет размер виртуального жесткого диска на указанный пользователем (новая функция)
- Создает виртуальную машину с нужным образом диска
При возникновении ошибок на любом из этапов скрипт сообщает об ошибке и завершает свою работу.
1#!/bin/bash
2
3#vars
4version="nil"
5vmID="nil"
6
7echo "############## Start of Script ##############
8
9## Checking if temp dir is available..."
10if [ -d /root/temp ]
11then
12 echo "-- Directory exists!"
13else
14 echo "-- Creating temp dir!"
15 mkdir /root/temp
16fi
17# Ask user for version
18echo "## Preparing for image download and VM creation!"
19read -p "Please input CHR version to deploy (6.38.2, 6.40.1, etc):" version
20# Check if image is available and download if needed
21if [ -f /root/temp/chr-$version.img ]
22then
23 echo "-- CHR image is available."
24else
25 echo "-- Downloading CHR $version image file."
26 cd /root/temp
27 echo "---------------------------------------------------------------------------"
28 wget --no-check-certificate https://download.mikrotik.com/routeros/$version/chr-$version.img.zip
29 unzip chr-$version.img.zip
30 echo "---------------------------------------------------------------------------"
31fi
32if [ ! -f /root/temp/chr-$version.img ]
33then
34 echo "-- Error downloading CHR $version image file!"
35 exit 0
36fi
37# List already existing VM's and ask for vmID
38echo "== Printing list of VM's on this hypervisor!"
39qm list
40echo "== Printing list of CT's on this hypervisor!"
41pct list
42echo ""
43read -p "Please Enter free vm ID to use:" vmID
44echo ""
45# Create storage dir for VM if needed.
46if [ -f /etc/pve/nodes/pve/qemu-server/$vmID.conf ]
47then
48 echo "-- VM exists! Try another vm ID!"
49 exit 0
50fi
51if [ -f /etc/pve/nodes/pve/lxc/$vmID.conf ]
52then
53 echo "-- CT exists! Try another vm ID!"
54 exit 0
55fi
56echo "-- Creating VM image dir!"
57mkdir /var/lib/vz/images/$vmID
58# Creating qcow2 image for CHR.
59read -p "Please input image size, GB:" imgsize
60echo "-- Converting image to qcow2 format "
61qemu-img convert \
62 -f raw \
63 -O qcow2 \
64 /root/temp/chr-$version.img \
65 /var/lib/vz/images/$vmID/vm-$vmID-disk-1.qcow2
66if [ $imgsize -ne 0 ]
67then
68 echo "-- Resize image to $imgsize GB"
69 qemu-img resize \
70 /var/lib/vz/images/$vmID/vm-$vmID-disk-1.qcow2 +${imgsize}G
71fi
72# Creating VM
73echo "-- Creating new CHR VM"
74qm create $vmID \
75 --name chr-$version \
76 --net0 virtio,bridge=vmbr0 \
77 --bootdisk virtio0 \
78 --ostype l26 \
79 --memory 256 \
80 --onboot no \
81 --sockets 1 \
82 --cores 1 \
83 --virtio0 local:$vmID/vm-$vmID-disk-1.qcow2
84echo "############## End of Script ##############"
Разберем его работу подробнее.
Секция ## Checking if temp dir is available..." проверяет наличие временной директории /root/temp и создает ее в случае отсутствия. Затем у пользователя запрашивается номер требуемой версии RouterOS и производится попытка ее скачать. Кроме исправленного адреса мы добавили опцию --no-check-certificate для wget, что позволяет исключить ошибки с проверкой валидности сертификата.
Затем производится проверка успешности скачивания и распаковки образа:
1if [ ! -f /root/temp/chr-$version.img ]
Если файл образа не существует - скрипт завершит свою работу.
В случае успеха он выведет пользователю список не только виртуальных машин, но и контейнеров:
1echo "== Printing list of VM's on this hypervisor!"
2qm list
3echo "== Printing list of CT's on this hypervisor!"
4pct list
После ввода желаемого VM ID происходит проверка наличия конфигурационных файлов, как для виртуалок, так и для контейнеров:
1if [ -f /etc/pve/nodes/pve/qemu-server/$vmID.conf ]
2then
3 echo "-- VM exists! Try another vm ID!"
4 exit 0
5fi
6if [ -f /etc/pve/nodes/pve/lxc/$vmID.conf ]
7then
8 echo "-- CT exists! Try another vm ID!"
9 exit 0
10fi
Если для указанного VM ID будет найден конфигурационный файл, скрипт сообщит что такая машина или контейнер существуют и завершит свою работу.
После прохождения всех проверок, казалось бы, можно создавать виртуальную машину, но не будем спешить. По умолчанию образ диска имеет объем всего 64 МБ, что во многих случаях будет явно недостаточно.
Поэтому мы добавили в скрипт новую функцию - установку нужного размера виртуального диска. Требуется указать нужное значение в ГБ или ноль, если вы не хотите увеличивать диск.
1read -p "Please input image size, GB:" imgsize
После чего будет выполнена конвертация образа, установка указанного размера и создание виртуальной машины.
Все последующие действия требуется выполнять с правами суперпользователя root.
Сначала создадим сам файл скрипта в корневой директории суперпользователя:
1nano /root/CHR_install.sh
И внесем в него приведенный выше текст, также можно скачать готовый скрипт с нашего сайта:
CHR_install.sh
MD5: 47E29D66B33955BCFB94E6149B823CB2
Например, это можно сделать командой:
1cd /root
2wget --no-check-certificate https://interface31.ru/tech_it/files/CHR_install.sh
Затем, вне зависимости от того, каким образом вы создали скрипт, сделаем его исполняемым:
1chmod +x /root/CHR_install.sh
Теперь его можно запускать, для этого, если вы находитесь в /root выполните:
1./CHR_install.sh
Из иных расположений:
1/root/CHR_install.sh
В ходе работы скрипта вам потребуется ответить на три вопроса: указать версию RouterOS так как она указана на сайте (6.48.1 или 6.49beta27), номер идентификатора виртуальной машины (VM ID) и желаемый размер виртуального диска в ГБ:
Результатом работы скрипта будет созданная виртуальная машина, перед запуском вы можете проверить и изменить ее параметры:
Обратите внимание, что скрипт создает единственный сетевой интерфейс, который подключает к vmbr0. Сама же RouterOS настроена таким образом, что на интерфейсе ether1 включен DHCP-клиент и при наличии в сети DHCP-сервера автоматически получит от него адрес. Однако вы можете настроить любую иную сетевую конфигурацию. Более подробно читайте в нашей статье о настройке сети в Proxmox VE.
Также не забудьте проверить и включить автоматический запуск виртуальной машины, по умолчанию он выключен:
Если же вам нужно расширить виртуальный диск уже существующей машины, то ее следует выключить и выполнить следующую команду:
1qemu-img resize /var/lib/vz/images/105/vm-105-disk-1.qcow2 +4G
В данном случае мы увеличили диск виртуальной машины с идентификатором 105 на 4 ГБ.
Онлайн-курс по MikroTik
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на
углубленном курсе по администрированию MikroTik.
Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента.
В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: