Jump to content

Recommended Posts

1) Кажется, есть противоречение между wiki и прошивкой. Согласно этой статьи в среду должны передаётся:

LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:/lib:/usr/lib
 

Однако /lib/libndmOpkg.so при запуске initrc экспортирует в среду:

LD_LIBRARY_PATH=/lib:/usr/lib:/opt/lib:/opt/usr/lib
 

Это можно воспроизвести, написав «фальшивый» скрипт /opt/etc/init.d/S99fake со следующим содержимым:

#!/bin/sh
export > /opt/tmp/env.tst
 

В итоге при запуске внешних сервисов возможны жалобы can't resolve symbol с аварийным завершением работы.

Link to comment
Share on other sites

Точно, баг. Не соответствует описанию, исправим. Новый релиз запланирован к концу следующей недели, а пока можно определить правильный LD_LIBRARY_PATH в initrc.

Link to comment
Share on other sites

2. Экспорт LD_LIBRARY_PATH наверняка сделано потому, что в тулчейн для сбора пакетов не заложен rpath=/opt/lib. Хочу напомнить, что пути из LD_LIBRARY_PATH не заменяют rpath, а дополняют его подстановкой перед путями из rpath, что для без указания правильного префикса /opt не имеет смысла для ряда пакетов, использующих свои плагины (poptop, znc, perl и другие). Устанавливай LD_LIBRARY_PATH или нет, такие пакеты без правки префикса не взлетят:

admin@RT-N66U:/tmp/home/root# ldd /opt/bin/perl
       libperl.so => /opt/lib/perl5/5.22/CORE/libperl.so (0x2aac0000)
       libpthread.so.0 => /opt/lib/libpthread.so.0 (0x2ac85000)
       libdl.so.0 => /opt/lib/libdl.so.0 (0x2acaa000)
       libm.so.0 => /opt/lib/libm.so.0 (0x2acbd000)
       ...

Кроме того, для бинарников с установленными битами setuid или setgid содержимое LD_LIBRARY_PATH игнорируется по соображением безопасности. Это можно проверить, скажем, на пакете sudo.

Если для сборки пакетов будет использовать билдут с этой правкой, то костыль с установкой LD_LIBRARY_PATH не понадобится.

Link to comment
Share on other sites

Здесь не первый раз упоминают rpath. Но предмет для дискуссии пустяковый. С точки зрения прошивки (libndmOpkg) важно, чтобы поддерживалось как можно больше разных пакетов. Для этого определяется LD_LIBRARY_PATH, который не мешает работе пакетов, собранных с rpath=/opt/lib, и позволяет работать пакетам, собранным без него.

Если же кто займётся сборкой пакетов нашим билдрутом, и непременно захочет rpath, подправит rules.mk самостоятельно.

Link to comment
Share on other sites

Кстати, $PATH в среду логичнее передавать не такой как сейчас:

PATH='/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin'

а такой, чтобы в первую очередь искались сторонние бинарники:

PATH='/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin'

Link to comment
Share on other sites

  • 1 month later...
Кстати, $PATH в среду логичнее передавать не такой как сейчас:

PATH='/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin'

а такой, чтобы в первую очередь искались сторонние бинарники:

PATH='/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin'

Спасибо, тоже исправлено, ждет релиза.

В бетах от 14.11.2015г косяк всё ещё есть. Проверено на Omni II.

Link to comment
Share on other sites

В бетах от 14.11.2015г косяк всё ещё есть. Проверено на Omni II.

Как проверяли, если не секрет? Берем скрипт /opt/etc/initrc:

#!/bin/sh
echo INITRC: $1
echo INITRC: $PATH
echo INITRC: $LD_LIBRARY_PATH

Видим:

[i] Nov 17 12:36:33 ndm: Opkg::Manager: /tmp/mnt/OPT initialized. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: start. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: /opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: /opt/lib:/opt/usr/lib:/lib:/usr/lib.

Link to comment
Share on other sites

Как проверяли, если не секрет?
С таким стартовым скриптом rc.unslung при старте роутера получаем в логе следующие сообщения:

[i] Nov 17 13:47:33 ndm: FileSystem::Ext: ext2 "ceeaaab9-273d-4fc4-b47e-94ec13633148:" filesystem initialized. 
[W] Nov 17 13:47:33 ndm: kernel: EXT2-fs (sda3): warning: mounting unchecked fs, running e2fsck is recommended
…
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE mounted to /tmp/mnt/STORAGE. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE mounted to /opt/. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE initialized. 
[E] Nov 17 13:47:33 ndm: Opkg::Manager: invalid initrc "/opt/etc/initrc": no such file or directory, trying /opt/etc/init.d/. 
[i] Nov 17 13:47:33 wmond: WifiMaster0/AccessPoint0: (RT2860) STA(30:75:12:0c:b6:0e) had associated successfully. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /usr/lib/libsupc++.so: _Unwind_SjLj_RaiseException: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /usr/lib/libsupc++.so: _Unwind_SjLj_Resume_or_Rethrow: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /usr/lib/libsupc++.so: _Unwind_SjLj_Register: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /usr/lib/libsupc++.so: _Unwind_SjLj_Resume: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /usr/lib/libsupc++.so: _Unwind_SjLj_Unregister: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmBase.so: _Unwind_SjLj_Unregister: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmBase.so: _Unwind_SjLj_Register: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmBase.so: _Unwind_SjLj_Resume: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmBase.so: __gcc_personality_sj0: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmHttp.so: _Unwind_SjLj_Unregister: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmHttp.so: _Unwind_SjLj_Register: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmHttp.so: _Unwind_SjLj_Resume: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /lib/libndmHttp.so: __gcc_personality_sj0: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /opt/etc/init.d/S00telnetd: _Unwind_SjLj_Unregister: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /opt/etc/init.d/S00telnetd: _Unwind_SjLj_Register: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /opt/etc/init.d/S00telnetd: _Unwind_SjLj_Resume: symbol not found. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: Error relocating /opt/etc/init.d/S00telnetd: __gcc_personality_sj0: symbol not found. 
[E] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/init.d/rc.unslung: exit code 127. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/ndm/user.d/010-profile.sh: admin's home directory created. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/ndm/user.d/020-root-pwd.sh: Pasword is set from file. 

Добавляем второй строчкой в rc.unslung unset LD_LIBRARY_PATH и перегружаем роутер. Всё в порядке:

[i] Nov 17 13:47:33 ndm: FileSystem::Ext: ext2 "ceeaaab9-273d-4fc4-b47e-94ec13633148:" filesystem initialized. 
[W] Nov 17 13:47:33 ndm: kernel: EXT2-fs (sda3): warning: mounting unchecked fs, running e2fsck is recommended
…
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE mounted to /tmp/mnt/STORAGE. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE mounted to /opt/. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /tmp/mnt/STORAGE initialized. 
[E] Nov 17 13:47:33 ndm: Opkg::Manager: invalid initrc "/opt/etc/initrc": no such file or directory, trying /opt/etc/init.d/. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/ndm/user.d/010-profile.sh: admin's home directory created. 
[i] Nov 17 13:47:33 ndm: Opkg::Manager: /opt/etc/ndm/user.d/020-root-pwd.sh: Pasword is set from file. 

Версия прошивки:

(config)> show version

         release: v2.05(AAUS.5)C1
            arch: mips

             ndm:
               exact: 0-43162e7
               cdate: 14 Nov 2015

             bsp:
               exact: 0-f0f8cc3
               cdate: 14 Nov 2015

             ndw:
             version: 4.0.1.106
            features: wifi_button,single_usb_port,flexible_menu,
                      emulate_firmware_progress
          components: cloud,ddns,dot1x,factory,fat,hfsplus,kabinet,miniupnpd,
                      monitor,nathelper-ftp,nathelper-pptp,nathelper-sip,ntfs,
                      opkg,ppe,ssl,trafficcontrol,usblte,usbserial,cifs,
                      components,cloudcontrol,config-ap,config-client,config-
                      repeater,corewireless,dlna,easyconfig,dhcpd,ftp,igmp,
                      l2tp,pingcheck,ppp,pppoe,pptp,skydns,storage,
                      transmission,usb,udpxy,usbmodem,usbnet,vpnserver,ydns,
                      base,printers,sysmode,easyconfig-3.2,base-l10n,modems,
                      theme-ZyXEL-Intl,base-theme,ispdb,base-ZyXEL-Intl

    manufacturer: ZyXEL
          vendor: ZyXEL
          series: Keenetic series
           model: Keenetic
      hw_version: 12132000-F
           hw_id: kn_rf
          device: Keenetic Omni II
           class: Internet Center

Link to comment
Share on other sites

А вот так вот сделать в вашем rc.unslung в самом начале:

export LANG=C
export PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:/lib:/usr/lib

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

Link to comment
Share on other sites

Как проверяли, если не секрет? Берем скрипт /opt/etc/initrc:

#!/bin/sh
echo INITRC: $1
echo INITRC: $PATH
echo INITRC: $LD_LIBRARY_PATH

Видим:

[i] Nov 17 12:36:33 ndm: Opkg::Manager: /tmp/mnt/OPT initialized. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: start. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: /opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin. 
[i] Nov 17 12:36:33 ndm: Opkg::Manager: /opt/etc/initrc: INITRC: /opt/lib:/opt/usr/lib:/lib:/usr/lib.

Мне кажется, что передавать эти переменные запуском из прошивки, бесполезное занятие. Busybox будет все равно дергать /etc/profile.

Link to comment
Share on other sites

IMHO пустое дело обсуждать rpath vs LD_LIBRARY_PATH, см. выше:

С точки зрения прошивки важно, чтобы поддерживалось как можно больше разных пакетов. Для этого определяется LD_LIBRARY_PATH, который не мешает работе пакетов, собранных с rpath=/opt/lib, и позволяет работать пакетам, собранным без него.

LD_LIBRARY_PATH может быть необходим для работы /opt/bin/sh, собранного без rpath. Внутри скрипта экспортируйте и переопределяйте, что вашей душе угодно.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...