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

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

    <bug>
          <bug_id>39178</bug_id>
          
          <creation_ts>2020-11-02 22:11:56 +0300</creation_ts>
          <short_desc>make-initrd does not include necessary libraries when building image for m-p&apos;s VM aarch64 target</short_desc>
          <delta_ts>2021-04-14 14:10:40 +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>qemu</component>
          <version>unstable</version>
          <rep_platform>x86_64</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>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Pavel Nakonechnyi">zorg</reporter>
          <assigned_to name="Alexey Shabalin">shaba</assigned_to>
          <cc>antohami</cc>
    
    <cc>asheplyakov</cc>
    
    <cc>boyarsh</cc>
    
    <cc>glebfm</cc>
    
    <cc>iv</cc>
    
    <cc>jqt4</cc>
    
    <cc>legion</cc>
    
    <cc>mike</cc>
    
    <cc>shaba</cc>
    
    <cc>sin</cc>
    
    <cc>vt</cc>
    
    <cc>zerg</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>193712</commentid>
    <comment_count>0</comment_count>
    <who name="Pavel Nakonechnyi">zorg</who>
    <bug_when>2020-11-02 22:11:56 +0300</bug_when>
    <thetext>Ниже, целевая архитектура aarch64, хост -- x86_64.

make-initrd, будучи вызван в процессе сборки VM образа инструментом mkimage-profiles (см. features.in/build-vm/image-scripts.d/17-kernel), не добавляет необходимых библиотек. Из-за этого полученная система оказывается неспособной загрузиться.

Простой способ воспроизвести проблему наверное не предложу. Скорее всего достаточно создать минимальный chroot для целевой архитектуры и сгенерировать образ initrd в нем.


Пример проблемного результата:

$ sudo initrd-ls initrd-4.14.98-pico-imx8mq-alt3.img | grep &quot;\./lib64&quot; | awk &apos;{ print $11; }&apos;
./lib64
./lib64/libz.so.1.2.11
./lib64/libz.so.1
./lib64/libselinux.so.1
./lib64/libresolv.so.2
./lib64/libresolv-2.30.so
./lib64/libpthread.so.0
./lib64/libpthread-2.30.so
./lib64/libpcre.so.3.15.12
./lib64/libpcre.so.3
./lib64/libnss_files.so.2
./lib64/libnss_files-2.30.so
./lib64/libnss_dns.so.2
./lib64/libnss_dns-2.30.so
./lib64/libmount.so.1.1.0
./lib64/libmount.so.1
./lib64/liblzma.so.5.2.5
./lib64/liblzma.so.5
./lib64/libkmod.so.2.3.5
./lib64/libkmod.so.2
./lib64/libgcc_s.so.1
./lib64/libdl.so.2
./lib64/libdl-2.30.so
./lib64/libcrypto.so.1.1
./lib64/libc.so.6
./lib64/libc-2.30.so
./lib64/libblkid.so.1.1.0
./lib64/libblkid.so.1
./lib64/libacl.so.1.1.2253
./lib64/libacl.so.1
./lib64/ld-linux-aarch64.so.1
./lib64/ld-2.30.so

В моем случае потребовалось вручную (через PUT_FILES) добавить следующие файлы:

/lib64/libreadline.so.7.0 /lib64/libreadline.so.7 /lib64/libtinfo.so.5.9 /lib64/libtinfo.so.5 /lib64/libcryptsetup.so.12.6.0 /lib64/libcryptsetup.so.12 /lib64/libcrypt.so.1.1.0 /lib64/libcrypt.so.1 /lib64/libsmartcols.so.1.1.0 /lib64/libsmartcols.so.1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193713</commentid>
    <comment_count>1</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2020-11-02 23:06:05 +0300</bug_when>
    <thetext>make-initrd использует ldd из хост-системы поэтому не может создать initrd для другой архитектуры. Возможно в будущем поддержка кросс-создания образов появится, но сейчас такой поддержки нет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197645</commentid>
    <comment_count>2</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-04-08 17:08:34 +0300</bug_when>
    <thetext>Я думаю, что проблема в qemu, так как на p9 с qemu проблем таких нет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197649</commentid>
    <comment_count>3</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-04-08 17:41:17 +0300</bug_when>
    <thetext>(Ответ для Alexey Gladkov на комментарий #1)
&gt; make-initrd использует ldd из хост-системы поэтому не может создать initrd
&gt; для другой архитектуры. Возможно в будущем поддержка кросс-создания образов
&gt; появится, но сейчас такой поддержки нет.

При сборке в mkimage-profiles в качестве хост-системы выступает hasher с qemu binfmt целевой архитектуры. Т.е. кросс-создание образов тут не при чём.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197651</commentid>
    <comment_count>4</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-04-08 18:01:29 +0300</bug_when>
    <thetext>(In reply to Антон Мидюков from comment #2)
&gt; Я думаю, что проблема в qemu, так как на p9 с qemu проблем таких нет.

Да.

Сейчас в qemu-user-static для aarch64 падает ldd. Можно посмотреть из host-системы, сделав hsh --init на aarch64:

$ qemu-aarch64.static   -L ./chroot ./chroot/lib64/ld-linux-aarch64.so.1 --list /bin/bash
Segmentation fault (core dumped)

Подробности чуть позже.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197654</commentid>
    <comment_count>5</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-04-08 18:35:33 +0300</bug_when>
    <thetext>&gt; Подробности чуть позже.

Наш /lib64/ld-linux-aarch64.so.1, когда не пытается выполнять вверенный ему ELF, очень хочет загрузить его по адресу 0x400000. И это ему удаётся, не смортя на то, что где-то там уже находится код qemu-user. Естественно, с qemu-user при этом оказывается всё плохо, и оно падает.

== Почему оно работает в обычной ситуации? == 

Потому что сам qemu-user притворяется ASLR и отправляет загружаемый бинарник на некий случайный адрес, по которому ничего полезного нет. Для статических &quot;гостевых&quot; бинарников, которым нужен фиксированный адрес, есть особые трюки.

== Почему оно работало раньше? == 

До qemu 5.0 статически собранный qemu-user был статически собран особым образом с применением особого linker script&apos;а, что убирало его с адреса 0x400000 на 0x60000000, и /lib64/ld-linux-aarch64.so.1 мог использовать кусок адресного пространства начиная с 0x400000 как хотел. Но не мог 0x60000000, однако и не пробовал, так что чаще всего всем везло.

Начиная с qemu 5.0 апстрим решил, что такие трюки с linker script&apos;ами больше не нужны и удалил их:

http://git.altlinux.org/gears/q/qemu.git?a=commitdiff;h=ee5195ee0fc87858088313f2c6f327ac41f5912f

&gt; This adjustment was random and unnecessary.

Угу.

== Что делать? ==

Можно попробовать накостылить что-нибудь вокруг этого параметра:

$ qemu-aarch64.static --help | grep BASE
-B address           QEMU_GUEST_BASE   set guest_base address to &apos;address&apos;

Вот так, например, работает:

$ qemu-aarch64.static  -B 0x60000000  -L ./chroot ./chroot/lib64/ld-linux-aarch64.so.1 --list /bin/bash
        libreadline.so.7 =&gt; /lib64/libreadline.so.7 (0x0000005501839000)
        libdl.so.2 =&gt; /lib64/libdl.so.2 (0x000000550189a000)
        libc.so.6 =&gt; /lib64/libc.so.6 (0x00000055018ae000)
        /lib64/ld-linux-aarch64.so.1 =&gt; ./chroot/lib64/ld-linux-aarch64.so.1 (0x0000005500000000)
        libtinfo.so.5 =&gt; /lib64/libtinfo.so.5 (0x0000005501a25000)


Можно писать апстриму и ждать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197887</commentid>
    <comment_count>6</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-04-13 14:34:21 +0300</bug_when>
    <thetext>(In reply to Ivan A. Melnikov from comment #5)
&gt; Можно писать апстриму и ждать.

Ну или как альтернативный вариант -- можно попробовать вернуть перенос кода qemu-user вверх:

http://git.altlinux.org/people/iv/packages/?p=qemu.git;a=commitdiff;h=13106489e9205fef9833d471b61413556fd68e84

Сделано только для qemu-user, зато для всех. Проверил для нескольких архитектур из интересных мне, на первый взгляд работает. Все желающие приглашаются потестировать задачу #269840.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197910</commentid>
    <comment_count>7</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2021-04-14 14:10:40 +0300</bug_when>
    <thetext>qemu-5.2.0-alt5 -&gt; sisyphus:

 Mon Apr 12 2021 Ivan A. Melnikov &lt;iv@altlinux&gt; 5.2.0-alt5
 - Move qemu-user-static text segment to 0x60000000 (ALT #39178)
 - Drop qemu-aux dependency from qemu-user-static (ALT #39815)
 - Drop qemu-mipsn32*.conf from binfmt config packages (ALT #39619)</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>