Файл прошивки для плеера имеет имя install.img. Этот файл мы помещаем на USB-флеш-накопитель (в просторечии — флешку), чтобы перепрошить (т.е., заменить прошивку) плеера.
Что собой представляет файл install.img? Несмотря на «мультимедийное» расширение (img -> image -> образ, изображение) — это всего лишь пакет файлов, собранный в один файл с помощью программы TAR без сжатия.
Радикальное отличие TAR от архиваторов, работающих под Windows — сохранение в пакет (и, соответственно, распаковка из него) не только самих файлов, но также и прав доступа на них для пользователей и групп, а также информации о владельцах.
Поэтому (а также по ряду других причин) все операции по разборке и сборке прошивок необходимо выполнять на компьютере под управлением UNIX-подобной операционной системы — например, любой операционной системы Linux. В наше время наиболее доступная и дружественная для пользователя операционная система этого ряда — Ubuntu.
Ubuntu можно поставить на компьютер с Windows по методике WUBI (Windows Based Ubuntu Installer) — и вы сможете попеременно загружаться то в Windows, то в Ubuntu — при этом не понадобиться делать никаких операций по созданию и изменению разделов жесткого диска. Ну, еще можно Ubuntu поставить на виртуальную машину. Непременное условие — ставьте 32-битную версию.
Итак:
Создаем на диске нашей Ubuntu-машины какую-нибудь папку, где будет происходить весь процесс разборки-переделки-сборки прошивки.
Допустим, это будет папка
~/src/player
(символом ~ обозначают для краткости домашнюю папку пользователя — на самом деле домашняя папка может быть такой: /home/<логин>)
Помещаем в эту папку файл прошивки install.img.
Создаем подпапку для распакованной прошивки. В моем примере назовем ее unpacked
Последующие операции настоятельно рекомендуется выполнять в терминале. Запускаем терминал и вводим команду:
cd ~/src/player
Распаковываем прошивку в папку ~/src/player/unpacked
tar -xf install.img -C unpacked
Переходим в папку с распакованной прошивкой и просматриваем файл configuration.xml — он нам многое может рассказать.
Например, вот такая секция
<image type=»squash»>
<fileName>package2/squashfs1.img</fileName>
<mountPoint>/</mountPoint>
</image>
говорит нам о том, что корневая папка (/) и ее подпапки будут представлять собой файловую систему SQUASHFS, имеющую как большое преимущество (хорошая степень сжатия — на 1 мегабайте физического пространства можно разместить несколько мегабайт логической информации), так и большой недостаток (запись — то есть, создание и изменение файлов и папок — невозможны).
Кроме того, мы узнаем, где находится образ файловой системы, и как он называется — в нашем случае package2/squashfs1.img
В других прошивках (в особенности, старых версий) для корня может использоваться другая файловая система — YAFFS2. Эта файловая система допускает запись, но не обладает способностью сжимать данные — поэтому много файлов в нее не поместить.
Если вам попалась такая прошивка, то соответствующая секция файла configuration.xml может выглядеть так:
<image type=»yaffs2″>
<fileName>package2/yaffs2_1.img</fileName>
<sizeBytesMin>0x9600000</sizeBytesMin>
<mountPoint>/</mountPoint>
</image>
Обратите внимание на параметр sizeBytesMin — он определяет физический размер места на внутренней флеш-памяти, которое займет структура папок и файлов. Соответственно, разница между этой величиной и суммарным объемом файлов будет тем «свободным пространством», которое может быть использовано для добавления папок и файлов при работающем плеере. Для файловой системы SQUASHFS этот параметр не указывается, поскольку не имеет смысла — ведь эта файловая система не позволяет изменять свой состав.
Размер указывается в байтах. Если перед значением указано 0x, то это шестнадцатиричное значение, если не указано — то десятичное.
Если будете по какой-то причине изменять этот параметр, и ваше получившееся значение в шестнадцатиричном виде будет содержать буквы, то эти буквы следует обязательно писать в верхнем регистре: A,B,C,D,E,F — но не a,b,c,d,e,f. Иначе будет ошибка при прошивании.
Следующая интересующая нас секция:
<image type=»yaffs2″>
<fileName>package2/usr.local.etc.tar.bz2</fileName>
<mountPoint>/usr/local/etc</mountPoint>
<sizeBytesMin>41943040</sizeBytesMin>
</image>
Здесь описана часть иерархии папок и файлов, которая прошивается в плеер отдельно от основной структуры — в следующую очередь. Это — папка /usr/local/etc и ее дочерние папки и файлы.
Образ представляет собой пакет TAR с компрессией bz2.
Таким образом, даже если основная структура папок и файлов находится на файловой системе «только для чтения», часть структуры доступна для изменения.
При прошивке сначала прошивается основная структура, а затем к ней добавляется вот эта дополнительная структура — папка /usr/local/etc. И эта папка замещает собой одноименную папку основного образа.
Другими словами, делаем вывод — все изменения файловой структуры, которые мы хотим внести в прошивку в пределах папки /usr/local/etc, следует выполнять там, куда мы распакуем не основной образ, а дополнительный.
Теперь можно приступать к распаковке основного и дополнительного образов.
Для этого нам понадобится набор соответствующих утилит, которых нет в установленной Ubuntu. Вернее, утилиты для работы с SQUASHFS можно установить из репозитория:
sudo apt-get install squashfs-tools
но они будут слишком современной версии, и образ, собранный с их помощью, при перепрошивке выдаст ошибку.
Нам понадобятся сквош-утилиты версии 3.0.
Их можно скачать с нашего сервера здесь. Пакет содержит два исполняемых файла — поместите их в папку /usr/local/bin вашего компьютера с Ubuntu.
Итак, приступаем к распаковке основного образа прошивки.
Для этого переходим в папку, где лежит файл squashfs1.img, и даем команду:
unsquashfs squashfs1.img
В результате мы должны получить подпапку squashfs-root, а в ней — корень файловой системы плеера — подпапки bin, etc, usr, lib и другие.
Теперь можно приступать к переделке прошивки.
Но сначала давайте учтем то, что было сказано выше по поводу папки /usr/local/etc. Как мы помним, эта папка «стоит особняком» и монтируется в файловой системе отдельно от «основы».
Давайте для начала увидим всю файловую систему плеера такой, какой она должна быть после прошивки.
мы видим, что папка /usr/local/etc в распакованной структуре файловой системы имеется. Но любые изменения, внесенные в нее, после сборки образа и перепрошивки фактически учтены не будут, ибо, ка я уже говорил выше, при перепрошивке содержимое этой папки заменяется другим содержимым — распакованным пакетом usr.local.etc.tar.bz2.
Поэтому давайте приведем нашу распакованную прошивку к «законченному» виду.
Папку /usr/local/etc удалять не стоит — все-таки она нужна для сборки основного образа.
Поэтому давайте ее переименуем (например, в etc1),вместо нее создадим пустую папку etc, а затем распакуем в нее содержимое многократно упоминавшегося пакета. Для этого перейдет в папку, где он лежит (это та же самая папка, где лежит основной образ), и дадим команду:
tar -xf usr.local.etc.tar.bz2 -C squashfs-root/usr/local/etc
Вот теперь можно переделывать прошивку так, как нам нужно.
Естественно, готовых инструкций по переделыванию никто вам не даст, но некоторые моменты и хитрости я вам все же постараюсь расписать.
Момент №1: в папке /usr/local/etc имеется файл со странным (для Windows-пользователя) именем — rcS. В этом файле прописаны команды, выполняющиеся при включении плеера. Соответственно, вы туда можете добавить при необходимости свои команды. Основным приложением (которое выводит картинку на экран телевизора и дает нам возможность управлять плеером с пульта) является приложение DvdPlayer. Обращайте внимание на команды, которые прописаны в файле автозапуска до запуска этого приложения и после его запуска.
Хитрость №1: некоторые файлы, которые требуют в процессе работы плеера изменения (например, если вы вздумаете изменить пароли пользователей, в частности, пароль root), находятся в области файловой системы SQUASHFS, доступной только для чтения. Но не менять же ради нескольких файлов тип файловой системы — тем более, что при этом мы сильно проиграем в свободном (чуть было не написал «дисковом», но там же не диск, а флеш-память) пространстве?
Нас спасет испытанный и многими любимый способ подмены, работающий в Линуксе — создание символических ссылок.
Вкратце: символическая ссылка — это файл, не имеющий содержимого, но указывающий на другой («настоящий») файл, который может быть расположен совсем в другом месте. Некое подобие ярлыков в Windows? Некое-то некое, но далеко не совсем. Дело в том, что в Windows по ярлыку можно только делать переход, а в Линуксе по символической ссылке можно исходный файл просматривать, редактировать и исполнять, при этом совершенно не зная, что это не настоящий файл, а ссылка. В Windows, кстати, тоже имеется возможность использовать символические ссылки, но эта возможность почему-то особо не афишируется. А в Линуксе …. да там все на символических ссылках 🙂
Дальше рассказывать теорию не буду, а лишь перечислю несколько файлов (и их назначение), которые следует подменить символическими ссылками (еще их называют «симлинками» — от английского Symbolic Link)
/etc/passwd (хранилище списка учетных записей и паролей)
/etc/passwd— (резервная копия этого файла)
/etc/group (список групп учетных записей)
/etc/inetd.conf (конфигурация интернет-служб плеера)
/etc/hostname (имя плеера в сети — не всем нравится имя по умолчанию Venus, к тому же что прикажете делать, если у вас в разных комнатах стоят несколько плееров, и все хотят, чтобы их в сети знали под именем «Венера»?)
(впрочем, распаковав прошивку, вы и так можете увидеть, что некоторые из упомянутых файлов уже представлены симлинками — иногда производители делают это, иногда нет)
Вопрос — а где лучше всего хранить «настоящие» файлы?
Ответ — конечно же в той области файловой системы, которая доступна для записи — то есть, в папке /usr/local/etc (если есть нужда, можете там создать подпапки и поместить какие-то файлы в них).
Как грамотно создать симлинки? Симлинки лучше создавать с относительным путем — это даст нам дополнительную возможность (еще до собирания прошивки) убедиться в том, что ссылка создана правильно — то есть, указывает на существующий файл. Например:
1. Переместим файл hostname из папки /etc в папку /usr/local/etc
2. Перейдем в папку /etc (не забывайте, что речь идет о папках файловой системы плеера — в распакованном виде на компьютере это будет папка ~/src/player/unpacked/package2/squashfs-root/etc)
3. Дадим команду:
ln -s ../usr/local/etc/hostname hostname
(обратите внимание — для указания на файл используем относительный путь)
Момент №2: Как известно, интерфейс плеера сильно хромает по части русской локализации. То русская надпись не влезает в отведенное ей на экране место, то сам перевод сделан с нарушением смысла, то вообще оставлена без перевода английская (спасибо, что хоть не китайская) фраза, то еще что.
Файл, содержащий русский перевод, называется RUSSIAN.str (в некоторых прошивках еще встречается имя RUS_ORIGAMI.str). А находится этот файл в папке /usr/local/bin/Resource. Если хотите изменить русский перевод — редактируйте этот файл. Только учтите, что его кодировка — UTF-8. И тут сразу же возникает проблема — ведь согласитесь, очень трудно заранее определить правильный перевод — ведь читая этот файл, мы не можем узнать, в каком диалоге или окне «вылезет» эта строка. А что, если будет превышено количество знаков, и мы увидим обрезанную строку? Или окажется, что перевод мы сделали не соответствующим смыслу? Или допустили опечатку? Что тогда — снова разбирать прошивку, вносить исправления, а затем пересобирать? Нет — есть рецепт получше. Называется он….
Хитрость №2: Переместим файл RUSSIAN.str в область файловой системы, доступную для записи — например, в папку /usr/local/etc/Resource (создадим там такую папку для удобства), а на его место поместим симлинк:
mkdir ~/src/player/unpacked/package2/squashfs-root/usr/local/etc/Resource
cd ~/src/player/unpacked/package2/squashfs-root/usr/local/bin/Resource
mv RUSSIAN.str ../../etc/Resource/
ln -s ../../etc/Resource/RUSSIAN.str RUSSIAN.str
И теперь у нас появится возможность исправлять русский перевод прямо «на ходу» — то есть, при включенном плеере, сразу же сверяясь с результатом на экране телевизора.
Момент (и хитрость) №3: Обратим внимание на папку /usr/local/bin/Resource/bmp. В этой папке хранится набор картинок в формате BMP. Эти картинки совокупно образуют экранный интерфейс меню плеера — отображаемые там значки, обрамление пунктов меню и т.д., и т.п. Но если вы попытаетесь просмотреть такой файл как картинку, то скорее всего вместо изображения получите ошибку (а при просмотре текстовым или бинарным просмотрщиком увидите, что содержимое такого файла начинается с «RT»). Это вызвано тем, что картинки хранятся в особом сжатом формате, понятном только плеерам на базе процессора Realtek, который умеет их распаковывать и показывать на экране. Зачем так сделали? Затем, что формат сжатый — и в итоге файл картинки занимает физически меньше места (раза в два, а то и в три).
Поэтому, если вы хотите нарисовать свои картинки вместо штатных, вам следует воспользоваться специальными средствами для перекодирования BMP из «нормального» формата в «реалтековский» и наоборот. Инструменты вы можете взять здесь. К большому сожалению, эти утилиты работают только под Windows — под Линукс таких не нашлось.
В некоторых прошивках вы можете встретить эти файлы-картинки в несжатом формате (все, или же только часть из них). Это говорит либо о небрежности разработчиков, либо о том, что они не были озабочены экономией места на внутренней флэш-памяти плеера. А нам это место ой, как дорого — ведь мы же собираемся добавить в плеер всяких-разных дополнений, утилит и функционала — начиная от закачки торрентов и вплоть до стирки постельного белья.
Хитрость №4: Что делать в ситуации, когда мы хотим «напихать» в прошивку столько всяких дополнений, сервисов, фенечек и прибабмасов, что все они однозначно не поместятся на внутреннюю флеш-память плеера? Но в то же время мы будем подключать к плееру внешний (или внутренний) жесткий диск. Как бы использовать это гигантское дисковое пространство?
Здесь поможет такая хитрость: создайте в корне файловой системы папку (обычно принятое для такой папки имя — opt), и на этом пока успокойтесь. В будущем (в том числе, и на работающем плеере) вы сможете примонтировать к этой папке любую другую папку — в том числе, и находящуюся на диске. Единственное условие — монтируемая папка должна быть на «родной линуксовой» файловой системе Ext2 или Ext3. Например:
mount -t ext2 /tmp/hdd/root/opt /opt
(чтобы монтирование было автоматическим, такие команды можно прописать в файле /usr/local/etc/rcS)
Как вариант — вместо монтирования можно использовать символическую ссылку. Но этот вариант хуже, потому что монтирование может быть динамическим (например, отмонтировали одну папку, подмонтировали другую), а символическая ссылка всегда указывает на конкретный объект, путь и имя которого изменить нельзя.
Момент №4: Корневой папкой web-сервера плеера является папка /tmp/www. Вся папка /tmp находится в RAM, поэтому все ее содержимое теряется при перезапуске плеера. Вместо потерянных данных туда каждый раз при включении плеера копируется содержимое папки /tmp_orig — в том числе и подпапка www.
Я выделяю отдельно рассмотрение этой папки потому, что многие дополнительные службы (например, moServices) для своей работы требуют, чтобы в папке web-сервера (то есть, папке /tmp/www) находились какие-то файлы. То есть — для того, чтобы нужные файлы оказались в папке tmp/www и не пропали после перезапуска, эти файлы должны находиться в папке /tmp_orig/www. Но ведь папка /tmp_orig/www находится в области файловой системы «только для чтения». Следовательно, нужно эту папку переместить в /usr/local/etc, а на ее месте разместить символическую ссылку:
cd ~/src/player/unpacked/package2/squashfs-root/tmp_orig
mv www ../usr/local/etc
ln -s ../usr/local/etc/www www
Всё — больше моментов и хитростей не будет. Переделывайте свою прошивку так, как вам хочется. При этом соблюдайте элементарные линуксовые правила — например, если файл должен исполняться (бинарный эльф или текстовый скрипт), то у него должно быть прописано разрешение на исполнение (chmod +x myfile). Если это файл-картинка, то у такого файла должно быть разрешение на чтение (chmod +r myfile). И так далее…
Теперь переходим к сборке прошивки. Можно, конечно написать «сборку производим в обратном порядке», но попытаюсь разложить процесс по деталям.
Итак, сначала нам нужно отделить и затем убрать из прошивки папку /usr/local/etc (как вы помните — эта папка стоит у нас в прошивке «особнячком»).
Переходим в эту папку:
cd ~/src/player/unpacked/package2/squashfs-root/usr/local/etc
и даем команду:
tar -cjf ~/src/player/unpacked/package2/usr.local.etc.tar.bz2 *
или (с относительными путями, но результат должен быть тем же)
tar -cjf ../../../../usr.local.etc.tar.bz2 *
(наличие в папке ~/src/player/unpacked/package2 старого файла с таким же именем нас не волнует — команда предусматривает затирание старого файла вновь создаваемым)
Затем удаляем из разобранной прошивки эту папку:
rm -r ~/src/player/unpacked/package2/squashfs-root/usr/local/etc
переименовываем папку etc1 в еtс
cd ~/src/player/unpacked/package2/squashfs-root/usr/local
rm etc1 etc
поднимаемся в папку, где лежит образ squashfs1.img
cd ~/src/player/unpacked/package2
удаляем его
rm squashfs1.img
и собираем вместо него новый
mksquashfs squashfs-root squashfs1.img -le -all-root
(параметр -le нужен для сборки с «правильным» чередованием байтов Юникода (little-endian), а параметр -all-root проставляет владельцем всех файлов пользователя root)
Затем удаляем папку с распакованным образом файловой системы
rm -r squashfs-root
поднимаемся на уровень выше:
cd ~/src/player/unpacked
или
cd ../
собираем окончательный образ прошивки
tar -cf ../install.img *
и переходим в папку, где он лежит (папка, с которой началось все это безобразие)
cd ~/src/player
Прошивка готова. Можно копировать ее на флешку, вставлять в плеер и т.д.
Что делать, если прошивка пошла с ошибкой?
Самая распространенная ошибка — образ прошивки слишком велик и не помещается в отведенное ему место. Рецепт — умерьте свои аппетиты и исключите из прошивки ненужное (а также прочитайте, что я тут выше написал в «Моментах» и «Хитростях».
Еще бывает так, что образ папки usr.local.etc.tar.bz2 (после распаковки) превышает размер, отведенный ему параметром sizeBytesMin. Попробуйте увеличить этот параметр, но учтите, что всякому увеличению есть верхний предел. Напомню, что полный объем внутренней флеш-памяти у большинства плееров составляет всего 256 мегабайт, из которых часть еще выделяется для служебных целей.
А если все же yaffs2 на прошивке найдётся? Да и вообще, возможно ли на медиаплеер поставить вполне себе Ubuntu?