Jak działa aktualizacja uruchomionych plików binarnych aplikacji podczas aktualizacji?

23

Właśnie zaktualizowałem mój ubuntu lucid do natty, podczas aktualizacji zastąpił on większość działających aplikacji nowszą wersją.

Jak to działa? (Czy aplikacja nie ulegnie awarii?) Co stanie się z aplikacją, jeśli plik lib zostanie zaktualizowany, a uruchomiona aplikacja, która szuka starszej biblioteki lib, spróbuje go załadować?

srinathhs
źródło
Dobre pytanie, ale prawdopodobnie lepiej zadane tutaj: unix.stackexchange.com (Wiem, że URL mówi Unix, ale one też odpowiadają na pytania dotyczące Linuksa!)
Zrozumienie funkcji zamiany podczas otwierania w Linuksie wygląda na to, że wciąż programuje (ale ledwo :)
bdonlan
2
@bdonlan: Jeśli dynamicznie ładujesz biblioteki w trakcie trwania procesu, powinieneś być tego bardzo świadomy, w przeciwnym razie może cię ugryźć. Jest to szczególnie ważne, jeśli próbujesz zrobić coś niezwykłego, np. Kod samodmodyfikujący itp. Ale tak, to granica.
Piskvor,
1
Nie jest to tak naprawdę istotne w przypadku kodu samodmodyfikującego, ale z pewnością jest to coś, o czym powinien wiedzieć ktoś, kto pisze biblioteki dla systemu Linux. :)
bdonlan
1
@Piskvor, brzmi to trochę jak wieloetapowy proces kompilacji gcc :) Ale w zasadzie tylko kompilatory robią coś takiego i zazwyczaj nie uaktualniasz systemu w tym czasie (nawet jeśli robisz, dopóki nie nie obniżaj niczego, gdy jest w toku, nic ci nie jest, ponieważ będzie korzystać ze swoich prywatnie skompilowanych kopii wszystkiego, co ma znaczenie)
bdonlan,

Odpowiedzi:

31

Linux (i inne systemy UNIX) rozróżnia nazwę pliku ( łącze ), sam plik (często identyfikowany z i- węzłem ) i otwiera uchwyty do pliku. Kiedy usuwasz plik, wywołujesz unlink()połączenie - usuwa to link do pliku (możesz także użyć, rename()aby zastąpić go innym i-węzłem). Jeśli jednak pozostaną otwarte uchwyty do pliku (lub inne łącza - pliki mogą mieć wiele dowiązań twardych ), i- węzeł pozostanie, podobnie jak zawartość pliku, dopóki wszystkie łącza i uchwyty nie znikną.

Tak więc uruchomione programy korzystające z biblioteki lub czegokolwiek trzymają uchwyt do starej wersji (często pośrednio poprzez mapowanie pamięci), więc pozostaje na dysku. Po prostu nie ma już nazwy pliku i zostanie wyczyszczony, gdy wszystkie programy, które go używają, zostaną zamknięte (lub przy następnym uruchomieniu, podczas sprawdzania systemu plików lub odtwarzania dziennika).

Ponadto zauważ, że programy oczekujące „starej biblioteki” poradzą sobie dobrze z nowszymi wersjami biblioteki. Bibliotekom Linux przypisuje się nazwę pliku („soname”), która odzwierciedla wersję ABI (Application Binary Interface) oferowaną przez bibliotekę. Na przykład biblioteka C w moim systemie to libc.so.6. Każdy program skompilowany ze starszą wersją libc, ale nadal wersja libc implementująca ABI w wersji 6, będzie z nim dobrze współpracować. Bardzo stare programy będą szukać libc.so.5lub libc.so.4czy coś zamiast; w tym przypadku musisz też zachować starą wersję - ale ponieważ nazwa pliku jest inna, nie stanowi to problemu.

bdonlan
źródło
9

W przeciwieństwie do systemu Windows można usunąć lub zastąpić otwarty plik; dla uproszczenia wyjaśnienia, nowe żądania dotyczące plików otwierają nowy plik, istniejące uchwyty używają pliku, który istniał podczas ich tworzenia. Innymi słowy, w Linuksie możesz mieć pliki / wersje plików, które nadal istnieją, chociaż nie ma już wskaźnika do nich w strukturze katalogów; te przestają istnieć, nie ma do nich żadnego wskaźnika (zamknięte i wszystkie).

Zwykle działająca aplikacja ładuje z góry potrzebne biblioteki, więc opisany problem wystąpiłby tylko w bardzo konkretnych sytuacjach czasowych podczas instalowania pakietu: uruchomione aplikacje nadal korzystają ze starej wersji biblioteki, nowo uruchomione aplikacje używają nowej jeden.

Jest to wykorzystywane nie tylko przy aktualizacji dystrybucji, ale dzieje się to przy każdej aktualizacji pakietu (aktualizacja powoduje tylko kilka dodatkowych automagicznych kroków w tym procesie).

Piskvor
źródło
0

Wiele procesów Linux działa nadal po aktualizacji pakietów, z których pochodzą, ale niektóre nie. Z mojego doświadczenia wynika, że ​​KDE nigdy nie działa poprawnie, jeśli uaktualnisz go podczas działania. Prawdopodobnie wystąpią awarie i / lub niepowodzenia wylogowania.

Robin Green
źródło