Несмотря на то, что рекомендуется устанавливать последние стабильные версии OpenWrt, иногда бывает необходимо установить самую свежую версию, например, если мы хотим поэксперементировать, или стабильная версия нас чем-то не устраивает. Так, например, у меня получилось, что я установил OpenWrt на роутер, с целью — поэксперементировать с вэб-камерой и программой-датчиком движения motion. Однако, оказалось, что на стабильной версии, Attitude Adjustment 12.09, трансляция изображения с вэбкамеры почему то работает не стабильно — постоянно режет кадры, из-за чего смотреть трансляцию практически невозможно и motion постоянно даёт ложные срабатывания. Поэтому я решил опробовать свежую сборку прошивки. Об этом ниже.
В данной статье речь пойдёт о роутере TP-Link TL-MR3020.
Итак Trunk — это тестовая ветка, в которую практически ежедневно выкладываются самые свежие сборки прошивки (на момент написания статьи — это Barrier Breaker), однако их стабильность и работоспособность не гарантируется.
Сохранение репозитория
Прежде, чем преступить к установке, остановимся подробнее на одной очень важной особенности ветки trunk, которую необходимо иметь ввиду! А заключается она в том, что вместе со сборкой прошивки, которая обновляется едва ли не ежедневно, обновляется и репозиторий пакетов программного обеспечения для неё. Поэтому, установив сборку из trunk, мы рискуем буквально на следующий день остаться без совместимого с ней репозитория. Чтобы этого не произошло, НЕОБХОДИМО ВМЕСТЕ СО СБОРКОЙ САМОЙ ПРОШИВКИ СКАЧИВАТЬ И РЕПОЗИТОРИЙ ПАКЕТОВ К НЕЙ!
Репозиторий можно разместить либо на локальном носителе роутера, либо, если есть такая возможность — на удалённом вэб-сервере. Я для этого использовал вэб-сервер, запущенный на другом роутере, тоже под управлением OpenWrt.
Чтобы упростить процесс скачивания, я написал небольшой скрипт:
nano openwrt-trunk-download
#!/bin/sh
# Корневая директория вэбсервера,
# сюда будет скачиваться репозиторий:
DIR=/usr/local/openwrt-repository
# Получаем текущую дату, она нам понадобится
# для удобства хранения разных ревизий:
DATE=`date +%Y-%m-%d`
# Проверяем, существует ли заданная директория,
# если нет - то создаём её:
if [ -d $DIR ]
then :
else
mkdir -p $DIR
fi
# Переходим в директорию для закачки,
# с помощью wget, качаем репозиторий,
# после чего полученную поддиректорию trunk
# переименовываем в соответствии с текущей датой
# и перемещаемся в неё (в поддиректорию нашей архитектуры):
cd $DIR
wget -r -np -nH -R index.htm* http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/ && \
mv snapshots/trunk snapshots/$DATE && \
cd snapshots/$DATE/ar71xx
# Скачиваем файл с контрольными суммами
# и необходимые прошивки:
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/md5sums
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sysupgrade.bin
Сохраняем скрипт, делаем его исполняемым и переносим в подходящее место:
chmod 700 openwrt-trunk-download
mv openwrt-trunk-download /usr/bin
Если всё сделали правильно, то теперь мы можем скачать самую свежую сборку из trunk вместе с репозиторием одной командой:
openwrt-trunk-download
Дожидаемся, пока процесс скачивания завершится и убеждаемся, что всё на своих местах:
ls -l /usr/local/openwrt-repository/snapshots/2013-10-15/ar71xx/
Теперь можем скачивать и прошивать OpenWrt уже со своего собственного хранилища:
cd /tmp
wget http://openwrt.osboy.ru/snapshots/2013-10-15/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
mtd -r write openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin firmware
По окончанию процесса прошивки роутер перезагрузится.
В заключение установки редактируем файл конфигурации менеджера пакетов opkg:
vi /etc/opkg.conf
в котором указываем путь к нашему репозиторию:
src/gz barrier_breaker http://openwrt.osboy.ru/snapshots/2013-10-01/ar71xx/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
Настройка
Для возможности установки всех необходимых пакетов нам потребуется перенести корень (или /overlay) на внешний usb накопитель.
Для этого устанавливаем необходимые пакеты:
opkg update
opkg install block-mount kmod-usb-storage kmod-fs-ext4
Копируем систему (overlay) на флешку:
mkdir /mnt/sda1
mount -t ext4 /dev/sda1 /mnt/sda1
tar -C /overlay -cvf - . | tar -C /mnt/sda1 -xf -
umount /mnt/sda1
И настраиваем файл fstab. В версии Barrier Breaker используется новая утилита block, позволяющая создать файл fstab автоматически:
block detect > /etc/config/fstab
Затем открываем файл fstab:
vi /etc/config/fstab
и редактируем его в соответствии со своими потребностями:
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '0'
option check_fs '0'
config 'mount'
option target '/overlay'
option uuid 'a36c5633-7eb8-432e-81b0-d968329056eb'
option enabled '1'
Тут мы видим, что вместо опции device используется опция uuid для идентификации нашаго монтируемого раздела на внешнем накопителе. Чтобы узнать значение uuid нашего раздела, используем команду:
block info
/dev/mtdblock2: UUID="27fede08-b36a6342-a42fccf7-de0f76cf" VERSION="4.0" TYPE="squashfs"
/dev/mtdblock3: TYPE="jffs2"
/dev/sda1: UUID="f3e65211-1b89-41a4-a688-150012e51aed" NAME="EXT_JOURNAL" VERSION="1.0" TYPE="ext4"
Тут /dev/sda1 — единственный раздел, который я создал на флешке. Раздел подкачки (swap) в данном случае я не использую.
После перезагрузки проверяем, всё ли правильно примонтировалось:
df -h
Filesystem Size Used Available Use% Mounted on
rootfs 7.4G 67.7M 7.0G 1% /
/dev/root 1.8M 1.8M 0 100% /rom/rom
tmpfs 14.1M 52.0K 14.1M 0% /tmp
/dev/mtdblock3 1.1M 880.0K 208.0K 81% /rom/overlay
overlayfs:/overlay 1.1M 880.0K 208.0K 81% /rom
tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda1 7.4G 67.7M 7.0G 1% /overlay
overlayfs:/overlay 7.4G 67.7M 7.0G 1% /
Устранение проблем
По идее описанных выше действий должно быть достаточно для готовности системы к дальнейшему использованию. Однако, как уже говорилось выше, работоспособность ветки trunk не гарантирована и могут возникнуть некоторые проблемы.
Так, например, у меня на момент написания статьи, в ревизии r38261, выявилось следующее:
Во-первых, с ошибками устанавливаются модули ядра и не запускаются автоматически. Приходится вручную их запускать командой modprobe. Причём некоторые модули после этого автоматически загружаются после перезагрузки (kmod-usb-storage), а некоторые не хотят (kmod-video-uvc). Приходится прописывать их запуск в файле /etc/rc.local .
А во-вторых, раздел на флешке никак не хотел монтироваться в /overlay, то есть не получалось перенести систему на флешку (extroot). Причем, если указать точку монтирования например /mnt/sda1 — то всё нормально монтировалось. Погуглив эту тему, я выяснил, что далеко не один с такой проблемой и что в некоторых ревизиях эта проблема периодически всплывает. На форуме OpenWrt было найдено решение этой проблемы: при запуске системы нужно выполнить:
export PREINIT=1
mount_root
Первое, что пришло в голову — прописать эти строки в /etc/rc.local . И, о чудо! После перезагрузки флешка прекрасно примонтировалась в /overlay . Однако, такой «костыль» оказался не лучшим решением. Дело в том, что пользовательские команды из файла /etc/rc.local , а значит и перенос корня (/overlay) выполняются при старте системы чуть ли не самыми последними — после того, как уже выполнены стартовые скрипты из директории /etc/rc.d . Поэтому, например, настройки dropbear при старте системы читаются из файла /etc/config/dropbear , сохранённого не на флешке, а во встроенной памяти роутера. И даже команды в файл /etc/rc.local придётся прописывать опять же во встроенной памяти, что создаст неудобства: для изменения этих файлов каждый раз придётся извлекать флешку, загружаться, вносить изменения, и только потом вставлять обратно флешку и загружать уже систему с неё.
Чтобы избавить себя от этих неудобств, я убрал эти две строки из /etc/rc.local и создал стартовый скрипт:
vi /etc/init.d/extroot
следующего содержания:
#!/bin/sh /etc/rc.common
START=02
start() {
export PREINIT=1
mount_root
# extroot on boot
}
Файл сохраняем, делаем его исполняемым:
chmod +x /etc/init.d/extroot
И активируем его выполнение при запуске системы:
/etc/init.d/extroot enable
После перезагрузки получаем систему с полноценным рабочим extroot.
Полезные ссылки
Форум «Умный дом — Репозиторий OpenWrt и прошивки для роутеров TP-Link TL-MR3020, TL-WR703N
OpenWrt wiki — Fstab Configuration
OpenWrt forum — how to use the new block-mount ?
OpenWrt wiki — Init Scripts