Воскресенье, 30.04.2017, 06:15
Вы вошли как
Приветствую Вас ГостьRSS
Меню
Категории раздела
Компиляция [2]
Инструкции по компиляции пакетов под плеер
Модификация прошивки [5]
Инструкции по модификации прошивки
Облако тегов
HDD playon!hd playonhd btpd 100 peers video 200 peers optware прошивка Realtek mipsel wifi rtorrent Firmware web Woxter i-Cube 750 ruTorrent Mede8er lighttpd digest Samba workgroup peers Port podware Compilation gcc Native hostname bmp bmp2rt felics rt2bmp ipkg ipkg-cl libexif libsigc++ Screen vsftpd transmission htop MC Nano rdate datasheet RTD1073
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа

Главная » Статьи » Продвинутые мануалы » Компиляция

Нативная компиляция на плеере. Репозиторий podware.
15.04.2010 Статья значительно переписана. Обновлен репозиторий.

Итак, почему не optware? Причин много, остановлюсь на самых главных:
- Оптварные пакеты собраны для процессоров класса MIPS32, а RTD1073 имеет ядро MIPS32 rel2. Разница не очень большая, но почему не использовать расширенные функции процессора, если они есть?
- Есть подозрение, что оптварные библиотеки собраны для процессоров с встроенным FPU. В реалтековских процессорах модуля обработки чисел с плавающей запятой нет.
- Библиотеки optware собраны с помощью GCC 4.1.1, а в нашем случае используется GCC 3.4.4 и библиотеки собраны с учетом специфики ядра. Очень бы хотелось использовать родные библиотеки плеера, но увы. Они собраны так "экономно", что все полезные функции в них заменены заглушками.
- В последних прошивках наблюдается тенденция к блокировке дополнительного софта. Корень системы защищен от любых попыток модификации. Мало того, что при смене прошивки нужно искать/делать "хакнутую" версию, так и еще необходимо полностью переустанавливать optware. podware предполагает наличие изменений только в 2-х файлах прошивки (/usr/local/etc/rcS и /usr/local/etc/profile), которые по умолчанию лежат в области, открытой для записи. Для восстановления работы podware нужно всего лишь сделать копию этих файлов перед сменой прошивки и вернуть их на место после.
- В podware предусмотрено использование дополнительного софта как на плеерах с встроенным HDD, так и с использованием внешних дисков.

Почему podware и откуда взялось это название?
Предыстория такова: в свое время один энтузиаст пытался создать программу для установки дополнительного софта на плеер. Он дал ей название PlugOnDevice. Этот проект и сейчас уществует в сети, но особого развития он не получил. Я пытался поучаствовать в этом проекте, однако не сошелся с автором во взглядах на общие тенденции. Однако, в результате обсуждения, в качестве названия папки для хранения дополнительного софта была выбрана папка pod. В дальнейшем мне было просто лень менять её название в конфигурационных файлах, и название сохранилось. podware, в том виде, как я его себе представляю - имеет структуру и организацию optware, за исключением особенностей, указанных выше.

Что же нужно для podware?

В первую очередь нужен жесткий диск, разбитый определенным образом. Как подключен этот диск к плееру - значения не имеет. Можно использовать внутренний диск, а можно и подключенный через USB (или eSATA).
Начну с описания разбивки внутреннего диска.
После форматирования плеером диск имеет следующую структуру:

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSEEEE
________________sda1________________sda2sda3


Ниже легенда:
NNNN - NTFS раздел, он занимает большую емкость диска. Нужен плееру, поэтому необходимо его сохранить, хотя бы 300-400 МБ. Этот раздел должен начинаться строго со 2-го цилиндра.
SSSS - SWAP раздел. Всего 160 МБ (20 цилиндров) для файла подкачки. Нужен обязательно, при желании можно сделать больше.
EEEE - EXT3 раздел. Это родная файловая система для линукса. Именно эта файловая система нам и нужна. Но выделенный плеером раздел не велик (160 МБ), нам этого не хватит.

Диск надо перебить так, что бы увеличился ext3 раздел:
NNNNSSSSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE (вар. 1)
sda1sda2________________sda3________________

или создать дополнительный ext3 раздел:
NNNNEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESSSSEEEE (вар. 2)
sda1______________sda4______________sda2sda3

