… или другой Linux-хостинг.
Сразу оговорюсь, что поскольку мне в процессе всех экспериментов уже поднадоело сносить и заново настраивать дроплет в DO, пример я буду выполнять в VMware ESXi, но на конечный результат это влиять не будет, команды все будут те же самые, в принципе, это применимо к любому облачному VPS хостингу, где у нас есть доступ по SSH.
За основу взят доклад Дмитрия Пичулина deemru на прошедшем 30 сентября MUM в Москве. В отличии от доклада Дмитрия, в данной статье не будет рассматриваться вопросы выбора хостинга и цен на него (в стремлении намутить облачный роутер подешевле), настройки полученного устройства. Рассмотрена будет лишь техническая сторона вопроса и решены пара проблем.

Вернувшись с MUM, я был в предвкушении, руки чесались запилить Mikrotik на Digital Ocean (в тот момент, там была Ubuntu Server, которая выполняла функции VPN-сервера). Полез смотреть архив выступлений, но его ещё не было и я написал письмо Дмитрию с просьбой поделиться слайдами. Получив презентацию, с холодной головой ринулся в бой — ломать свой дроплет полностью. Сделал всё, как в презентации, всё завелось. Легче и придумать нельзя. Скачиваем на хостинг образ, распаковываем, переводим файловую систему в read-only, заливаем образ на диск через dd. Но тут то меня и подстерегала первая нестыковочка — у Дмитрия при первой загрузке CHR автоматически произошло расширение файловой системы и она заняла весь диск, у меня же этого не произошло и пришлось довольствоваться 128 МБ.

Кто-то скажет 128 МБ на роутере хватит всем. Но меня эта ситуация в корне не устраивала, поэтому я принялся её устранять. Всем известно, что RouterOS основана на Linux, но от Linux'а там мало что осталось, поэтому после установки системы, её штатными средствами переразметить диск уже нельзя. Нельзя и загрузиться с какого-нибудь LiveCD и переразметить в нём (ну по крайней мере у DO нельзя). Попытки тыкаться fdisk'ом и parted'ом после заливки образа на диск, но до перезагрузки так же не привели к какому-либо положительному результату (эффекта либо не было вообще, либо я получал не загружающуюся систему).

Нормальные герои всегда идут в обход.

