Только самое нужное. Избавляем Linux от багажа прошивок для оборудования - «Новости» » Самоучитель CSS
Меню
Наши новости
Учебник CSS

Невозможно отучить людей изучать самые ненужные предметы.

Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3

Надо знать обо всем понемножку, но все о немногом.

Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы

Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)

Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода

Самоучитель CSS

Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5

Новости

Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости

Справочник CSS

Справочник от А до Я
HTML, CSS, JavaScript

Афоризмы

Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы

Видео Уроки


Наш опрос



Наши новости

      
      
  • 24 марта 2016, 16:20
27-07-2020, 16:00
Только самое нужное. Избавляем Linux от багажа прошивок для оборудования - «Новости»
Рейтинг:
Категория: Новости

Разработчики Linux поддерживают не только множество драйверов устройств в исходном коде ядра, но и большую коллекцию прошивок к устройствам в пакете linux-firmware. Но когда размер системы имеет значение — нужно отсечь лишнее. Модули ядра легко отключить в make menuconfig, а вот выбрать нужные прошивки сложнее. Поэтому сегодня мы напишем скрипт, который позволит тебе извлечь из полугигабайтной коллекции прошивок несколько мегабайт, нужных именно твоей машине.

С железом нередко бывает так, что одного драйвера в пространстве ядра ОС для его работы недостаточно. Нужна также прошивка (firmware), которая загружается в само устройство. Точный формат и назначения прошивки зачастую известны только производителю: иногда это программа для микроконтроллера или FPGA, а иногда просто набор данных. Пользователю это не важно, главное, что устройство не работает, если ОС не загрузит в него прошивку.


В свободных операционных системах прошивки нередко вызывают споры. Многие из них распространяются под несвободными лицензиями и без исходного кода. Авторы OpenBSD и ряда дистрибутивов GNU/Linux считают это проблемой и со свободой, и с безопасностью и принципиально не включают такие прошивки в установочный образ.


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


Полный набор из linux-firmware занимает более 500 Мбайт в распакованном виде. При этом каждой отдельно взятой системе требуется только небольшая часть этих файлов, остальное — мертвый груз.


Даже в современном мире с дисками на несколько терабайт еще много случаев, когда размер имеет значение: встраиваемые системы, образы для загрузки через PXE и подобное. Хорошо, если о board support package позаботился кто-то другой, но это не всегда так.


Если ты точно знаешь полный список нужного железа, можно извлечь файлы вручную. Впрочем, даже в этом случае найти нужные файлы может быть непросто — linux-firmware представляет собой не очень структурированную кучу файлов, и списка соответствия файлов именам модулей ядра там нет. А если ты хочешь дать пользователям возможность легко собрать свой образ, тут и вовсе нет выбора — нужно автоматическое решение.


В этой статье я расскажу о своем способе автоматической сборки. Он неидеален, но автоматизирует большую часть работы, что уже неплохо. Писать скрипт будем на Python 3.


Только самое нужное. Избавляем Linux от багажа прошивок для оборудования - «Новости»
INFO

Примеры кода в статье упрощенные. Готовый и работающий скрипт ты можешь найти на GitHub.



К примеру, можно им просмотреть список прошивок для включенных в .config драйверов сетевых карт Realtek.


$ make menuconfig
$ make prepare
$ list-required-firmware.py -s drivers/net/ethernet/realtek/
rtl_nic/rtl8168d-1.fw
rtl_nic/rtl8168d-2.fw
rtl_nic/rtl8168e-1.fw
...

Основы


В ядре Linux нет глобального списка прошивок и кода для их загрузки. Каждый модуль загружает свои прошивки с помощью функций из семейства request_firmware. Логично, если учесть, что процедура загрузки прошивки Сѓ каждого устройства разная. Соответственно, информация Рѕ нужных прошивках разбросана РїРѕ множеству отдельных файлов СЃ исходным РєРѕРґРѕРј.


РќР° первый взгляд, некоторую надежду дает опция СЃР±РѕСЂРєРё FIRMWARE_IN_KERNEL. Увы, на деле она встраивает в файл с ядром только файлы, которые ты явно укажешь в EXTRA_FIRMWARE. Так что файлы РІСЃРµ равно сначала придется найти.


