Як працює оновлення запущених бінарних програм програми під час оновлення?


23

Я щойно модернізував свій ubuntu lucid до natty, під час оновлення він замінив більшість запущених програм на новішу версію.

Як це працює? (Невдалі програми не завершаться?) Що станеться з програмою, якщо оновлений файл lib та запущений додаток, який шукає старіший lib, намагається завантажити його?


Добре запитання, але, мабуть, краще тут задати : unix.stackexchange.com (я знаю, що URL говорить, що Unix, але вони також надсилають питання Linux!)

Зрозуміти функціонал заміни, поки відкрито Linux, схоже, він все ще програмує (але ледве :)
bdonlan

2
@bdonlan: Якщо ви динамічно завантажуєте бібліотеки протягом свого процесу, вам слід дуже добре знати про це, інакше це може вас вкусити. Це особливо важливо, якщо ви намагаєтесь зробити щось незвичне, наприклад, код, що змінюється і т. Д. Але так, це межа.
Пісквор

1
Це не дуже важливо для самомодифікуючого коду, але це, безумовно, щось, хто повинен писати бібліотеки для Linux, так. :)
bdonlan

1
@Piskvor, трохи схоже на багатоступеневий процес компіляції для gcc :) Але в основному лише такі компілятори роблять щось подібне, і зазвичай ви не оновлювали б систему, поки ви це робите (навіть якщо ви це робите, доки не робите "Не знижуйте нічого, поки він працює, ви добре, оскільки він буде використовувати свої приватно складені копії всього, що має значення)
bdonlan

Відповіді:


31

Linux (та інші UNIX) розмежовують назву файлу ( посилання ), сам файл (часто ототожнюється з inode ) та відкриті ручки до файлу. Коли ви збираєтесь видалити файл, ви викликаєте unlink()виклик - це стирає посилання на файл (ви також можете використовувати його rename()для перезапису з іншим inode). Однак якщо відкриті ручки до файлу (або інші посилання - файли можуть мати декілька жорстких посилань ) залишаються, то вклад залишається, і так зберігається вміст файлу, поки всі посилання та ручки не зникнуть.

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

Крім того, зауважте, що програми, які очікують на "стару бібліотеку", стануть чудовими при нових версіях бібліотеки. Бібліотекам Linux присвоюється ім'я файлу ('soname'), яке відображає версію ABI (бінарного інтерфейсу програми), яку пропонує бібліотека. Наприклад, бібліотека С у моїй системі є libc.so.6. Будь-яка програма, складена зі старшої версії libc, але все ще версія libc, що реалізує версію 6 ABI, буде добре працювати з нею. Дійсно старі програми будуть шукати libc.so.5або libc.so.4або що - то замість; в цьому випадку вам також потрібно буде зберегти стару версію, але оскільки ім'я файлу інше, це не проблема.


9

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

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

Це використовується не лише в оновленнях дистрибутива, але відбувається при кожному оновленні пакету (dist-upgrade просто додає ще кілька автоматичних кроків до цього процесу).


0

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

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