Jak działa proces aktualizacji Ubuntu?

12

W jaki sposób Ubuntu bezproblemowo aktualizuje się do nowszej dystrybucji, gdy system operacyjny wciąż działa? Uaktualniam z 10.10 do 11.04 i kilkakrotnie aktualizowałem i jest to tak proste, jak uruchomienie menedżera aktualizacji -d oraz pobranie i zainstalowanie ich, a następnie ponowne uruchomienie.

Jak dokładnie to działa? W jaki sposób menedżer aktualizacji może zaktualizować system operacyjny, gdy jest on nadal używany?

bbosak
źródło
Okej, dodanie mojego pytania w komentarzu z nagrodą nie było dobrym pomysłem. Nie wygląda też na to, żebym mógł to edytować.
Oxwivi

Odpowiedzi:

3

Z mojego doświadczenia zakładam, że podczas działania pakietów i modułów są one przechowywane w pamięci i nie odwołują się zbytnio do ich kopii na dysku twardym. Możesz to zobaczyć, jeśli uruchomisz program w Ubuntu, a następnie usuniesz powiązane pakiety podczas jego działania. Będzie działał, ale jeśli go zamkniesz, nie będziesz mógł go ponownie uruchomić.

Zakładam, że to samo dzieje się z uaktualnieniem dystrybucji. Wszystkie pakiety związane z oryginalną wersją Ubuntu nadal działają, mimo że zostały usunięte i zastąpione nowymi, więc kiedy zostaną ostatecznie zatrzymane przy ponownym uruchomieniu systemu, nowe pakiety przejmują kontrolę.

Slipstream
źródło
To wyjaśniałoby również, dlaczego w miarę postępu aktualizacji zauważam, że do niektórych menu dodawane są nowe funkcje.
bbosak
16

Oto bardziej szczegółowy opis procesu. Przepraszam, że tekst był tak długi.

Moje doświadczenie wynika z Debiana, dla którego pierwotnie wynaleziono cały system pakowania i aktualizacji używany w Ubuntu. Codzienne aktualizacje bezpieczeństwa Ubuntu odpowiadają działaniom, apt-get upgradektóre normalnie nie usuwają żadnego oprogramowania. Aktualizacje dużych wersji odpowiadają okresowi, apt-get dist-upgradew którym pakiety oprogramowania mogą być wymieniane całkowicie.

W rzeczywistości komponenty bardzo niskiego poziomu zwykle nie są wymieniane podczas aktualizacji wersji. Natychmiast po aktualizacji powinieneś znaleźć dwa obrazy jądra i initrd w katalogu / boot. Wynika to z faktu, że w przeciwieństwie do programów, komponenty jądra nie są tak dobrze wymienne. Jeśli zajdzie potrzeba załadowania nowych sterowników urządzeń podczas aktualizacji, muszą one być kompatybilne z działającym jądrem. Po uruchomieniu systemu za pomocą nowego jądra stary można usunąć. Ostatnim razem, gdy sprawdziłem, że to jedno trzeba było zrobić ręcznie, nie wiem, jak radzi sobie z tym obecny program aktualizujący. To jest BTW. główny powód, dla którego obraz jądra nosi swój numer wersji w nazwie pliku - dzięki czemu można jednocześnie instalować różne wersje jądra. To samo dla ścieżki modułu (/ lib / modules / ...)

Pakiety oprogramowania są uaktualniane jeden po drugim, zaczynając od najniższych pakietów w hierarchii zależności. Są to zwykle biblioteki programów, takie jak libc i inne. Kolejność aktualizacji pakietów nie jest jednak zakodowana na stałe, lecz dynamicznie obliczana w miarę rozwiązywania zależności między pakietami. W większości przypadków stare programy mogą działać z nowymi bibliotekami, więc nie jest to takie problematyczne, jeśli te biblioteki zostaną najpierw wymienione.

Musisz tutaj zrozumieć, że system rozróżnia między ręcznie zainstalowanymi pakietami (tj. Pakietami, których instalacji sam sobie zażądałeś, tj. Chromem) i automatycznie zainstalowanymi pakietami, które zostały zainstalowane tylko w celu spełnienia zależności ręcznie zainstalowanych pakietów (i zależności tych zależności ).

Dla każdego ręcznie zainstalowanego programu program aktualizujący po prostu szuka nowszej wersji. Często te programy to tylko meta-pakiety, takie jak „ubuntu-desktop”, który nie zawiera danych, a jedynie zależności. Zostaną pobrane nowe wersje bibliotek zależnych, ponieważ są one wymagane przez bezpośrednio aktualizowane (ręcznie żądane) programy. Aktualizator zawsze będzie próbował zainstalować najnowszą użyteczną wersję dowolnego pakietu zależnego (podczas każdego uaktualnienia nie tylko aktualizacji wydania).

Programy, które nie mogą działać z nowymi wersjami bibliotek, nie mogą zostać uruchomione w czasie po aktualizacji biblioteki, a także przed aktualizacją samego programu. Jeśli te programy powinny już działać przed aktualizacją biblioteki, będą nadal działać, ponieważ stara wersja biblioteki pozostaje w pamięci tak długo, jak długo jest używana. To samo dotyczy programów, które zostały uruchomione przed ich aktualizacją. Nie będą one oferować nowych funkcji, dopóki nie zostaną zakończone i ponownie uruchomione.

Po aktualizacji niektóre biblioteki (lub ogólnie zależności) zostaną osierocone. Są to biblioteki, które były wymagane przez stare wersje programów, ale nie są już wymagane przez nowe wersje. Ponieważ te pakiety są oznaczone jako zainstalowane automatycznie, a ponieważ nie ma już do nich żadnego ręcznego programu prgram, pakiety te można łatwo zlokalizować i usunąć. Możesz nawet zaobserwować to jako ostatni krok procesu aktualizacji (program aktualizujący mówi „usuwanie przestarzałych pakietów” lub coś podobnego).

Niektóre pakiety zostaną zainstalowane, które, jeśli nie były wcześniej instalowane, są po prostu nowymi zależnościami, które są oznaczone jako automatycznie zainstalowane i mogą zostać usunięte, jeśli wymagania dla nich znikną w przyszłości.

Ten mechanizm pozwala nawet na wymianę całych programów użytkownika. Jak na przykład przejście z Gnome2 na Unity. Ponieważ oba są tylko automatycznymi zależnościami od Ubuntu-Desktop, który jest jednym z niewielu pakietów, dla których w rzeczywistości w pierwszej kolejności są wymagane nowe wersje.

Programy zwykle nie zależą od konkretnej wersji jądra systemu operacyjnego, więc normalnie będą działać dobrze z działającym jądrem.

Podejrzewam, że oprócz tego wszystkiego aktualizator Ubuntu wprowadza pewne poprawki i obejścia, aby obejść sytuacje, w których teoria się psuje.

Jak widać podczas aktualizacji są bardzo dobre warunki, w których system nadaje się tylko do ograniczonej części. Jeżeli coś pójdzie nie tak podczas aktualizacji Państwo będzie najprawdopodobniej pozostanie ze złamanym systemem. Często nawet taki, którego nie można łatwo naprawić, ponieważ może to również wpłynąć na program aktualizacji. Pamiętaj, że programy z uszkodzonymi zależnościami mogą nadal działać, ale nie można ich ponownie uruchamiać, o ile zależności są zepsute, dotyczy to również programu aktualizującego.

Za pomocą programu wiersza polecenia apt-markmożna dowiedzieć się, które pakiety są oznaczone jako zainstalowane ręcznie, a które automatycznie. Możesz także przełączać te znaki za pomocą tego samego programu. Wpłynie to bezpośrednio na proces aktualizacji.

W bardziej złożonej konfiguracji oprogramowania Updater czasami prosi o ręczne rozwiązanie zależności. To znaczy, gdy jeden ręcznie zainstalowany program zostanie zaktualizowany i zażąda nowej wersji biblioteki, podczas gdy inny ręcznie zainstalowany program zależy od starej wersji tej samej biblioteki i nie może współpracować z nową. Będziesz musiał dokonać wyboru, albo zrezygnować z jednego z tych programów, albo powstrzymać się od aktualizacji obu. Ponieważ zależności są często skomplikowane, bardzo szybko mogą się one stać bardzo nieuporządkowane (być może słyszałeś o piekle zależności).

Teraz konkretne pytania:

  1. Kiedy zmienia się infrastruktura niskiego poziomu (niski poziom jak w jądrze, sterownikach, bibliotekach itp., Z czym użytkownik nie wchodzi w bezpośrednią interakcję), co dzieje się z przestarzałymi plikami binarnymi?
    • OK ... Już to opisałem
  2. Co dzieje się z aplikacją, która została całkowicie przestarzała? Na przykład Unity 2D (lub jakiekolwiek inne oprogramowanie porzucone / brak opiekunów, których pakiet nie znajduje się w nowym repozytorium).
    • Jeśli aplikacja została raz zainstalowana ręcznie, pozostanie w systemie, często powodując zależność piekło, które opisałem.
  3. ubuntu-desktop to metapakiet, który pobiera domyślne aplikacje Ubuntu jako zależności. Jeśli usunę Firefoksa i zainstaluję Chrome, czy Firefox nadal będzie pobierany jako część aktualizacji?
    • Tak długo, jak jest to standardowa przeglądarka nowej wersji. Chromium również zostanie zaktualizowane. Nie jestem pewien, czy możesz usunąć Firefoksa bez usuwania ubuntu-desktop. Zauważ, że oprócz ścisłych zależności, system pakietów zna również koncepcję rekomendacji, w których oprogramowanie będzie normalnie instalowane jak zależność, ale można je później odinstalować bez wpływu na nic poza własnymi zależnościami.
  4. Co więcej, co się stanie, jeśli pojedyncza aplikacja zależała od pakietu-x i nie robi tego już w nowej wersji; czy pakiet-x zostanie zaktualizowany wraz z resztą pakietów, mimo że zostanie osierocony?
    • Nie.

Zapytaj mnie, czy nadal masz jakieś pytania.

Paul Hänsch
źródło
Czy możesz link do większej liczby dokumentów związanych z piekłem zależności (przypomina mi termin DLL piekło)? Używam minimalnej liczby instalacji Ubuntu i chcę dowiedzieć się, jak będzie działać aktualizacja.
Oxwivi,
Myślę, że wszystko, co znajdziesz w Internecie na temat uzależnienia od piekła, to skargi. Przeczytaj swoje apt man strony, jak man apt-get. Uważam, że często przydatne jest użycie składni określającej komendę, np. apt-get -t intrepid install foo/jaunty bar/oneiricEtc ..., tylko przykłady. W rzeczywistości ma to większy sens w Debianie, w którym czasami miksujesz wydania, w Ubuntu jest to mniej zwyczajowe. Ciekawymi tematami mogą być także przypinanie i zawieszanie pakietów.
Paul Hänsch,
3
Wygrywasz nagrodę za najdłuższą odpowiedź bez kodu, jaką kiedykolwiek widziałem w sieci Stack Exchange.
Patrick
3

Na poziomie systemu plików, w przeciwieństwie do systemu Windows, w systemie Unix można usuwać otwarte pliki. Usunięcie po prostu usuwa nazwę pliku, a nie jego zawartość, więc każdy program, który nadal ma otwarty plik, może nadal uzyskać do niego dostęp, dopóki go nie zamknie, i dopiero wtedy dane zostaną uwolnione.

Tak więc proces aktualizacji po prostu usuwa stare pliki, zastępuje je nowymi, a dla niektórych usług systemowych uruchamia je ponownie, aby nowa wersja była uruchomiona.

Istnieje jeden lub dwa składniki, których nie można zrestartować bez ponownego uruchomienia całego komputera, więc po ich uaktualnieniu pojawi się monit o ponowne uruchomienie, więc będziesz używać nowej wersji.