РџРѕРёСЃРє РїРѕ вызовам request_firmware() тоже не очень перспективен. Некоторые модули поддерживают несколько разных прошивок, да и имя файла часто хранится в переменной. В качестве примера можно посмотреть на фрагмент кода из драйвера сетевой карты Intel e100.


К счастью для нас, модули должны указывать нужные им файлы прошивок с помощью макроса MODULE_FIRMWARE(). Пример РјРѕР¶РЅРѕ найти РІ e100. Этот макрос определен РІ файле include/linux/module.h.


Именно из вывода этого макроса берется информация о прошивках, которую можно увидеть в выводе утилиты modinfo.


$ sudo modinfo e100 | grep firmware
firmware:
e100/d102e_ucode.bin
firmware:
e100/d101s_ucode.bin
firmware:
e100/d101m_ucode.bin

В ряде случаев можно было бы обойтись одной modinfo. Если Сѓ тебя есть собранное СЏРґСЂРѕ Рё возможность его загрузить, ты можешь просмотреть вывод modinfo для каждого нужного модуля. Это не всегда удобно или вообще возможно, так что мы продолжим искать решение, для которого понадобится только исходный код ядра.


Здесь и далее будем считать, что все ненужные модули отключены в конфиге сборки ядра (Kconfig). Если мы собираем образ для конкретной системы или ограниченного набора систем, это вполне логичное предположение.


Ищем исходники модулей


Чтобы собрать список имен файлов прошивок, мы сначала составим список всех файлов исходного кода ядра, где они используются. Затем мы прогоним эти файлы через препроцессор из GCC, чтобы раскрыть все макросы, и извлечем собственно имена нужных файлов.


Находим все включенные в конфиге модули


Это самая простая часть. Конфиг сборки ядра имеет простой формат «ключ — значение» вроде CONFIG_IWLWIFI=m. Значение может быть n (не собирать), y (встроить РІ СЏРґСЂРѕ) или m (собрать в виде модуля).


Нас интересуют только ключи, а какое значение там, y или m, нам не важно. Поэтому мы можем выгрести нужные строки регулярным выражением (.*)=(?:y|m). Р’ модуле re из Python синтаксис (?:...) используется для незахватывающих РіСЂСѓРїРї (non-capturing group), так что захвачена будет только часть РІ скобках РёР· (.*)=.


def load_config(path):
with open(path, 'r') as f:
config = f.read()
targets = re.findall(r'(.*)=(?:y|m)', config)
return targets
Цитирование статьи, картинки - фото скриншот - Rambler News Service.
Иллюстрация к статье - Яндекс. Картинки.
Есть вопросы. Напишите нам.
Общие правила  поведения на сайте.