В случае использования внешнего диска вместе с внутренним, внутренний перебивать не надо. Внешний диск может быть разбит как угодно, но присутствие раздела ext3 достаточного размера необходимо.

В случае, если в плеере нет диска, разбивка внешнего должна быть следующей:

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESSSS (вар. 3)
__________________sda1__________________sda2

Как переразбивать диск, уже было описано и обсуждено в статье Установка rtorrent

Следующим шагом будет создание рабочей папки. Ее полный путь /tmp/hdd/root/pod
В плеерах с внутренним диском путь /tmp/hdd/root указывает на корень ext3 раздела, в плеерах без него этот путь указывает на папку в RAM-диске. Соответственно, существует несколько вариантов создания рабочей папки (в зависимости от разметки диска).
Вар. 1: mkdir -m 777 /tmp/hdd/root/pod
Вар. 2: mkdir -m 777 /tmp/hdd/volumes/HDD2/pod && ln -s /tmp/hdd/volumes/HDD2/pod /tmp/hdd/root/pod
Вар. 3: mkdir -m 777 /tmp/usbmounts/sdxN/pod

Прим. Для варианта с внешним диском необходимо использование дополнительного скрипта внутри файла rcS для определения, как смонтировался внешний диск и создания линка на нужный путь. Кроме того, не забудьте в вариантах 2 и 3 предварительно перемонтировать нужный диск на запись (mount -o,remount, rw ...).


Теперь немного про память. В последних прошивках по умолчанию отключен swap. С одной стороны - свопирование процессов сильно замедляет общую производительность плеера, а с другой - для доп. софта оперативки все таки маловато. При использовании крупных ресурсопотребляющих программ (gcc) без свопирования может произойти критическая ошибка в каком нибудь процессе при вызове функций типа malloc. Как ни странно, при наитивной компиляции на плеере без свопирования, чаще всего выпадает в осадок процесс Dvdplayer ;)
Отсюда мысль: а не добавить ли в файл rcS команду вида swapon /dev/sda2 2>/dev/null    ?
Прим. При использовании внешнего диска имя устройства для свопирования не определено заранее, можно монтировать вручную или искать имя скриптом в rcS.

Изменения в файле rcS в плеере с внутренним HDD уже были описаны в статье Установка rtorrent. А для плееров без него скрипт должен быть чуть другой.

В качестве примера приведу окончание файла rcS с моего PlayOn!HD-mini. Общий смысл этого скрипта прост - после задержки на время монтирования дисков плеером производится поиск разделов ext3 и проверка наличия папки pod по полученным путям. Если таковая найдена - ищется swap, монтируется, создается линк на рабочую папку и запускаются стартовые скрипты podware.

Code
###_podware_section_1_begin
sleep 180
found=0
paths=$(cat /proc/mounts | grep ext3 | cut -d" " -f 2)
for i in $paths
do
  if [ -e $i/pod ] && [ -d $i/pod ]; then
    found=1
    podpath=$i
  fi
done
unset paths i
if [ $found=1 ]; then
  #swap search & activate
  swap=$(fdisk -l | grep swap | cut -d" " -f 1 | sed 1!d)
  if [ ! $swap = "" ]; then
    swapon $swap
  fi
  unset swap
  #podware activate
  mount -o remount,rw $podpath
  ln -s $podpath/pod /tmp/hdd/root/pod
  unset podpath
  #here init scripts starts
fi
unset found
###_podware_section_1_end

Прим. Время задержки следует установить индивидуально. Например, если к плееру подключено более 2,5 ТБ дискового объема через USB, задержка должна быть увеличена до 5 минут. Если используется внешний диск, подключенный через eSata - задержку можно уменьшать.

Следующим шагом предстоит настроить пути в файле /usr/local/etc/profile. В принципе, все описанные ниже операции делает скрипт автоматически, я просто опишу, что добавляется.

