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

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

    <bug>
          <bug_id>31351</bug_id>
          
          <creation_ts>2015-10-09 19:28:57 +0300</creation_ts>
          <short_desc>В copy_chroot_binaries() отсутствует проверка наличия необходимых библиотек</short_desc>
          <delta_ts>2015-10-14 19:04:10 +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>installer-scripts-remount-stage2</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>https://lists.altlinux.org/pipermail/devel/2015-October/200270.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>distro-blocker, patch, relnote</keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>21111</blocked>
    
    <blocked>30940</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="solo">solo</reporter>
          <assigned_to name="Michael Shigorin">mike</assigned_to>
          <cc>mike</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>153069</commentid>
    <comment_count>0</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-09 19:28:57 +0300</bug_when>
    <thetext>В функции copy_chroot_binaries(), определённая в /usr/sbin/install2-remount-functions (предоставляется пакетом installer-scripts-remount-stage2, см. http://git.altlinux.org/people/mike/packages/?p=installer-scripts-remount-stage2.git;a=blob;f=installer-scripts-remount-stage2/scripts/install2-remount-functions;h=c689af73bd0fb19ad22c80ca893d3b1e334962f0;hb=e119820712cab35620fd73c65bb79ddfda15daf6) отсутствует проверка наличия библиотек, необходимых для копируемых бинарников. В некоторых случаях это приводит к их неработоспособности (см. &lt;https://lists.altlinux.org/pipermail/devel/2015-October/200270.html&gt;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153070</commentid>
    <comment_count>1</comment_count>
    <who name="Michael Shigorin">mike</who>
    <bug_when>2015-10-09 21:16:26 +0300</bug_when>
    <thetext>Это, кстати, результат изменения графа зависимостей...
похоже, придётся тырить/применять код из make-initrd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153101</commentid>
    <comment_count>2</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-12 13:07:11 +0300</bug_when>
    <thetext>(В ответ на комментарий №1)
&gt; Это, кстати, результат изменения графа зависимостей...
&gt; похоже, придётся тырить/применять код из make-initrd.

А это идея: Похоже можно заменить вызов cp на вызов /usr/share/make-initrd/tools/put-file из make-initrd -- такой вариант обещает быть более красивым, чем то что у меня на рисовалось (см. http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=433c72492313dedde71fa783770a85b9f8eaf1bc). С учётом того, что put-file нужно будет вызывать в chroot`е алгоритм будет примерно такой:

1. Проверить, существует ли $destdir/usr/share/make-initrd/tools/put-file (если нет -- выводим предупреждение и ничего не делаем.

2. Создать временный каталог $destdir/tmp/installer.XXX

3. Смонтировать в $destdir/tmp/installer.XXX текущий корень:

mount --bind / $destdir/tmp/installer.XXX

4. Выполнить копирование необходимых файлов из $destdir в $destdir/tmp/installer.XXX, используя вызов put-file внутри chroot`а $destdir

5. Отмонтировать $destdir/tmp/installer.XXX

6. Удалить каталог $destdir/tmp/installer.XXX</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153103</commentid>
    <comment_count>3</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-12 15:04:05 +0300</bug_when>
    <thetext>Предлагаю такой вариант -- см. http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=93bb697665fec05f1f71bb33f9581ef7b8729aa3.

PS: chroot нужен для корректной обработки ldd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153127</commentid>
    <comment_count>4</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 15:41:14 +0300</bug_when>
    <thetext>(В ответ на комментарий №3)
&gt; Предлагаю такой вариант -- см.
&gt; http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=93bb697665fec05f1f71bb33f9581ef7b8729aa3.

Вариант работает, судя по тестам.

PS: Более красиво было бы:

1. Перенести /usr/share/make-initrd/tools/put-{file,tree} в /usr/bin.

2. Выделить в отдельный пакет (put-file, например).

3. Добавить скриптам ключ --from-chroot (что позволит избавиться от mount --bind и в chroot запускать только ldd).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153128</commentid>
    <comment_count>5</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 15:57:42 +0300</bug_when>
    <thetext>(В ответ на комментарий №4)
&gt; (В ответ на комментарий №3)
&gt; &gt; Предлагаю такой вариант -- см.
&gt; &gt; http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=93bb697665fec05f1f71bb33f9581ef7b8729aa3.
&gt; 
&gt; Вариант работает, судя по тестам.

Тестировал: http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commit;h=dffdf4874b933e93a6f0e9fd13899bc2a6622edc</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153131</commentid>
    <comment_count>6</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2015-10-13 16:16:15 +0300</bug_when>
    <thetext>installer-scripts-remount-stage2-0.5.2-alt2 -&gt; sisyphus:

* Tue Oct 13 2015 Aleksey Avdeev &lt;solo@altlinux&gt; 0.5.2-alt2
- Add copying the libraries necessary for binaries copied (ALT#31351).
  To copy using a script /usr/share/make-initrd/tools/put-file
  belonging to an installable distribution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153134</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Shigorin">mike</who>
    <bug_when>2015-10-13 17:14:14 +0300</bug_when>
    <thetext>Возможно, блокер bug 30940 стоило снять, хотя баг как таковой оставался:

cryptsetup - utility to setup a encrypted disks with LUKS support
* Thu Oct 08 2015 Gleb F-Malinovskiy &lt;glebfm@altlinux&gt; 1.6.8-alt2
- Replaced libpwquality with libpasswdqc.
* Tue Sep 08 2015 Alexey Shabalin &lt;shaba@altlinux&gt; 1.6.8-alt1

По части залитого пакета 0.5.2: Лёш, большая человеческая просьба пакеты моего авторства заливать всё же по согласованию, т.к. патч в текущем виде я так и не принял; прокомментирую здесь:

 copy_chroot_binaries() {
+       if [ ! -x &quot;$destdir$PUTFILE&quot; ]; then
+               echo &quot;remount: file does not exist or is not available for execution: $destdir$PUTFILE&quot; &gt;&amp;2
+               return
+       fi

Здесь ты теоретически ломаешь работу функции без веского повода вместо graceful degradation, когда при отсутствии более совершенного инструмента выбирается менее совершенный (другое дело, что в нынешнем установленном альтовом чруте с ядром make-initrd будет почти обязательно).

Этот кусок, вообще говоря, ломает логику и при добавлении -f это может выйти боком на ровном месте в некоторых случаях:

        if [ -f &quot;$destdir/etc/lvm/lvm.conf&quot; ]; then
-               mkdir -p /etc/lvm &amp;&amp;
-               cp -p &quot;$destdir/etc/lvm/lvm.conf&quot; /etc/lvm
+               echo &quot;remount: copying /etc/lvm/lvm.conf&quot; &gt;&amp;2
+               chroot &quot;$destdir&quot; &quot;$PUTFILE&quot; &quot;$workdir&quot; &quot;/etc/lvm/lvm.conf&quot; ||:
        fi

(ты потерял &amp;&amp;, а зачем именно для lvm.conf использовать put-file -- я лично так пока и не понял)

+       umount &quot;$binddir&quot;
+       rm -rf &quot;$binddir&quot;
 }
 
Вместо rm -rf напрашивается rmdir -- ты ведь перед монтированием делал пустой каталог :)

Т.е. вроде и без блокеров, а в угловых ситуациях разработки и применения ты нечаянно заложил несколько дополнительных мин и этого делать не следовало.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153135</commentid>
    <comment_count>8</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 17:36:02 +0300</bug_when>
    <thetext>(В ответ на комментарий №7)
&gt; Возможно, блокер bug 30940 стоило снять, хотя баг как таковой оставался:
&gt; 
&gt; cryptsetup - utility to setup a encrypted disks with LUKS support
&gt; * Thu Oct 08 2015 Gleb F-Malinovskiy &lt;glebfm@altlinux&gt; 1.6.8-alt2
&gt; - Replaced libpwquality with libpasswdqc.
&gt; * Tue Sep 08 2015 Alexey Shabalin &lt;shaba@altlinux&gt; 1.6.8-alt1
&gt; 
&gt; По части залитого пакета 0.5.2: Лёш, большая человеческая просьба пакеты моего
&gt; авторства заливать всё же по согласованию, т.к. патч в текущем виде я так и не
&gt; принял;

  Поторопился, приношу извения.

&gt; прокомментирую здесь:
&gt; 
&gt;  copy_chroot_binaries() {
&gt; +       if [ ! -x &quot;$destdir$PUTFILE&quot; ]; then
&gt; +               echo &quot;remount: file does not exist or is not available for
&gt; execution: $destdir$PUTFILE&quot; &gt;&amp;2
&gt; +               return
&gt; +       fi
&gt; 
&gt; Здесь ты теоретически ломаешь работу функции без веского повода вместо graceful
&gt; degradation, когда при отсутствии более совершенного инструмента выбирается
&gt; менее совершенный (другое дело, что в нынешнем установленном альтовом чруте с
&gt; ядром make-initrd будет почти обязательно).
&gt; 
&gt; Этот кусок, вообще говоря, ломает логику и при добавлении -f это может выйти
&gt; боком на ровном месте в некоторых случаях:
&gt; 
&gt;         if [ -f &quot;$destdir/etc/lvm/lvm.conf&quot; ]; then
&gt; -               mkdir -p /etc/lvm &amp;&amp;
&gt; -               cp -p &quot;$destdir/etc/lvm/lvm.conf&quot; /etc/lvm
&gt; +               echo &quot;remount: copying /etc/lvm/lvm.conf&quot; &gt;&amp;2
&gt; +               chroot &quot;$destdir&quot; &quot;$PUTFILE&quot; &quot;$workdir&quot; &quot;/etc/lvm/lvm.conf&quot; ||:
&gt;         fi
&gt; 
&gt; (ты потерял &amp;&amp;, а зачем именно для lvm.conf использовать put-file -- я лично
&gt; так пока и не понял)

  put-file корректно обрабатывает случай, если /etc/lvm/lvm.conf симлинк, cp (без -L) -- ловил за копированием симлинка.

&gt; 
&gt; +       umount &quot;$binddir&quot;
&gt; +       rm -rf &quot;$binddir&quot;
&gt;  }
&gt; 
&gt; Вместо rm -rf напрашивается rmdir -- ты ведь перед монтированием делал пустой
&gt; каталог :)
&gt; 
&gt; Т.е. вроде и без блокеров, а в угловых ситуациях разработки и применения ты
&gt; нечаянно заложил несколько дополнительных мин и этого делать не следовало.

