Я только что обновил свой Ubuntu Lucid до Natty, во время обновления он заменил большинство запущенных приложений более новой версией.
Как это работает? (Не произойдет ли сбой приложения?) Что произойдет с приложением, если файл lib был обновлен и запущенное приложение, которое ищет более старую библиотеку lib, попытается загрузить ее?
Ответы:
В Linux (и других UNIX) проводится различие между именем файла ( ссылка ), самим файлом (часто идентифицируемым с помощью inode ) и открытыми дескрипторами файла. Когда вы идете, чтобы удалить файл, вы вызываете
unlink()
вызов - это стирает ссылку на файл (вы также можете использовать,rename()
чтобы перезаписать его другим индексом). Однако, если остаются открытые дескрипторы файла (или другие ссылки - файлы могут иметь несколько жестких ссылок ), индекс остается, как и содержимое файла, до тех пор, пока все ссылки и дескрипторы не исчезнут.Таким образом, запуск программ с использованием библиотеки или чего-либо другого сохраняет дескриптор старой версии (часто неявно через отображение памяти), поэтому он остается на диске. У него просто больше нет имени файла, и он будет очищен, когда все программы, использующие его, будут закрыты (или при следующей перезагрузке, во время проверки файловой системы или воспроизведения журнала).
Кроме того, обратите внимание, что программы, ожидающие «старую библиотеку», будут отлично работать с более новыми версиями библиотеки. Для библиотек Linux назначается имя файла («soname»), которое отражает версию ABI (двоичный интерфейс приложения), предлагаемую библиотекой. Например, библиотека C в моей системе есть
libc.so.6
. Любая программа, скомпилированная для более старой версии libc, но все еще версия libc, реализующая ABI версии 6, будет работать с ней хорошо. Действительно старые программы будут искатьlibc.so.5
илиlibc.so.4
или что-то вместо этого; в этом случае вам также необходимо сохранить старую версию - но поскольку имя файла другое, это не проблема.источник
В отличие от Windows, вы можете удалить или заменить открытый файл; чтобы дать упрощенное объяснение, новые запросы к файлам открывают новый файл, существующие дескрипторы используют файл, который существовал, когда они были созданы. Другими словами, в Linux у вас могут быть файлы / версии файлов, которые все еще существуют, хотя в структуре каталогов больше нет указателей на них; те перестают существовать, на них вообще нет указателей (закрытых и все).
Обычно запущенное приложение загружает необходимые библиотеки заранее, поэтому описанная вами проблема может возникнуть только в очень специфических временных ситуациях, пока пакет устанавливается: запущенные приложения по-прежнему используют старую версию библиотеки, недавно запущенные приложения используют новую один.
Это используется не только при обновлении дистрибутива, но и при каждом обновлении пакета (dist-upgrade добавляет к этому процессу еще пару автоматических шагов).
источник
Многие процессы Linux продолжают работать после обновления пакетов, из которых они приходят, но некоторые этого не делают. По моему опыту, KDE никогда не работает должным образом, если вы обновляете его во время работы. Вероятно, у вас возникнут сбои и / или сбои при выходе из системы.
источник