psusi
źródło
2

Jak Linux może się aktualizować, gdy jest nadal używany?

Głównie dlatego, że Linux (a wraz z nim większość dystrybucji) jest po prostu zaprojektowany w ten sposób. Możliwość aktualizacji pakietu w działającym systemie jest celem większości dystrybucji opartych na Linuksie.

W systemie Linux nic nie stoi na przeszkodzie, aby proces menedżera pakietów zapisał plik na dysku, nawet jeśli plik ten jest obecnie otwarty przez aplikację lub plik jest wykonywalną lub współdzieloną biblioteką kodu, która jest obecnie uruchomiona . Na bardzo niskim poziomie są blokady, które chronią dostęp do pliku podczas pojedynczej operacji zapisu / odczytu, ale nigdy nie są zaprojektowane tak, aby można je było przechowywać dłużej niż przez milisekundy oraz w jakiejkolwiek innej aplikacji próbującej zapisać do tego samego pliku po prostu poczeka te milisekundy.

Możesz zamienić plik wykonywalny, gdy jest uruchomiony, i tak naprawdę nie zrobi nic z uruchomionym procesem, ponieważ proces nie potrzebuje już pliku na dysku - cały jego kod został już załadowany do pamięci.

Dlatego w systemie Linux, nawet jeśli możesz zaktualizować aplikację podczas jej działania, aktualizacja nie zadziała, dopóki nie zaktualizujesz aplikacji, którą zaktualizowałeś. W przypadku uaktualnienia procesu w tle, takiego jak usługa systemowa, usługa ta musiałaby zostać zrestartowana. W przypadku aktualizacji jądra oznacza to ponowne uruchomienie.

Czy zastąpienie plików programu podczas działania nie spowoduje uszkodzenia niektórych programów?

Niektóre pakiety w dystrybucji Linuksa będą zawierać instrukcje instalacji instruujące menedżera pakietów, aby zatrzymał niektóre usługi systemowe podczas aktualizacji pakietu i wznowił te usługi po zakończeniu aktualizacji. Zapobiega to sytuacjom, w których na przykład pliki konfiguracyjne dla określonej usługi są aktualizowane, a działająca wersja usługi może nie być w stanie poradzić sobie z nowszą wersją plików konfiguracyjnych.

Ogólnie rzecz biorąc, zwykłe aplikacje użytkownika nie wymagają uruchamiania plików konfiguracyjnych, z wyjątkiem plików, które sam generuje i umieszcza w lokalizacjach, takich jak katalogi domowe użytkowników. Dlatego menedżer pakietów nie będzie ich dotykać podczas aktualizacji.

thomasrutter
źródło
Jestem już świadomy wszystkich tych szczegółów, przeczytaj komentarz, który zamieściłem wraz z moją nagrodą. Chcę wiedzieć, jak dokładnie Ubuntu, tj. aptObsługuje pewne pakiety i zależności podczas procesu aktualizacji.
Oxwivi
-2

Jest to podobne do innej funkcji. Mam nadzieję, że pomoże to zrozumieć podstawowy proces.

Mam na myśli możliwość „przełączania roota” podczas uruchamiania systemu operacyjnego.

Podczas uruchamiania systemu operacyjnego główny system plików (czytaj: „/”) jest początkowo dostępny tylko w pamięci RAM. Podczas tego procesu rozruchu przełącza / z pamięci RAM na system plików / na dysku twardym.

sfałszowane
źródło
1
Nie, mechanizm chroot nie jest używany podczas aktualizacji systemu. Aktualizacja odbywa się w systemie plików na żywo. Możesz nawet oglądać przebudowywanie menu programu i zmiany ikon programu w miarę ich wymiany. Ale mechanizm chroot jest używany w oryginalnej instalacji systemu, gdy świeży system jest „debootstrapped” do zmieniającego się środowiska root na nowo utworzonej partycji dysku.
Paul Hänsch