Как работает обновление исполняемых файлов приложения во время обновления?

23

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

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

srinathhs
источник
Хороший вопрос, но, вероятно, лучше задать его здесь: unix.stackexchange.com (я знаю, что в URL написано Unix, но они тоже задают вопросы по Linux!)
Понимание функциональности замены при открытии в Linux кажется, что она все еще программирует (но только :))
bdonlan
2
@bdonlan: Если вы динамически загружаете библиотеки в течение жизни вашего процесса, вы должны очень хорошо об этом знать, иначе это может вас укусить. Это особенно важно, если вы пытаетесь сделать что-то необычное, например, самоизменяющийся код и т. Д. Но да, это границы.
Писквор
1
На самом деле это не имеет отношения к самоизменяющемуся коду, но это то, что кто-то, пишущий библиотеки для linux, должен знать, да. :)
bdonlan
1
@Piskvor, звучит немного похоже на многоступенчатый процесс компиляции для gcc :) Но в основном только компиляторы делают что-то подобное, и обычно вы не будете обновлять систему, пока вы это делаете (даже если вы это делаете, пока вы этого не делаете). «т понижение ничего пока это в процессе, все в порядке, так как он будет использовать его в частном порядке, скомпилированные копии того , что там , где это)
bdonlan

Ответы:

31

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

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

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

bdonlan
источник
9

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

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

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

Piskvor
источник
0

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

Робин Грин
источник