OSBoy notes.

Записки обо всём...

Установка OpenWrt из Trunk

Несмотря на то, что рекомендуется устанавливать последние стабильные версии 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

Теги : openwrt, trunk, extroot, tp-link, tl-mr3020

Комментариев: 1

OSBoy
#Ответить
На ревизии r38636 extroot получилось сделать сходу, без всяких танцев с бубном. Однако, при установке некоторых модулей ядра всё ещё выскакивают ошибки.

Добавить комментарий

Отменить