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

18

Почему Ubuntu не требует перезагрузки при большем количестве обновлений? Я знаю, что для обновлений ядра и таких, как драйверы видео, он не может загрузить изменения без перезагрузки. Но мне любопытно узнать о более простых обновлениях довольно фундаментальных пакетов, которые часто не требуют перезагрузок. Такие вещи, как Telepathy, glibc, gtk и т. Д. Почему такие пакеты не требуют перезагрузки для обновления? Новая версия действительно работает сразу после обновления?

Другим примером будет Гвиббер. Я недавно получил и обновил gwibber через диспетчер обновлений во время работы gwibber. Обновление успешно завершено. Будет ли gwibber работать с новой версией без перезапуска вручную? И это то же самое для других пакетов? (Я знаю, что некоторые, как MySQL и Apache автоматически перезагружаются при обновлении). Для пакетов, которые не перезапускаются автоматически, разве это не может быть проблемой безопасности для исправления безопасности?

Это происходит потому, что я запускаю OS X около недели, и почти каждое обновление требует перезагрузки, даже если это не связано с ядром / драйвером видео (насколько я могу судить - они не дают вам много информации ), Мой друг сказал, что Apple принудительно перезапускает большинство обновлений «на всякий случай», было бы странно, если бы вы не перезагружались. Windows является худшим, потому что почти любая установка / удаление или обновление требует перезапуска (часто принудительное завершение работы занимает очень много времени). Это может быть немного широким для этого места, но почему разные операционные системы обрабатывают это так по-разному? Или, более конкретно, для Ubuntu: почему Ubuntu не придерживается более строгой политики перезапуска?

gregghz
источник

Ответы:

23

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

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

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

Что касается того, почему OS X делает это, эта теория «на всякий случай» звучит правдоподобно.

Эндрю Ламберт
источник
1
Для того, чтобы продемонстрировать точку изумленной, создайте файл test.py: #!/usr/bin/env python print raw_input()Запустить с python test.pyили , chmod +x test.py && ./test.pyи, когда он запросит ввод, rm test.py.
Raylu
Причина, по которой большинство пользовательских программ не перезапускается автоматически, заключается в том, что считается, что у них очень короткий срок службы и практически нет привилегий для изменения системы. Если вы обеспокоены тем, что можете просто выйти из системы и снова войти в нее, это закроет все открытые вами программы.
LassePoulsen
2
В частности, dpkg устанавливает файлы, записывая их в foo.dpkg-new и затем переименовывая их поверх любого предыдущего файла, который там был, что позволяет плавно обновлять библиотеки и исполняемые файлы на месте.
Колин Уотсон,