понедельник, 21 октября 2013 г.

OpenWRT — сборка из исходников прошивки

Написал Денис Юрьев в 05.10.2013
Во-первых меня уже долгое время напрягал тот факт, что доступно уже давно ядро версии 3.*, а в dd-wrt для моего устройства (Dlink DIR-320) до сих пор ядро версии 2.4.
Во-вторых вытекает сразу из первого — кривая поддержка ntfs, до сих пор ничего не ясно с поддержкой ext4 ну и еще куча всего странного и непонятного
В-третьих недавно я Вам рассказал про модуль для ядра Linux — zRam, загорелся таким вот способом несколько решить проблему с нехваткой оперативной памяти в DD-WRT и как думаете что произошло? Конечно же, для DD-WRT этого модуля в принципе не существует.
UPD 05.10.2013: с момента написания статьи изменилась немного логика первых этапов сборки прошивки. Внес необходимые изменения, исправил недочеты.

Порывшись в инете я узнал, что в OpenWRT уже есть возможность использовать zRam, собрать прошивку для Dlink DIR320 с ядром третьей версии.
Возможно просто всё это не документировано касательно DD-WRT, но изобретать велосипед у меня времени особо нет. Воспользуюсь доступной в обилии на многих языках документацией по OpenWRT и соберу себе ту прошивку, которая нужна конкретно мне.

Сборка OpenWRT

Для сборки первым делом понадобится операционная система семейства Linux. В моем случае это Ubuntu Linux 13.04 64bit.

Подготовка к установке — получение исходных кодов OpenWRT и необходимых пакетов

Итак, приступим.
1. Устанавливаем Subversion
denis@denis-pc:~$ sudo apt-get install subversion
2. Так же в ходе получения исходников пакетов и патчей нам понадобится пакет git
denis@denis-pc:~$ sudo apt-get install git
3. Получаем исходники OpenWRT
Стабильная версия с версией ядра 2.6.*:
denis@denis-pc:~$ svn co svn://svn.openwrt.org/openwrt/branches/backfire openwrt
Стабильная версия с версией ядра 3.*
denis@denis-pc:~$ svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment openwrt
Тестовая версия:
denis@denis-pc:~$ svn co svn://svn.openwrt.org/openwrt/trunk/ openwrt
Я выбрал последний вариант, так как там доступен модуль zRam
Получив исходники, переходим в каталог, где они лежат:
cd ~/openwrt
4. Теперь надо еще получить пакеты и патчи, доступные для сборки:
./scripts/feeds update -a
./scripts/feeds install -a
5. Доустанавливаем необходимые для сборки пакеты. Для этого проверяем чего еще не хватает:
make prereq
Collecting package info: done
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
Checking 'working-g++'... failed.
Checking 'ncurses'... failed.
Checking 'zlib'... failed.
Checking 'gawk'... failed.
Checking 'unzip'... ok.
Checking 'bzip2'... ok.
Checking 'perl'... ok.
Checking '/usr/bin/python2.7'... ok.
Checking 'wget'... ok.
Checking 'git'... ok.
Checking 'gnutar'... ok.
Checking 'svn'... ok.
Checking 'gnu-find'... ok.
Checking 'getopt-extended'... ok.
Checking 'non-root'... ok.
В моем случае:
sudo apt-get install g++ libncurses5-dev zlib1g-dev gawk
Примечание: очень часто неопытные пользователи при компиляции не могут найти откуда устанавливать пакет ncurses (ncurses-devncurses-devel и т.д.), который требует команда make — решение проблемы в установке пакета libncurses5-dev
6. Если всё необходимое установлено, то мы увидим следующую картину:
конфигурирование пакетов и модулей ядра OpenWRT
Псевдографическое меню конфигурирование пакетов и модулей ядра прошивки OpenWRT
Примечание: в данном конфигураторе сборки прошивки используются стандартные для linux-систем условные обозначения:
< > — отключено
<M> — включено, компиляция модулем. (В случае OpenWRT — отдельным *.ipk — файлов, для доустановки после прошивки)
<*> — включено, пакет будет «запакован» в прошивку
Первым делом указываем тип процессора.
У DLink DIR-320 rev. A1 это Broadcom BCM5354KFBG, он же BCM95354
Итак открываем TargetSystem и там выбираем Broadcom BCM947xx/953xx.
Выбор типа процессора при сборке OpenWRT
Выбираем тип процессора при сборке OpenWRT — Broadcom BCM947xx/953xx
7. Компиляция пакетов для сборки прошивки.
Это пункт необязательный, но настаиваю на его выполнении.
Дело в том, что если вы пропустите сборку пакетов для компиляции прошивки OpenWRT, то она произойдет при первой компиляции самой прошивки.
Однако потом будет труднее выявить ошибку — что не хочет собираться, инструменты для компиляции или сама прошивка.
Внимание: чтобы потом не пересобирать эти инструменты — убедитесь, что в предыдущем пункте правильно выбрали тип процессора устройства.
make tools/install && make toolchain/install
Команда выполняется достаточно долго, есть время попить чай или прибраться в комнате:-D