OK, Сейчас доработаю.

PS: Доработку пакетом, или патчем?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153139</commentid>
    <comment_count>9</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 18:04:01 +0300</bug_when>
    <thetext>(В ответ на комментарий №8)
&gt; (В ответ на комментарий №7)
...
&gt; &gt; Этот кусок, вообще говоря, ломает логику и при добавлении -f это может выйти
&gt; &gt; боком на ровном месте в некоторых случаях:
&gt; &gt; 
&gt; &gt;         if [ -f &quot;$destdir/etc/lvm/lvm.conf&quot; ]; then
&gt; &gt; -               mkdir -p /etc/lvm &amp;&amp;
&gt; &gt; -               cp -p &quot;$destdir/etc/lvm/lvm.conf&quot; /etc/lvm
&gt; &gt; +               echo &quot;remount: copying /etc/lvm/lvm.conf&quot; &gt;&amp;2
&gt; &gt; +               chroot &quot;$destdir&quot; &quot;$PUTFILE&quot; &quot;$workdir&quot; &quot;/etc/lvm/lvm.conf&quot; ||:
&gt; &gt;         fi
&gt; &gt; 
&gt; &gt; (ты потерял &amp;&amp;, а зачем именно для lvm.conf использовать put-file -- я лично
&gt; &gt; так пока и не понял)

  Не понял, о добавлении какого -f идет речь. В остальном, смены логики не вижу:

