В этой статье я покажу, как пересоб­рать 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 тре­бует­ся под­дер­жка на уров­не ядра. За чем же дело ста­ло? Заг­ружа­ем исходни­ки, выс­тавля­ем нуж­ные опции, запус­каем сбор­ку и идем пить кофе. Так‑то оно так, но есть нюанс.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

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

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

    Подписаться

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