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

Вот ответ на Ваш вопрос:

s/^\(.\{15\}\)\(.\{2\}\)\(.\{2\}\)\(.\{4}\)/\1\4\3\2/

Но если можно привязать в конец вместо этого, это становится более простым:

s/\(.\{2\}\)\(.\{2\}\)\(.\{4\}\)$/\3\2\1/

Лично, я, вероятно, сделал бы [0-9] вместо . также:

s/\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{4\}\)$/\3\2\1/

Как обычно, существует больше чем один способ сделать это.

25
09.09.2012, 22:50
4 ответа

Обновление Пространства пользователя редко является проблемой

Можно часто обновлять пакеты в живой системе потому что:

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

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

См. также

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

23
27.01.2020, 19:40
  • 1
    Но что произойдет, если Вам будет нужна вся кэш-память? В этом случае библиотеки доли должны будут быть загружены снова из диска... –  Nils 08.09.2012, 22:36
  • 2
    На самом деле описание № 1 не было настолько четким. Старое содержание файла библиотеки остается под отдельным (исходным) inode, даже если всех имен, связывающихся с ним, не стало, целому некоторому процессу открыли файл или его отображенное содержание, данные сохранены отличными (и файловая система не может быть повторно смонтирована r/o, пока удаление связи файла не завершается). Процесс, который отобразил исходный файл все еще, имеет размещения в ОЗУ к исходному содержанию. –  Skaperen 08.09.2012, 22:51
  • 3
    @Nils я не эксперт, но если бы у Вас заканчивается кэш, разве он не был бы записан, чтобы подкачать и перечитать оттуда? Если бы это было полно затем, то некоторый процесс был бы, вероятно, заблокирован, прежде чем он мог устранить память из другого процесса, который уже использует его. предположение –  Joe 15.09.2012, 02:22
  • 4
    @Joe нет - подкачка является поршнем, также. Skaperen описывает то, что происходит: дескриптор файла считается неповрежденный. Таким образом, в основном программа имеет один hadle к старой (уведенной) библиотеке, которая не будет удалена, пока тот дескриптор не будет свободен снова - это - все на уровне файловой системы - не на уровне RAM. –  Nils 16.09.2012, 00:57

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

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

4
27.01.2020, 19:40
  • 1
    , файл может все еще быть перечитан как "запоминающее устройство", если бы отображение его не внесло изменений в памяти (который иначе сместил бы запоминающее устройство для свопинга при наличии), и в копии памяти отбрасывается из-за другого давления спроса для использования памяти. Но это не проблема, потому что исходный файл все еще открыт или отображен. Заменяющая библиотека является новым и другим файлом, который не открыл старый процесс. –  Skaperen 08.09.2012, 22:59
  • 2
    @Skaperen я предполагаю, что Вы говорите о файлах с отображенной памятью. Это не проблемы когда пакеты обновления. Все диспетчеры пакетов создают новые файлы для замены старых вместо того, чтобы перезаписать их. На самом деле это - единственный способ сделать это, поскольку рабочий исполняемый файл не может быть изменен, это может только быть несвязанным. –  Patrick 09.09.2012, 02:13

Предположим, что "B" был заменен в файловой системе, также. Теперь "A" должен считать "B" снова по некоторым причинам. Вопрос: действительно ли возможно, что "A" мог найти несовместимую версию "B" и отказать или неправильно функционировать некоторым другим способом?

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

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

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

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

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

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

4
27.01.2020, 19:40

Существуют некоторые случаи, где это - проблема:

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

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

  • Обновление ядра в системах SuSE: На SuSE старое ядро и его модули становятся удаленными прямо после обновления патча ядра. Если Вы затем захотите использовать что-то новое, которое требует модуля ядра, который не был загружен вплоть до сих пор, то сервис перестанет работать.
0
27.01.2020, 19:40
  • 1
    Кажется, что некоторая часть (части) Tomcat была перезапущена, или динамическими библиотеками пользовались ниже уровня Java (например, dlopen () и такой), который мог закончиться с соединением живых API. –  Skaperen 08.09.2012, 23:06
  • 2
    @Skaperen, даже когда пользующиеся общие библиотеки - если они закрываются после использования какая-либо программа, должны испытать затруднения, если кэш становится редким... –  Nils 08.09.2012, 23:13
  • 3
    Открытый дескриптор файла имеет ту же власть сохранять данные по диску как название файла в каталоге. Исходный inode не будет удален, пока существует жесткая ссылка на диске или открытом дескрипторе файла. Кэш не имеет никакого отношения к нему. Теперь, некоторые программы закрывают их дескрипторы файлов, когда они не используют их, и это может позволить данным уйти. –  dmckee --- ex-moderator kitten 09.09.2012, 02:53
  • 4
    @dmckee. Мы становимся ближе к ядру. Таким образом, что нормально для "нормальной" программы: откройте библиотеку и сохраните ее открытой, или загрузите библиотеку и закройте ее впоследствии? –  Nils 09.09.2012, 23:15

Теги

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