- в начало переменной окружения PATH добавляются пути на папки с исполняемыми файлами podware (/tmp/hdd/root/pod/sbin и /tmp/hdd/root/pod/bin)
- переменная HOME принимает значение /tmp/hdd/root/pod
Одним из принципиальных моментов является то, что не меняется домашняя директория для пользователя root в файле /usr/local/etc/passwd. Это связано с тем, что концепция podware предполагает "отключаемую" конфигурацию, т.е. если если диск с папкой pod отключен - на работу плеера это никак не должно повлиять. Однако, такой вариант накладывает определенные ограничения на использование некоторых программ, например busybox более свежей версии. Если есть желание - можно добавить нового пользователя из группы root с установленной домашней директорией и шеллом на новый busybox и работать под ним.

Далее рассмотрим концепцию построения репозитория. Эта концепция базируется на принципах optware. Иными словами, в сети создается сервер, на котором хранятся собранные пакеты и их описание. Пример можно посмотреть в родном репозитории optware

На данный момент мы решили организовать репозиторий на базе этого сайта. К сожалению, папка, где будут храниться собранные пакеты, недоступна для просмотра (специфика хостинга), но плеерам этого и не нужно. Кроме того, объем дискового пространства здесь весьма ограничен, впрочем, на первое время его хватит. Не исключено, что в последствии репозиторий может переехать на другой хостинг. В первое время репозиторий будет наполняться пакетами инструментального характера, что бы у пользователей появилась возможность собирать прикладные программы самостоятельно. Это позволит подключить дополнительные силы для наполнения репозитория.
PS. Сделали индекс репозитория отдельной страницей.

Основной программой для работы с репозиторием является ipkg (The Itsy Package Manager). Для установки этого пакета потребуется наличие в штатном софте плеера утилиты wget.

Итак, установка podware должна начинаться со следующих команд в telnet-сессии:

Code
PlayonHD login: root
warning: cannot change to home directory


BusyBox v1.1.3 (2009.12.18-04:22+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # cd /tmp
/tmp # wget http://playonhd.ucoz.ru/stable/pod-install
Connecting to playonhd.ucoz.ru[195.216.243.37]:80
pod-install          100% |******************************|   403       00:00 ETA
/tmp # chmod +x pod-install
/tmp # ./pod-install
Connecting to playonhd.ucoz.ru[195.216.243.37]:80
ipkg.conf            100% |******************************|   203       00:00 ETA
Connecting to playonhd.ucoz.ru[195.216.243.37]:80
ipkg-cl              100% |******************************|   537 KB    00:00 ETA
Downloading http://playonhd.ucoz.ru/stable/Packages.gz
Inflating http://playonhd.ucoz.ru/stable/Packages.gz
Updated list of available packages in /tmp/hdd/root/pod/lib/ipkg/lists/podware
Successfully terminated.
Installing ipkg-pod (0.99.163-1) to /tmp/hdd/root/pod/...
Downloading http://playonhd.ucoz.ru/stable/ipkg-pod_0.99.163-1_mipsel.ipk
Installing uclibc-pod (0.9.28-1) to /tmp/hdd/root/pod/...
Downloading http://playonhd.ucoz.ru/stable/uclibc-pod_0.9.28-1_mipsel.ipk
Configuring ipkg-pod
Configuring uclibc-pod
Successfully terminated.
/tmp # exit

Окно телнета закроется.

На этом установка uClibc и ipkg завершена. Теперь можно коннектиться снова использовать команды:
ipkg list                 - список пакетов в репозитории
ipkg list_installed       - список установленных пакетов
ipkg update               - обновление списка пакетов, размещенных в репозитории
ipkg upgrade              - автоматическое обновление пакетов до новых версий
ipkg install <имя_пакета> - скачивание и установка пакета
ipkg remove <имя_пакета>  - удаление пакета
ipkg                      - если нужны другие варианты ;)

 
Прим. Пакеты uclibc-pod и ipkg-pod устанавливать не нужно. Они ставятся автоматически.
   
Вот тут может возникнуть справедливый вопрос: А как же программы podware будут выбирать, какую использовать библиотеку, если их 2? Вот тут есть маленькая хитрость. В каждом исполняемом файле линукса есть специальное поле, в котором указываются пути для поиска динамических библиотек. Специально собранный пакет GCC имеет встроенные ключи для построения исполняемых файлов и заботится об этом не надо. Вот как выглядит исполняемый файл podware в дизассеммблере IDA Pro:

