ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Модульный initrd.img
@ 2018-05-06 16:55 Michael A. Kangin
  2018-05-06 18:25 ` Leonid Krivoshein
  0 siblings, 1 reply; 7+ messages in thread
From: Michael A. Kangin @ 2018-05-06 16:55 UTC (permalink / raw)
  To: devel

Здравствуйте!

Не секрет, хотя и не широкоизвестно, что популярные загрузчики позволяют 
указывать несколько cpio-образов, которые при загрузке будут объединены 
в памяти в единую initramfs.

Этим можно воспользоваться, и разделить текущий монолитный initrd.img на 
отдельные образы - собственно сам initrd, early-микрокод, и модули ядра 
[с фирмварью].

Зачем это может быть нужно?
- ускорение генерации новых initrd при установке нового ядра. Если 
микрокод и само тело initrd остаётся такими же, достаточно только 
быстренько слепить образ с новыми модулями.
- уменьшение суммарного размера микрокода / разных вариантов initrd / 
разных версий ядра. Например, мы выносим микрокод отдельным образом - и 
нам не нужно включать его в каждую новую версию initrd, которую мы 
делаем. Если мы генерим себе -debug initrd, то достаточно сделать 
крохотный diff-образ с bash / lsmod / whatever, а модули и основной 
initrd у нас уже есть. Мы можем предложить загрузить на выбор std-def и 
un-def, причём разница (кроме самих vmlinuz'ов) будет достаточно 
небольшая, архивы из десятка модулей ядра.
- возможность оперативно фиксить уже существующий initrd, добавив сбоку 
в отдельном образе или недостающий модуль, или конфиг там какой со скриптом.
- возможность полностью отвязать сам initrd от версии ядра. И иметь 
возможность загрузить систему с, например, RHEL-овским ядром, но нашим 
initrd, не ломая никакой совместимости.

Минимальная поддержка, необходимая в initrd для сторонних образов с 
модулями - вызов "depmod -a" перед загрузкой модулей, например, в стадии 
pre-udev. Если сторонние образы содержат что-то другое, то и поддержки 
особой не надо.

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

Вот пара вполне работающих примеров:

syslinux с семейством (iso, pxe):
=======================
LABEL test-modular-initrd
MENU LABEL Test modular initrd
KERNEL clb/vmlinuz
INITRD clb/microcode.img,clb/initrd-thin.img,clb/supermicro_boot.modules
APPEND root=http://xxxxx/rescue-base-sm.manifest rootdelay=5
=======================
Работает как с legacy bios, так и с uefi.

grub2:
=======================
...
echo    'Loading Linux 4.9.71-std-def-alt0.M80P.1 ...'
linux   /boot/vmlinuz-4.9.71-std-def-alt0.M80P.1 
root=UUID=a397ac93-3b06-4023-83e4-18b29a28b033 ro  quiet 
resume=/dev/disk/by-uuid/6481d48d-8403-4049-adfc-87e94b950361 panic=30 
splash
echo    'Loading initial ramdisk ...'
initrd  /boot/microcode.img 
/boot/initrd-4.9.71-std-def-alt0.M80P.1-thin.img /boot/modules.img
=======================
c uefi не пробовал.

Так же, не знаю, умеют ли это хитрые uefi-загрузчики типа refind'а.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] Модульный initrd.img
  2018-05-06 16:55 [devel] Модульный initrd.img Michael A. Kangin
@ 2018-05-06 18:25 ` Leonid Krivoshein
  2018-05-06 19:34   ` Michael A. Kangin
  0 siblings, 1 reply; 7+ messages in thread
From: Leonid Krivoshein @ 2018-05-06 18:25 UTC (permalink / raw)
  To: devel

Добрый вечер!


06.05.2018 19:55, Michael A. Kangin пишет:
> Здравствуйте!
>
> Не секрет, хотя и не широкоизвестно, что популярные загрузчики 
> позволяют указывать несколько cpio-образов, которые при загрузке будут 
> объединены в памяти в единую initramfs.
>

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


> Этим можно воспользоваться, и разделить текущий монолитный initrd.img 
> на отдельные образы - собственно сам initrd, early-микрокод, и модули 
> ядра [с фирмварью].
>

Если не ошибаюсь, ucode для initel/amd у нас тоже сейчас отделён. Цена 
вопроса в любом из вариантов -- выравнивание кусков по 4Кб границам, 
если не ошибаюсь, они склеиваются не встык, а должны выравниваться по 
границам размера страницы.


> Зачем это может быть нужно?
> - ускорение генерации новых initrd при установке нового ядра. Если 
> микрокод и само тело initrd остаётся такими же, достаточно только 
> быстренько слепить образ с новыми модулями.

Это значит капитально переделывать инструмент генерации initrd, другие 
дистрибутивные инструменты, которые это должны поддерживать. Ради чего? 
Так ли уж долго генерируется initrd? И ведь нужно ещё вести учёт того, 
что менялось, а что нет.


> - уменьшение суммарного размера микрокода / разных вариантов initrd / 
> разных версий ядра. Например, мы выносим микрокод отдельным образом - 
> и нам не нужно включать его в каждую новую версию initrd, которую мы 
> делаем. Если мы генерим себе -debug initrd, то достаточно сделать 
> крохотный diff-образ с bash / lsmod / whatever, а модули и основной 
> initrd у нас уже есть. Мы можем предложить загрузить на выбор std-def 
> и un-def, причём разница (кроме самих vmlinuz'ов) будет достаточно 
> небольшая, архивы из десятка модулей ядра.

Для решения конкретных задач всё равно будут пары ядро+initrd, а любые 
попытки приведут к небольшому увеличению конечного образа, но не наоборот.


> - возможность оперативно фиксить уже существующий initrd, добавив 
> сбоку в отдельном образе или недостающий модуль, или конфиг там какой 
> со скриптом.

Чтобы его оперативно пофиксить сейчас достаточно сказать make-initrd.


> - возможность полностью отвязать сам initrd от версии ядра. И иметь 
> возможность загрузить систему с, например, RHEL-овским ядром, но нашим 
> initrd, не ломая никакой совместимости.
>

make-initrd умеет класть в образ initramfs любые файлы и сейчас.


> Минимальная поддержка, необходимая в initrd для сторонних образов с 
> модулями - вызов "depmod -a" перед загрузкой модулей, например, в 
> стадии pre-udev. Если сторонние образы содержат что-то другое, то и 
> поддержки особой не надо.
>

Сейчас автоугадав взаимных зависимостей модулей работает на этапе 
генерации initrd. Чего же хорошего в переносе этой длительной операции 
на этап КАЖДОЙ (!) загрузки машины?


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

Так и сейчас чтобы сгенерировать initrd с определёнными фичами или 
наоборот, без них, достаточно подправить /etc/initrd.mk и сказать 
make-initrd. Именно так можно избавиться от плимута, к примеру.


> Вот пара вполне работающих примеров:
>
> syslinux с семейством (iso, pxe):
> =======================
> LABEL test-modular-initrd
> MENU LABEL Test modular initrd
> KERNEL clb/vmlinuz
> INITRD clb/microcode.img,clb/initrd-thin.img,clb/supermicro_boot.modules
> APPEND root=http://xxxxx/rescue-base-sm.manifest rootdelay=5
> =======================
> Работает как с legacy bios, так и с uefi.
>
> grub2:
> =======================
> ...
> echo    'Loading Linux 4.9.71-std-def-alt0.M80P.1 ...'
> linux   /boot/vmlinuz-4.9.71-std-def-alt0.M80P.1 
> root=UUID=a397ac93-3b06-4023-83e4-18b29a28b033 ro  quiet 
> resume=/dev/disk/by-uuid/6481d48d-8403-4049-adfc-87e94b950361 panic=30 
> splash
> echo    'Loading initial ramdisk ...'
> initrd  /boot/microcode.img 
> /boot/initrd-4.9.71-std-def-alt0.M80P.1-thin.img /boot/modules.img
> =======================
> c uefi не пробовал.
>
> Так же, не знаю, умеют ли это хитрые uefi-загрузчики типа refind'а.

Даже если не умеет загрузчик, куски можно склеить заранее. И получить 
всё тот же монолитный initrd. Но зачем? Ведь в конечном итоге для 
решения конкретной задачи эти куски попадают на обработку всё равно уже 
в склееном виде.


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] Модульный initrd.img
  2018-05-06 18:25 ` Leonid Krivoshein