Разработчики Linux поддерживают не только множество драйверов устройств в исходном коде ядра, но и большую коллекцию прошивок к устройствам в пакете linux-firmware. Но когда размер системы имеет значение — нужно отсечь лишнее. Модули ядра легко отключить в make menuconfig, а вот выбрать нужные прошивки сложнее. Поэтому сегодня мы напишем скрипт, который позволит тебе извлечь из полугигабайтной коллекции прошивок несколько мегабайт, нужных именно твоей машине. С железом нередко бывает так, что одного драйвера в пространстве ядра ОС для его работы недостаточно. Нужна также прошивка (firmware), которая загружается в само устройство. Точный формат и назначения прошивки зачастую известны только производителю: иногда это программа для микроконтроллера или FPGA, а иногда просто набор данных. Пользователю это не важно, главное, что устройство не работает, если ОС не загрузит в него прошивку. В свободных операционных системах прошивки нередко вызывают споры. Многие из них распространяются под несвободными лицензиями и без исходного кода. Авторы OpenBSD и ряда дистрибутивов GNU/Linux считают это проблемой и со свободой, и с безопасностью и принципиально не включают такие прошивки в установочный образ. Если у тебя есть устройство, которое требует прошивки, и тебе нужно, чтобы оно работало, вопрос лицензии прошивки становится чисто академическим — от необходимости иметь ее в системе и загружать ты никуда не уйдешь. Полный набор из linux-firmware занимает более 500 Мбайт в распакованном виде. При этом каждой отдельно взятой системе требуется только небольшая часть этих файлов, остальное — мертвый груз. Даже в современном мире с дисками на несколько терабайт еще много случаев, когда размер имеет значение: встраиваемые системы, образы для загрузки через PXE и подобное. Хорошо, если о board support package позаботился кто-то другой, но это не всегда так. Если ты точно знаешь полный список нужного железа, можно извлечь файлы вручную. Впрочем, даже в этом случае найти нужные файлы может быть непросто — linux-firmware представляет собой не очень структурированную кучу файлов, и списка соответствия файлов именам модулей ядра там нет. А если ты хочешь дать пользователям возможность легко собрать свой образ, тут и вовсе нет выбора — нужно автоматическое решение. В этой статье я расскажу о своем способе автоматической сборки. Он неидеален, но автоматизирует большую часть работы, что уже неплохо. Писать скрипт будем на Python 3. INFO Примеры кода в статье упрощенные. Готовый и работающий скрипт ты можешь найти на GitHub. К примеру, можно им просмотреть список прошивок для включенных в .config драйверов сетевых карт Realtek. Основы В ядре Linux нет глобального списка прошивок и кода для их загрузки. Каждый модуль загружает свои прошивки с помощью функций из семейства request_firmware. Логично, если учесть, что процедура загрузки прошивки Сѓ каждого устройства разная. Соответственно, информация Рѕ нужных прошивках разбросана РїРѕ множеству отдельных файлов СЃ исходным РєРѕРґРѕРј. РќР° первый взгляд, некоторую надежду дает опция СЃР±РѕСЂРєРё FIRMWARE_IN_KERNEL. Увы, на деле она встраивает в файл с ядром только файлы, которые ты явно укажешь в EXTRA_FIRMWARE. Так что файлы РІСЃРµ равно сначала придется найти. РџРѕРёСЃРє РїРѕ вызовам request_firmware() тоже не очень перспективен. Некоторые модули поддерживают несколько разных прошивок, да и имя файла часто хранится в переменной. В качестве примера можно посмотреть на фрагмент кода из драйвера сетевой карты Intel e100. К счастью для нас, модули должны указывать нужные им файлы прошивок с помощью макроса MODULE_FIRMWARE(). Пример РјРѕР¶РЅРѕ найти РІ e100. Этот макрос определен РІ файле include/linux/module.h. Именно из вывода этого макроса берется информация о прошивках, которую можно увидеть в выводе утилиты modinfo. В ряде случаев можно было бы обойтись одной modinfo. Если Сѓ тебя есть собранное СЏРґСЂРѕ Рё возможность его загрузить, ты можешь просмотреть вывод modinfo для каждого нужного модуля. Это не всегда удобно или вообще возможно, так что мы продолжим искать решение, для которого понадобится только исходный код ядра. Здесь и далее будем считать, что все ненужные модули отключены в конфиге сборки ядра (Kconfig). Если мы собираем образ для конкретной системы или ограниченного набора систем, это вполне логичное предположение. Ищем исходники модулей Чтобы собрать список имен файлов прошивок, мы сначала составим список всех файлов исходного кода ядра, где они используются. Затем мы прогоним эти файлы через препроцессор из GCC, чтобы раскрыть все макросы, и извлечем собственно имена нужных файлов. Находим все включенные в конфиге модули Это самая простая часть. Конфиг сборки ядра имеет простой формат «ключ — значение» вроде CONFIG_IWLWIFI=m. Значение может быть n (не собирать), y (встроить РІ СЏРґСЂРѕ) или m (собрать в виде модуля). Нас интересуют только ключи, а какое значение там, y или m, нам не важно. Поэтому мы можем выгрести нужные строки регулярным выражением (.*)=(?:y|m). Р’ модуле re из Python синтаксис (?:.) используется для незахватывающих РіСЂСѓРїРї (non-capturing group), так что захвачена будет только часть РІ скобках РёР· (.*)=.
Просмотров: 554
Комментариев: 0:   27-07-2020, 16:00
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

 
Еще новости по теме:



Другие новости по теме: