Mam obecnie dziwny problem z Debianem (wheezy / amd64).
Utworzyłem chroota, aby zainstalować serwer (przepraszam, nie mogę podać więcej szczegółów). Nazwijmy jego ścieżkę /chr_path/
. Aby to ułatwić, zainicjowałem tego chroota za pomocą paska debootstrap (także wheezy / amd64).
Wyglądało na to, że wszystko działa dobrze w chroot, ale kiedy uruchomiłem skrypt instalacyjny mojego serwera, otrzymałem:
zsh: Not found /some_path/perl
(z pewnych powodów instalator zawiera plik binarny perla)
Oczywiście sprawdziłem /some_path/
lokalizację i znalazłem plik binarny „perl”. file
w środowisku chroot zwraca:
/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
Plik istnieje, wydaje się być w porządku, ma poprawne prawa. Mogę użyć file
, ls
, vim
na nim, ale jak tylko próbuję go uruchomić - ./perl
na przykład - uzyskać: zsh: Not found ./perl
.
Ta sytuacja jest dla mnie całkiem zrozumiała. Ponadto :
- Mogę wykonywać inne podstawowe pliki binarne (/ bin / ls, ...) w chroot bez otrzymywania błędów
- Mam takie same problemy z innymi plikami binarnymi dostarczonymi z projektem
- Kiedy próbuję uruchomić plik binarny z głównego katalogu głównego (
/chr_path/some_path/perl
), działa. - Próbowałem umieścić jeden z plików binarnych z kopią mojego
ls
. Sprawdziłem, czy prawa dostępu były takie same, ale to niczego nie zmieniło (jedno działało, a drugie nie)
źródło
libc6-i386
pakietu lubia32-libs
jeśli chcesz mieć wiele bibliotek).Odpowiedzi:
Jeśli nie uda się uruchomić pliku zależnego od „modułu ładującego”, wyświetlony błąd może dotyczyć modułu ładującego, a nie wykonywanego pliku.
/lib/ld.so
lub/lib/ld-linux.so.2
i powinno być plikiem wykonywalnym./bin/sh
Dla skryptu, który zaczyna się od#!/bin/sh
. (Bash i zsh podają komunikat „zły tłumacz” zamiast „polecenia nie znaleziono” w tym przypadku.)Komunikat o błędzie jest raczej mylący, ponieważ nie oznacza, że problem stanowi moduł ładujący. Niestety, naprawienie tego byłoby trudne, ponieważ interfejs jądra ma miejsce tylko na zgłoszenie liczbowego kodu błędu, a nie na wskazanie, że błąd w rzeczywistości dotyczy innego pliku. Niektóre powłoki wykonują same prace dla skryptów (odczytując
#!
wiersz skryptu i ponownie sprawdzając warunek błędu), ale żadna z tych, które widziałem, nie próbuje zrobić tego samego dla natywnych plików binarnych.ldd
nie będzie działać na plikach binarnych, ponieważ działa poprzez ustawienie specjalnych zmiennych środowiskowych, a następnie uruchomienie programu, umożliwiając programowi ładującemu wykonanie pracy.strace
nie dostarczyłby również żadnych istotnych informacji, ponieważ nie zgłosiłby więcej niż to, co zgłasza jądro, a jak widzieliśmy, jądro nie może zgłaszać wszystkiego, co wie.Taka sytuacja często pojawia się, gdy próbujesz uruchomić plik binarny dla odpowiedniego systemu (lub rodziny systemów) i superarchitektury, ale niewłaściwej podarchitektury. Tutaj masz pliki binarne ELF w systemie, który oczekuje plików binarnych ELF, więc jądro ładuje je dobrze. Są to pliki binarne i386 działające na procesorze x86_64, więc instrukcje mają sens i doprowadzają program do punktu, w którym może szukać swojego modułu ładującego. Ale program jest programem 32-bitowym (jak
file
wskazuje dane wyjściowe), szuka 32-bitowego programu ładującego/lib/ld-linux.so.2
i prawdopodobnie zainstalowałeś tylko 64-bitowy moduł ładujący/lib64/ld-linux-x86-64.so.2
w chroot.Musisz zainstalować 32-bitowy system wykonawczy w chroot: moduł ładujący i wszystkie biblioteki, których potrzebują programy. Począwszy od wersji Debian wheezy, jeśli chcesz obsługiwać zarówno i386, jak i x86_64, zacznij od instalacji amd64 i aktywuj obsługę wielu ścieżek : uruchom
dpkg --add-architecture i386
wtedyapt-get update
iapt-get install libc6:i386 zlib1g:i386 …
(jeśli chcesz wygenerować listę zależności pakietu perla Debiana, aby zobaczyć, jakie biblioteki prawdopodobnie będą być potrzebne, możesz użyćaptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Możesz pobrać kolekcję popularnych bibliotek, instalującia32-libs
pakiet (najpierw musisz włączyć obsługę wielu kanałów). W systemie Debian amd64 aż do wheezy, 32-bitowy moduł ładujący znajduje się wlibc6-i386
pakiecie. Instalując, możesz zainstalować większy zestaw bibliotek 32-bitowychia32-libs
.źródło
ldd
ale nadal pojawia się ten sam błąd.lsb-core
ale to nie pomogło. Myślę, że lepiej otworzyć na to nowe pytanie.Uruchom
ldd(1)
na swoimperl
pliku binarnym. Często pozornie mylącyNot found
błąd w pliku, który najwyraźniej istnieje, ponieważ nie znaleziono jednej z bibliotek współdzielonych używanych przez program.Możliwe więc, że twój chroot jest niekompletny w odniesieniu do bibliotek współdzielonych wymaganych przez twoje pliki binarne.
źródło
perl is not a dynamic executable
kiedy jestem w chroot i otrzymuję prawidłową listę zależności z zewnątrz. Obecnie sprawdzam, czy jest coś dziwnego, ale użyłem paska deboot, aby uniknąć tego rodzaju braku i mam już wiele bibliotek lib (w systemie chroot jest wykonywalny perl, który działa dobrze, ale jest to inna wersja; być może zrobię trochę link symboliczny?)