Code
# File Name   : C:\PlayOnHD\gawk
# Format      : ELF (Executable)
# Imagebase   : 400000
# Interpreter '/tmp/hdd/root/pod/lib/ld-uClibc.so.0'
# Needed Library 'libdl.so.0'
# Needed Library 'libm.so.0'
# Needed Library 'libgcc_s.so.1'
# Needed Library 'libc.so.0'
# Library Search Path '/tmp/hdd/root/pod/lib'
#
# Options     : --opsex
# Options     : -fPIC
# Options     : -fCPIC
# Options     : --mips32r2
# Options     : --o32

Ну, и в заключении несколько советов по сборке.

- Распаковывайте исходники вне папки pod. Например, можно создать папку src на том же уровне и распаковывать сорцы туда.

- Не забывайте перед началом сборки установить текущее время через меню плеера или командой date

- Установите размер экранного буфера PyTTY в 2000 строк. Зачем так много? Если будут сыпаться ошибки - и этого может не хватить ;)

- Обязательно начинайте сборку с команды ./configure --help Внимательно просмотрите доступные ключи.

- Если не надо применять дополнительных ключей, обязательная часть часть команды конфигурации должна быть:

Code
./configure --prefix=$HOME

- Не плодите папки man и info. Если путь для этих папок отличен от $PREFIX/share - используйте ключи --mandir=$HOME/share/man и --infodir=$HOME/share/info

- Если в настройках конфигуратора ключ --with-gnu-ld стоит по умолчанию отключенным (default=no), его надо добавить, как как линкер у нас GNU.

- Если в настройках конфигуратора есть ключ --with-PACKAGE - добавляйте смело, результаты тестов лучше будут.

- Общий порядок сборки обычно такой:
Code
./configure ...
make
make check
make install-strip
или make install
 
- Если решили изменить конфигурацию сборки, предварительно выполняйте команду make distclean

Вопросы и ответы
В: Почему в репозитории так мало пакетов?
О: Москва не сразу строилась... ;) В первую очередь репозиторий будет наполняться инструментами, но дойдет время и до прикладных программ. Есть опыт сборки? Присоединяйтесь!

В: Почему структура построения пакетов не всегда соответствует оптварной?
О: В первую очередь это связано с особенностями данного хостинга. Объемные пакеты приходится разбивать на части, если они превышают 20 МБ.

В: Почему версии пакетов не всегда соответствуют оптварным?
О: В первую очередь, делается попытка собрать последнюю стабильную версию софта. Если это получается и успешно проходят тесты - пакет выкладывается в репозиторий. В противном случае берется версия пакета, такая же, как в optware. Пользуясь случаем, выражаю свою благодарность коллективу, работающему над optware, ибо все основные принципы построения пакетов и их зависимостей "подсмотрены" у них.

В: Почему размеры пакетов podware в большинстве случаев больше аналогичных пакетов optware?
О: Размеры пакетов действительно больше, поскольку в пакет упаковывается весь комплект документации, а в некоторых случаях и статически собранные библиотеки. Однако, размеры исполняемых файлов podware меньше (процессор MIPS32 rel2 имеет набор дополнительных директив, которые уменьшают размер кода). А в некоторых случаях бывает наоборот, когда отсутствуют необходимые функции в библиотеках, они включаются в исполняемые файлы, увеличивая их размер.

В: В пакете XXX не работает функция YYY
О: Ну что ж... От ошибок никто не застрахован. Пишите, будем думать, как исправить...

В:
Я пытаюсь собрать пакет XXX. Куча ошибок и нечего не выходит. Что делать?
О: Сборка чужого софта - всегда танцы с бубном. На некоторые вопросы сможет ответить поиск по интернету, а некоторые сможет победить только коллективный разум. Пишите...

В: Сборка прошла удачно. А как определить, что нужно положить в пакет *.ipk и как его собрать?
О: Утилита для компоновки пакетов работает под Python, у нас пока он не собран. В данный момент все пакеты переносятся на большую линуксовую машину и компонуются там. Я например, делаю следующим образом:
- перед командой make install(-strip) выполняю команду ls -R $HOME >before , а после ls -R $HOME >after  Сравнение двух полученных файлов файлов дает информацию о составе будущего пакета. Кроме того, всегда можно посмотреть аналогичный пример в репозитории optware.