Настройка пакетов и модулей ядра OpenWRT

Выполним команду:
make menuconfig
В итоге в терминале вы увидите снова псевдографическое меню для настройки сборки OpenWRT с уже выбранным процессором.
Теперь выбираем профиль Target Profile и там выбираем Broadcom SoC, b44 Ethernet, BCM43xx WiFi (b43, default) — это позволит сэкономить пару десятков килобайт в размере нашей будущей прошивки, исключив ненужные драйвера ethernet-контролеров.
сборка OpenWRT - выбор профиля
Выбираем профиль для нашего устройства DLink DIR-320 rev. A1/A2 — 
Broadcom SoC, b44 Ethernet, BCM43xx WiFi (b43, default)
Теперь подключаем модули ядра.
Для этого открываем пункт в главном меню Kernel modules
Выбор модулей для OpenWRT
Выбираем пункт Kernel Modules в главном меню конфигурации сборки прошивки OpenWRT
Для начала надо настроить модуль поддержки WiFi нашего устройства — kmod-b43
Для этого выбираем пункт Wireless Drivers
Настройка параметров драйверов wireless при сборке openwrt
Выбор пункта Wireless Drivers
В открывшемся меню отключаем ненужный в нашем случае модуль kmod-b43legacy и переходим к настройке модуля kmod-b43
настройка модуля kmod-b43
Отключаем модуль kmod-b43legancy и переходим к настройке модуля kmod-b43
Отключим ненужный функционал модуля kmod-b43, чтобы сэкономить несколько сотен килобайт, что позволит включить в прошивку веб-интерфейс.
Для этого выпоняем следующие действия:
Значение параметра Core revisions to include выставляем равным 13
Значение параметра PHY types to include выставляем равным LP
Отключаем пункты Enable support for PIO transfer modeEnable support for N-PHYs,Enable support for HT-PHYs.
В итоге должна получиться примерно следующая картина:
настройка kmod-b43 openwrt
Настройка модуля kmod-b43 для маршрутизатора DLink DIR-320 rev. A1/A2
Теперь выбираем раздел USB support для подключения поддержки USB-устройств
Выбор модулей ядра OpenWRT, отвечающих за поддержку USB-устройств
Выбираем раздел USB support для выбора модулей ядра OpenWRT, отвечающих за поддержку USB-устройств
Я буду подключать только внешний USB-диск, для этого я выбираю
kmod-usb-core — поддержка спецификации USB ядром
kmod-usb-brcm47xx — поддержка USB-устройств процессором маршрутизатора
kmod-usb2 — поддержка USB версии 2.0
kmod-ohci — поддержка USB-хабов
kmod-usb-storage — поддержка USB-дисков
Выбираем необходимые нам модули ядра OpenWRT
Выбираем необходимые нам модули ядра OpenWRT для поддержки USB-носителей
Подключим нужные нам модули поддержки файловых систем.
В списке категорий подключаемых модулей ядра выберем раздел Filesystems
OpenWRT подключение поддержки файловых систем
Подключение поддержки файловых систем в OpenWRT
И выберем модуль ядра kmod-fs-ext4. Этот модуль обеспечит поддержку файловых систем ext2ext3 и ext4. Его необходимо выбрать, если планируете устанавливатьSamba-сервер или торрент-клиент Transmission, ну или любые пакеты.
Так же, если вам критична поддержка других файловых систем, то вы можете выбратьkmod-fs-ntfs для поддержки NTFS или kmod-fs-vfat для поддержки файловой системыFAT32.
Включение поддержки ext2, ext3, ext4 в OpenWRT
Включение модуля ядра kmod-fs-ext4 для поддержки файловых систем ext2ext3 и ext4 вOpenWRT
Теперь настало время подключить поддержку zRam.
Напомню, этот модуль я хочу использовать для экономии оперативной памяти маршрутизатора путем монтирования в виртуальное сжатое блочное устройство раздела подкачки swap.
Для автоматизации этого процесса в OpenWRT уже есть готовый скрипт zram-swap. Включив его в состав прошивки вы автоматизируете весь этот процесс.
Для этого выбираем в главном меню конфигуратора прошивки пункт Base system
Подключение базовых элементов прошивки OpenWRT
Выбираем пункт Base system в главном меню конфигурации сборки прошивки OpenWRT
И в конце открывшегося списка отмечаем для установки zram-swap
Включаем в состав прошивки OpenWRT поддержку zRam и скрипт для монтирования раздела подкачки в zRam
Выбираем компонент zram-swap
Скорее всего это лишь частично решит проблему с нехваткой памяти, так что без раздела подкачки на внешнем устройстве нам не обойтись. Но для этого необходимо будет монтировать его с пониженным приоритетом, чтобы маршрутизатор старался использовать максимально swap в виртуальном устройстве zram
Для этого нам необходимо не забыть включить подключение раздела подкачки с указанием приоритета.
Там же в Base system ищем пакет busybox и выбираем его нажатием клавишей Enter:
OpenWRT - пакет busybox
Выбор пакета Busybox
Откроется конфигурация пакета busybox, котором выберем раздел Linux System Utilities
OpenWRT - linux system utilities
Выбираем категорию Linux System Utilities
и в нём включим поддержку swaponoff, а так же приоритет для разделов подкачкиSupport priority option -p
OpenWRT swapon swapoff
Включаем поддержку команд swapon и swapoff и приоритет разделов подкачки
Для удобного монтирования разделов на подключаемых носителях нам так же понадобится пакет block-mount, который можно включить в состав нашей будущей прошивки в всё том же разделе Base system
Включение пакета block-mount в состав прошивки openwrt
Включаем пакет block-mount в состав прошивки OpenWRT
Теперь остается подключить web-интерфейс LuCI. Сразу же скажу, что данный веб-интерфейс намного лучше продуман разработчиками, нежели веб-интерфейс DD-WRT.
Итак, возвращаемся в главное меню конфигуратора OpenWRT и выбираем пункт LuCI
Включение web-интерфейса LuCI в прошивку OpenWRT
Включаем web-интерфейса LuCI в прошивку OpenWRT
Выбираем первый пункт Collections и в открывшемся меню выбираем luci
luci в прошивке openwrt
luci в прошивке openwrtВключаем основную часть web-интерфейса LuCI в состав прошивки OpenWRT
Если Вы испытываете проблемы с английским языком, или же просто хотите видеть родной язык в Web-интерфейсе, тогда выбирайте пятый пункт в настройках пакета LuCI— Translations
Там вы сможете выбрать как русский (luci-i18n-russian), так и украинский (luci-i18n-ukrainian) языки
выбор русской локали в веб-интерфейсе openwrt
выбор русской локали в веб-интерфейсе openwrtДобавление русской локализации для веб-интерфейса LuCI
На этом конфигурацию прошивки можно закончить. Выходим из конфигуратора, соглашаемся с предложением сохранить новую конфигурацию.

