Как обновить общую библиотеку без катастрофического отказа?

Вы не говорите, хотите ли Вы закончить со Сжатием или Хрипящий. Я предположу, что Вы хотите первого, в этом случае можно понизить до него путем отдавания ему высокого приоритета контакта:

$ cat /etc/apt/preferences
Package: *
Pin: release stable
Pin-Priority: 9000

Тот путь, работая apt-get upgrade && apt-get dist-upgrade движение должно 'обновить' все установленные пакеты до их версий Сжатия.

18
13.04.2017, 15:36
2 ответа

Как упомянуто в том, Почему пакет программного обеспечения работает очень хорошо, даже когда он обновляется?, блокировка помещается в inode не на имени файла. Когда Вы загружаете и выполняете двоичный файл, файл отмечен как занятый - который является, почему Вы получаете ETXTBSY (занятый файл) ошибка, когда Вы пытаетесь записать в него.

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

Корректный способ обновить поэтому:

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

  2. создание нового файла с обновленным содержанием.

Недавно созданные процессы будут использовать обновленное содержание, запущенные приложения получат доступ к старой версии. Это - то, что делает любая нормальная утилита управления пакетом. Обратите внимание, что это не полностью ни без какой опасности хотя - например, приложения, динамично загружающие код (использование dlsym() и друзья), испытает проблемы, если API библиотеки изменится тихо.

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

21
27.01.2020, 19:46

Обновление об/мин делает то же - с рабочими двоичными файлами и библиотеками, в то время как ничто не отказывает.

Таким образом, что является различием:

  1. удалите связь с файлом
  2. запишите новый файл с тем же именем

Это НЕ заменит оперативный файл: inode, относящийся к используемому двоичному файлу, все еще "занят" до последнего объекта, содержащего его открытые концы. Новый файл будет создан с новым inode-числом.

Теперь scp или cp попытается заменить оперативный файл - который изменил бы содержание, к которому относится inode. Это не работает - как Вы описали.

6
27.01.2020, 19:46

Теги

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