Было: Попытка копирования (cp) выполнялась только если /etc/lvm создан или существует -- т. к. в противном случаи mkdir вернёт ошибку и &amp;&amp; не даст выполнить cp.

Стало: Если по каким-то причинам put-file не может создать /etc/lvm -- он обламывается, возвращая ошибку.

Т. е. в обоих вариантах в случаи невозможности создать /etc/lvm имеем отсуьсвие копирования $destdir/etc/lvm/lvm.conf и признак ошибки в $?.

Прошу указать на слом логики.

&gt; 
&gt;   put-file корректно обрабатывает случай, если /etc/lvm/lvm.conf симлинк, cp
&gt; (без -L) -- ловил за копированием симлинка.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153141</commentid>
    <comment_count>10</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 18:46:23 +0300</bug_when>
    <thetext>(В ответ на комментарий №8)
&gt; (В ответ на комментарий №7)
...
&gt; &gt; 
&gt; &gt; Т.е. вроде и без блокеров, а в угловых ситуациях разработки и применения ты
&gt; &gt; нечаянно заложил несколько дополнительных мин и этого делать не следовало.
&gt; 
&gt; OK, Сейчас доработаю.

  Доработанный вариант -- http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=260ce0d154daa337a01f20c7b11d0065a5e10771

&gt; 
&gt; PS: Доработку пакетом, или патчем?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153143</commentid>
    <comment_count>11</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-13 21:35:46 +0300</bug_when>
    <thetext>Прошу смотреть http://git.altlinux.org/tasks/151373/.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153154</commentid>
    <comment_count>12</comment_count>
    <who name="Michael Shigorin">mike</who>
    <bug_when>2015-10-14 17:25:19 +0300</bug_when>
    <thetext>(В ответ на комментарий №9)