@ 2018-05-06 19:34   ` Michael A. Kangin
  2018-05-06 23:50     ` Leonid Krivoshein
  0 siblings, 1 reply; 7+ messages in thread
From: Michael A. Kangin @ 2018-05-06 19:34 UTC (permalink / raw)
  To: devel

On 05/06/2018 08:25 PM, Leonid Krivoshein wrote:

>> Минимальная поддержка, необходимая в initrd для сторонних образов с
>> модулями - вызов "depmod -a" перед загрузкой модулей, например, в
>> стадии pre-udev. Если сторонние образы содержат что-то другое, то и
>> поддержки особой не надо.
> Сейчас автоугадав взаимных зависимостей модулей работает на этапе
> генерации initrd. Чего же хорошего в переносе этой длительной операции
> на этап КАЖДОЙ (!) загрузки машины?

Мне кажется, вы не вполне понимаете, о чём речь.
Не стоит называть вызов depmod -a "автоугадавом".
На паре десятков модулей в tmpfs он стремителен.

[root@host-161 o1]# time depmod -a -b .
0.00user 0.00system 0:00.01elapsed 90%CPU (0avgtext+0avgdata 
5660maxresident)k
0inputs+424outputs (0major+1324minor)pagefaults 0swaps


> Даже если не умеет загрузчик, куски можно склеить заранее. И получить
> всё тот же монолитный initrd. Но зачем? Ведь в конечном итоге для
> решения конкретной задачи эти куски попадают на обработку всё равно уже
> в склееном виде.

Потому что выбор конкретной задачи может быть сформулирован и предложен 
в меню загрузчика. А создавать по монолитному образу на каждый из 64 
(например) вариантов в многоуровневом меню - лишние затраты ресурсов на 
генерацию и хранение (дедупликацию) одного и того же многократно.

А в случае медленной сетевой загрузки (uefi c tftp, например) 
оказывается очень важным предоставить как можно меньший образ.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] Модульный initrd.img
  2018-05-06 19:34   ` Michael A. Kangin
@ 2018-05-06 23:50     ` Leonid Krivoshein
    0 siblings, 1 reply; 7+ messages in thread
From: Leonid Krivoshein @ 2018-05-06 23:50 UTC (permalink / raw)
  To: devel


06.05.2018 22:34, Michael A. Kangin пишет:
> On 05/06/2018 08:25 PM, Leonid Krivoshein wrote:
>
>>> Минимальная поддержка, необходимая в initrd для сторонних образов с
>>> модулями - вызов "depmod -a" перед загрузкой модулей, например, в
>>> стадии pre-udev. Если сторонние образы содержат что-то другое, то и
>>> поддержки особой не надо.
>> Сейчас автоугадав взаимных зависимостей модулей работает на этапе
>> генерации initrd. Чего же хорошего в переносе этой длительной операции
>> на этап КАЖДОЙ (!) загрузки машины?
>
> Мне кажется, вы не вполне понимаете, о чём речь.
> Не стоит называть вызов depmod -a "автоугадавом".
> На паре десятков модулей в tmpfs он стремителен.
>

Ключевое здесь -- "на паре десятков". И эту пару десятков вы хотите 
разделить на несколько отдельных initrd? :) В актуальном ядре модулей -- 
более 4400. Около 600Мб займёт генерируемый modules.dep, ещё более 700Мб 
modules.dep.bin. Понятно, что на паре десятков модулей, да ещё и на 
быстром процессоре, это может оказаться быстрее. Хотя 90% загрузка 
процессора и в/в даже в этом случае не ускоряет процесс запуска машины, 
а замедляет его. Под автоугадавом взаимных зависимостей модулей имелось 
ввиду брать не дистрибутивное, а строить зависимости заново -- этот 
процесс вынуждено выполняется на этапе make-initrd, потому что в образ 
попадают не все модули. Ваш модульный подход вынуждает переносить 
перестроение зависимостей на этап загрузки, если модули разложены по 
разным кускам.


> [root@host-161 o1]# time depmod -a -b .
> 0.00user 0.00system 0:00.01elapsed 90%CPU (0avgtext+0avgdata 
> 5660maxresident)k
> 0inputs+424outputs (0major+1324minor)pagefaults 0swaps
>
>
>> Даже если не умеет загрузчик, куски можно склеить заранее. И получить
>> всё тот же монолитный initrd. Но зачем? Ведь в конечном итоге для
>> решения конкретной задачи эти куски попадают на обработку всё равно уже
>> в склееном виде.
>
> Потому что выбор конкретной задачи может быть сформулирован и 
> предложен в меню загрузчика. А создавать по монолитному образу на 
> каждый из 64 (например) вариантов в многоуровневом меню - лишние 
> затраты ресурсов на генерацию и хранение (дедупликацию) одного и того 
> же многократно.
>

