A resposta é que um pacote criado com equivs-build
de um arquivo de controle que contém uma variação no nome (libc6-local por exemplo) de um pacote existente e uma versão superior, acionará a remoção do pacote antigo , não por causa da execução para prerm
ou postrm
scripts do pacote novo ou antigo, mas por design .
Agora, é possível criar um pacote com um nome totalmente diferente e definir no arquivo de controle que fornece um pacote como o libc6. Mais especificamente, considere o seguinte arquivo de controle (apenas a parte relevante mostrada) para um pacote virtual proposto:
Package: 6cbil-local //libc6 backwards is good enough
Version: 2.9
Provides: glibc-2.9
Section: libs
Compare isso com o arquivo de controle em libc6 2.17-0ubuntu5 (minha máquina):
Package: libc6
Source: eglibc
Version: 2.17-0ubuntu5
Architecture: amd64
Maintainer: Ubuntu Developers <[email protected]>
Installed-Size: 10441
Depends: debconf (>= 0.5) | debconf-2.0, libgcc1
Suggests: glibc-doc, locales
Conflicts: prelink (<= 0.0.20090311-1), tzdata (<< 2007k-1), tzdata-etch
Breaks: lsb-core (<= 3.2-27), nscd (<< 2.17)
Replaces: libc6-amd64
Provides: glibc-2.17-1
Section: libs
Priority: required
Multi-Arch: same
Em seguida, considere um pacote vazio com base nesse arquivo de controle:
Package: using6
Version: 1.0
Depends: libc6 (= 2.9) // it requires that specific version
Em seguida, crie os pacotes. Nosso pacote virtual que fornece o glib-2.9 instala e não remove nenhuma libc6 instalada . Quando você tenta instalar nosso pacote que depende do glibc-2.9, obtemos um erro em apt
(configurado como 2.2 aqui ):
The following packages have unmet dependencies:
using6 : Depends: libc6 (= 2.9) but 2.17-0ubuntu5 is to be installed
E: Unable to correct problems, you have held broken packages.
ou dpkg
:
dpkg: dependency problems prevent configuration of using6:
using6 depends on libc6 (= 2.9); however:
Version of libc6:amd64 on system is 2.17-0ubuntu5.
Volte para o nosso pacote virtual inicial e substitua o que ele fornece:
Provides: glibc-2.9, libc6
Em seguida, tente reinstalar o nosso pacote que depende do glibc-2.9. dpkg
fornece a mesma mensagem de erro, mas não apt
!!!! O Apt realmente mudou de idéia no minuto em que eu construí os pacotes depois de alterar o valor de fornecimento, em seguida, enviei as alterações para o Packages.gz e atualizei o apt com dpkg-scanpackages dirwithpackages | gzip > dirwithpackages/Packages.gz
then sudo apt-get update
:
The following packages have unmet dependencies:
using6 : Depends: libc6 (= 2.9) //notice the reference to 2.17 is gone!!
E: Unable to correct problems, you have held broken packages.
Isso é um pouco diferente da explicação que eu perdi no Manual do Debian :
5.2.1.4.3. Limitações Atuais
Pacotes virtuais sofrem de algumas limitações preocupantes, sendo a mais significativa a ausência de um número de versão. Para retornar ao exemplo anterior, uma dependência como Depends: libdigest-md5-perl (> = 1.6), apesar da presença de Perl 5.10, nunca será considerada como satisfeita pelo sistema de empacotamento - enquanto na verdade é mais provável que seja satisfeito. Desconhecendo isso, o sistema de pacotes escolhe a opção menos arriscada, assumindo que as versões não combinam.
GOING FURTHER Virtual package versions Although today virtual packages can't have versions, this will not necessarily always be the case. Indeed, apt is already able to manage the versions of virtual packages and it is likely that dpkg eventually will too. We will then be able to write fields such as Provides: libstorable-perl (= 1.7) to indicate that a package provides the same functionality as libstorable-perl in its 1.7 version.
A experiência acima mostra que apt
e dpkg
se comportaram de maneira um pouco diferente (na medida em que as mensagens de erro mudam) com minha configuração (Xubuntu 13.04, dpkg = 1.16.10 (amd64) e apt = 0.9.7.7ubuntu4 (amd64) ). Apt
reconhece que vê que este pacote que instalamos fornece libc6, mas não vê que ele forneça exatamente a versão 2.9. Por fim o apt chama o dpkg para que o dpkg seja o gargalo.
It seems on my setup the only value that makes a difference for "Provides" in a control file under your scenario is libc6. But that won't be enough to allow installing software with reliance on a specific version because of current limitations and design.
Por fim, como você sabe, o ld.config.so é o instalação para cuidar de todos os links, como demonstrado em este exemplo da cadeia de ld arquivos e diretórios .so.conf. A infra-estrutura de vinculação e a variável $ LD_LIBRARY_PATH para objetos compartilhados têm prioridade sobre os locais padrão da biblioteca, como / lib e / usr / lib nesse contexto.