Почему обновление работающей системы Linux не вызывает проблем?

25

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

Позвольте мне привести пример.

Предположим, что в системе запущена программа «А» из определенного пакета. Эта программа в определенный момент должна открыть другой файл ("B") из того же пакета. После этого программа «А» закрывает «В», потому что она больше не нужна. Предположим, теперь я обновляю пакеты «А» и «В», к которым относятся. «A» не затрагивается напрямую этими операциями, по крайней мере, на данный момент, так как он работает в оперативной памяти, а обновление только заменило «A» на жестком диске. Предположим, что «B» также была заменена в файловой системе. Теперь по какой-то причине «А» нужно снова прочитать «В». Вопрос заключается в следующем: возможно ли, что «А» может найти несовместимую версию «В» и аварийно завершить работу или выйти из строя каким-либо другим способом?

Почему никто не обновляет свои системы, перезагружая их с живого CD или с помощью подобной процедуры?

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

Ответы:

23

Обновление Userland редко является проблемой

Вы можете часто обновлять пакеты в действующей системе, потому что:

  1. Общие библиотеки хранятся в памяти, а не читаются с диска при каждом вызове, поэтому старые версии будут оставаться в использовании до перезапуска приложения.
  2. Открытые файлы фактически считываются из файловых дескрипторов , а не из имен файлов, поэтому содержимое файла остается доступным для запущенных приложений, даже когда они перемещены / переименованы / удалены, пока сектора не будут перезаписаны или файловые дескрипторы не будут закрыты.
  3. Пакеты, которые требуют перезагрузки или перезапуска, обычно обрабатываются менеджером пакетов правильно, если пакет был хорошо спроектирован. Например, Debian будет перезапускать определенные сервисы всякий раз, когда обновляется libc6.

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

Смотрите также

http://en.wikipedia.org/wiki/Ring_%28computer_security%29#Supervisor_mode

CodeGnome
источник
Но что будет, если вам понадобится вся кеш-память? В этом случае share-библиотеки должны быть снова загружены с диска ...
Nils
3
На самом деле описание № 1 было не так ясно. Содержимое старого файла библиотеки остается под отдельным (исходным) индексом, даже если все имена, связанные с ним, исчезли, пока какой-либо процесс открыл файл или его содержимое отображено, данные сохраняются различными (а файловая система не может перемонтируется до тех пор, пока не будет отменено связывание файла). Процесс, который сопоставил исходный файл, все еще имеет сопоставления памяти с исходным содержимым.
Skaperen
@Nils Я не эксперт, но если у вас кончится кеш, не будет ли он написан для того, чтобы поменять и перечитать оттуда? Если он заполнен, то какой-то процесс, вероятно, будет заблокирован, прежде чем он сможет отнять память у другого процесса, который уже использует его.
Джо
@ Джо нет - своп тоже есть. Скапперен описывает, что происходит: дескриптор файла остается нетронутым. Таким образом, в основном программа имеет один хедл к старой (ушедшей) библиотеке, которая не будет удалена, пока этот дескриптор снова не освободится - это все на уровне файловой системы, а не на уровне ОЗУ.
Нильс
4

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

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

Патрик
источник
Файл все еще может быть перечитан как «резервное хранилище», если его сопоставление не внесло изменений в память (что в противном случае изменило бы резервное хранилище для замены, если оно доступно), а копия в памяти отбрасывается из-за других требований давления для использования объем памяти. Но это не проблема, потому что исходный файл все еще открыт или сопоставлен. Библиотека замены - это новый и другой файл, который старый процесс не открыл.
Skaperen
1
@Skaperen Я предполагаю, что вы говорите о отображенных в памяти файлах. Это не проблемы при обновлении пакетов. Все менеджеры пакетов создают новые файлы, чтобы заменить старые вместо того, чтобы перезаписывать их. Фактически это единственный способ сделать это, так как работающий исполняемый файл не может быть изменен, он может быть только удален.
Патрик
4

Предположим, что «B» также была заменена в файловой системе. Теперь по какой-то причине «А» нужно снова прочитать «В». Вопрос заключается в следующем: возможно ли, что «А» может найти несовместимую версию «В» и аварийно завершить работу или выйти из строя каким-либо другим способом?

Это возможно, но маловероятно в большинстве случаев. Если «B» является библиотекой кода, то исходная версия обычно не будет закрыта. «А» будет продолжать использовать оригинальную версию «В». Если вы запустите «A» после обновления, будет использоваться новая версия «B». Во время обновления существует риск того, что несовместимые версии могут быть загружены. Однако из-за способа загрузки библиотек кода это должно стать проблемой только в том случае, если «А» нужна функциональность, отсутствующая в загруженных им версиях «В».

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

Файлы конфигурации - это немного другое, но обычно они читаются при запуске. В этом случае «A» не будет читать «B», пока не будет изменена перезагрузка конфигурации. Опять же, было бы плохой практикой кодирования изменять формат или значение файла конфигурации. Несовместимая версия файла конфигурации должна иметь другое имя, чтобы это не вызывало проблем.

Почему никто не обновляет свои системы, перезагружая их с живого CD или с помощью подобной процедуры?

Завершение работы и перезагрузка с другой версии может привести к перебоям в обслуживании. Для серверов это обычно нежелательно. В любом случае менеджер пакетов в работающей системе знает о программном обеспечении и версиях, которые он установил. Live CD имеют собственный список установленного программного обеспечения, возможно, с разными версиями. Это затрудняет надежное обновление работающей системы с live CD.

Live CD иногда используются при установке новой версии O / S. В этом случае чистая установка O / S обычно выполняется. Это может ограничить количество неиспользуемых файлов из предыдущей версии, сохраняемых. Это может быть больше усилий, чем обновление живой системы. Однако, если используются разные корневые разделы, это может ограничить риск застрять с не загружаемой частично обновленной системой.

BillThor
источник
0

Есть несколько случаев, когда это проблема:

  • Обновление JDK при работающей java-VM: я задал myselv тот же вопрос, что и вы, - у меня был запущенный tomcat, использующий java. Теперь после патча-обновления JDK он все еще работал без проблем - так казалось.

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

  • Обновление ядра на SuSE-системах. На SuSE старое ядро ​​и его модули удаляются сразу после обновления ядра. Если затем вы захотите использовать что-то новое, для чего требуется модуль ядра, который не был загружен до сих пор, служба не будет работать.
Nils
источник
2
Звучит так, как будто некоторые части Tomcat были перезапущены, или динамические библиотеки были использованы ниже уровня Java (например, dlopen () и тому подобное), что может привести к сочетанию живых API.
Skaperen
@Skaperen даже при использовании разделяемых библиотек - если они закрываются после использования, любая программа должна иметь проблемы, если кэш становится редким ...
Nils
1
Дескриптор открытого файла имеет те же возможности для сохранения данных на диске, что и имя файла в каталоге. Исходный индекс не будет удален, если на диске имеется жесткая ссылка или дескриптор открытого файла. Кеш не имеет к этому никакого отношения. Теперь, некоторые программы закрывают свои файловые дескрипторы, когда они не используют их, и это может позволить данным исчезнуть.
dmckee
@dmckee Верно. Мы приближаемся к сути. Так что же является нормальным для «нормальной» программы: открыть библиотеку и оставить ее открытой, или загрузить библиотеку и затем закрыть ее?
Нильс