&gt; Не понял, о добавлении какого -f идет речь.

#!/bin/sh -f (у нас порой производится устрожение скриптов, а тут последствия при таком стали бы зависимы от ситуации времени выполнения -- т.е. тестирование изменения могло бы не показать добавленной проблемы, которая потом могла вылезти фатальным сбоем инсталятора в ситуации, где ранее работало).

(В ответ на комментарий №10)
&gt; PS: Доработку пакетом, или патчем?
Обычно бывает удобней сперва отсмотреть и если что -- поправить (--amend), но на глаз теперь почти порядок; единственно что не понял: зачем делать put-file применительно к /etc/lvm/lvm.conf, оно же не должно быть бинарником -- или это ты механически переделал на put-file и второе вхождение cp? :)

PPS: по результатам теста будто работает; на всякий обрати внимание -- regular-server.iso у меня с таким пакетом встал (при этом /mnt/destination/sbin/lvm и прочие нужные скрипту бинари были скопированы в /sbin инсталятора и не имели выпадений по библиотекам, судя по ldd), но не смог загрузиться с lvm-ного корня: initrd не выполнил vgchange -ay, после ручного подъёма в lvm, монтирования в /root и exec /root/sbin/init установка загрузилась.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153155</commentid>
    <comment_count>13</comment_count>
    <who name="Michael Shigorin">mike</who>
    <bug_when>2015-10-14 17:25:34 +0300</bug_when>
    <thetext>В смысле закидывай.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153156</commentid>
    <comment_count>14</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-14 18:47:49 +0300</bug_when>
    <thetext>(В ответ на комментарий №12)
&gt; (В ответ на комментарий №9)
&gt; &gt; Не понял, о добавлении какого -f идет речь.
&gt; 
&gt; #!/bin/sh -f (у нас порой производится устрожение скриптов, а тут последствия
&gt; при таком стали бы зависимы от ситуации времени выполнения -- т.е. тестирование
&gt; изменения могло бы не показать добавленной проблемы, которая потом могла
&gt; вылезти фатальным сбоем инсталятора в ситуации, где ранее работало).

  Судя по man sh, при sh -f поведение измениться не должно, т. к. нет автодополнение имён файлов (что -f отключает) не используется. А вот при sh -e поведение изменено: сделана маскировка кода возврата при ошибках (через ||:), т. к. требуется корректно отмонтировать примонтированное.

&gt; 
&gt; (В ответ на комментарий №10)
&gt; &gt; PS: Доработку пакетом, или патчем?
&gt; Обычно бывает удобней сперва отсмотреть и если что -- поправить (--amend), но
&gt; на глаз теперь почти порядок; единственно что не понял: зачем делать put-file
&gt; применительно к /etc/lvm/lvm.conf, оно же не должно быть бинарником -- или это
&gt; ты механически переделал на put-file и второе вхождение cp? :)

  Не, специально:

1. Мне нравиться как put-file обрабатывает симлинки -- при копировании структуры вида &lt;симлинк&gt; -&gt; &lt;файл&gt; она воссоздаётся.

2. Можно выкинуть mkdir.

3. Однообразие.

  На самом деле, если положиться исключительно на put-file, то суть copy_chroot_binaries() можно сократить до:

copy_chroot_binaries() {
	binddir=&quot;$(mktemp -d &quot;$destdir/tmp/copy_chroot_binaries.XXXXXXXXX&quot;)&quot;
	workdir=&quot;${binddir#$destdir}&quot;
	mount --bind / &quot;$binddir&quot;

	chroot &quot;$destdir&quot; &quot;$PUTFILE&quot; &quot;$workdir&quot; &quot;$MDADM&quot; &quot;$LVM&quot; &quot;$CRYPTSETUP&quot; /etc/lvm/lvm.conf ||:

	umount &quot;$binddir&quot;
	rmdir &quot;$binddir&quot;
}

т. к. put-file практически все необходимые проверки выполняет.

&gt; 
&gt; PPS: по результатам теста будто работает; на всякий обрати внимание --
&gt; regular-server.iso у меня с таким пакетом встал (при этом
&gt; /mnt/destination/sbin/lvm и прочие нужные скрипту бинари были скопированы в
&gt; /sbin инсталятора и не имели выпадений по библиотекам, судя по ldd), но не смог
&gt; загрузиться с lvm-ного корня: initrd не выполнил vgchange -ay, после ручного
&gt; подъёма в lvm, монтирования в /root и exec /root/sbin/init установка
&gt; загрузилась.

Для информации: у меня в системе поставленной с того инсталлятора, который я сейчас мучаю (пакет с предлагаемыми правками там всегда) LVM автоматом стартует. Но там у меня systemd (по ТЗ он там нужен).


(В ответ на комментарий №13)
&gt; В смысле закидывай.

OK. Закинул.

Но после -- нашёл ляп... Прошу смотреть очередной фикс http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=7c26c2ff301304cc0988590fad5990918be2d612. Там возвращается потерянная скобка:

-       if -n &quot;$useputfile&quot; ]; then
+       if [ -n &quot;$useputfile&quot; ]; then</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153157</commentid>
    <comment_count>15</comment_count>
    <who name="solo">solo</who>
    <bug_when>2015-10-14 18:57:53 +0300</bug_when>
    <thetext>(В ответ на комментарий №14)
...
&gt; 
&gt; Но после -- нашёл ляп... Прошу смотреть очередной фикс
&gt; http://git.altlinux.org/people/solo/packages/installer-scripts-remount-stage2.git?p=installer-scripts-remount-stage2.git;a=commitdiff;h=7c26c2ff301304cc0988590fad5990918be2d612.
&gt; Там возвращается потерянная скобка:
&gt; 
&gt; -       if -n &quot;$useputfile&quot; ]; then
&gt; +       if [ -n &quot;$useputfile&quot; ]; then

Прошу пропуска для installer-scripts-remount-stage2-0.5.4-alt1 (см. http://git.altlinux.org/tasks/151413/logs/events.1.1.log).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153158</commentid>
    <comment_count>16</comment_count>
    <who name="Michael Shigorin">mike</who>
    <bug_when>2015-10-14 19:04:10 +0300</bug_when>
    <thetext>(В ответ на комментарий №14)
&gt; &gt; &gt; Не понял, о добавлении какого -f идет речь.
&gt; &gt; #!/bin/sh -f

В смысле -e, конечно.

&gt; &gt; ты механически переделал на put-file и второе вхождение cp? :)
&gt;   Не, специально:

А.

&gt; На самом деле, если положиться исключительно на put-file, то суть
&gt; copy_chroot_binaries() можно сократить до:

У нас пока есть mkinitrd (хоть уже и не поддерживается, но в некоторых армовых образах задействовалось).

&gt; (В ответ на комментарий №13)
&gt; &gt; В смысле закидывай.
&gt; OK. Закинул. Но после -- нашёл ляп... Прошу смотреть очередной фикс

Что самое смешное, я его тоже проморгал, читая дифф.  Закидывай, конечно.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>