GNU/Linux >> Znalost Linux >  >> Linux

„Žádný takový soubor nebo adresář“ spočívá na nainstalovaných binárních souborech Optware?

Už nějakou dobu používám Optware k instalaci balíčků na svůj NAS založený na ARM – obvyklé věci jako Transmission, Samba a další. Nedlouho po spuštění jsem však měl problémy s visícím přenosem. Chvíli jsem se rozhlížel po řešení a nakonec jsem zjistil, že zdroj Optware, který jsem používal, nebyl ten, který byl nastaven pro můj box NAS. Přepnul jsem kanály a přeinstaloval všechny balíčky, ale nyní se mi při pokusu o spuštění čehokoli, co bylo přeinstalováno, zobrazuje následující chyba:

$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory

Zkontroloval jsem /opt/bin a /opt/sbin a spustitelné soubory tam určitě jsou – v čem je tedy skutečný problém?

$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory

$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory

$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…

Nejsem si jistý, co to znamená, ale dokazuje to, že soubor je tam, jo? Nebo to má něco společného se sdílenými knihovnami?

Přijatá odpověď:

Když se vám nepodaří spustit soubor, který závisí na „zavaděči“, chyba se může týkat zavaděče, nikoli souboru, který spouštíte.

  • Zavaděč dynamicky propojeného nativního spustitelného souboru je součástí systému, který je zodpovědný za načítání dynamických knihoven. Je to něco jako /lib/ld.so nebo /lib/ld-linux.so.2 , a měl by to být spustitelný soubor.
  • Zavaděčem skriptu je program uvedený na řádku shebang, např. /bin/sh pro skript, který začíná #!/bin/sh .

Chybová zpráva je spíše zavádějící, protože neoznačuje, že problém je v zavaděči. Bohužel by to bylo těžké, protože rozhraní jádra má prostor pouze pro hlášení číselného kódu chyby, nikoli pro indikaci toho, že se chyba ve skutečnosti týká jiného souboru. Některé shelly dělají práci se skripty samy (čtou #! řádek ve skriptu a přepracování chybového stavu), ale žádný, který jsem neviděl, se pokoušel udělat totéž pro nativní binární soubory.

ldd nefunguje ani na binárních souborech, protože funguje tak, že nastaví některé speciální proměnné prostředí a poté spustí program, přičemž práci nechá zavaděč. strace by také neposkytlo žádné smysluplné informace, protože by nehlásilo více, než hlásí jádro, a jak jsme viděli, jádro nemůže hlásit vše, co ví.

Zde jsou vaše přeinstalované spustitelné soubory (smbd , transmission-daemon atd.) požadují zavaděč, který ve vašem systému není. Takže váš nový zdroj není vhodný ani pro váš systém.

Související:Linux – Upravit rychlost ventilátoru pomocí Fancontrol podle teploty pevného disku (Hddtemp)?

Tato situace často nastává, když se pokoušíte spustit binární soubor pro správný systém (nebo rodinu systémů) a superarchitekturu, ale špatnou podarchitekturu. Zde máte binární soubory ELF v systému, který očekává binární soubory ELF, takže je jádro načte v pořádku. Jsou to binární soubory ARM běžící na procesoru ARM, takže instrukce dávají smysl a dostanou program do bodu, kdy může hledat svůj zavaděč. Ale je to špatný nakladač.

Teď se dostávám k domněnkám, ale mám podezření, že váš nový zdroj je pro špatné ARM ABI. ABI je společný jazyk pro volání mezi procedurami, a zejména pro volání funkcí knihovny. Na některých architekturách procesorů existuje několik možných voleb ABI a musíte si vybrat jednu a používat ji konzistentně. Existují dvě ARM ABI s distribucemi Linuxu:tradiční arm-elf ABI a novější EABI (arm-eabi ). Na stejném systému nemůžete kombinovat ABI, takže musíte najít zdroj balíčků pro vaše ABI (nebo přeinstalovat systém pro jiné ABI).


Linux
  1. Nelze spustit žádný takový soubor nebo adresář [Opravit]

  2. Mkdir:Nelze vytvořit adresář:Žádný takový soubor nebo adresář?

  3. Obchod:Nenalezeno [Žádný takový soubor nebo adresář]

  1. Žádná taková chyba souboru nebo adresáře při spouštění binárního souboru

  2. 'SDL.h nebyl nalezen žádný takový soubor nebo adresář' při kompilaci

  3. Závažná chyba:cuda.h:Žádný takový soubor nebo adresář

  1. Python – žádný takový soubor nebo adresář, ale vidím to!?

  2. conda source deactivate :bash:deactivate:Žádný takový soubor nebo adresář

  3. touch:nelze se dotknout `foo':Žádný takový soubor nebo adresář