<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>34985</bug_id>
          
          <creation_ts>2018-06-04 23:16:01 +0300</creation_ts>
          <short_desc>make-initrd feature request для тестирования модулей</short_desc>
          <delta_ts>2019-11-04 14:36:35 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>make-initrd</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vitaly Chikunov">vt</reporter>
          <assigned_to name="Alexey Gladkov">legion</assigned_to>
          <cc>antohami</cc>
    
    <cc>boyarsh</cc>
    
    <cc>glebfm</cc>
    
    <cc>ldv</cc>
    
    <cc>legion</cc>
    
    <cc>placeholder</cc>
    
    <cc>shaba</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>171565</commentid>
    <comment_count>0</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-04 23:16:01 +0300</bug_when>
    <thetext>Внешним модулям ядра необходимо тестирование, которое не может произойти в хешере под юзером, поэтому есть идея создавать тестовое окружение в initrd и запускать его через qemu.

Для этого в make-initrd не хватает или не удобно сделано:

- Необходима возможность запуска make-initrd под юзером (скажем при опции --no-checks). Сейчас приходится подменять id на echo 0. (Пермишены на чтение /boot и /lib/modules будут сделаны rpm-build-kernel-perms хелпером, depmod отключен --no-depmod.)

- Необходима возможность добавлять внешние модули в initrd, находящиеся в произвольных дирах. Сейчас приходится класть модуль в /usr/src/mod/ и в confik.mk писать

KERNEL_MODULES = /usr/src/mod
MODULES_ADD += xt_so.ko

тогда make-initrd находит, что у xt_so.ko есть зависимость x_tables и добавляет его. Однако, всё равно внутри initrd нельзя загрузить модуль так как там нет insmod, а modules.* не содержит упоминаний для xt_so.ko. Поэтому нельзя использовать modprobe. Я ещё даже не придумал как это решить.

Я думал над вариантом сделать user readable/writabe копию /lib/modules (скажем в /usr/srs/lib/), но make-initrd не поддерживает смену basedir.

- Неудобно, что depinfo требуются modules.*.bin для работы, приходится вставлять их генерацию в хелпер.

- PUT_DIRS добавляет диру стрипая префикс, а PUT_FILES оставляя, было бы удобнее, чтоб можно было указать в какое место initrd класть диру/файл. Хочется положить бинарник модуля не в произвольную диру, а в /lib/modules/*/misc (или extra/).

- Нельзя положить в iproute2&apos;s бинарник ip через PUT_PROGS, его перекрывает busybox. (Он нужен чтоб сделать &quot;сеть&quot; через veth.)

- PUT_PROGS не может полностью добавить бинарник iptables так как не видит, что ему требуется /lib*/iptables/. Впрочем, это можно пофиксить через PUT_FILES += /lib*/iptables/*.so

- Не помешала бы feature запускающая фиксированный скрипт (точка входа в тесты) и после этого делающая shutdown системе, без таймаутов и прочего.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171596</commentid>
    <comment_count>1</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2018-06-05 17:43:21 +0300</bug_when>
    <thetext>(В ответ на комментарий №0)
&gt; Внешним модулям ядра необходимо тестирование, которое не может произойти в
&gt; хешере под юзером, поэтому есть идея создавать тестовое окружение в initrd и
&gt; запускать его через qemu.
&gt; 
&gt; Для этого в make-initrd не хватает или не удобно сделано:
&gt; 
&gt; - Необходима возможность запуска make-initrd под юзером (скажем при опции
&gt; --no-checks). Сейчас приходится подменять id на echo 0. (Пермишены на чтение
&gt; /boot и /lib/modules будут сделаны rpm-build-kernel-perms хелпером, depmod
&gt; отключен --no-depmod.)

Ок. Это можно сделать.

&gt; - Необходима возможность добавлять внешние модули в initrd, находящиеся в
&gt; произвольных дирах. Сейчас приходится класть модуль в /usr/src/mod/ и в
&gt; confik.mk писать
&gt; 
&gt; KERNEL_MODULES = /usr/src/mod
&gt; MODULES_ADD += xt_so.ko
&gt; 
&gt; тогда make-initrd находит, что у xt_so.ko есть зависимость x_tables и добавляет
&gt; его. Однако, всё равно внутри initrd нельзя загрузить модуль так как там нет
&gt; insmod, а modules.* не содержит упоминаний для xt_so.ko. Поэтому нельзя
&gt; использовать modprobe. Я ещё даже не придумал как это решить.

Потому что depmod создаёт их только в /lib/modules/KVERSION. Позтому нет смысла менять путь в initrd.

&gt; Я думал над вариантом сделать user readable/writabe копию /lib/modules (скажем
&gt; в /usr/srs/lib/), но make-initrd не поддерживает смену basedir.

Сделайте /lib/modules user writabe.

&gt; - Неудобно, что depinfo требуются modules.*.bin для работы, приходится
&gt; вставлять их генерацию в хелпер.

Он использует libkmod. Это libkmod их использует.

&gt; - PUT_DIRS добавляет диру стрипая префикс, а PUT_FILES оставляя, было бы
&gt; удобнее, чтоб можно было указать в какое место initrd класть диру/файл. Хочется
&gt; положить бинарник модуля не в произвольную диру, а в /lib/modules/*/misc (или
&gt; extra/).

