Dlaczego aktualizacja działającego systemu Linux nie stanowi problemu?


25

Lata używam na co dzień systemów Linux i nigdy nie miałem większych problemów z aktualizacją systemu, gdy był uruchomiony, ale wciąż zastanawiam się, dlaczego jest to możliwe.

Pozwól mi zrobić przykład.

Załóżmy, że program „A” z określonego pakietu działa w systemie. Ten program w pewnym momencie musi otworzyć inny plik („B”) z tego samego pakietu. Następnie program „A” zamyka „B”, ponieważ już go nie potrzebuje. Załóżmy, że teraz aktualizuję pakiet „A” i „B” należą. Operacje te nie mają bezpośredniego wpływu na „A”, przynajmniej na chwilę, ponieważ działa on w pamięci RAM, a aktualizacja właśnie zastąpiła „A” na dysku twardym. Załóżmy, że „B” również zostało zastąpione w systemie plików. Teraz „A” musi z jakiegoś powodu ponownie przeczytać „B”. Pytanie brzmi: czy jest możliwe, że „A” może znaleźć niezgodną wersję „B” i spowodować awarię lub usterkę w inny sposób?

Dlaczego nikt nie aktualizuje swoich systemów po ponownym uruchomieniu z CD na żywo lub podobną procedurą?


Wolę unikać takich aktualizacji, nie z powodu mechaniki aktualizacji (można to zrobić dobrze), ale raczej dlatego, że najpierw wolę przetestować moje aplikacje i konfigurację pod kątem zmian. Wtedy miałbym osobny, teraz zaktualizowany system, do którego po prostu się przełączę. Ale poza tym aktualizacja w obszarze użytkownika zasadniczo nie stanowi problemu, a dla drobnych poprawek lub zabezpieczeń po prostu bym to zrobił.
Skaperen

Odpowiedzi:


23

Aktualizacja Userland rzadko stanowi problem

Często można aktualizować pakiety w systemie na żywo, ponieważ:

  1. Udostępniane biblioteki są przechowywane w pamięci, a nie odczytywane z dysku przy każdym wywołaniu, więc stare wersje będą w użyciu do momentu ponownego uruchomienia aplikacji.
  2. Otwarte pliki są w rzeczywistości odczytywane z deskryptorów plików , a nie z nazw plików, więc zawartość pliku pozostaje dostępna dla uruchomionych aplikacji, nawet po przeniesieniu / zmianie nazwy / usunięciu do momentu nadpisania sektorów lub zamknięcia deskryptorów plików.
  3. Pakiety wymagające ponownego załadowania lub ponownego uruchomienia są zazwyczaj poprawnie obsługiwane przez menedżera pakietów, jeśli pakiet został dobrze zaprojektowany. Na przykład Debian zrestartuje niektóre usługi przy każdej aktualizacji libc6.

Zasadniczo, chyba że aktualizujesz jądro i nie używasz ksplice, programy lub usługi mogą wymagać ponownego uruchomienia, aby skorzystać z aktualizacji. Jednak rzadko trzeba ponownie uruchamiać system, aby zaktualizować cokolwiek w obszarze użytkownika, chociaż na komputerach jest to czasami łatwiejsze niż ponowne uruchomienie poszczególnych usług.

Zobacz też

http://en.wikipedia.org/wiki/Ring_%28computer_security%29#Supervisor_mode


Ale co się stanie, jeśli potrzebujesz całej pamięci podręcznej? W takim przypadku biblioteki udziałów będą musiały zostać ponownie załadowane z dysku ...
Nils

3
W rzeczywistości opis nr 1 nie był tak jasny. Stara zawartość pliku biblioteki pozostaje pod osobnym (oryginalnym) i-węzłem, nawet jeśli wszystkie nazwy łączące się z nim znikną, tak długo, jak jakiś proces ma otwarty plik lub jego zawartość jest odwzorowana, dane są rozróżniane (a system plików nie może być ponownie montowany r / o, aż do zakończenia rozłączania pliku). Proces, który zamapował oryginalny plik, nadal ma mapowania pamięci do oryginalnej zawartości.
Skaperen

