Сокращение Linux до размера

Новые инструменты, такие как musl, toybox и Clang, предлагают новые методы сокращения ядра Linux, файловой системы и пространства пользователя для IoT.

На прошлогодней Европейской конференции по встраиваемым Linux-технологиям Тим Бирд ( Sony Bird) предупредил, что застопорившийся прогресс в уменьшении размера ядра Linux означает, что Linux уступает огромный рынок периферийных узлов IoT операционным системам реального времени (ОСРВ).
На этом февральском мероприятии ELC в Северной Америке другая фигура, которая долгое время была в центре ELC - Майкл Опденакер из Free Electron - подвела итоги новейших схем сжатия ядра, а также будущих возможностей.
Возможно, благодаря наставлениям Тима Берда, на ELC 2017 состоялось несколько презентаций по уменьшению занимаемой площади, в том числе Учебное пособие Роба Лэндли : Создание максимально простой системы Linux .


На ELC 2017 Майкл Опденакер показывает минимальные размеры ядра ARM по сравнению с последними выпусками.

(щелкните изображение, чтобы увеличить)

Как и Bird, Opdenacker оплакивал отсутствие прогресса, но сказал, что разработчикам встраиваемых Linux-систем есть множество способов уменьшить нагрузку.
Они варьируются от использования новых технологий, таких как musl, toybox и Clang, до пересмотра других подходов, которые разработчики иногда упускают из виду.

В своем выступлении Опденакер объяснил, что традиционным мотиватором сокращения ядра было ускорение загрузки или копирование образа Linux из хранилища с низкой емкостью.
В современном мире IoT к этому присоединилось выполнение требований к очень маленьким конечным точкам с ограниченными ресурсами.
Однако это не единственные причины.
«Некоторые хотят запускать Linux в качестве загрузчика, поэтому им не нужно заново создавать драйверы загрузчика, а некоторые хотят запускать всю систему во внутренней ОЗУ или кэш-памяти», - сказал Опденакер.
«Небольшое ядро ​​также может уменьшить поверхность атаки для повышения безопасности».

Замедленные усилия, такие как проект Linux Kernel Tinification , в основном сделали свое дело, сказал Опденакер.
Несмотря на то, что с годами размер немного увеличился, вы все равно можете использовать различные методы для запуска вашего ядра всего в 4 МБ ОЗУ.

«Можно подумать, что, поскольку проект Tinification не настолько активен, ядро ​​будет расти в геометрической прогрессии, но оно все еще находится под контролем, поэтому, возможно, мы могли бы изменить тенденцию», - сказал Опденакер.
«При более агрессивной работе может быть достигнуто 2-3 МБ.
Тем не менее, в ELC Europe 2015 не было много нового в этой области ».

Хотя исправления Джоша Триплетта Tinification, которые удаляют функциональность через параметры конфигурации, сами были удалены из дерева linux-next, они все еще доступны для экспериментов.
Основная причина: разработчики ядра не решаются вырвать слишком много сантехники из-за потенциальной возможности ошибок.

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

Сокращение ядра

Между тем, есть еще много способов уменьшить след.
Один из самых простых способов - уменьшить размер ядра во время компиляции.
Во-первых, используйте недавний компилятор, сказал Опденакер.
Например, gcc 6.2 дает вам почти половинное процентное снижение по сравнению с gcc 4.7 в ARM версии Linux 4.10.
Это может быть немного, но, «добавил каждый байт», добавил он.

Тогда есть оптимизация компилятора.
Например, в gcc вы можете использовать опцию -Os, чтобы уменьшить размер.
Начиная с gcc 4.7, пользователи также могут запускать необязательную оптимизацию времени соединения, которая может уменьшить неиспользуемый код при применении в конце компиляции «при объединении всех объектных файлов вместе для оптимизации таких вещей, как встраивание в различные объекты», - сказал Опденакер.
В одном тесте запуск gcc 6.2 с LTO уменьшил размер очищенной переменной на 2,6 процента (x86_64) до 2,8 процента (32-разрядная ARM).

Несколько лет назад был большой интерес к проекту LLVM Linux, который использовал внешний интерфейс Clang для компилятора LLVM для компиляции ядра Linux для оптимизации производительности и размеров.
«Возможно, это лучше, чем то, что вы можете получить с помощью gcc LTO сегодня, но проект застопорился с 2015 года», - сказал Опденакер.
В ответ один из слушателей предположил, что проект еще жив.

Использование внешнего интерфейса Clang для компилятора LLVM обеспечивает еще большую экономию занимаемой площади, чем gcc LTO.
Opdenacker провел несколько тестов, используя программу под названием OggEnc, которая состоит из одной программы на Си.
Затем он сравнил Clang 3.8.1 с gcc 6.2 на x86_64 и увидел 5-процентное сокращение «из коробки без каких-либо действий». Однако Gcc может предложить большие сокращения при компиляции очень маленьких программ, добавил он.