Так для реальной жизни в меню только те варианты, которые нужны. Ну и 
что, что есть пересечения по части сжатых initrd. Их куча устаревших всё 
равно на дисках валяется без надобности. Вы знаете много людей, которые 
пользуются remove-old-kernel? :)


> А в случае медленной сетевой загрузки (uefi c tftp, например) 
> оказывается очень важным предоставить как можно меньший образ.
>

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


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] Модульный initrd.img
  @ 2018-05-07 11:52           ` Michael A. Kangin
  2018-05-07 23:34             ` Leonid Krivoshein
  2018-05-07 22:56           ` [devel] Fwd: " Leonid Krivoshein
  1 sibling, 1 reply; 7+ messages in thread
From: Michael A. Kangin @ 2018-05-07 11:52 UTC (permalink / raw)
  To: devel

On 05/07/2018 10:42 AM, Leonid Krivoshein wrote:

> Вероятно Автоугадав здесь действительно не лучший термин, назовите его 
> Перестроителем или Построителем. :) На самом деле механизм 
> автоматического определения нужных модулей (страшный Автоугадав) большей 
> частью находится в самом ядре. И ему этот список зависимостей модулей в 
> определённый момент может потребоваться. 

Леонид, вы опять описываете это всё в очень странных терминах и 
понятиях. Я вам советую почитать маны на depmod, modules.dep, modprobe, 
для исключения путаницы, чтобы понимать, что для чего нужно.

И там нет НИКАКОГО "угадава", только списки экспортируемых и требуемых 
символов, как зависимости в RPM. Вы же деятельность apt-get update не 
называете автоугадавом?



> Чтобы перестроить (создать 
> заново) список зависимостей, нужно как минимум линейно пройтись по всем 
> заголовкам модулей, как минимум рекурсивно по всей директории с модулями 
> ядра. Для экономии времени на этапе начальной загрузки каждый модуль 
> ядра у нас пожат отдельно gzip'ом, сам же слой с модулями не пожат. На 
> этапе начальной загрузки ещё неизвестно, какие из модулей реально 
> потребуются, какие нет. Полный набор модулей (без фирмвари) -- это 
> порядка 75Мб в сжатом виде. 

Полный набор модулей, включая все звуковые карточки и графические 
планшетики, никто никогда не будет класть в initrd, они там не нужны.
Поэтому нижеследующие выкладки абсолютно бессмысленны.

Кроме того, я имел некоторый практический опыт по исследовательской 
загрузке многих типов хостов - виртуалки, сервера, тощие клиенты 
(включая допотопно-тормознутый Intel Atom) полным образом со всеми 
четыретыщ модулей. Задержка при загрузке от depmod не ощущается вообще 
никак, от слова "совсем", даже на вышуепомянутом атоме.
Гораздо и неизмеримо большее время уходит на прокачать такой 
бесмысленно-огромный образ по сети.

> На конкретной системе из этих 75Мб или 
> порядка 4450 модулей потребуется лишь 30-100 модулей.

Именно, это типичное количество модулей, оказывающееся в итоговой 
initramfs, буде она собрана из кусочков или из монолитного образа.
И переживать по поводу скорости отработки на них depmod абсолютно 
бессмысленно.

> При загрузке 
> модулей, их распаковка выполняется автоматически. А теперь запустим 
> depmod -a на максимально возможном наборе. Чтобы заглянуть в файл 
> модуля, придётся его сначала распаковать, если не целиком, то хотя бы 
> первый блок. И так по каждому из 4450 модулей, которые ещё неизвестно, 
> потребуются или нет. gzip не умеет делать это во много потоков, только в 
> один,

Используйте pigz



>>> Так ничто не мешает сгенерировать компактный монолитный образ сейчас, 
>>> не прибегая к модульности.
>> Совершенно логически верное высказывание. Как и обратное - ничто не 
>> мешает разбить функциональность по модулям сейчас, не прибегая к 
>> монолитности.
> 
> Пока что мешает отсутствие поддержки со стороны соответствующего 
> инструментария. И кто его будет переделывать ради сомнительной (пока 
> что) выгоды?

Нет, отсутствие поддержки абсолютно не мешает использовать при желании 
эту технологию уже сейчас, в режиме "заката солнца вручную". 
Разумеется, поддержка в make-initrd по формированию отдельных образов 
была бы конечно приятным бонусом по автоматизации, но она не обязательна.

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



>> Я тут подумал - даже поддержка depmod со стороны initrd не нужна. Эту 
>> depmod и дёргающий её скриптик тоже можно притащить сторонним модулем.
>> Надо будет еще подумать, мне понравилось. Захват initrd на абордаж!

-- 
Michael A. Kangin


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [devel] Fwd: Re:  Модульный initrd.img
    2018-05-07 11:52           ` Michael A. Kangin