@Nils Nie jestem ekspertem, ale jeśli zabraknie pamięci podręcznej, czy nie zostanie napisane, aby zamienić i ponownie przeczytać stamtąd? Gdyby to było pełne, prawdopodobnie jakiś proces zostałby zablokowany, zanim mógłby zabrać pamięć innemu procesowi, który już go używa.
Joe

@Joe nie - zamiana jest również ram. Skaperen opisuje, co się dzieje: uchwyt pliku jest nienaruszony. Zasadniczo więc program ma jedną starą bibliotekę (starej) biblioteki, która nie zostanie usunięta, dopóki ten uchwyt nie będzie ponownie wolny - wszystko na poziomie systemu plików - nie na poziomie pamięci RAM.
Nils

4

Tak, to co opisałeś jest możliwe, ale przez większość czasu, jeśli plik jest dołączony do pakietu, będzie to biblioteka lub inny plik, który będzie czytany tylko raz (ponieważ się nie zmienia, nie ma powodu, aby przeczytaj to wiele razy). Również jeśli plik jest potrzebny długoterminowo, aplikacja prawdopodobnie pozostawi otwarty uchwyt pliku, w którym nawet jeśli zostanie zastąpiony w rzeczywistym systemie plików, otwarty uchwyt pliku pozostawi starą wersję otwartą.

W większości przypadków wszelkie dane, które są odczytywane wiele razy w trakcie procesu, są danymi użytkownika / zmiennych i nie zmieniłoby się to podczas aktualizacji pakietu. Ponadto, ponieważ dane są zmienne, każdy programista przy zdrowych zmysłach upewniłby się, że program poradzi sobie z nimi, zmieniając się z jednego odczytu na drugi.


Plik można nadal odczytać ponownie jako „magazyn kopii zapasowych”, jeśli jego mapowanie nie spowodowało żadnych zmian w pamięci (co w innym przypadku zmieniłoby magazyn kopii zapasowych na wymianę, jeśli jest dostępny), a kopia w pamięci została odrzucona z powodu innej presji popytu, aby użyć pamięć. Nie stanowi to jednak problemu, ponieważ oryginalny plik jest nadal otwarty lub zmapowany. Biblioteka zastępcza to nowy i inny plik, którego stary proces nie otworzył.
Skaperen

1
@ Skaperen Zakładam, że mówisz o plikach mapowanych w pamięci. Nie są to problemy podczas aktualizacji pakietów. Wszyscy menedżerowie pakietów tworzą nowe pliki, aby zastąpić stare, zamiast nadpisywać je. W rzeczywistości jest to jedyny sposób, aby to zrobić, ponieważ działającego pliku wykonywalnego nie można modyfikować, można go jedynie odłączyć.
Patrick

4

Załóżmy, że „B” również zostało zastąpione w systemie plików. Teraz „A” musi z jakiegoś powodu ponownie przeczytać „B”. Pytanie brzmi: czy jest możliwe, że „A” może znaleźć niezgodną wersję „B” i spowodować awarię lub usterkę w inny sposób?

Jest to możliwe, ale w większości przypadków mało prawdopodobne. Jeśli „B” jest biblioteką kodów, oryginalna wersja zwykle nie byłaby zamknięta. „A” będzie nadal używać oryginalnej wersji „B”. Jeśli po aktualizacji uruchomisz „A”, zostanie użyta nowa wersja „B”. Podczas aktualizacji istnieje ryzyko, że zostaną załadowane niezgodne wersje. Jednak ze względu na sposób ładowania bibliotek kodów powinno to stanowić problem tylko wtedy, gdy „A” potrzebuje funkcji nieobecnej w załadowanych wersjach „B”.

