В этой статье я покажу, как пересоб­рать Bodhi Linux 7.0 для сни­жения тре­бова­ний к опе­ратив­ной памяти на эта­пе заг­рузки в демонс­тра­цион­ном режиме или при уста­нов­ке. При этом фун­кци­ональ­ность совер­шенно не пос­тра­дает. Ты най­дешь здесь два сце­нария обо­лоч­ки, с помощью которых смо­жешь сде­лать то же самое с дру­гими дис­три­бути­вами, осно­ван­ными на Ubuntu 22.04 LTS. А в про­цес­се узна­ешь мно­го инте­рес­ного о Linux.
 

Из-за чего весь сыр-бор?

При­рода не тер­пит пус­тоты. Носите­ли информа­ции, хоть их емкость тоже рас­тет семимиль­ными шагами, не справ­ляют­ся с лавиной дан­ных, которая на них обру­шива­ется.

В кон­це девянос­тых компь­ютер с 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/initrd.gz теперь сос­тавля­ют 111 Мбайт + 340 Мбайт + 346 Мбайт = 797 Мбайт.

Эта угро­жающая тен­денция прив­лекла вни­мание чле­нов сооб­щес­тва Ubuntu, и резуль­таты про­веден­ных ими изыс­каний внед­рены в пос­леднем на дан­ный момент выпус­ке — Ubuntu 23.10. В это неп­росто поверить, но Ubuntu 23.10 Server стар­тует с дис­три­бутив­ного носите­ля на сис­теме с 384 Мбайт ОЗУ. Как уда­лось дос­тичь столь пот­ряса­юще­го резуль­тата?

 

И как это носят теперь?

Раз­работ­чики руководс­тво­вались тре­мя желани­ями:

  • из­бавить­ся от ошиб­ки «error: out of memory» на началь­ном эта­пе заг­рузки опе­раци­онной сис­темы;
  • умень­шить раз­мер заг­рузоч­ного раз­дела /boot;
  • ус­корить заг­рузку опе­раци­онной сис­темы.

Ис­сле­дова­тели быс­тро приш­ли к выводу, что клю­чевую роль тут игра­ет МФС, а имен­но ее раз­мер и спо­соб ком­понов­ки. Свой­ства алго­рит­ма сжа­тия осо­бен­но замет­ны на малоп­роиз­водитель­ных сис­темах с огра­ничен­ным объ­емом опе­ратив­ной памяти. В пос­тавках Ubuntu, начиная с вер­сии 22.04, для ком­прес­сии началь­ной кор­невой фай­ловой сис­темы initramfs исполь­зовал­ся метод zstd -1, пос­коль­ку zstd -19 ока­зал­ся слиш­ком мед­ленным для некото­рых вычис­литель­ных сис­тем. Таким обра­зом, обна­ружи­вает­ся про­тиво­речие: сжа­тие полез­но для того, что­бы сни­зить тре­бова­ния к объ­ему памяти и хра­нили­ща информа­ции, но вре­дит быс­трой заг­рузке сис­темы.

Что­бы раз­решить это про­тиво­речие, раз­работ­чики пред­ложили сжи­мать не всю МФС как еди­ницу хра­нения, а вхо­дящие в нее фай­лы модулей ядра с драй­верами устрой­ств и с исполь­зуемы­ми ими дво­ичны­ми дан­ными, каж­дый по отдель­нос­ти. В поль­зу такого решения говорят сле­дующие аргу­мен­ты. Для работы кон­крет­ной плат­формы нуж­ны лишь нес­коль­ко драй­веров из того обширно­го набора, который пос­тавля­ется в сос­таве дис­три­бути­ва. При заг­рузке опе­раци­онной сис­темы будут вос­тре­бова­ны и пот­ребу­ют рас­паков­ки лишь нес­коль­ко фай­лов из сос­тава МФС, а осталь­ные будут хра­нить­ся в ком­пак­тной фор­ме на слу­чай изме­нения кон­фигура­ции. К тому же для сжа­тия мож­но вос­поль­зовать­ся более ресур­соем­ким и эффектив­ным методом ком­прес­сии, потому что эта про­цеду­ра выпол­няет­ся однократ­но, а один раз мож­но и подож­дать.

Мо­дифи­циро­ван­ный вари­ант ком­понов­ки обра­за МФС casper/initrd.zst для дис­три­бути­ва Bodhi Linux 7.0 тре­бует в опе­ратив­ной памяти 97 Мбайт + 47 Мбайт + 126 Мбайт = 270 Мбайт.

Те­перь initrd сос­тоит не из трех, а из четырех час­тей. Пер­вые две — как и рань­ше — бинар­ные бло­ки с мик­рокода­ми для про­цес­соров AMD и Intel, помещен­ные в нес­жатые архи­вы cpio. А вот сле­дом за ними теперь идет еще один нес­жатый архив cpio, который содер­жит пред­варитель­но сжа­тые фай­лы с модуля­ми ядра и дво­ичны­ми дан­ными драй­веров устрой­ств. Зак­лючитель­ная часть пред­став­ляет собой сжа­тый архив cpio с той частью МФС, которая оста­лась пос­ле выноса из нее модулей ядра и фай­лов firmware.

Бла­года­ря тому что раз­мер сжа­той час­ти сущес­твен­но умень­шил­ся, для ее рас­паков­ки ста­ло тре­бовать­ся мень­ше буфер­ной опе­ратив­ной памяти. При­мене­ние к модулям ядра и фай­лам firmware более эффектив­ного метода сжа­тия спо­собс­тво­вало, помимо про­чего, умень­шению раз­мера фай­ла initrd. Как резуль­тат — сни­жение тре­бова­ний к опе­ратив­ной памяти на эта­пе заг­рузки с пол­ным сох­ранени­ем фун­кци­ональ­нос­ти, что наг­лядно демонс­три­рует­ся дис­три­бутив­ными носите­лями Ubuntu 23.10.

Как заглянуть в initrd

Ты, навер­ное, зна­ешь, что содер­жимое ISO-обра­зов удоб­но прос­матри­вать с помощью фай­лового менед­жера 7zFM.exe из пос­тавки ар­хивато­ра 7-Zip. Но его же мож­но исполь­зовать для ана­лиза содер­жимого обра­зов МФС. Надо толь­ко выб­рать файл initrd и вос­поль­зовать­ся пун­ктом меню «Файл — Открыть внут­ри #». Тог­да на панели отоб­разит­ся перечень его сос­тавных час­тей, каж­дую из которых мож­но открыть как обыч­но, нажав Enter.

Анализ содержимого файла initrd с помощью файлового менеджера 7zFM.exe
Ана­лиз содер­жимого фай­ла initrd с помощью фай­лового менед­жера 7zFM.exe

Ес­тес­твен­но, все опи­сан­ное про­изош­ло не само собой, а пот­ребова­ло уси­лий от раз­работ­чиков дис­три­бути­ва. Во‑пер­вых, для сжа­тия фай­лов с модуля­ми ядра при его сбор­ке в кон­фигура­ции дол­жны при­сутс­тво­вать сле­дующие парамет­ры:

# CONFIG_MODULE_COMPRESS_NONE is not set
CONFIG_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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии