V současné době mám zvláštní problém na debianu (wheezy/amd64).
Vytvořil jsem chroot pro instalaci serveru (nemohu o něm poskytnout žádné podrobnosti, omlouvám se). Nazvěme jeho cestu /chr_path/
.
Abychom to usnadnili, inicializoval jsem tento chroot pomocí debootstrapu (také wheezy/amd64).
Zdálo se, že vše funguje dobře uvnitř chrootu, ale když jsem spustil instalační skript mého serveru, dostal jsem:zsh:Nenalezeno /some_path/perl
(instalační program obsahuje z nějakých důvodů binární soubor Perl)
Samozřejmě jsem zkontroloval /some_path/
umístění a našel jsem binární soubor „perl“. soubor
v chrootovém prostředí vrací :
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
Soubor existuje, zdá se být v pořádku, má správná práva. Mohu použít soubor
, ls
, vim
na něm, ale jakmile se jej pokusím spustit – ./perl
například – dostanu :zsh:Not found ./perl
.
Tato situace je pro mě celkem pochopitelná. Navíc :
- Mohu spouštět další základní binární soubory (/bin/ls,…) v chrootu bez chyb
- Mám stejné problémy s ostatními binárními soubory, které byly dodány s projektem
- Když se pokusím spustit binární soubor z hlavního kořenového adresáře (
/chr_path/some_path/perl
), funguje to. - Snažil jsem se vložit jeden z binárních souborů s kopií mého
ls
. Zkontroloval jsem, že přístupová práva jsou stejná, ale nic se nezměnilo (jedno fungovalo a druhé ne)
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
. (Bash a zsh dávají v tomto případě zprávu „špatný interpret“ místo „příkaz nenalezen“.)
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
nebude fungovat 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í.
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árky i386 běžící na procesoru x86_64, takže instrukce dávají smysl a dostanou program do bodu, kdy může hledat svůj zavaděč. Ale program je 32bitový program (jako soubor
výstup indikuje), hledá 32bitový zavaděč /lib/ld-linux.so.2
a pravděpodobně jste nainstalovali pouze 64bitový zavaděč /lib64/ld-linux-x86-64.so.2
v chrootu.
Musíte nainstalovat 32bitový runtime systém do chrootu:zavaděč a všechny knihovny, které programy potřebují. Od Debian wheezy dále, pokud chcete podporu i386 a x86_64, začněte s instalací amd64 a aktivujte podporu multiarch:spusťte dpkg --add-architecture i386
poté apt-get update
a apt-get install libc6:i386 zlib1g:i386 …
(chcete-li vygenerovat seznam závislostí balíčku Perl Debianu, abyste viděli, jaké knihovny budou pravděpodobně potřeba, můžete použít aptitude search -F %p '~Rdepends:^perl$ ~ri386' ). Kolekci běžných knihoven můžete stáhnout instalací
ia32-libs
balíček (nejprve musíte povolit podporu multiarch). Na Debianu amd64 až po wheezy je 32bitový zavaděč v libc6-i386
balík. Větší sadu 32bitových knihoven můžete nainstalovat instalací ia32-libs
.