Опденакер также упомянул некоторые патчи, предложенные Энди Клин в 2012 году, построенные вокруг gcc LTO.
Они обещали повысить производительность и сократить до 6 процентов неиспользуемого кода в системах ARM.
«К сожалению, патчи вызвали некоторые новые проблемы, поэтому они не были приняты», добавил он.
«Разработчики ядра боялись создавать новые ошибки, которые было трудно отследить.
Но, может быть, стоит попробовать еще раз.

Другой метод компиляции, доступный пользователям ARM, - это компиляция с помощью большого пальца (-mthumb), который предлагает сочетание 16- и 32-битных инструкций вместо всего набора 32-битных ARM (-marm).
По словам Опденакера, некоторые компиляторы, такие как Ubuntu, будут компилироваться по умолчанию.
При использовании OggEnc компиляция большого пальца была на 6,8% меньше, чем компиляция ARM.
Однако он признал, что это не окончательный тест, поскольку его компилятор также компилировал части программы, используя набор ARM.

Начиная с Linux 3.18, разработчики смогли уменьшить размер ядра с помощью команды «make tinyconfig», которая сочетает в себе «make allnoconfig» с несколькими добавленными настройками, уменьшающими размер.
«Он использует gcc optimize для размера, поэтому код может быть медленнее, но он меньше», - сказал Опденакер.
«Вы включаете сжатие ядра XZIP и экономите от 6 до 10 КБ».

В ядре теперь есть несколько опций тинификации, которые вы можете выбрать, например, добавление obj-y в Makefiles ядра.
«Другими словами, вы можете скомпилировать ядро ​​без необходимости все время использовать ptrace, что в ARM занимает 14 КБ». Вы можете найти несколько возможностей объединения в ядре Linux, обратившись к obj-y в файлах Makefile ядра, соответствующих коду, который всегда включен в двоичный файл ядра
«Например, вы можете собрать ядро ​​без поддержки ptrace, что в ARM занимает 14 КБ», - сказал Опденакер.

Это хорошая идея, чтобы «изучить ваши журналы компиляции и посмотреть, действительно ли все нужно», сказал Опденакер.
«Вы можете решить, насколько это полезно и как трудно удалить.
Вы также можете искать регрессии по размеру с помощью команды bloat-o-meter , которая сравнивается с vmlinux, чтобы увидеть, что увеличилось в размерах между версиями ».

Сокращение пространства пользователя

Чтобы уменьшить объем пространства пользователя в более простых программах, Opdenacker предлагает, чтобы вместо busybox разработчики использовали пробный набор утилит командной строки Linux, который теперь встроен в Android.
«Toybox имеет те же приложения и в основном те же функции, что и busybox, но использует только 84 КБ вместо 100 КБ», - добавил он.
«Если вам нужна оболочка с несколькими утилитами командной строки, toybox может сэкономить вам несколько тысяч байтов, хотя она менее настраиваема».


Майкл Опденакер объясняет эффективность мусульманина (слева) и указывает на другие ресурсы по линкованию Linux

(нажмите на картинку, чтобы увеличить)

Другой метод - переключение реализаций стандартной библиотеки C / POSIX.
Более новый a href = ”https://www.musl-libc.org/faq.html” target = ”new”> musl libc использует меньше места, чем uclibc и glibc.
Опденакер описал один тест в программе hello.c под gcc 6.3 и busybox, в котором musl использовал только 7.3KB против 67KB для uclibc-ng 1.0.22 против 49KB с использованием glibc с gcc 6.2.

Для уменьшения размера файловой системы Opdenacker рекомендует загружать initramfs для небольших файловых систем.
«Он позволяет вам загружаться раньше, потому что вам не нужно инициализировать драйверы файловой системы и хранилища». Для больших объемов ОЗУ он предлагает использовать файловые системы сжатия, такие как SquashFS, JFFS2 или ZRAM.

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

«В наши дни вы даже не можете купить 8 МБ ОЗУ», - сказал один из участников.
«Это интересное упражнение, но я не знаю, есть ли большая отдача». Другой разработчик отметил, что одной из проблем проекта Tinification было то, что он «удалял вещи, которые не были нужны в действительно небольших конфигурациях памяти, но В ту минуту, когда вы отправляетесь в облако, все это требуется ».

Если Linux действительно столкнулся с некоторыми практическими ограничениями для уменьшения занимаемой площади, то появятся новые возможности для более простых ОСРВ, включая несколько платформ с открытым исходным кодом, таких как Zephyr и FreeRTOS, для работы конечных точек небольшого размера на микроконтроллерах.
Однако это не означает, что Linux полезен только для шлюзов IoT.
С ростом количества IoT-узлов, связанных с искусственным интеллектом и мультимедиа, Linux может быть единственной игрой в городе.
Между тем, приятно знать, что есть несколько новых приемов для создания минималистичного встроенного шедевра вашей мечты.

Смотрите полное видео ниже:

Видеозапись презентации Майкла Опденакера: «Методы уменьшения размера встроенного Linux»

Эта статья защищена авторским правом © 2016 Linux.com и была первоначально опубликована здесь .
Он был воспроизведен этим сайтом с разрешения его владельца.
Пожалуйста, посетите Linux.com для получения последних новостей и статей о Linux и open source.