Допустим, у меня есть пакет 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
?
Из того, что я испытал не то, что я считал.
Однако при повреждении A, затем B повреждается также, так как A зависит от него. Таким образом, моим вопросом является dpkg, имеет какой-либо встроенный способ справиться с этой ситуацией?
Да, это попытается переустановить или реконфигурировать на следующем запуске.
, Если это было просто прервано, это зафиксирует это и продолжит работать нормальным.
, Но это - проблема со сценариями управления, это перестанет работать снова и снова, и это остается в этом цикле. Затем это - ошибка, и отчет был бы заполнен против того пакета, и требуется ручная фиксация.
состояние установки B изменяется в зависимости от состояния A?
нет, состояние не остается, как Установлено никакое изменение, но оно отслеживает поврежденную зависимость также, по крайней мере, не в том же файле /var/lib/dpkg/status
.
, Если dpkg не обрабатывает эту ситуацию разумно, склонный?
нет, APT не вмешивается в этом случае. apt
использование dpkg
, dpkg ниже находится на одном уровне инструмент, и это - единственный инструмент, которые на самом деле устанавливают, создают, удаляют пакеты Debian.
Позволяют нам попробовать его, лучше это сделано в virtualbox.
Готовят фиктивные пакеты
~$ 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
Попытка этот сценарий
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
Для входа цикл, где Вы не можете полная установка, ни один не удаляет ее.
Создают чистый 1.0.1, B 1.0.0, но 1.0.0 с Prerm:
сценарий, который содержит exit 1
. Таким образом, когда Вы пытаетесь установить 1.0.1, dpkg не удалит 1.0.0.
Если зависимости 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
будут полезны.
-rf
не нужно. Часть -exec rm {} \;
может быть улучшена путем записи -exec rm {} +
вместо этого. Этот путь rm
назовут со столькими же файлов, сколько вписано командной строкой, эффективно ускоряя целый процесс много, когда будет много файлов.
– PerlDuck
12 August 2018 в 03:45