22
Сен

Язык для virt2real

Написал Максим Крентовский в Исследования

Виртурилке, как любой другой платформе для DIY-творчества, необходимо API и системный язык, позволяющий реализовывать 80% типовых задач, не выходящих за рамки базового применения устройства. Это не касается задач, в которых нужна поддержка специализированного оборудования или максимальное быстродействие с целью обеспечить минимальную задержку реакции системы.

Во всех остальных случаях можно обойтись достаточно простой моделью, позволяющей осуществлять базовые операции над одним устройством или их группой для создания систем управления с обратной связью через аудио/видео. Предполагается, что в основе этой модели будет лежать протокол поверх HTTP (REST, JSON RPC, и т.п.), который будет использован для управления конечным оборудованием.

Помимо этого, к языку разработки также имеются определенные пожелания, например, чтобы это был простой и удобный язык, позволяющий реализовывать типовые абстракции (замыкания, анонимные функции, функции высшего порядка и т.д.), автоматическое управление памятью, легкую интеграцию со сторонним кодом и удобную стандартную библиотеку. На нашей платформе подобных языков несколько, поэтому я решил их протестровать на простейшем синтетическом примере для получения временных замеров, позволяющих выбрать наиболее производительный из них, поскольку производительность, как показал опыт, является слабым местом для не очень мощного SoC.
Подробнее →

30
Янв

Потрошим прошивки устройств

Написал Максим Крентовский в Деятельность

Зачастую все программное обеспечение для встраиваемых устройств распространяется в виде прошивок — кода, записываемого во внутреннюю flash-память устройства (представленного в виде внутренней памяти на кристалле или отдельного NAND/NOR-чипа). В случае, если устройство работает на Linux-е, то ROM-устройство с большой долей вероятности будет NAND flash размером в несколько мегабайт, а прошивка представляет собой образ блочного устройства, содержащего один и более разделов с вполне традиционными для Линукса, но специфичными файловыми системами, учитывающими особенности носителя (flash-носители предпочитают блочные операции и последовательную запись). Часто используют Cramfs, SquashFS для read only разделов и JFFS2, UbiFS для перезаписываемых разделов.

Соответственно, подмонтировать такую прошивку при помощи loop-устройства представляется нетривиальной задачей, поскольку для успешного монтирования надо найти смещение начала раздела внутри файла прошивки (это можно сделать по сигнатуре файловой системы или просто перебором в лоб всех смещений до успешного монтирования, разумеется, не вручную). Другой способ — создать mtd-устройство в памяти и пролить прошивку туда с последующим монтированием полученных разделов может оказаться тоже не самым удобным — размеры прошивок, например, размещаемых на SD и micro-SD картах могут быть вполне себе гигагбайных порядков, при этом объем полезных данных — много меньше (отдельный вопрос — что на исходной карте было до распаковки на нее образа и не уползло ли это случайно в итоговую прошивку).

Я в таких случаях использую очень простой хак при помощи такой забавной штуки, как network block device. Поясню на примере прошивки для Виртурилки:

  • скачиваем прошивку для устройства и распаковываем для получения образа прошивки (с большой долей вероятности он будет запакован, несмотря на расширение файла)
  • 1
    2
    $ wget http://files.virt2real.ru/firmware/virt2real-board/1.1/04_10_2013_sdcard.img.zip
    $ unzip 04_10_2013_sdcard.img.zip
  • достаем NBD-сервер, я использую всего 50 строк кода на Питоне
  • 1
    2
    $ wget http://code.activestate.com/recipes/577569-nbd-server-in-python/download/1/ -O nbdserver.py
    $ chmod 1777 nbdserver.py
  • запускаем наш сервер на 3000-м порту, подсовывая в качестве файла прошивку:
  • 1
    ./nbdserver.py 3000 04_10_2013_sdcard.img
  • переходим в соседнюю консоль и запускаем клиента
  • 1
    2
    3
    4
    $ sudo apt-get install nbd-client
    $ sudo nbd-client 127.0.0.1 3000 /dev/nbd0
    Negotiation: ..size = 1947MB
    bs=1024, sz=2041577472 bytes
  • окей, теперь наша прошивка доступна как блочное устройство /dev/nbd0 и у него есть разделы p1 (ядро и параметры бутлоадера) и p2 (файловая система) , которые можно потрошить. Убеждаемся:
  • 1
    2
    $ ls /dev/nbd0*
    /dev/nbd0  /dev/nbd0p1  /dev/nbd0p2
  • ну и теперь монтируем
  • 1
    $ sudo mount /dev/nbd0p1 /mnt

Вишенкой на торте является то, что мы, помимо того, что видим прошивку нашего устройства и можем выдрать оттуда полезные вещи, можем еще и исправить ее, правда, в случае, когда файловая система позволяет запись, в противном надо копировать содержимое раздела себе, а потом собирать новый образ ФС и «интегрировать» его в прошивку. Таким образом можно сделать локализацию и/или кастомизацию любимого видеорегистратора, найти фотки всех индусов, которые делали любимый медиа-центр или NAS, ну и т.д.

Комментарии к записи Потрошим прошивки устройств отключены
17
Май

Virt2Real и Buildroot. Собираем систему.

Написал Максим Крентовский в Деятельность

virt2real

Про проект Virt2Real (разработка платформы для удаленного управления с обратной связью по видео) много написано на их сайте, повторяться не буду, а свою историю участия в этом начинании как-нибудь потом напишу. В данной статье. Сейчас бы хотелось затронуть вопросы подготовки программного обеспечения для этой платформы, а именно — дистрибутива Линукс, собранного при помощи buildroot.
Подробнее →

Следующая страница →