@ 2018-05-07 22:56           ` Leonid Krivoshein
  1 sibling, 0 replies; 7+ messages in thread
From: Leonid Krivoshein @ 2018-05-07 22:56 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Перешлю сюда, чтоб нить не потерялась...


-------- Перенаправленное сообщение --------
Тема: 	Re: [devel] Модульный initrd.img
Дата: 	Mon, 7 May 2018 11:42:09 +0300
От: 	Leonid Krivoshein <klark.devel@gmail.com>
Кому: 	Michael A. Kangin <mak@complife.ru>



07.05.2018 04:22, Michael A. Kangin пишет:
> On 05/07/2018 01:50 AM, Leonid Krivoshein wrote:
>
>>> Мне кажется, вы не вполне понимаете, о чём речь.
>>> Не стоит называть вызов depmod -a "автоугадавом".
>>> На паре десятков модулей в tmpfs он стремителен.
>
>> Ключевое здесь -- "на паре десятков". И эту пару десятков вы хотите
>> разделить на несколько отдельных initrd? :)
>
> Мне вновь кажется, что вы не совсем понимаете, о чём идёт речь.
>
>> Около 600Мб займёт генерируемый modules.dep, ещё более 700Мб
>> modules.dep.bin.
>
> Это вам со страху показалось.
>

Да, там Кб, а не Мб. 580Кб + 772Кб = 1.4Мб


>> Понятно, что на паре десятков модулей, да ещё и на быстром
>> процессоре, это может оказаться быстрее. Хотя 90% загрузка процессора
>> и в/в даже в этом случае не ускоряет процесс запуска машины, а
>> замедляет его.
>
> Я понимаю ваше нетерпение. Каждая сотая секунды на счету.
>
>> Под автоугадавом взаимных зависимостей модулей имелось ввиду брать не
>> дистрибутивное, а строить зависимости заново
>
> Вы описываете деятельность depmod крайне странными терминами.
> depmod не строит/перестраивает зависимости, а создаёт список
> зависимостей. И использует для этого не страшного Афтоугадава и прочую
> магию поней, а информацию из самих файлов модулей. Если есть сомнения,
> загляните в ман.

Вероятно Автоугадав здесь действительно не лучший термин, назовите его
Перестроителем или Построителем. :) На самом деле механизм
автоматического определения нужных модулей (страшный Автоугадав) большей
частью находится в самом ядре. И ему этот список зависимостей модулей в
определённый момент может потребоваться. Чтобы перестроить (создать
заново) список зависимостей, нужно как минимум линейно пройтись по всем
заголовкам модулей, как минимум рекурсивно по всей директории с модулями
ядра. Для экономии времени на этапе начальной загрузки каждый модуль
ядра у нас пожат отдельно gzip'ом, сам же слой с модулями не пожат. На
этапе начальной загрузки ещё неизвестно, какие из модулей реально
потребуются, какие нет. Полный набор модулей (без фирмвари) -- это
порядка 75Мб в сжатом виде. На конкретной системе из этих 75Мб или
порядка 4450 модулей потребуется лишь 30-100 модулей. При загрузке
модулей, их распаковка выполняется автоматически. А теперь запустим
depmod -a на максимально возможном наборе. Чтобы заглянуть в файл
модуля, придётся его сначала распаковать, если не целиком, то хотя бы
первый блок. И так по каждому из 4450 модулей, которые ещё неизвестно,
потребуются или нет. gzip не умеет делать это во много потоков, только в
один, отсюда и 90% загрузки CPU. На моём 8-ми ядерном топовом Intel NUC
с 2xNVME в raid-0, 32Гб RAM и Core i7 циферки уже другие:

cd /lib/modules/`uname -r` && time depmod -an | wc -l

0:01.29elapsed 74%CPU
113512inputs + 0outputs
39155

На эти полторы секунды машинка взревела. Заметьте, даже в файл не
вывожу, только подсчитываю строки. Повторный запуск, когда все данные
уже в кэше? Да, немного меняют картину, но очень немного!

0:00.93elapsed 99%CPU
0inputs + 0outputs
39155

И это очень шустрая машинка, а представляете тормоза для большинства
более медленных машин? Речь пойдёт не о 1-1.5 секундах, а каждая секунда
на этапе начальной загрузки сами знаете на вес чего. :)


>
>> этот процесс вынуждено выполняется на этапе make-initrd, потому что в
>> образ попадают не все модули. Ваш модульный подход вынуждает
>> переносить перестроение зависимостей на этап загрузки, если модули
>> разложены по разным кускам.
>
> Ага, целая сотая доля секунды вынужденного "перестроения
> зависимостей". Меньше деления не нашлось, извините.
>

Всё зависит от скорости конкретной машины и обрабатываемого набора
модулей. А также того факта, пожаты они или нет, каким упаковщиком.


>>> 0.00user 0.00system 0:00.01elapsed 90%CPU (0avgtext+0avgdata
>
>
>> Так для реальной жизни в меню только те варианты, которые нужны. Ну и
>> что, что есть пересечения по части сжатых initrd. Их куча устаревших
>> всё равно на дисках валяется без надобности. Вы знаете много людей,
>> которые пользуются remove-old-kernel? :)
>
> Я глубоко уважаю право некоторых людей без надобности держать у себя
> на дисках кучу устаревших initrd.
>
>
>> Так ничто не мешает сгенерировать компактный монолитный образ сейчас,
>> не прибегая к модульности.
>
> Совершенно логически верное высказывание. Как и обратное - ничто не
> мешает разбить функциональность по модулям сейчас, не прибегая к
> монолитности.

Пока что мешает отсутствие поддержки со стороны соответствующего
инструментария. И кто его будет переделывать ради сомнительной (пока
что) выгоды?


> Я тут подумал - даже поддержка depmod со стороны initrd не нужна. Эту
> depmod и дёргающий её скриптик тоже можно притащить сторонним модулем.
> Надо будет еще подумать, мне понравилось. Захват initrd на абордаж!


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] Модульный initrd.img
  2018-05-07 11:52           ` Michael A. Kangin