PUT_DIRS/PUT_FILES -- это хэлперы у которых есть определённый сюзкейс. Они нужны, чтобы просто добавлять файлы в образ. Для более сложных случаев они не подходят. Придумывать язык в этом месте будет неправильно. Если хочется что-то положить под другим именем, то это можно сделать в соответствующей цели без врапперов.

&gt; - Нельзя положить в iproute2&apos;s бинарник ip через PUT_PROGS, его перекрывает
&gt; busybox. (Он нужен чтоб сделать &quot;сеть&quot; через veth.)

Да, так было задумано. Раньше это не мешало. Как быстрое решение ip можно положить в другой каталог.

&gt; - PUT_PROGS не может полностью добавить бинарник iptables так как не видит, что
&gt; ему требуется /lib*/iptables/. Впрочем, это можно пофиксить через PUT_FILES +=
&gt; /lib*/iptables/*.so

Это так и должно быть. Такие вещи на совести кладущего что-то в образ.

&gt; - Не помешала бы feature запускающая фиксированный скрипт (точка входа в тесты)
&gt; и после этого делающая shutdown системе, без таймаутов и прочего.

Положите в образ /sbin/init-bin с своим содержимым и этот файл заменит init в образе. Этим пользуется make-initrd-propagator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171600</commentid>
    <comment_count>2</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-05 18:03:40 +0300</bug_when>
    <thetext>Спасибо за ответ.

(В ответ на комментарий №1)
&gt; &gt; - Не помешала бы feature запускающая фиксированный скрипт (точка входа в тесты)
&gt; &gt; и после этого делающая shutdown системе, без таймаутов и прочего.
&gt; 
&gt; Положите в образ /sbin/init-bin с своим содержимым и этот файл заменит init в
&gt; образе. Этим пользуется make-initrd-propagator.

Ок, но oneshot feature была бы предпочтительнее, чтоб не делать работу init
самому (держать такой ALT-specific скрипт инициализации в upstream мало
смысла). Хотя, может так и лучше.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171601</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2018-06-05 18:49:24 +0300</bug_when>
    <thetext>(В ответ на комментарий №2)
&gt; &gt; Положите в образ /sbin/init-bin с своим содержимым и этот файл заменит init в
&gt; &gt; образе. Этим пользуется make-initrd-propagator.
&gt; 
&gt; Ок, но oneshot feature была бы предпочтительнее, чтоб не делать работу init
&gt; самому (держать такой ALT-specific скрипт инициализации в upstream мало
&gt; смысла). Хотя, может так и лучше.

Файл /sbin/init-bin не ALT-specific. Недавно это было настоящим init&apos;ом и частью системы инициализации, а модуль make-initrd-propagator это заабьюзил, чтобы подменить init на себя. Я не хотел такого, но раз уж так случилось, то пусть уж используется.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171613</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2018-06-06 01:48:15 +0300</bug_when>
    <thetext>При тестирования использую вот такую фичу/хак:

/people/legion/packages/make-initrd-hacker.git

для установленных в систему ядер. Для апстримных ядер и тестирования патчей к нему это несовсем подходит и я использую другой инструмент.

Для этой фичи я использую скрипт:

$ cat ./run-unfsd
/usr/sbin/unfsd -e &quot;$cwd/exports&quot; -d -n 9000 -m 9001 -p

$ cat &quot;$cwd/exports&quot;
/ 127.0.0.1(rw,insecure)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171615</commentid>
    <comment_count>5</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-06 02:00:22 +0300</bug_when>
    <thetext>(In reply to comment #4)
&gt; При тестирования использую вот такую фичу/хак:

Спасибо!

ps. Пытались заюзать 9p virtfs qemu, для того, чтоб загрузить &quot;полную&quot; систему из того что установлено в хешере (идея glebfm). Не вышло, так как при security_model=mapped-file - не работают симлинки, а без - всё равно не хватает пермишенов. Буду ещё думать на эту тему, чтоб расширить возможности тестирования в хешере под реальным рутом.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171621</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2018-06-06 10:54:12 +0300</bug_when>
    <thetext>(В ответ на комментарий №5)
&gt; (In reply to comment #4)
&gt; &gt; При тестирования использую вот такую фичу/хак:
&gt; 
&gt; Спасибо!
&gt; 
&gt; ps. Пытались заюзать 9p virtfs qemu, для того, чтоб загрузить &quot;полную&quot; систему
&gt; из того что установлено в хешере (идея glebfm). Не вышло, так как при
&gt; security_model=mapped-file - не работают симлинки, а без - всё равно не хватает
&gt; пермишенов. Буду ещё думать на эту тему, чтоб расширить возможности
&gt; тестирования в хешере под реальным рутом.

Для разработки ядра использую 9p и qemu, но без хэшера. Я сделал корманный враппер для Кирилла Шутемова:

https://github.com/legionus/vm

Он позволяет запускать ядро из дерева исходников с доступом к хостовой файловой системе откуда я запускаю тесты. Собственно make-initrd-hacher делает тоже самое, но на nfs, а vm у меня остался как запускалка тестов.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>185299</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2019-11-04 14:36:35 +0300</bug_when>
    <thetext>То что я обещал сделать вроде уже сделано и в сизифе.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>