Что происходит с зависимыми пакетами Debian при обновлении пакета Debian?

Допустим, у меня есть пакет debian A-1.0.0.deb (который содержит библиотеку) и другой пакет B-1.0.0.deb (который содержит сервис), который зависит от библиотеки A. Допустим, я хочу перейти на A-1.0.1.deb.

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

Однако, когда вы нарушаете A, тогда B тоже нарушается, поскольку это зависит от A. Поэтому мой вопрос: есть ли у dpkg какой-либо встроенный способ справиться с этой ситуацией? Меняется ли состояние установки B в зависимости от состояния A? В идеале dpkg должен иметь некоторую встроенную функциональность для перемещения B из установленного состояния в другое состояние (чтобы служба B могла быть остановлена ​​и перезапущена, когда A исправен), но я не могу найти все в документации dpkg, которая предполагает, что это сделано.

Если dpkg не справляется с этой ситуацией разумно, apt?

5
задан 18 November 2016 в 10:42

2 ответа

Из того, что я испытал не то, что я считал.

  • Однако при повреждении A, затем B повреждается также, так как A зависит от него. Таким образом, моим вопросом является dpkg, имеет какой-либо встроенный способ справиться с этой ситуацией?

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

    1. , Если это было просто прервано, это зафиксирует это и продолжит работать нормальным.

    2. , Но это - проблема со сценариями управления, это перестанет работать снова и снова, и это остается в этом цикле. Затем это - ошибка, и отчет был бы заполнен против того пакета, и требуется ручная фиксация.

  • состояние установки B изменяется в зависимости от состояния A?

    нет, состояние не остается, как Установлено никакое изменение, но оно отслеживает поврежденную зависимость также, по крайней мере, не в том же файле /var/lib/dpkg/status.

  • , Если dpkg не обрабатывает эту ситуацию разумно, склонный?

    нет, APT не вмешивается в этом случае. apt использование dpkg, dpkg ниже находится на одном уровне инструмент, и это - единственный инструмент, которые на самом деле устанавливают, создают, удаляют пакеты Debian.

<час>

Позволяют нам попробовать его, лучше это сделано в virtualbox.

  1. Готовят фиктивные пакеты

    ~$ sudo apt install equivs
    ~$ mkdir deleteme
    ~$ cd deleteme
    

    , B 1.0.0 зависит от

    ~/deleteme$ equivs-control b0
    ~/deleteme$ nano b0
    ...
    Package: b
    Version: 1.0.0
    ...
    Depends: a
    ...
    ~/deleteme$ equivs-build b0
    

    А 1.0.0 чистых установки & удалите

    ~/deleteme$ equivs-control a0
    ~/deleteme$ nano a0
    ...
    Package: a
    Version: 1.0.0
    ...
    ~/deleteme$ equivs-build a0
    

    А, который 1.0.1 грязных установки, но чистый удаляют

    ~/deleteme$ cp a0 a1
    ~/deleteme$ nano a1
    ...
    Package: a
    Version: 1.0.1
    ...
    Postinst: a1.postinst
    ...
    
    ~/deleteme$ nano a1.postinst
    
    #!/bin/sh    
    exit 1
    
    ~/deleteme$ equivs-build a1
    

    Теперь, Вы должны иметь:

    ~/deleteme$ ls -1
    a0
    a1
    a_1.0.0_all.deb
    a_1.0.1_all.deb
    a1.postinst
    b0
    b_1.0.0_all.deb
    
  2. Попытка этот сценарий

    sudo su
    
    dpkg -i b_1.0.0_all.deb
    dpkg --audit
    dpkg -i a_1.0.0_all.deb
    dpkg --audit
    dpkg --configure -a
    dpkg --audit
    dpkg --remove a
    dpkg --remove b
    dpkg --remove a
    
    dpkg -i a_1.0.0_all.deb
    dpkg -i b_1.0.0_all.deb
    dpkg --audit
    dpkg -i a_1.0.1_all.deb
    dpkg --audit
    dpkg --remove a
    apt purge a
    
  3. Для входа цикл, где Вы не можете полная установка, ни один не удаляет ее.

    Создают чистый 1.0.1, B 1.0.0, но 1.0.0 с Prerm: сценарий, который содержит exit 1. Таким образом, когда Вы пытаетесь установить 1.0.1, dpkg не удалит 1.0.0.

0
ответ дан 18 November 2016 в 10:42

Если зависимости A изменились на установленном пакете B, Вы будете видеть ошибку после выполнения apt-get update && apt-get upgrade, пакет будет отмечен как kept back:

The following packages have been kept back
B-1.0.0

dpkg не поможет Вам, если обновление будет доступно B-1.0.1 то только apt-get dist-upgrade будут полезны.

0
ответ дан 18 November 2016 в 10:42
  • 1
    +1 для упоминания, что -rf не нужно. Часть -exec rm {} \; может быть улучшена путем записи -exec rm {} + вместо этого. Этот путь rm назовут со столькими же файлов, сколько вписано командной строкой, эффективно ускоряя целый процесс много, когда будет много файлов. – PerlDuck 12 August 2018 в 03:45

Другие вопросы по тегам:

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