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ć?
Odpowiedzi:
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.5
lublibc.so.4
czy coś zamiast; w tym przypadku musisz też zachować starą wersję - ale ponieważ nazwa pliku jest inna, nie stanowi to problemu.źródło
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).
źródło
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.
źródło