Як працює процес оновлення Ubuntu?


11

Як Ubuntu безперервно оновляється до нового дистрибутива, поки операційна система все ще працює? Я оновлююсь з 10.10 до 11.04, і я вже кілька разів оновлювався, і це так просто, як запустити оновлення-менеджер -d та завантажити та встановити їх, а потім перезавантажити.

Як саме це працює, хоча? Як менеджер оновлень може оновити операційну систему, поки вона все ще використовується?


Гаразд, додавання мого запитання в коментарі щедрості не було гарною ідеєю. Не схоже, що я також можу його редагувати.
Oxwivi

Відповіді:


3

Зі свого досвіду я б припустив, що в той час як пакети та модулі працюють, вони зберігаються в пам'яті і не сильно відносяться до їх копії на жорсткому диску. Це можна побачити, якщо ви запускаєте програму в ubuntu, а потім видаляєте відповідні пакети під час її запуску. Він буде продовжувати працювати, але якщо ви закриєте його, ви не зможете його перезапустити.

Я припускаю, що те ж саме відбувається і з оновленням дистрибутива. Усі пакунки, пов’язані з оригінальною версією ubuntu, все ще працюють, навіть якщо їх було видалено та замінено на нові, тож коли їх нарешті зупинено під час перезавантаження системи, нові пакунки перейдуть на себе.


Це також пояснить, чому я помічаю нові функції, що додаються до деяких меню в міру прогресування оновлення.
bbosak

15

Ось більш детальний опис процесу. Вибачте, текст отримав так довго.

Мій досвід походить від Debian, для якого спочатку була винайдена вся система упаковки та оновлення, що використовується в Ubuntu. Щоденні оновлення безпеки Ubuntu відповідають запущеним, apt-get upgradeякі зазвичай не видаляють жодне програмне забезпечення. Великі оновлення версій відповідають тому, apt-get dist-upgradeпротягом якого програмні пакети можна повністю обміняти.

Насправді компоненти дуже низького рівня зазвичай не обмінюються під час оновлення випуску. Відразу після оновлення у каталозі / boot слід знайти два зображення ядра та initrd. Це тому, що на відміну від програм, компоненти ядра не так добре взаємозамінні. Якщо виникає потреба у завантаженні нових драйверів пристроїв під час оновлення, вони повинні бути сумісні з запущеним ядром. Після завантаження системи новим ядром старе можна видалити. Востаннє, коли я перевіряв, що це потрібно зробити вручну, я не знаю, як це впорається поточний оновник. Це BTW. головна причина, чому зображення ядра містить його номер версії у назві файлу - так що ви можете мати різні версії ядра одночасно. Те ж саме для шляху модуля (/ lib / module / ...)

Програми програмного забезпечення оновлюються один за одним, починаючи з найнижчих пакетів в ірархії залежностей. Зазвичай це бібліотеки програм, такі як libc та інші. Послідовність оновлення пакетів, однак, не кодується жорстко, але динамічно обчислюється у міру вирішення залежностей пакунків. У більшості випадків старі програми можуть функціонувати з новими бібліотеками, тому це не так вже й проблематично, якщо перші бібліотеки замінять спочатку.

Тут ви повинні зрозуміти, що система розрізняє пакети, встановлені вручну (тобто пакети, встановлення яких ви безпосередньо запросили, тобто хром), і автоматично встановлені пакети, які встановлені лише для виконання залежностей від встановлених вручну пакетів (і залежностей цих залежностей) ).

Для кожної встановленої вручну програми оновлення просто шукає нову версію. Часто ці програми є лише мета-пакетами типу "ubuntu-desktop", який не містить даних, а лише залежності. Будуть введені нові версії залежних бібліотек, оскільки їх вимагають безпосередньо оновлені (вручну запитувані) програми. Оновлення завжди буде намагатися встановити нову корисну версію будь-якого залежного пакета ( в протягом будь-якого upgrdade не тільки випустити оновлення).

Програми, які не можуть функціонувати з новими версіями бібліотеки, не можна запускати протягом часу після оновлення бібліотеки, а також до оновлення самої програми. Якщо ці програми вже повинні бути запущені до оновлення бібліотеки, вони, однак, продовжують працювати, оскільки стара версія бібліотеки залишається в пам'яті, поки вона залишається у використанні. Те саме стосується програм, які були запущені ще до їх оновлення. Вони не надаватимуть нових функцій, поки вони не припиняться та не перезапускаються.

Після оновлення деякі бібліотеки (або взагалі залежності) стануть сиротами. Це бібліотеки, які потребували старі версії програм, але нові версії більше не потрібні. Оскільки ці пакунки позначені як автоматично встановлені, і оскільки жодна встановлена ​​вручну програма не стосується них, ці пакунки можна легко знайти та вилучити. Ви навіть можете спостерігати це як останній крок процесу оновлення (оновлення каже: "видалення застарілих пакетів" або щось подібне).

Будуть встановлені деякі пакети, які там, де не встановлені раніше, це просто нові залежності, які позначені як автоматично встановлені, і їх можна буде видалити, якщо вимога до них відпаде в майбутньому.

Цей механізм навіть дозволяє обмінюватися цілими програмами користувачів. Як, наприклад, перехід від Gnome2 до Unity. Оскільки обидва є лише автоматичними залежностями ubuntu-desktop, який є одним з небагатьох пакетів, для якого в першу чергу фактично запитуються нові версії.

Програми зазвичай не залежать від конкретної версії ядра ОС, тому вони нормально працюватимуть із запущеним ядром.

Крім усього цього, я підозрюю, що оновник Ubuntu кидає в суміш деякі конкретні виправлення та обхідні шляхи, щоб обійти ситуації, коли ця теорія порушується.

Як ви бачите, під час оновлення існують дуже хороші умови, коли система доступна лише для обмеженої частини. Якщо під час оновлення щось піде не так, ви , швидше за все, залишитесь із зламаною системою. Часто навіть такий, який неможливо легко відремонтувати, оскільки це може вплинути і на програму оновлення. Пам'ятайте, що програми з розбитими залежностями можуть продовжувати функціонувати, але не перезапускатись, доки залежність буде розбита, це стосується і оновлення.

Ви можете скористатися програмою командного рядка, apt-markщоб дізнатися, які пакунки позначені як встановлені вручну та які були автоматично встановлені. Ви також можете перемикати ці позначки за допомогою тієї самої програми. Це безпосередньо вплине на процес оновлення.

У складніших програмах налаштування програмного оновлення інколи буде просити вас усунути залежність вручну. Тобто, коли одна встановлена ​​вручну програма оновлюється і вимагає нової версії бібліотеки, тоді як інша встановлена ​​вручну програма залежить від старої версії тієї ж бібліотеки і не може працювати з новою. Тоді вам доведеться зробити свій вибір, або відмовитися від однієї з цих програм, або утриматися від оновлення обох. Оскільки залежності часто складні, це може дуже швидко забруднитись (ви могли чути про термін "пекло залежності").

Тепер до конкретних питань:

  1. Якщо змінюється інфраструктура низького рівня (низький рівень, як у ядрі, драйверах, бібліотеках тощо, все, з чим користувач не взаємодіє безпосередньо), що відбувається з застарілими бінарними файлами?
    • Гаразд ... Я вже висвітлював цей
  2. Що відбувається з додатком, який повністю застарів? Наприклад, Unity 2D (або будь-яке інше програмне забезпечення, відмовлене / не має технічного обслуговування, пакет якого не знаходиться в новому репо).
    • Якщо додаток одного разу було встановлено вручну, воно залишатиметься в системі, що часто спричиняє пекло залежності, яку я описав.
  3. ubuntu-desktop - це метапакет, який висуває програми Ubuntu за замовчуванням як залежності. Якщо я видалю Firefox та встановив Chrome, чи буде Firefox все-таки залучатися як частина оновлень?
    • Поки це стандартний браузер нового випуску, так. Також буде оновлено хром. Я не впевнений, чи зможете ви видалити Firefox, не видаляючи ubuntu-desktop. Зауважте, що крім суворих залежностей, система пакунків знає також концепцію рекомендацій, де програмне забезпечення, як правило, встановлюється як залежність, але його можна буде видалити пізніше, не зачіпаючи нічого іншого, крім власних індивідуальних залежностей.
  4. Більше того, що станеться, якщо один додаток, який раніше залежав від пакета-x, і більше не робить цього в новому випуску; буде оновлено package-x разом з рештою пакетів, незважаючи на те, що вони осиротіли?
    • Ні.

Просто запитайте мене, чи є у вас ще запитання.


Чи можете ви зв’язати більше документів, пов’язаних із пеклам залежності (нагадує мене про термін DLL пекло)? Я використовую мінімальні встановлення Ubuntu, і хочу зрозуміти, як для мене буде працювати оновлення.
Oxwivi

