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?
upgrade
release-management
bbosak
źródło
źródło
Odpowiedzi:
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ę.
źródło
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 upgrade
które normalnie nie usuwają żadnego oprogramowania. Aktualizacje dużych wersji odpowiadają okresowi,apt-get dist-upgrade
w 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-mark
moż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:
Zapytaj mnie, czy nadal masz jakieś pytania.
źródło
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/oneiric
Etc ..., 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.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.
źródło
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.
źródło
apt
Obsługuje pewne pakiety i zależności podczas procesu aktualizacji.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.
źródło