Оновлення ядра Linux, залишаючи решту системи такою, якою є


25

Я користувач OpenBSD. У FAQBS OpenBSD написано:

OpenBSD - це повна система, призначена для синхронізації. Це не ядро ​​плюс утиліти, які можна оновити окремо один від одного.

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

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

Я з цим цілком гаразд. Насправді, це одна з причин я використовую OpenBSD. Це робить систему послідовною одиницею, і мені легко сформувати розумовий огляд її.

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

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

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

Причина, про яку я запитую, полягає в тому, що інший користувач на цьому веб-сайті запитав мене, чи можна буде замінити ядро ​​в його системі Linux на новішу версію ". Виходячи з речей OpenBSD, я не міг сказати, що так, це гарантувало б, щоб не порушити систему.


Я використовую "Linux" вище як скорочення для "дистрибуції Linux", ядра + утиліти.


Це ще один спосіб сказати, що OpenBSD має лише один розподіл. Кілька записів меню grub у звичайній системі Linux - це повернення до більш раннього ядра у випадку, якщо (як правило) новітня з якихось причин не може завантажитися.
Thorbjørn Ravn Andersen

Відповіді:


29

Лінус Торвальдс має дуже сильну думку щодо змін ядра, що призводить до регресії простору користувачів (детальніше див. Питання " Ядро Linux: розбиття простору користувача ").

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

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

Політика стабільного простору користувачів є причиною того, що оновлення ядра рідко викликають проблеми в додатках простору користувачів, і ви, як правило, не очікуєте проблем після оновлення ядра.

Однак стабільність API не гарантується для інтерфейсів ядра та інших деталей реалізації . Sysfs (on /sys) та procsfs (on /proc/) розкривають деталі реалізації ядра щодо конфігурації виконання, апаратного забезпечення, мережі, процесів тощо, які використовуються додатками низького рівня. Ці інтерфейси можуть змінюватися несумісним чином між версіями ядра, якщо є вагомі причини. Зміни все ще намагаються мінімізувати несумісність, якщо це можливо, і є правила щодо того, як програми можуть використовувати інтерфейси таким чином, що найменше може спричинити проблеми. Вплив також обмежений, оскільки програми, що не мають низького рівня, не повинні використовувати ці інтерфейси.

@PeterCordes вказав, що якщо зміна procfs або sysfs порушує програму, використовувану вашими дистрибутивами init-скриптів, у вас може виникнути проблема.

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

@StephenKitt додав, що для оновленого простору користувача може знадобитися новіша версія ядра; у цьому випадку система може не мати можливості завантажуватися зі старим ядром, і примітки до випуску розповсюдження згадують про це, коли це доречно.


1
Було б корисно в довгостроковій перспективі розширити це пояснення резюме інтерфейсу користувача-ядра (він же виклики системи), оскільки він пояснює механізм, за допомогою якого різні конфігуровані ядра не порушують програми.
wallyk

3
Навіть procfs ( /proc) та sysfs ( /sys) зберігаються максимально стабільно, дотримуючись тієї ж політики / філософії "не порушуйте користувацький простір". Також ioctl()коди на файли пристроїв en.wikipedia.org/wiki/Ioctl . Це виходить далеко за рамки простої сумісності з системним викликом ABI, але, як ви кажете, коли є вагомі причини, все змінюється /procі в /sys. Він не порушує більшість програм безпосередньо, але якщо він порушить програму простору користувача низького рівня, яку використовують сценарії init вашого дистрибутива, у вас може виникнути проблема. На щастя, це рідко.
Пітер Кордес

Насправді деякі файли, такі як rfkillкомутатор IIRC , змінили місця в деяких оновленнях ядра. Так /procі /sysнабагато менш стабільні, ніж інтерфейс syscall. На щастя, дистрибутивні програми зазвичай не включають такі оновлення ядра, якщо це не основна версія оновлення версії дистрибутива.
Руслан

3
Тут слід враховувати два аспекти: оновлення ядра та оновлення користувачів. Завдяки стабільності ABI ядра, оновлення ядра є досить безпечним (навіть із /procта /sysзазвичай змінюється - видалення займає роки). Однак для оновлення простору користувачів може знадобитися нове ядро, і ви можете створити незавантажену систему, якщо у вас немає достатнього нового ядра. Примітки до випуску Distro згадують це, коли це доречно (тому не оновлюйте дистрибутивів сліпо, читайте нотатки до випуску).
Стівен Кітт

1
Існують вказівки щодо файлів / proc і / sys і про те, як користувацька область повинна їх читати, щоб додати більше полів у новіші ядра. / proc / stat, наприклад, або / proc / meminfo. Очікується, що користувальницький простір буде ігнорувати додані поля.
Zan Lynx

11

Ядро Linux та користувальницький простір дистрибутиву Linux, в якому історично переважали користувацькі інструменти, розроблені проектом GNU, слабко поєднані. Частково це задумом, а частково - необхідністю.

На відміну від BSD, де ядро ​​та базовий користувальницький простір розробляються та підтримуються разом, ядро ​​Linux та його користувальницький простір були розроблені та підтримуються різними людьми. Тож утримувати їх щільно з'єднаними разом буде важко, навіть якщо громада цього бажає, що, на мою думку, це не робить.

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

Однак, все ще є певна ступінь зв'язку. Досить старе ядро ​​Linux не працюватиме із сучасними дистрибутивами.


2
@Abigail це забір ниток, але сумісність вперед може бути забезпечена, якщо в просторі користувача реалізуються відповідні резервні копії (навіть деградовані резервні копії) для відсутніх функцій ядра. Це, правда, часто не бажано або навіть варто, але деякі програми це роблять ( glibcнаприклад). (Але так, це не обіцянка ядра, це обіцянка простору користувача.)
Стівен Кітт

7

Я розумію, що Linux є ядром, а все інше - допоміжним. Ви, безумовно, можете оновити ядро ​​незалежно від (багатьох) встановлених пакетів, оскільки вони, як правило, прив'язані до бібліотек, а не до самого ядра. Зазвичай ви бачите лише таке з'єднання між версіями ядра та драйверами апаратного забезпечення (наприклад, драйвери GPU). Деяке програмне забезпечення сумісне лише з певними версіями ядра, але це повинно бути зазначено в індивідуальній документації цих програм.

Досить поширеним є встановлення двох системних пакетів ядер, встановлених у системі - поточно використовуваний пакет та раніше встановлений пакет. Під час оновлення після забезпечення належної роботи нової версії найдавнішу версію можна буде видалити, і у вас все ще є відомий безпечний запас. Наприклад, Red Hat (та його двоюрідні брати) package-cleanup --oldkernels --count 2повинні робити це автоматично.


Навіть щось на зразок kmod , яке, на вашу думку, потрібно буде прив’язати до версії ядра, має трохи свободи, у яких версіях він буде працювати.
Ігнасіо Васкес-Абрамс

4

Окрім усіх хороших аргументів тут, я можу додати кілька моментів, які допоможуть.

Ми вже знаємо політику команди ядра, і, як дистрибутиви Linux, ми намагаємося зберегти вихідний код ядра максимально чистим. Це означає, що коли виникає вразливість або щось, що потребує виправлення, ми повідомляємо команду ядра і намагаємося допомогти з патчами, але, врешті-решт, остаточне рішення приймається від команди ядра.

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

Одним із додаткових елементів, які слід пам’ятати, є те, що всі дистрибутиви Linux мають команду технічного обслуговування, яка гарантує, що все програмне забезпечення сумісне з системою. Ось чому майже кожен дистрибутив має стабільну і нестабільну версію. Розробники працюють з "нестабільним" програмним забезпеченням, і коли все тестується, вони відзначають його як стабільний, лише після цього звичайний користувач може оновити пакет, тому якщо людина, яка запитала вас, є звичайним користувачем, на 90% впевнена, що програмне забезпечення добре перевірено .

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.