Dependency Hell na Unixie

Pewnego dnia widzę, że aplikacja webowa, którą uruchomiłem kilka dni temu, przestała działać. Zanim doszedłem do tego, co się dzieje, musiałem chwilę pomyśleć, by odtworzyć ciąg przyczynowo-skutkowy.

  • Aplikacja korzysta z bibliotek natywnych.
  • Biblioteki sam kompilowałem na hostingu.
  • Biblioteki są dynamicznie linkowane do bibliotek systemowych.
  • Administrator hostingu zrobił update.

Skutek był prosty, linker nie mógł już rozwiązać zależności, bo wersje bibliotek się nie zgadzały. Musiałem ponownie zbudować wszystkie biblioteki. By zabezpieczyć się na przyszłość, postanowiłem wykonać kopię wszystkich potrzebnych zależności dla mojej aplikacji.

Pomysł na rozwiązanie problemu był prosty, przeszukać zależności i wykonać kopię. Niektórzy na Windowsie mogli mieć do czynienia z podobnym problemem, tam wykorzystuje się narzędzie Dependency Walker. Na Unixach wystarczy odpalić ldd, by poznać, jakich bibliotek potrzebuje biblioteka.

Wzorując się na skrypcie stąd, rozszerzyłem jego możliwości. Zamiast podawać każdą bibliotekę z osobna, należy podać katalog z własnymi bibliotekami. Dla nich zostanie stworzona kopia.

W podanym katalogu zostaną znalezione wszystkie biblioteki i binarki (kod wykonywalny w formacie ELF), a następnie rozwiązane zostaną dla nich symlinki do ścieżek bezwzględnych. Pierwotnym założeniem jest to, że katalog z bibliotekami znajduje się w ścieżce linkera (biblioteki muszą działać zanim zostaną skopiowane zależności).

Następnym krokiem jest przeszukanie zależności, wywalenie duplikatów poleceniami sort i uniq, a następnie wywalenie zależności do bibliotek, które już znajdują się w podanym do skryptu katalogu.

Przykładowo

Teraz można użyć katalogu z kopią bibliotek, dodając go do ścieżki linkera

Dzięki wykonaniu kopii, zmiana wersji bibliotek systemowych nie skutkuje przerwaniem pracy aplikacji.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *