С этой записи я хочу начать цикл статей об OpenWrt, в котором попытаюсь законспектировать основные этапы её установки и настройки, а так же подробнее остановиться на решении некоторых конкретных задач с помощью роутера под управлением OpenWrt. Сразу оговорюсь, что некоторые элементарные вещи я буду опускать, поэтому статья рассчитана на более-менее подготовленного читателя, который, по крайней мере, имеет представление, что вообще такое OpenWrt и Linux. Для получения более подробной информации об OpenWrt стоит обратиться к OpenWrt Wiki.
OpenWrt поддерживает довольно внушительный список устройств, в данной же статье речь пойдёт о роутере TP-Link TL-MR3020.
Установка OpenWrt
Для начала, нужно убедиться в том, что наше устройство поддерживается OpenWrt, и выбрать подходящую версию прошивки. Поначалу мне было не совсем просто разобраться в многообразии версий, но потом, покопавшись в wiki и разделе загрузок, стало ясно, что вариантов не так уж и много. Если вкратце: в загрузках нужно выбрать одну из веток: 10.03 «Backfire», 12.09 «Attitude Adjustment», либо Barrier Breaker (trunk), выбрать архитектуру своего роутера, и затем прошивку для своей модели.
Backfire — наиболее старая из основных версий;
Attitude Adjustment — более новая и продвинутая, на более свежей версии ядра;
Barrier Breaker — на момент написания статьи ещё в разработке, нестабильная, она находится в тестовой ветке (trunk) и практически ежедневно обновляется, то есть фактически это самая свежая сборка, но работоспособность её не гарантирована.
Для моего роутера оптимальным вариантом для решения большинства задач будет стабильная и проверенная версия Attitude Adjustment. Качаем её отсюда и прошиваем ей роутер. Процесс прошивки ничем не отличается от прошивки фирменного ПО роутера через вэб-интерфейс (есть и другие способы прошивки, тут они не рассматриваются; для других устройств процесс прошивки может отличаться).
ВНИМАНИЕ! Поверх фирменного ПО роутера можно прошивать только версии factory! Версии sysupgrade шить нельзя!
Итак, указываем в вэб-интерфейсе ранее скачанный файл прошивки и запускаем процесс. Через несколько минут роутер перезагрузится, после чего можем зайти на него по адресу: 192.168.1.1 через вэб-интерфейс (luci) либо по telnet. Доступа к устройству по ssh изначально нет — он появится после того, как мы зададим пароль для root:
root@OpenWrt:~# passwd
Далее нужно настроить доступ в интернет — для возможности установить необходимые пакеты ПО через встроенный в OpenWrt менеджер пакетов opkg:
vi /etc/config/network
У меня TP-Link TL-MR3020 не используется, как, собственно, роутер. Он подключен к домашней сети и к интернету через другой, основной роутер и получает IP адрес по dhcp (жестко привязанный к MAC-адресу), поэтому меняем соответствующим образом настройки сетевого интерфейса:
config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'dhcp'
Перенос корня на USB накопитель (Extroot)
Так как встроенная память роутера, доступная для установки пакетов, нещадно мала, нам потребуется сразу же перенести систему на внешний USB флеш- или жесткий диск. Для этого устанавливаем необходимые модули ядра:
opkg update
opkg install block-mount kmod-usb-storage kmod-fs-ext4
Остальные необходимые пакеты установятся по зависимостям.
Затем подготовим раздел на внешнем USB-накопителе (или несколько разделов, в соответствии с нашими потребностями). Если позволяет свободное место в памяти роутера, то можно установить необходимые утилиты для работы с файловыми системами:
opkg install cfdisk e2fsprogs
Или же можно разметить диск любым доступным способом, например на компьютере с ОС Linux.
mkfs.ext4 /dev/sda1
В данном случае я использую 8Гб флешку, на которой создал всего один раздел ext4. От раздела подкачки (swap) я решил отказаться ввиду сильно ограниченного количества циклов перезаписи флеш-накопителей.
Подключаем флешку к роутеру и проверяем, что она определилась системой:
ls /dev | grep sd
sda
sda1
Есть два варианта переноса системы на внешний носитель: перенос собственно корня, либо перенос каталога /overlay , в котором сохраняются все изменения относительно базового образа системы, который хранится в памяти устройства в режиме только для чтения. Я пробовал оба варианта — оба нормально работают, но в итоге остановился на втором, т.е. перенос /overlay .
Копируем /overlay на флешку:
mkdir /mnt/sda1
mount -t ext4 /dev/sda1 /mnt/sda1
tar -C /overlay -cvf - . | tar -C /mnt/sda1 -xf -
umount /mnt/sda1
После этого правим файл /etc/config/fstab для загрузки с флешки:
vi /etc/config/fstab
Приводим его примерно к такому виду:
config global automount
option from_fstab 1
option anon_mount 0
config global autoswap
option from_fstab 0
option anon_swap 0
config mount
option target /overlay
option device /dev/sda1
option fstype ext4
option options rw,sync
option enabled 1
option enabled_fsck 0
# config swap
# option device /dev/sda2
# option enabled 1
В разных версиях OpenWrt формат файла fstab немного отличается.
Когда всё готово, сохраняем изменения и перезагружаем роутер.
Теперь можно проверить, что у нас получилось:
df -h
Filesystem Size Used Available Use% Mounted on
rootfs 7.7G 245.2M 7.0G 3% /
/dev/root 2.0M 2.0M 0 100% /rom
tmpfs 14.3M 76.0K 14.2M 1% /tmp
tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda1 7.7G 245.2M 7.0G 3% /overlay
overlayfs:/overlay 7.7G 245.2M 7.0G 3% /
Видим, что раздел /dev/sda1 на нашей флешке удачно примонтировался в /overlay , и теперь нам доступно почти 8Гб свободного места!
Теперь можно смело доустанавливать все необходимые нам пакеты.
Русифицируем веб-интерфейс (Luci):
opkg update
opkg install luci-i18n-russian
Устанавливам остальные необходимые нам пакеты:
opkg install nano mc
Если в процессе настройки что-то пошло не так, например, при попытке установить какой либо пакет, заняли всё свободное место в памяти роутера и теперь не получается его освободить, то можно восстановить системные настройки по умолчанию командой:
mtd -r erase rootfs_data
По окончанию сброса настроек роутер перезагрузится. После этого можно начинать настройку заново.
Полезные ссылки
OpenWrt wiki — Supported Devices
OpenWrt wiki — TP-Link TL-MR3020
OpenWrt wiki — Rootfs on External Storage (extroot)
OpenWrt wiki — Fstab Configuration