Почему после обновлений не надо перезагружаться?
От: vsb Казахстан  
Дата: 04.07.17 11:38
Оценка: 2 (1)
Объясните на пальцах сабж на примере, например CentOS. Если это какой-нибудь /usr/bin/vim, который сейчас не запущен, вопросов нет. Теперь первый вариант: он таки запущен. При обновлении делается unlink/creat? Т.е. запущенный процесс использует старый файл, новые процессы используют новые файлы? Т.е. при обновлении нужно перезапустить все старые процессы? Кто этим занимается, особенно если обновление автоматическое?

Что насчёт какого-нибудь openssl? Например запущен postfix, который слинкован с openssl, в котором нашлась дырка. Кто его перезапустит?

По-моему таки в линуксе после обновлений надо перезагружаться. Как работает система, в которой какие-то программы держат в памяти удалённые файлы, какие-то — обновлённые, я даже не представляю.

Или таки это продумано, есть отслеживание зависимостей, перезапуски сервисов, уведомления пользователя о запущенных устаревших программах и тд? Где об этом можно почитать?
Re: Почему после обновлений не надо перезагружаться?
От: aik Австралия  
Дата: 04.07.17 11:53
Оценка: 7 (1)
Здравствуйте, vsb, Вы писали:

vsb>Объясните на пальцах сабж на примере, например CentOS. Если это какой-нибудь /usr/bin/vim, который сейчас не запущен, вопросов нет. Теперь первый вариант: он таки запущен. При обновлении делается unlink/creat? Т.е. запущенный процесс использует старый файл, новые процессы используют новые файлы? Т.е. при обновлении нужно перезапустить все старые процессы? Кто этим занимается, особенно если обновление автоматическое?


Да каждый пакет сам и решает походу. vim так и будет старый работать, пока процесс не закроют, а sshd перестартует.

vsb>Что насчёт какого-нибудь openssl? Например запущен postfix, который слинкован с openssl, в котором нашлась дырка. Кто его перезапустит?


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

vsb>По-моему таки в линуксе после обновлений надо перезагружаться. Как работает система, в которой какие-то программы держат в памяти удалённые файлы, какие-то — обновлённые, я даже не представляю.


Да нормально работает, я б проблем ждал от взаимодействия процессов через какой нибудь ipc/dbus (но не сталкивался), а так то в чем проблема на бытовом то уровне?

Я наоборот не понимаю нафига винда каждый раз назойливо так требует перезагрузки — виндовые сервисы перестартуют нормально, а ведь они источник экплойтов обычно (или нет?).
Re: Почему после обновлений не надо перезагружаться?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.07.17 12:06
Оценка: 4 (1)
Здравствуйте, vsb, Вы писали:

vsb>Объясните на пальцах сабж на примере, например CentOS. Если это какой-нибудь /usr/bin/vim, который сейчас не запущен, вопросов нет. Теперь первый вариант: он таки запущен. При обновлении делается unlink/creat? Т.е. запущенный процесс использует старый файл, новые процессы используют новые файлы? Т.е. при обновлении нужно перезапустить все старые процессы? Кто этим занимается, особенно если обновление автоматическое?


Для некоторых сервисов в управляющих скриптах пакета прописан перезапуск.

vsb>Что насчёт какого-нибудь openssl? Например запущен postfix, который слинкован с openssl, в котором нашлась дырка. Кто его перезапустит?


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

vsb>По-моему таки в линуксе после обновлений надо перезагружаться. Как работает система, в которой какие-то программы держат в памяти удалённые файлы, какие-то — обновлённые, я даже не представляю.


Обычно конфликтов нет. Но иногда возникает такое (тут я, кстати, не уверен, что файл был корректно подменён).

vsb>Или таки это продумано, есть отслеживание зависимостей, перезапуски сервисов, уведомления пользователя о запущенных устаревших программах и тд? Где об этом можно почитать?


См. мою первую ссылку.
The God is real, unless declared integer.
Re[2]: Почему после обновлений не надо перезагружаться?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.07.17 12:10
Оценка:
Здравствуйте, aik, Вы писали:

