Как работает процесс обновления Ubuntu?

11

Как Ubuntu легко обновляется до более нового дистрибутива, пока операционная система все еще работает? Я обновляюсь с 10.10 до 11.04, и я обновлялся несколько раз раньше, и это так же просто, как запустить update-manager -d, загрузить и установить их, а затем перезагрузить компьютер.

Как именно это работает? Как менеджер обновлений может обновлять операционную систему, пока она еще используется?

bbosak
источник
Хорошо, добавление моего вопроса в комментарии щедрых людей не было хорошей идеей. Похоже, я тоже не могу его редактировать.
Oxwivi

Ответы:

3

Исходя из моего опыта, я предполагаю, что во время работы пакетов и модулей они хранятся в памяти и больше не обращаются к своей копии на жестком диске. Это можно увидеть, если вы запустите программу в Ubuntu, а затем удалите связанные пакеты во время ее работы. Он будет продолжать работать, но если вы закроете его, вы не сможете перезапустить его.

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

Slipstream
источник
Это также объясняет, почему я замечаю новые функции, добавляемые в некоторые меню по мере обновления.
bbosak
15

Здесь более подробное описание процесса. Извините, текст так долго

Мой опыт связан с Debian, для которого изначально была изобретена вся система упаковки и обновления, используемая в Ubuntu. Ежедневные обновления безопасности Ubuntu соответствуют запуску, apt-get upgradeкоторый обычно не удаляет программное обеспечение. Большие обновления выпуска соответствуют тому, в apt-get dist-upgradeтечение которого пакеты программного обеспечения могут быть полностью заменены.

На самом деле компоненты очень низкого уровня обычно не заменяются во время обновления выпуска. Сразу после обновления вы должны найти два образа ядра и initrd в каталоге / boot. Это потому, что в отличие от программ, компоненты ядра не так хорошо взаимозаменяемы. Если во время обновления возникает необходимость загрузки новых драйверов устройств, они должны быть совместимы с работающим ядром. После загрузки системы с новым ядром старое можно удалить. В прошлый раз, когда я проверял, это нужно было сделать вручную, я не знаю, как это делает текущий модуль обновления. Это кстати. основная причина, по которой образ ядра имеет свой номер версии в имени файла - поэтому вы можете установить разные версии ядра одновременно. То же самое для пути к модулю (/ lib / modules / ...)

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

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

Для каждой установленной вручную программы средство обновления просто ищет более новую версию. Часто эти программы являются просто метапакетами, такими как «ubuntu-desktop», который не содержит данных, а содержит только зависимости. Новые версии зависимых библиотек будут добавлены, так как они запрашиваются непосредственно обновляемыми (запрашиваемыми вручную) программами. Средство обновления всегда будет пытаться установить самую новую используемую версию любого зависимого пакета (во время любого обновления, а не только выпуска обновления).

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

После обновления некоторые библиотеки (или зависимости в целом) будут потеряны. Это библиотеки, которые требовались в старых версиях программы, но больше не требуются в новых версиях. Поскольку эти пакеты помечены как автоматически установленные, и так как никакая prgram, установленный вручную, больше не относится к ним, эти пакеты можно легко найти и удалить. Вы даже можете наблюдать это как последний шаг процесса обновления (программа обновления говорит «удаление устаревших пакетов» или что-то подобное).

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

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

Программы обычно не зависят от конкретной версии ядра ОС, поэтому они будут нормально работать с работающим ядром.

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

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

Вы можете использовать программу командной строки, apt-markчтобы узнать, какие пакеты помечены как установленные вручную, а какие установлены автоматически. Вы также можете переключать эти метки, используя ту же программу. Это напрямую повлияет на процесс обновления.

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

Теперь к конкретным вопросам:

  1. Когда изменяется низкоуровневая инфраструктура (низкоуровневая, как в ядре, драйверах, библиотеках и т. Д., С которой пользователь напрямую не взаимодействует), что происходит с устаревшими двоичными файлами?
    • Хорошо ... я уже рассмотрел этот
  2. Что происходит с приложением, которое полностью устарело? Например, Unity 2D (или любое другое программное обеспечение, от которого отказались / нет сопровождающих, чей пакет не находится в новом репо).
    • Если приложение однажды было установлено вручную, оно останется в системе, часто вызывая ад зависимости, который я описал.
  3. ubuntu-desktop - это метапакет, который использует стандартные приложения Ubuntu как зависимости. Если я удалил Firefox и установил Chrome, Firefox все равно будет загружен как часть обновлений?
    • Пока это стандартный браузер новой версии, да. Хром также будет обновлен. Я не уверен, что вы можете удалить Firefox без удаления Ubuntu-Desktop. Обратите внимание, что помимо строгих зависимостей, система пакетов знает также концепцию рекомендаций, где программное обеспечение обычно устанавливается как зависимость, но может быть удалено позже, не затрагивая ничего, кроме собственных исключительных зависимостей.
  4. Более того, что произойдет, если одно приложение раньше зависело от package-x и больше не делало этого в новой версии; будет ли пакет-x обновлен вместе с остальными пакетами, несмотря на то, что они осиротели?
    • Неа.

Просто спросите меня, есть ли у вас еще вопросы.

Пол Хенш
источник
Можете ли вы дать ссылку на другие документы, связанные с адом зависимостей (напоминает мне термин «ад DLL»)? Я использую минимальные установки Ubuntu, и я хочу выяснить, как обновление будет работать для меня.
Oxwivi
Я думаю, что все, что вы найдете в Интернете об адской зависимости, это жалобы. Читайте ваши подходящие страницы руководства, например man apt-get. Я считаю, что часто полезно использовать синтаксис команды с указанием релиза, такой как apt-get -t intrepid install foo/jaunty bar/oneiricetc ..., только примеры. На самом деле это имеет больше смысла в Debian, где вы иногда смешиваете релизы, в Ubuntu это менее привычно. Интересными темами также могут быть apt-pinning и установка пакетов на удержание.
Пол Хэнш
3
Вы получаете награду за самый длинный ответ без кода, который я когда-либо видел в сети Stack Exchange.
Патрик
3

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

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

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

psusi
источник
2

Как Linux может обновляться, пока он еще используется?

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

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

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

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

Не заменит ли файлы программы, пока она работает, некоторые программы?

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

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

thomasrutter
источник
Я уже знаю обо всех этих деталях, пожалуйста, прочитайте комментарий, который я разместил в своей награде. Я хочу знать, как именно Ubuntu, т.е. aptобрабатывает определенные пакеты и зависимости в процессе обновления.
Oxwivi
-2

Это похоже на другую функцию. Надеюсь, что это помогает понять основной процесс.

Я имею в виду возможность «переключать root» при загрузке операционной системы.

Когда операционная система загружается, корневая файловая система (читай: «/») изначально доступна только в оперативной памяти. Во время этого процесса загрузки он переключается / из ОЗУ в / файловую систему на жестком диске.

rigved
источник
1
Нет, механизм chroot не используется во время обновления системы. Обновление выполняется в действующей файловой системе. Вы даже можете наблюдать, как меню вашей программы перестраиваются и значки программ меняются по мере их замены. Но механизм chroot используется при первоначальной установке системы, когда свежая система «дебутзируется» в среду изменения корня на только что созданном разделе диска.
Пол Хэнш