Как делает двоичные файлы запущенного приложения обновления во время работы обновления?

Я просто обновил свою человечность, ясную до аккуратного, во время обновления, это заменило большинство запущенных приложений более новой версией.

Как это работает? (Разве приложения не откажут?), Что произойдет с приложением, если библиотечный файл был обновлен и запущенное приложение, которое ищет более старый lib попытки загрузить его?

23
задан 21 May 2011 в 15:30

3 ответа

Linux (и другой UNIXes) проводит различия между названием файла (ссылка), сам файл (часто отождествляемый с inode), и открытыми дескрипторами в файл. Когда Вы идете для удаления файла, Вы звоните unlink() звоните - это стирает ссылку на файл (Вы могли также использовать rename() перезаписывать его с другим inode). Однако, если открытые дескрипторы в файл (или другие ссылки - файлы могут иметь несколько hardlinks) остаются, inode остается, и также - содержание файла, пока все ссылки и дескрипторы не уходят.

Таким образом, под управлением программы, пользующиеся библиотекой или независимо от того, что, сохраняют дескриптор к старой версии (часто неявно посредством размещения в ОЗУ), таким образом, это остается на диске. Это просто не имеет имени файла больше и будет очищено, когда все программы с помощью него закрылись (или на следующей перезагрузке, во время проверки файловой системы или воспроизведения журнала).

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

31
ответ дан 23 November 2019 в 01:26

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

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

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

9
ответ дан 23 November 2019 в 01:26

Много процессов Linux продолжают работать после того, как пакеты, из которых они происходят, были обновлены - но некоторые не делают. По моему опыту, KDE никогда не работает правильно при обновлении его, в то время как он работает. Вы, вероятно, испытаете катастрофические отказы и/или отказы выйти из системы.

0
ответ дан 23 November 2019 в 01:26

Другие вопросы по тегам:

Похожие вопросы: