Решил я затестить, каково это — OpenWRT на x86 архитектуре, т.к. Линукс под рукой время от времени бывает нужен — для всяких экспериментов, ну или, хотя бы, флешку отформатировать для роутера… Раньше я для этого использовал ноут с ArchLinux-ом. Но ноут у меня накрылся, да и Arch я разлюбил, после того как он на systemd перешёл… как то лень его фактически с нуля по новой осваивать! Зато для этих целей прекрасно подойдёт виртуалка с уже полюбившимся мне OpenWRT!
Подготовка ПО
Качаем последнюю стабильную версию VirtualBox (на момент написания статьи — 5.0.6) и соответствующую версию Extension Pack для него. Устанавливаем VirtualBox и Extension Pack. В моём случае — на компьютере установлена Windows 7 64bit — она и будет использоваться как Хост-ОС.
Качаем образ OpenWRT. Тут выбираем нужный релиз, затем архитектуру x86 (либо x86/64, как я сделал в данном случае) и, наконец, нужный образ (в данном случае — openwrt-15.05-x86-64-combined-ext4.img.gz). Если есть готовый образ для VirtualBox (.vdi) — скачиваем его. Если же доступен только raw образ (.img.gz), то его потребуется переконвертировать в совместимый с VirtualBox формат. Для этого воспользуемся встроенным в VirtualBox конвертором. В папке с установленной VirtualBox создаём текстовый файл с расширением .bat или .cmd следующего содержания:
"%~dp0VBoxManage.exe" convertfromraw --format VDI %1 "%~dpn1.vdi"
pause
Затем распаковываем образ из скачанного архива и перетаскиваем его на созданный ранее скрипт. Полученный .vdi образ можно подключать к Виртуальной машине.
Создание виртуальной машины (ВМ)
Запускаем VirtualBox и жмём «Создать». Задаём имя, тип и версию гостевой системы:
На этапе подключения жёсткого диска выбираем «Использовать существующий виртуальный жёсткий диск» и подключаем наш .vdi образ с OpenWRT:
Затем Выбираем созданную ВМ и жмём «Настроить». На вкладке «Сеть» настраиваем сетевой интерфейс для связи ВМ с внешним миром. Мой хост-компьютер подключен к домашней сети и интернет через роутер. Поэтому удобнее всего для ВМ будет использовать тип подключения «Сетевой мост». Таким образом ВМ будет выглядеть в сети как отдельное устройство: будет иметь возможность общаться с другими устройствами в домашней сети (включая хост-компьютер), выходить в интернет, получать от роутера IP адрес по DHCP и т.д. :
Здесь «Realtek PCIe GBE Family Controller» — это физический интерфейс хост-машины, подключенный к роутеру, через который будет организован «сетевой мост».
На вкладке «COM-порты» нужно обязательно поставить галочку «Включить последовательный порт», иначе OpenWRT не сможет запуститься:
Запуск ВМ и настройка сети
Запускаем созданную виртуальную машину. После окончания процесса загрузки нажимаем Enter — станет доступна консоль OpenWRT:
Создаём пароль для root:
passwd
По умолчанию OpenWRT использует на lan интерфейсе статический адрес 192.168.1.1 . Чтобы настроить ВМ для работы в нашей домашней сети, редактируем конфиг:
vi /etc/config/network
Так как в моей домашней сети устройства получают адреса от роутера по DHCP, приводим конфиг примерно к такому виду:
config interface loopback
option ifname lo
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
config interface lan
option ifname eth0
option proto dhcp
Применяем настройки сети:
/etc/init.d/network reload
Чтобы ВМ получала от роутера фиксированный IP адрес, добавляем MAC-адрес виртуального адаптера в список постоянных аренд в настройках DHCP сервера на роутере и присваиваем ему нужный IP.
Также отмечу, что я в настройках ВМ включил два сетевых интерфейса: один — для связи с домашней сетью и интернетом, второй — для других целей. Оба — в режиме сетевого моста. OpenWRT по умолчанию определила первый интерфейс (eth0) как lan со статическим адресом 192.168.1.1, второй (eth1) — как wan с получением адреса по DHCP. Таким образом доступ из виртуалки в домашнюю сеть и интернет получился сразу «из коробки». Однако, по умолчанию фаервол OpenWRT запрещает подключение к ней по SSH и к вэб-интерфейсу по http «извне» — то есть через wan интерфейс. Но так как виртуалка будет находиться в моей домашней сети, я просто переназначил интерфейсы lan и wan для удобства работы:
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'option netmask '255.0.0.0'
config interface 'wan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.1.10'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'lan'
option ifname 'eth1'
option proto 'dhcp'
В VirtualBox версии 5.0.4 у меня наблюдался такой баг: виртуальные (гостевые) машины видели по сети роутер, друг друга, выходили в интернет, НО не видели хост-машину, так же как и хост-машина не видела гостевые! Баг вылечился обновлением VirtualBox до версии 5.0.6.
Ну и теперь, когда у нашей ВМ есть выход в интернет, можно устанавливать все необходимые пакеты, например:
opkg update
opkg install nano mc
В скачанном образе OpenWRT корневой раздел размером около 48мБ. Этого вполне достаточно для установки пакетов первой необходимости и выполнения многих задач. Однако, если нам этого недостаточно, то увеличим виртуальный жёсткий диск.
Расширение дискового пространства
Для изменения размера виртуальных жёстких дисков в VirtualBox есть специальный инструмент и, в принципе, можно воспользоваться им. Но я сделал иначе.
В настройках виртуальной машины подключим ещё один виртуальный жёсткий диск. Выбираем «Создать новый диск», затем задаём его название, выбираем нужный размер и формат хранения:
Загружаем нашу виртуалку и проверяем, что система увидела второй диск:
ls -la /dev | grep sd
brw-r--r-- 1 root root 8, 0 Oct 8 20:22 sda
brw-r--r-- 1 root root 8, 1 Oct 8 20:22 sda1
brw-r--r-- 1 root root 8, 2 Oct 8 20:22 sda2
brw-r--r-- 1 root root 8, 1 Oct 8 20:22 sdb
Видим, что второй диск определился как /dev/sdb . Теперь просто копируем первый диск на него утилитой dd:
dd if=/dev/sda of=/dev/sdb
Останавливаем ВМ, удаляем из неё первый диск и грузимся со второго, оставшегося (теперь он уже станет /dev/sda). Можем убедиться, что диск у нас теперь стал действительно такого размера, какой мы задали, например утилитой cfdisk:
cfdisk /dev/sda
Однако видим, что наш корневой раздел sda2 так и остался размером 48мБ, а остальное место на диске осталось неразмеченным. Поэтому качаем LiveCD с утилитой GParted, подключаем его к виртуальному CD-приводу нашей машины, и загружаем с него виртуалку. Ну а дальше — дело техники: запускаем GParted, выбираем раздел /dev/sda2 и растягиваем его на всё неразмеченное пространство диска. В конце жмём «применить» («Apply»), и выключаем машину. Вот и всё, теперь можно извлечь образ из виртуального CD-привода и снова загрузить виртуалку с жесткого диска. Проверяем результат:
df -h
Filesystem Size Used Available Use% Mounted on
rootfs 7.9G 13.7M 7.9G 0% /
/dev/root 7.9G 13.7M 7.9G 0% /
tmpfs 122.6M 52.0K 122.6M 0% /tmp
tmpfs 512.0K 0 512.0K 0% /dev