vsb>>По-моему таки в линуксе после обновлений надо перезагружаться. Как работает система, в которой какие-то программы держат в памяти удалённые файлы, какие-то — обновлённые, я даже не представляю.


aik>Да нормально работает, я б проблем ждал от взаимодействия процессов через какой нибудь ipc/dbus (но не сталкивался), а так то в чем проблема на бытовом то уровне?


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

На один такой апгрейд я наблюдал пачку сегфолтов.

aik>Я наоборот не понимаю нафига винда каждый раз назойливо так требует перезагрузки — виндовые сервисы перестартуют нормально, а ведь они источник экплойтов обычно (или нет?).


У неё открытый файл привязан к своему абсолютному пути, и замена содержимого по этому пути приводит к тому, что оно может перечитываться из нового файла. А дальше — легче потребовать перезагрузки для исключения проблемных ситуаций в принципе, чем вычислять, кого затронет, а кого — нет.
The God is real, unless declared integer.
Re[2]: Почему после обновлений не надо перезагружаться?
От: DOOM Россия  
Дата: 04.07.17 12:13
Оценка:
Здравствуйте, aik, Вы писали:

aik>Я наоборот не понимаю нафига винда каждый раз назойливо так требует перезагрузки — виндовые сервисы перестартуют нормально, а ведь они источник экплойтов обычно (или нет?).

В основном как раз, чтобы не парится за библиотеки. Например, было как-то в висте обновление (что-то с орфографией и исправлением буквально одного слова), которое, мало того, что весило десятки мегабайт, но еще и требовало перезагрузки.
А было все просто — словарь являлся ресурсом dll, которую MS прописал в AppInit (линкуется с любым запускаемым приложением). Поэтому: патч был такой большой (в MSI нет бинари патчинга, только замена файла) и требовал перезагрузки (чтобы у всех приложений обновился этот ресурс).
Ну а частенько да — MS просто лень перезапускать сервисы и пр.
Re: Почему после обновлений не надо перезагружаться?
От: watchmaker  
Дата: 04.07.17 12:13
Оценка:
Здравствуйте, vsb, Вы писали:

vsb> Т.е. запущенный процесс использует старый файл, новые процессы используют новые файлы? Т.е. при обновлении нужно перезапустить все старые процессы?


Да, существующие процессы нужно перезапустить.

vsb>Что насчёт какого-нибудь openssl? Например запущен postfix, который слинкован с openssl, в котором нашлась дырка. Кто его перезапустит?

При ручном обновлении появится сообщение типа такого: https://www.linode.com/docs/assets/1714-openssl-patch-1.png

vsb>Кто этим занимается, особенно если обновление автоматическое?

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

vsb>Или таки это продумано, есть отслеживание зависимостей, перезапуски сервисов, уведомления пользователя о запущенных устаревших программах и тд?

В дистрибутивах типа ubuntu кажется ничего такого нет. То есть ставится только флаг о том, что для применения нужно перезагрузится, и на десктопе через UI пользователю об этом периодически напоминают.


Кстати говоря, так как ядро в linux одно, то при его обновлении при соответствующих настройках как раз иногда можно не перезагружаться.
Тут как раз существует есть автоматика, которая прозрачно переключится на новое ядро через Ksplice прямо на работающей системе.
Но тут дело в том что ядро — это по сути одна программа. Но если фикс был в том же openssl, то использующих его программ слишком много, и таким образом слишком дорого для каждой программы выяснять как она отреагирует на подмену на лету. Поэтому программа просто продолжит использовать старую версию библиотеки до перезагрузки.
Re[3]: Почему после обновлений не надо перезагружаться?
От: aik Австралия  
Дата: 04.07.17 14:42
Оценка:
Здравствуйте, netch80, Вы писали:

N>Проблема возникает, когда, например, одновременно меняется код бинарника и формат lib-файла, используемого этим бинарником. Вот тогда можно ждать разнообразных цветных искр от того, что недоостановленный старый бинарь лезет за файлом, который в новом формате.


Поясни механику. Динамический линкер при старте обычного процесса грузит либы, и дальше их можно unlink и запись по новой — на работающем процессе это скажется только если процесс долбанутый и выгружает-загружает библиотеки по ходу работы. Или есть другой сценарий?

aik>>Я наоборот не понимаю нафига винда каждый раз назойливо так требует перезагрузки — виндовые сервисы перестартуют нормально, а ведь они источник экплойтов обычно (или нет?).

N>У неё открытый файл привязан к своему абсолютному пути, и замена содержимого по этому пути приводит к тому, что оно может перечитываться из нового файла.

Это везде так, путь не должен смущать. Если это либа какого то конкретного приложения — тогда обновление пакета атомарно и заменится и либа, и приложение. Если либа какая то общая — тогда у нее не должны пропадать/меняться экспортируемые символы, или ее обновлятор должен убивать всех клиентов.

N>А дальше — легче потребовать перезагрузки для исключения проблемных ситуаций в принципе, чем вычислять, кого затронет, а кого — нет.


Ну а по-моему это потому, что удалить открытую dll нельзя (ну, раньше нельзя было) — нет линуксового unlink, отсюда и заходы с перезагрузкой.
Re[4]: Почему после обновлений не надо перезагружаться?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.07.17 10:59
Оценка:
Здравствуйте, aik, Вы писали:

N>>Проблема возникает, когда, например, одновременно меняется код бинарника и формат lib-файла, используемого этим бинарником. Вот тогда можно ждать разнообразных цветных искр от того, что недоостановленный старый бинарь лезет за файлом, который в новом формате.

aik>Поясни механику. Динамический линкер при старте обычного процесса грузит либы, и дальше их можно unlink и запись по новой — на работающем процессе это скажется только если процесс долбанутый и выгружает-загружает библиотеки по ходу работы. Или есть другой сценарий?

Я понял, что тебя смущает. lib-файл — не обязательно библиотека кода, это любое, что используется процессом и входит в поставку пакета. Лучше было бы сказать libdata (стиль BSD — они разделяют /usr/lib, /usr/libdata, /usr/libexec). У Linux принято пихать в /usr/lib и /usr/share всё, что нужно пакету, поэтому я так и назвал.

Если процесс может этот файл переоткрывать в процессе работы, подмена на ходу приведёт к тому, что процесс старый, а файлы данных нового формата. И опаньки.

Но, кстати, к собственно библиотекам (в виде .so и т.п.) это тоже относится, и почему так сразу и "долбанутый"? Вполне может быть ситуация, что требуется какой-то плагин, а потом перестал требоваться, и ему dlclose() до новой потребности.

N>>А дальше — легче потребовать перезагрузки для исключения проблемных ситуаций в принципе, чем вычислять, кого затронет, а кого — нет.

aik>Ну а по-моему это потому, что удалить открытую dll нельзя (ну, раньше нельзя было) — нет линуксового unlink, отсюда и заходы с перезагрузкой.

Я такие вещи именно под виндой "лечил" так — если не разрешает удалять или перемещать файл, перемещаем целый каталог. Это почему-то работало — в частности, против всякой adware дряни, которая цеплялась на старте системы.
Когда перезагрузился и она неактивна — тогда можно и удалять всё из этих временных каталогов.
The God is real, unless declared integer.
Отредактировано 07.07.2017 8:48 netch80 . Предыдущая версия .
Re: Почему после обновлений не надо перезагружаться?
От: kov_serg Россия  
Дата: 05.08.17 14:07
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Объясните на пальцах сабж на примере

https://habrahabr.ru/company/mailru/blog/330782/
Re[2]: Почему после обновлений не надо перезагружаться?
От: oziro Нигерия  
Дата: 10.08.17 15:17
Оценка:
> Я наоборот не понимаю нафига винда каждый раз назойливо так требует перезагрузки

Я лично думаю, это связано с тем, что винда не умеет нормально удалять файлы. Как только приходится что-то делать на винде, постоянно возникает ситуация "файл заблокирован", бесит жутко. И ни удалить, ни переместить без ребута или спецсредств. В линуксе с этим проще — файл всегда удаляется, стоит только попросить. Если его держит открытый процесс, он и продолжает с ним работать, но в дереве каталогов файла уже нет, никто никому не мешает, под его именем может уже быть и второй, и третий, и сколько угодно, только удаляй\создавай. Процесс доработает, отпустит дескриптор файла — всё, файл языком слизало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.