Почему пакет программного обеспечения работает очень хорошо, даже когда он обновляется?

Надлежащая подсистема безопасности, такая как SELinux позволит Вам выполнять исполняемый файл с ограниченным или никакими возможностями, включая диск, сеть и средства UI. ulimit будет заботиться об остальных.

29
24.05.2013, 06:26
2 ответа

Причиной является Unix, не блокирует исполняемый файл, в то время как это выполняется или даже если этому действительно нравится Linux, эта блокировка относится к inode, не имени файла. Это означает, что процесс, сохраняющий это открытый, получает доступ к тем же (старым) данным даже после того, как файл был удален (несвязанный на самом деле) и заменил новым тем же именем, которое является по существу, что делает обновление пакета.

Это - одни из основных отличий между Unix и Windows. Последний не может обновить файл, заблокированный, поскольку он пропускает слой между именами файлов и inodes создание главной стычки, чтобы обновить или даже установить некоторые пакеты, поскольку он обычно требует полной перезагрузки.

35
27.01.2020, 19:38
  • 1
    Для разъяснения в соответствии с Linux, Вы не можете изменить исполняемый файл, в то время как он работает. Но можно удалить связь с файлом и заменить его новым файлом того же имени. –  cjm 30.04.2013, 09:11
  • 2
    В соответствии с Linux, Вы могли бы изменить исполняемый файл, в то время как он работает. Результат, вероятно, был бы непредсказуем хотя, если Вы действительно не знаете то, что Вы делаете. Добавленный "то же имя" точка, которая не была явно указана. –  jlliagre 30.04.2013, 09:41
  • 3
    @jlliagre, Если я не неправильно понимаю, Вы не можете насколько я знаю: sprunge.us/egiR –  Chris Down 30.04.2013, 09:44
  • 4
    Одна аккуратная вещь о NFTS, хотя - при выполнении переименовывания из командной строки или другой программы, затем можно поместить файл того же имени назад туда, и это не будет влиять на программы, которые имеют исходный открытый файл. (переименовать команда в проводнике не работает на это) –  Steffan Donal 30.04.2013, 11:52
  • 5
    @cjm SE, Вы корректны о "тексте файла занятая" защита в соответствии с Linux, обновленным ответом. Нет такого ограничения в соответствии с Солярисом, с которым с я более знаком. Можно все еще изменить совместно использованные библиотеки с обоими Ose все же. –  jlliagre 30.04.2013, 17:39

Исполняемые файлы обычно открываются однажды, присоединяются к дескриптору файла и не имеют дескриптора файла к своему двоичному файлу вновь открытым в течение единственного периода выполнения. Например, если Вы выполняетесь bash, exec() обычно только создает дескриптор файла для inode, которым указывают /bin/bash однажды - на вызове.

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

В более сложных случаях это может вызвать проблемы. Например, файл конфигурации может быть обновлен и впоследствии перечитан, или программа может передолжностное лицо сама через путь, от которого это выполнялось. Могут также быть проблемы, если программы взаимосвязаны, и каждый выполняется перед обновлением, и один после (возможно первой программой). Это также верно для некоторых библиотек.

Для простых вариантов использования, тем не менее, безопасно обновить, не перезапуская процесс.

18
27.01.2020, 19:38
  • 1
    , которым другая опасность, даже в простых случаях, состоит в том что, потому что запущенное приложение использует кэшируемую копию двоичного файла, что, пока Вы вручную не перезапускаете приложение, это все еще выполняет старую версию кода. В то время как это не должно иметь значения большую часть времени; если обновление включало исправления безопасности, несмотря на патч, устанавливаемый, Ваша система все еще уязвима, потому что старая версия все еще работает. –  Dan is Fiddling by Firelight 30.04.2013, 15:41
  • 2
    я боюсь Ваш первый абзац, неточен. Ядра Unix/Linux не загружают исполняемые программы сразу, но карту распределения памяти их. Это означает, что только страницы, на самом деле используемые в конечном счете, добираются до RAM. Это - смысл "Текстового файла занятая" защита в соответствии с Linux. Нет никакой гарантии, некоторая часть исполняемого файла не будет считана еще долго после того, как она была запущена. Кроме того, некоторые страницы никогда не будут загружаться для достаточно больших программ, и это еще более верно для динамично загруженных библиотек. Например, bash двоичный файл является приблизительно 200 4K страницами, не уверенными, что они все используются на средней сессии. –  jlliagre 30.04.2013, 18:09
  • 3
    @jlliagre, о котором я говорил ialloc()луг к структуре ядра на чтении, не размещении в ОЗУ самих страниц. Разве я не прав в размышлении, что на современном расширении* файловые системы, inode в конечном счете последователен в ядре (и в подсистеме VM)? –  Chris Down 30.04.2013, 19:27
  • 4
    Нет никаких частей гарантии исполняемого содержания, не будет считан долгое время после того, как оно выполняется, и нет никакой гарантии ни одного, что те же страницы не будут прочитаны снова через некоторое время в течение времени выполнения. –  jlliagre 01.05.2013, 17:55
  • 5
    @jlliagre, но это не то, что я имел в виду. Возможно, я выбирал свои выражения немного в моем ответе, я попытаюсь сделать то, что я имел в виду более ясный. –  Chris Down 01.05.2013, 18:08

Теги

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