@ 2018-05-07 23:34             ` Leonid Krivoshein
  0 siblings, 0 replies; 7+ messages in thread
From: Leonid Krivoshein @ 2018-05-07 23:34 UTC (permalink / raw)
  To: devel


07.05.2018 14:52, Michael A. Kangin пишет:
>> Чтобы перестроить (создать заново) список зависимостей, нужно как 
>> минимум линейно пройтись по всем заголовкам модулей, как минимум 
>> рекурсивно по всей директории с модулями ядра. Для экономии времени 
>> на этапе начальной загрузки каждый модуль ядра у нас пожат отдельно 
>> gzip'ом, сам же слой с модулями не пожат. На этапе начальной загрузки 
>> ещё неизвестно, какие из модулей реально потребуются, какие нет. 
>> Полный набор модулей (без фирмвари) -- это порядка 75Мб в сжатом виде. 
>
> Полный набор модулей, включая все звуковые карточки и графические 
> планшетики, никто никогда не будет класть в initrd, они там не нужны.

Однако выше вы же привели пример дистрибутива с ядром, где в initrd 
кладутся _ВСЕ_ модули. Это во-первых. Мы же не говорим только об одной 
задаче: собрать некий оптимальный initrd для конкретной машины из 30-100 
модулей, так? Иначе зачем тогда делить их на куски? Это во-вторых. 
Предварительный анализ решения задачи "чего всё-таки выкинуть, а что 
оставить" (да, теперь проще от обратного отталкиваться) как раз 
показывает, что выкинув звук (3.6Мб), графику, итп. из 75Мб можно 
сэкономить "копейки". Потом кто-то захочет плимут и разумеется 
потребуется графика. Потом другому понадобится бульканье на этапе 
загрузки, и придётся включать обратно звук. В общем, мне пока не очень 
верится, что такой оптимизацией стоит заниматься без ущерба чему-то, 
когда речь об универсальной загрузке. А кейсы они бывают разные. Это 
в-третьих.

Предупреждая вопрос, модули (75Мб) -- фигня, в сравнении с фирмварью. 
Там ещё под 300Мб набирается. Конечно, можно сказать "идите на фиг" всем 
пользователям Wi-Fi, IB, или просто разделить на варианты "all" и "most".


> Поэтому нижеследующие выкладки абсолютно бессмысленны.
>

Поэтому в приведённом кейсе полторы секунды на очень быстрой машине 
вашего depmod -a превратятся в 20 секунд или даже в 2 минуты на старой 
мегатормозной лошадке. Ну, никто так не делает!


> Кроме того, я имел некоторый практический опыт по исследовательской 
> загрузке многих типов хостов - виртуалки, сервера, тощие клиенты 
> (включая допотопно-тормознутый Intel Atom) полным образом со всеми 
> четыретыщ модулей. Задержка при загрузке от depmod не ощущается вообще 
> никак, от слова "совсем", даже на вышуепомянутом атоме.
> Гораздо и неизмеримо большее время уходит на прокачать такой 
> бесмысленно-огромный образ по сети.
>
>> На конкретной системе из этих 75Мб или порядка 4450 модулей 
>> потребуется лишь 30-100 модулей.
>
> Именно, это типичное количество модулей, оказывающееся в итоговой 
> initramfs, буде она собрана из кусочков или из монолитного образа.
> И переживать по поводу скорости отработки на них depmod абсолютно 
> бессмысленно.

Если в итоговый образ попадёт 30-100 модулей, значит initrd собирается 
для конкретной машины, и смысл тогда делить его на куски? А если не для 
конкретной, я рассматриваю другой крайний вариант именно потому, что это 
наш случай (универсальная загрузка), и мы ещё не знаем, какие из модулей 
могут потребоваться. Их в конечном итоге потребуется те же 30-100, 
только заранее неизвестно, каких именно. Если сложить в initrd все 
имеющиеся, depmod -a должен будет пройтись сначала по всем условно 
4450-плюс-минус, и не мгновенно, а распаковав каждый.


>
>> При загрузке модулей, их распаковка выполняется автоматически. А 
>> теперь запустим depmod -a на максимально возможном наборе. Чтобы 
>> заглянуть в файл модуля, придётся его сначала распаковать, если не 
>> целиком, то хотя бы первый блок. И так по каждому из 4450 модулей, 
>> которые ещё неизвестно, потребуются или нет. gzip не умеет делать это 
>> во много потоков, только в один,
>
> Используйте pigz
>

Вы это не мне говорите, а на kernel.org предложите. Ядро же этим 
занимается. В деплое я и так его активно использую. :)


>>>> Так ничто не мешает сгенерировать компактный монолитный образ 
>>>> сейчас, не прибегая к модульности.
>>> Совершенно логически верное высказывание. Как и обратное - ничто не 
>>> мешает разбить функциональность по модулям сейчас, не прибегая к 
>>> монолитности.
>>
>> Пока что мешает отсутствие поддержки со стороны соответствующего 
>> инструментария. И кто его будет переделывать ради сомнительной (пока 
>> что) выгоды?
>
> Нет, отсутствие поддержки абсолютно не мешает использовать при желании 
> эту технологию уже сейчас, в режиме "заката солнца вручную". 
> Разумеется, поддержка в make-initrd по формированию отдельных образов 
> была бы конечно приятным бонусом по автоматизации, но она не обязательна.
>
> Равно как и обратное - наличие в природе такой технологии никому не 
> мешает жить по старому и пользоваться монолитными образами.
>

Вот на этой ноте хотелось бы спор закончить. Потому что, если не 
изменяет память, нынешний make-initrd позволяет буквально парой строк в 
/etc/initrd.mk создать initrd с нужным вам наполнением без единого 
модуля. А дальше -- каждый сам себе злобный Буратино! :) Делайте любые 
куски с наборами модулей и фирмварью, благо есть depinfo, который теперь 
и softdeps учитывает. То есть смысл дальше спорить, если нынешняя 
технология никак не мешает вашим экспериментам?


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-05-07 23:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-06 16:55 [devel] Модульный initrd.img Michael A. Kangin
2018-05-06 18:25 ` Leonid Krivoshein
2018-05-06 19:34   ` Michael A. Kangin
2018-05-06 23:50     ` Leonid Krivoshein
2018-05-07 11:52           ` Michael A. Kangin
2018-05-07 23:34             ` Leonid Krivoshein
2018-05-07 22:56           ` [devel] Fwd: " Leonid Krivoshein

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git