Dobra praktyka kodowania utrzymuje ten sam interfejs dla funkcji. W rezultacie nie ma większego znaczenia, która wersja jest załadowana, poza tym, czy w nowszej wersji zostały naprawione błędy.

Pliki konfiguracyjne to nieco inna sprawa, ale zwykle są odczytywane podczas uruchamiania. W takim przypadku „A” nie odczytuje „B”, chyba że zmienione zostanie ponowne ładowanie konfiguracji. Ponownie zmiana formatu lub znaczenia pliku konfiguracyjnego byłaby złą praktyką kodowania. Niezgodna wersja pliku konfiguracyjnego powinna mieć inną nazwę, aby nie stanowiło problemu.

Dlaczego nikt nie aktualizuje swoich systemów po ponownym uruchomieniu z CD na żywo lub podobną procedurą?

Wyłączenie i ponowne uruchomienie z innej wersji doprowadziłoby do awarii usługi. W przypadku serwerów zazwyczaj nie jest to pożądane. W każdym razie menedżer pakietów w uruchomionym systemie jest świadomy zainstalowanego oprogramowania i wersji. Live CD mają tam własną listę zainstalowanych programów, być może z różnymi wersjami. Utrudnia to niezawodne uaktualnienie działającego systemu z Live CD.

Live CD są czasami używane, gdy instalowana jest nowa wersja systemu operacyjnego. W takim przypadku zwykle wykonuje się czystą instalację systemu operacyjnego. Może to ograniczyć liczbę nieużywanych plików z poprzedniej wersji. Może to być większy wysiłek niż aktualizacja systemu na żywo. Jeśli jednak zostaną zastosowane różne partycje główne, może to ograniczyć ryzyko utknięcia w częściowo zaktualizowanym systemie, którego nie można uruchomić.


0

W niektórych przypadkach jest to problem:

  • Uaktualnienie JDK podczas działania maszyny wirtualnej Java: Zadałem myselv to samo pytanie, które otrzymałeś - miałem działającego kocura korzystającego z Java. Teraz po aktualizacji łatki JDK nadal działał bez problemów - tak się wydawało.

Teraz wyjaśnieniem jest pamięć podręczna. OK - uruchomiłem program do zapamiętywania pamięci, aby zużyć całą dostępną pamięć RAM - i wtedy Tomcat się zawiesił (po uzyskaniu dostępu do uruchomionej tam aplikacji).

  • Aktualizacja jądra w systemach SuSE: W SuSE stare jądro i jego moduły są usuwane zaraz po aktualizacji łatki do jądra. Jeśli chcesz użyć czegoś nowego, wymagającego modułu jądra, który nie był do tej pory załadowany, usługa zakończy się niepowodzeniem.

2
Wygląda na to, że niektóre fragmenty Tomcata zostały zrestartowane lub biblioteki dynamiczne zostały użyte poniżej poziomu Java (np. Dlopen () i tak dalej), co może skończyć się mieszaniem aktywnych API.
Skaperen

@Skaperen nawet przy użyciu biblioteki współdzielone - jeśli zostaną zamknięte po użyciu dowolnego programu powinny mieć kłopoty, jeśli bufor jest coraz skąpe ...
Nils

1
Otwarty deskryptor pliku ma taką samą moc zatrzymywania danych na dysku jak nazwa pliku w katalogu. Pierwotny i-węzeł nie zostanie usunięty, dopóki na dysku będzie twardy link lub otwarty deskryptor pliku. Pamięć podręczna nie ma z tym nic wspólnego. Teraz niektóre programy zamykają swoje deskryptory plików, gdy ich nie używają, co może pozwolić na zniknięcie danych.
dmckee,

@dmckee Right. Zbliżamy się do rdzenia. Więc co jest normalne dla „normalnego” programu: otwórz bibliotekę i pozostaw ją otwartą, lub załaduj bibliotekę i zamknij ją później?
Nils
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.