Компиляция прошивки OpenWRT

Приступаем к самой сборке
make -j4 V=s
Параметр -j4 указывает во сколько потоков выполнять сборку для ускорения процесса. Укажите на один поток больше, чем количество ядер вашего процессора. Если же у вас процессор с поддержкой Hyper-threading, то укажите равное количеству виртуальных ядер (потоков).
Готовый файл прошивки будет носить имя openwrt-brcm47xx-squashfs.trx и найдете его в папке bin в каталоге с исходниками прошивки
Процесс компиляции исходников занимает, в зависимости от вычислительных способностей вашего компьютера, от 20 минут до нескольких часов.

Устанавливаем на DIR-320 прошивку OpenWRT

В итоге в каталоге с исходниками появится папка bin/brcm47xx (если вы собирали для маршрутизатора с процессором серии brcm47xx)
В папке будет куча готовых прошивок. Для DIR-320 файл прошивки называется openwrt-brcm47xx-squashfs.trx
Если Вы ранее не пользовались альтернативными прошивками и впервые будете прошивать своё устройство, то процесс точно такой же, как установка прошивки DD-WRT на DIR-320.
Если же у Вас уже установлена прошивка DD-WRT, то можете смело обновляться через веб-интерфейс, только не забудьте указать, что необходимо сбросить настройки на заводские.

Первый взгляд на OpenWRT

Как только все установится по адресу 192.168.1.1 будет доступен веб-интерфейсOpenWRT LuCI, который сразу же предложит установить пароль пользователю root. Указываем пароль, и перед нами во всей своей красе предстает веб-интерфейс. Вот небольшой его кусок.
Веб-интерфейс LuCI OpenWRT
Главная страница web-интерфейса LuCI прошивки OpenWRT
Как Вы можете заметить, файл подкачки в zram сразу же подхватился и его объем равен половине памяти устройства. Ну что ж, цель достигнута.

PS

Статью я эту писал параллельно с экспериментами не менее недели. Главной проблемой был ограниченный объем энергонезависимой памяти устройства и желание запихать необходимый минимум «инструментов» в те самые 3.69 Mb, доступные для прошивки. Моя прошивка в итоге имеет объем 3.63 Mb. И это еще при оставленной поддержки ipv6, выпиливать которую не так и сложно, но рассмотрю этот момент в следующей статье.
В следующих статьях рассмотрю возможности новой для меня прошивки и протестирую, дает ли пользу использование zRam.
Оставайтесь на связи.

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

Отправить комментарий