Содержание статьи
Из-за чего весь сыр-бор?
Природа не терпит пустоты. Носители информации, хоть их емкость тоже растет семимильными шагами, не справляются с лавиной данных, которая на них обрушивается.
В конце девяностых компьютер с 32 Мбайт оперативной памяти и диском на 3,2 Гбайт был типичным инструментом офисного работника и мечтой студента. Сегодня трудно удивить компьютером, характеристики которого в 1000 раз выше, но который по‑прежнему работает на пределе своих возможностей.
Частично это объясняется новым уровнем сложности решаемых задач, но иногда встречаются ограничения, которым трудно найти оправдание.
Чуть больше года назад в статье «Linux на диете. Уменьшаем требования Bodhi Linux к оперативной памяти» я описал проблему некоторых дистрибутивов: при загрузке Linux использует минимальную файловую систему (МФС), сжатый образ которой загружается в оперативную память, в ней же разжимается, после чего еще копируется в начальную корневую файловую систему, тоже хранящуюся в оперативной памяти. И для всей этой акробатики памяти требуется больше, чем для обычной работы операционной системы.
Больше всего памяти занимают драйверы устройств (преимущественно — сетевых и видеоадаптеров) и двоичные файлы, используемые ими (микропрограммы и прошивки).
Исключив эти компоненты из МФС, можно установить Bodhi Linux 6.0, основанный на Ubuntu 20.04 LTS, на компьютер с 512 Мбайт ОЗУ (тогда как изначально требовалось 768 Мбайт). Ты потеряешь только анимированную заставку и возможность загрузки по сети. Некритично, но правильное решение проблемы по Альтшуллеру должно сохранять функциональность системы как минимум в объеме первоначального замысла.
Тем временем плохо поддающееся контролю распухание образа МФС набирает обороты с выходом новых устройств: нужны все новые и новые драйверы для их поддержки. Новой версии Bodhi Linux 7.0, которая основана на Ubuntu 22.04 LTS, для загрузки с официального дистрибутивного носителя уже не хватает 768 Мбайт! Ничего удивительного: суммарные требования к оперативной памяти при подготовке МФС casper/
теперь составляют 111 Мбайт + 340 Мбайт + 346 Мбайт = 797 Мбайт.
Эта угрожающая тенденция привлекла внимание членов сообщества Ubuntu, и результаты проведенных ими изысканий внедрены в последнем на данный момент выпуске — Ubuntu 23.10. В это непросто поверить, но Ubuntu 23.10 Server стартует с дистрибутивного носителя на системе с 384 Мбайт ОЗУ. Как удалось достичь столь потрясающего результата?
И как это носят теперь?
Разработчики руководствовались тремя желаниями:
- избавиться от ошибки «error: out of memory» на начальном этапе загрузки операционной системы;
- уменьшить размер загрузочного раздела
/
;boot - ускорить загрузку операционной системы.
Исследователи быстро пришли к выводу, что ключевую роль тут играет МФС, а именно ее размер и способ компоновки. Свойства алгоритма сжатия особенно заметны на малопроизводительных системах с ограниченным объемом оперативной памяти. В поставках Ubuntu, начиная с версии 22.04, для компрессии начальной корневой файловой системы initramfs использовался метод zstd
, поскольку zstd
оказался слишком медленным для некоторых вычислительных систем. Таким образом, обнаруживается противоречие: сжатие полезно для того, чтобы снизить требования к объему памяти и хранилища информации, но вредит быстрой загрузке системы.
Чтобы разрешить это противоречие, разработчики предложили сжимать не всю МФС как единицу хранения, а входящие в нее файлы модулей ядра с драйверами устройств и с используемыми ими двоичными данными, каждый по отдельности. В пользу такого решения говорят следующие аргументы. Для работы конкретной платформы нужны лишь несколько драйверов из того обширного набора, который поставляется в составе дистрибутива. При загрузке операционной системы будут востребованы и потребуют распаковки лишь несколько файлов из состава МФС, а остальные будут храниться в компактной форме на случай изменения конфигурации. К тому же для сжатия можно воспользоваться более ресурсоемким и эффективным методом компрессии, потому что эта процедура выполняется однократно, а один раз можно и подождать.
Модифицированный вариант компоновки образа МФС casper/
для дистрибутива Bodhi Linux 7.0 требует в оперативной памяти 97 Мбайт + 47 Мбайт + 126 Мбайт = 270 Мбайт.
Теперь initrd состоит не из трех, а из четырех частей. Первые две — как и раньше — бинарные блоки с микрокодами для процессоров AMD и Intel, помещенные в несжатые архивы cpio. А вот следом за ними теперь идет еще один несжатый архив cpio, который содержит предварительно сжатые файлы с модулями ядра и двоичными данными драйверов устройств. Заключительная часть представляет собой сжатый архив cpio с той частью МФС, которая осталась после выноса из нее модулей ядра и файлов firmware.
Благодаря тому что размер сжатой части существенно уменьшился, для ее распаковки стало требоваться меньше буферной оперативной памяти. Применение к модулям ядра и файлам firmware более эффективного метода сжатия способствовало, помимо прочего, уменьшению размера файла initrd. Как результат — снижение требований к оперативной памяти на этапе загрузки с полным сохранением функциональности, что наглядно демонстрируется дистрибутивными носителями Ubuntu 23.10.
Как заглянуть в initrd
Ты, наверное, знаешь, что содержимое ISO-образов удобно просматривать с помощью файлового менеджера 7zFM.
из поставки архиватора 7-Zip. Но его же можно использовать для анализа содержимого образов МФС. Надо только выбрать файл initrd и воспользоваться пунктом меню «Файл — Открыть внутри #». Тогда на панели отобразится перечень его составных частей, каждую из которых можно открыть как обычно, нажав Enter.
Естественно, все описанное произошло не само собой, а потребовало усилий от разработчиков дистрибутива. Во‑первых, для сжатия файлов с модулями ядра при его сборке в конфигурации должны присутствовать следующие параметры:
# CONFIG_MODULE_COMPRESS_NONE is not setCONFIG_MODULE_COMPRESS_ZSTD=Y
Во‑вторых, для обеспечения подгрузки сжатых бинарных файлов firmware конфигурация ядра должна включать такие параметры:
CONFIG_FW_LOADER_PAGED_BUF=Y
CONFIG_FW_LOADER_COMPRESS=Y
CONFIG_FW_LOADER_COMPRESS_ZSTD=Y
В‑третьих, поддержка этой технологии должна быть реализована в сценарии из initramfs-tools
, который формирует образ МФС.
Остается только порадоваться за счастливых обладателей Ubuntu 23.10, которые получили все перечисленные доработки прямо «из коробки». Но как быть тем, кто предпочитает стабильность и ориентируется на LTS-дистрибутивы с длительным временем поддержки? Ждать следующего выпуска? Практика показывает, что в случае Bodhi Linux это может затянуться на долгие годы... А давай попробуем доработать дистрибутив своими силами! В конце концов, тот, кто сам пилит свои дрова, согревается дважды. Путь намечен, осталось сделать первый шаг. Как там у классиков? «Вижу цель, не вижу препятствий!..»
Что у нас с ядром?
Итак, для работы механизмов сжатия файлов модулей и firmware требуется поддержка на уровне ядра. За чем же дело стало? Загружаем исходники, выставляем нужные опции, запускаем сборку и идем пить кофе. Так‑то оно так, но есть нюанс.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»