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
|