Итак для того чтобы получить RouterOS, установленную на Digital Ocean, в которой доступно 20 ГБ дискового пространства (ну или сколько там у Вас по тарифу) нам потребуется:

  • Собственно, сам droplet с установленным Linux дистрибутивом (в данном случае дистрибутив будет Ubuntu Server 16.04 x64, а вместо droplet'а будет виртуальная машина в ESXi, но ещё раз повторюсь, что роли это не сыграет), к которому у нас есть доступ по SSH.

  • Установленный на компьютере или сервере гипервизор (изначально я делал в VirtualBox, сейчас буду делать опять же в ESXi, на конечный результат это не влияет).

  • LiveCD вашего любимого Linux-дистрибутива (желательно, чтобы там был GUI, так будет удобнее).

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

Начнём с дроплета.


Нам нужно выяснить, какого объёма нам нужен диск в виртуальной машине, поэтому:

fdisk -l /dev/sda
Диск /dev/sda: 16 GiB, 17179869184 байтов, 33554432 секторов
Единицы измерения: секторов из 1 * 512 = 512 байтов
Размер сектора (логический/физический): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Тип метки диска: dos
Идентификатор диска: 0x7b5dbf9c

Устр-во    Загрузочный    Start Конец Секторы  Size Id Тип
/dev/sda1  *               2048 31457279 31455232   15G 83 Linux
/dev/sda2              31459326 33552383  2093058 1022M  5 Расширенный
/dev/sda5              31459328 33552383  2093056 1022M 82 Linux своп / Solaris

Как мы видим, у нас диск 17179869184 байт, запомним это значение.

Подготовка промежуточной машины


В гипервизоре создаём новую виртуальную машину. Её параметры особого значения не имеют, но можно, к примеру сделать их близкими к характеристикам дроплета. Размер диска лучше сделать с небольшим запасом, на всякий случай (почему-то 20ГБ в DO оказались меньше 20ГБ в VirtualBox). Настраиваем загрузку виртуальной машины с LiveCD.

image

Включаем её и после загрузки скачиваем любым удобным способом последнюю версию CHR, которую можно найти по ссылке:

image

Нам нужен образ Raw disk image (к примеру chr-6.37.1.img.zip). Распаковываем архив:

unzip chr-6.37.1.img.zip
Archive:  chr-6.37.1.img.zip
  inflating: chr-6.37.1.img

И заливаем образ на жёсткий диск с помощью dd (Дмитрий тут использовал утилиту pv, но я, если честно не вижу в этом смысла, т.к. образ маленький и разворачивается довольно быстро):

dd if=chr-6.37.1.img.zip of=/dev/sda
262144+0 records in
262144+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 5.64304 s, 23.8 MB/s

вместо sda нужно указать ваш диск, его имя может отличаться.

Расширяем файловую систему RouterOS


Любители всё делать в консоли могут делать там, мне показалось быстрее и проще сделать всё в GParted.

Запускаем GParted, выбираем диск, на который установили RouterOS и с помощью функции Resize/Move увеличиваем размер второго раздела. Обратите внимание, что размер раздела за вычетом размера первого раздела не должен превышать размер диска Вашего дроплета, который мы посмотрели в самом начале (т.е. первый раздел у нас 32 МиБ, значит второй должен быть не более 17179869184 байт / 1048576 = 16384 МиБ и — 32, т.е. 16352 МиБ)

image

Не забываем применить изменения разметки диска.

Создаём новый образ и жмём его с помощью gzip:


dd if=/dev/sda bs=8196 count 17000 | gzip -9cf > chr.img.gz
17000+0 records in
17000+0 records out
139332000 bytes (139 MB, 133 MiB) copied, 3.30824 s, 42.1 MB/s

Значение 17000 мы получаем путём приведения размера образа при его развёртывании на диск. Там было 128 МиБ, т.е. 128 * 1024 = 131072 КиБ разделим размер на размер блока и округлим 131072 / 8 = 16384 ? 17000 блоков.

Заливаем полученный образ на дроплет и устанавливаем его


scp chr.img.gz user@host:~/

Где user — имя пользователя на вашем дроплете, а host — его адрес. Копирование будет выполняться в домашний каталог пользователя.

Принимаем сертификат ssh сервера, и вводим пароль, когда нас об этом попросят. После окончания копирования, эта виртуальная машина нам больше не понадобится.

Переходим на наш дроплет. Можно подключиться к нему по ssh или зайти через консоль. Убедимся, что наш образ скопировался, желающие могут проверить контрольные суммы. Переведём файловую систему в режим read-only и развернём образ на диск через gzip и dd:

echo u > /proc/sysrq-trigger && gunzip -c chr.img.gz | dd of=/dev/vda

Всё! CHR установлен на наш дроплет. Перезагрузимся:

reboot

Вас приветствует Mikrotik Cloud Hosted Router


@gexogen - обманщик!!!
На самом деле, хоть я и обещал, что нет никакой разницы, в Digital Ocean мы это делаем или в ESXi, разница всё-таки есть. В DO всё работает, а вот ESXi после перезагрузки упал в Kernel Panic. Но, в ESXi файловая система растягивается и так при первой загрузке и данные манипуляции не потребуются.

После перезагрузки входим под пользователем admin без пароля, после чего задаём пароль, прописываем ip адрес и дефолтный маршрут:

/system user set admin password=YOURPASSWORD
/ip address add address=YOUR.IP.ADD.RESS/MASK
/ip route add gateway=YOUR.GATE.WAY.IP

После чего можно подключаться к нему и настраивать через Winbox.

Заключение


image

На доступном месте можно установить внутри RouterOS виртуальную машину с Linux или использовать его как-нибудь иначе — на Ваше усмотрение (поднять FTP сервер или ещё что-нибудь).

Ссылки:


Презентация Дмитрия в фомате PDF
Запись его выступления
На всякий случай, ссылка на готовый образ под файловую систему на 20 ГБ (т.е. минимальный тариф DO за 5$)
Поделиться с друзьями
-->

Комментарии (10)


  1. istui
    11.10.2016 19:10

    Для тех кто не в курсе — на каких условиях предоставляется CHR и какие кейсы его применения?


    1. GeXoGeN
      11.10.2016 19:21
      +1

      Есть 4 уровня лицензирования: free — имеет ограничение 1 мбит/с на каждый интерфейс, p1 — ограничение 1 гбит/с на интерфейс, p10 — 10 гбит/с на интерфейс, и p-unlimited — без ограничений. Других ограничений в рамках лицензии нет — любое количество туннелей и пользователей. Так же есть 60-дневный триал. P1 лицензия стоит 2260 рублей.
      Кейсы — например, в моём случае — это просто VPN сервер и тестовая площадка, можно использовать его в качестве шлюза, если у Вас виртуальные машины в одной сети находятся (никто же не заставляет вас его именно в облако устанавливать), можно как обычный x86 RouterOS использовать (на сколько я понимаю, от неё он отличается моделью лицензирования).


      1. vetash
        13.10.2016 20:23

        Насколько я понял можно обновлять триал столько раз сколько хочеться. Что говорят сами Mikrotik по этому поводу?


        1. GeXoGeN
          13.10.2016 20:24

          на MUM'е представители Mikrotik загадочно улыбались в ответ


  1. Kliba
    11.10.2016 20:24

    Насчет увеличения места на диске — а чем не устроил вариант описанный тут — http://forum.mikrotik.com/viewtopic.php?t=98981? ИМХО он проще несколько, чем описанное вами в статье.


    1. GeXoGeN
      11.10.2016 20:27
      +1

      Потому что в том варианте мы увеличиваем размер файла образа, файловая система и раздел sda2/vda2 остается размером 128 Мбайт. На VirtualBox, VMware при первой загрузке RouterOS растягивает раздел, занимая всё доступное свободное место. На DO этого по какой-то причине не происходит. Моя статья как раз о способе побороть это.


      1. Kliba
        11.10.2016 20:41

        ясно, спасибо.


  1. edinorog
    13.10.2016 03:40

    Не совсем понял одну вещь. Предположим я развернул лицензию на виртуалке. Виртуалка изволила сдохнуть. Является ли лицензия переносимой? Или идёт привязка к данной конкретной машине после Ее активации?


    1. GeXoGeN
      13.10.2016 07:12
      +1

      Лицензии переносимые. Перенос делается в три клика в личном кабинете на сайте микротика.


  1. vetash
    13.10.2016 23:59
    +2

    Кто будет юзать CHR на XEN — необходимо в конфиге жестко установить uuid иначе system id сгенерируется заново после перезагрузки DOMU и лицензия тоже слетит.
    Делается так:
    ```
    # 128-bit UUID for the domain as a hexadecimal number.
    # Use «uuidgen» to generate one if required.
    # The default behavior is to generate a new UUID each time the guest is started.
    #uuid = «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX»
    ```