Я думаю, що все, що ви знайдете в Інтернеті про пекло залежності, - це скарги. Читайте сторінки влучної людини, як-от man apt-get. Я вважаю, що часто корисно використовувати синтаксис команд, що вказують випуск, як apt-get -t intrepid install foo/jaunty bar/oneiricтощо ..., лише приклади. Насправді це має більше сенсу з Debian, де ви іноді змішуєте випуски, в Ubuntu це менш звично. Цікавими темами також можуть бути влучне закріплення та встановлення пакетів на очікування.
Paul Hänsch

3
Ви виграєте нагороду за найдовший відповідь без коду, яку я коли-небудь бачив у мережі Stack Exchange.
Патрік

3

На рівні файлової системи, на відміну від Windows, в системі Unix можна видаляти відкриті файли. Видалення просто видаляє ім'я файлу, а не його вміст, тому будь-які програми, які все ще мають відкритий файл, все ще можуть отримати до нього доступ до закриття файлу, і лише після цього дані звільняються.

Тож процес оновлення просто видаляє старі файли, замінює їх на нові, а для деяких системних служб перезавантажує їх, щоб нова версія працювала.

Є один або два компоненти, які неможливо перезапустити без перезавантаження всього комп’ютера, тому після оновлення ви отримаєте запит на перезавантаження, тому ви будете використовувати нову версію.


2

Як Linux може оновлюватись, поки він все ще використовується?

Головним чином, тому, що Linux (а з ним і більшість дистрибутивів) просто створений таким чином. Можливість оновлення пакета в операційній системі є метою більшості дистрибутивів на базі Linux.

У Linux немає нічого, що перешкоджало б процесу управління менеджером пакунків писати у файл на диску, навіть якщо цей файл наразі відкритий програмою або файл є виконуваною або спільною бібліотекою коду, яка зараз працює . На дуже низькому рівні є блокування, які захищають доступ до файлу під час однієї операції запису / читання, але вони ніколи не розроблені для того, щоб утримуватись більше ніж мілісекунд, і будь-яка інша програма, що намагається записати в той самий файл буде просто чекати цих мілісекунд.

Ви можете замінити виконуваний файл під час його запуску, і він фактично нічого не зробить для запущеного процесу, тому що процес більше не потребує файлу на диску - весь його код уже завантажений у пам'ять.

Ось чому в Linux, навіть якщо ви можете оновити програму під час її запуску, оновлення насправді не набере чинності, поки не буде перезапущено оновлену програму. У разі оновлення фонового процесу, такого як системна служба, цю службу потрібно буде перезапустити. У випадку, якщо ви оновили ядро, це означає перезавантаження.

Не вдасться замінити файли програми, поки вона працює, перервати деякі програми?

Деякі пакети в дистрибутиві Linux містять інструкції з встановлення, які доручають менеджеру пакунків зупиняти певні системні служби під час оновлення пакета та запускати ці служби після завершення оновлення. Це запобігає ситуаціям, коли, наприклад, файли конфігурації для певної послуги оновлюються і запущена версія послуги може не впоратися з новою версією файлів конфігурації.

Як правило, звичайні користувацькі програми не вимагають запуску файлів конфігурації, за винятком файлів, які він генерує сам, і розміщується в таких місцях, як домашні каталоги користувачів. Таким чином, менеджер пакунків не буде зачіпати їх під час оновлення.


Я вже знаю про всі ці деталі, будь ласка, прочитайте коментар, який я розмістив з моєю нагородою. Хочу знати, як саме Ubuntu, тобто aptобробляє певні пакети та залежності під час процесу оновлення.
Оксвіві

-2

Це схоже на іншу особливість. Сподіваюсь, це допомагає зрозуміти основний процес.

Я маю на увазі можливість "перемикати корінь", коли операційна система завантажується.

Коли операційна система завантажується, коренева файлова система (читати: "/") спочатку доступна лише в оперативній пам'яті. Поки цей процес завантаження працює, він перемикає / з ОЗУ на / файлову систему на жорсткому диску.


1
Ні, механізм chroot не використовується під час оновлення системи. Оновлення виконується в реальній файловій системі. Ви навіть можете спостерігати за тим, як ваші програмні програми відновлюються, а значки програм змінюються під час їх заміни. Але механізм chroot використовується в оригінальній установці системи, коли свіжа система "перезавантажується" в середовище зміни кореня на новоствореному дисковому розділі.
Пол Ханш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.