В: Как выложить свой пакет в репозиторий?
О: Свяжитесь со мной через личку на этом сайте или в конференции playon!hd@conference.jabber.ru
Категория: Компиляция | Добавил: Lossless (10.03.2010)
Просмотров: 11650 | Комментарии: 12 | Теги: podware, Native, Compilation, playon!hd, gcc | Рейтинг: 2.0/1
Всего комментариев: 12
12  
плеер ACR-PV72100TV - Playon!DVRTV, прошивка v.6.2.1262UO(v.905).
можно ли на него поставить данные пакеты? или какие другие?
есть ли какие нюансы?

11  
Несмотря на то что сайт посвящен плеерам PlayOnHD, все отлично подходит и к моему Ellion. Быть может есть смысл сменить название на более широко объемлющее, чтобы привлечь больше публики wink . Хотелось бы еще подробней рассмотреть ситуацию выключения плеера с пульта: что происходит с процессами при этом? Если со штатными ничего не происходит, то как будут реагировать вновь установленные с podware?

10  
Пожалуйста напишите подробно как зделать так, что бы установленный transmission запускался каждый раз при запуске плеера. Заранее спасибо!

8  
Уважаемый Lossless,
Пожалуйста, опишите, как должен выглядеть конец файла rcS на плеере с внутренним hdd. И нужны ли дополнительные стартовые скрипты, наподобие starter для оптварного rtorrent.
Папку pod создал в /tmp/hdd/root/

Думаю, это будет полезно не только мне, но и остальным не продвинутым юзерам.


9  
Обязательно, но чуть позже (счас небольшой цейтнот). А что касается стартовых скриптов - они создаются и запускаются в никсах по определенным правилам и очень не хочется их нарушать... Пока могу только посоветовать просмотреть содержимое папки /etc/init.d на плеере или в прошивке. Там есть ответы на многие вопросы

6  
необходимо полностью переустанавливать optware. podware предполагает наличие изменений только в 2-х файлах прошивки (/usr/local/etc/rcS и /usr/local/etc/profile), которые по умолчанию лежат в области, открытой для записи. Для восстановления работы podware нужно всего лишь сделать копию этих файлов перед сменой прошивки и вернуть их на место после.
Не согласен с этим высказыванием. Здесь принципиальных отличий opt от pod нет. Все работает аналогично. Нужно создать линк на папку и восстановить файлы конфигураций. http://forum.iconbit.ru/viewtopic.php?f=40&t=2585&sid=5b550c9ce96927cfba343000d11f8a99&start=310#p46815

Идея отличная! Очень рад!


7  
Увы, как я уже писал, для установки optware нужен доступный для записи корень. На всех родных последних прошивках там просто нет места:
Code
mount -o,remount,rw /
ln -s /tmp/hdd/root/opt opt
- не пройдет sad
Основная идея этого проекта - использование немодифицированных прошивок

5  
Статья переписана. Репозиторий перезалит. Если устанавливали podware до 15 апреля 2010 года - удалите содержимое папки pod и проинсталлируйте заново

3  
Здравствуйте, Lossless!
Принципиально ли использование для этих целей именно жесткого диска.
Мне удалось разбить вашим способом USB Flash, смонтировать ее и
добиться необходимой структуры каталогов.
Как Вы думаете, имеет смысл приступать к установке ipkg?
С уважением, ura.

4  
Вообще, флешь память имеет ограничения по скорости записи и кол-ву перезаписей. Данный проект ставит целью экономию аппаратных ресурсов плеера, из которых самый уязвимым звеном является впаянная на плату микросхема флешь памяти. Если флешка достаточного размера, скорострельная и есть возможность менять ее раз в год - почему бы и нет? wink

2  
Lossless, ты проделал очень-очень большую и кропотливую работу, оценить которую сейчас по-настоящему смогут единицы. Заложил фундамент альтернативного развития POHD. После появления прикладных программ (стабильных и шустрых torrent-клиентов и др.) плодами твоего труда смогут воспользоваться все владельцы железок на чипе Realtek.
Снимаю шляпу. Молодец.

1  
Сделали индекс репозитория отдельной страницей. По мере обновления репозитория будем вносить изменения туда + в комментах будут последние логи.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]