dpkg - opção -dry-run não está simulando a instalação corretamente

2

Dado um arquivo .DEB aleatório, como podemos verificar se a instalação será concluída com sucesso sem a instalação no dispositivo? Por favor, veja o seguinte trecho:

root@VirtualBox:/Folder# dpkg -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
Selecting previously unselected package mysql-workbench.
(Reading database ... 48937 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
Unpacking mysql-workbench (6.2.3+dfsg-7) ...
dpkg: dependency problems prevent configuration of mysql-workbench:
 mysql-workbench depends on libatkmm-1.6-1 (>= 2.22.1); however:
  Package libatkmm-1.6-1 is not installed.
 mysql-workbench depends on libcairo2 (>= 1.14.0); however:
  Package libcairo2 is not installed.
 mysql-workbench depends on libcairomm-1.0-1 (>= 1.6.4); however:
  Package libcairomm-1.0-1 is not installed.
 mysql-workbench depends on libctemplate2; however:
  Package libctemplate2 is not installed.
 mysql-workbench depends on libgdal1h (>= 1.8.0); however:
  Package libgdal1h is not installed.
 mysql-workbench depends on libgdk-pixbuf2.0-0 (>= 2.22.0); however:
  Package libgdk-pixbuf2.0-0 is not installed.
 mysql-workbench depends on libgl1-mesa-glx | libgl1; however:
  Package libgl1-mesa-glx is not installed.
  Package libgl1 is not installed.
 mysql-workbench depends on libglibmm-2.4-1c2a (>= 2.42.0); however:
  Package libglibmm-2.4-1c2a is not installed.
 mysql-workbench depends on libgnome-keyring0 (>= 2.22.2); however:
  Package l
dpkg: error processing package mysql-workbench (--install):
 dependency problems - leaving unconfigured
Processing triggers for mime-support (3.58) ...
Processing triggers for shared-mime-info (1.3-1) ...
Errors were encountered while processing:
 mysql-workbench
root@VirtualBox:/Folder# echo $?
1
root@VirtualBox:/Folder# dpkg --dry-run -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
(Reading database ... 49115 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
root@VirtualBox:/Folder# echo $?
0
root@VirtualBox:/Folder# dpkg --dry-run --simulate -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
(Reading database ... 49115 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
root@VirtualBox:/Folder# echo $?
0
root@VirtualBox:/Folder# 

Quando eu uso a opção dpkg -i , o comando falha com um valor de retorno de 1, mas o mesmo comando que um --dry-run retorna zero. Adicionar a opção --simulate também não parece mudar o comportamento. Quaisquer ponteiros sobre como verificar consistentemente se a instalação de um arquivo .DEB será executada corretamente, sem realmente instalar o pacote?

Estou executando isso em um emulador de Raspberry Pi.

root@VirtualBox:/Folder# cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    
por Arpith 15.11.2017 / 17:52

2 respostas

3

Embora isso não seja tecnicamente uma resposta, foi uma boa pergunta.

Se olharmos para o man dpkg, é isso que diz sobre as opções para testar. Se algum especialista Debian real puder fornecer uma resposta mais autoritária, isso seria bom. Ou edite o meu se tiver erros nele.

   --no-act, --dry-run, --simulate
          Do everything which is supposed to be done, but don't write any changes. This is used to see what would happen with the specified
          action, without actually modifying anything.

Eu acredito, embora eu não esteja certo, que, em essência, tudo que o dpkg está testando é se o comando tem alguma falha nele. Por exemplo, se você fez:

#dpkg --dry-run -i nonexistent.deb || echo $?
dpkg: error: cannot access archive 'nonexistent.deb': No such file or directory
2

esse é o resultado. Uma coisa que eu notei foi que o dpkg requeria root mesmo com --dry-run, queixou-se de não ser capaz de usar o arquivo de log, o que significa que --dry-run não faz nada do que esperamos. Com apt-get , você pode usar --simulate como usuário regular.

O dpkg é uma ferramenta apt de nível muito baixo, e como você pode ver pelos seus resultados em seus testes, ele não sabia sobre as árvores de dependência e banco de dados apt até que ele realmente instalasse o arquivo .deb. Então deduzo que dpkg --dry-run ou --simulate etc simplesmente estão testando os dados reais do comando literal, não as dependências etc.

O que sugere que, embora pareça ser o mesmo comando que funciona de forma decente, mas não perfeita, no apt-get, na verdade não é o mesmo. Alguém teria que ler o código no dpkg --simulate para ver o que realmente faz.

A pesquisa dessa questão parece confirmar o que acredito ser o caso:

link

If a feature, is there an automatic way of checking a .deb's dependencies, other than trying to dpkg -i it (and ending up with under-configured packages) or doing a dpkg -f and checking the dependencies one by one by hand?

What I'm looking for is a something like dpkg-buildpackage's 'Unmet build dependencies: ...' check, but for .debs.

     

Existe um novo aplicativo disponível chamado "gdebi" em:    link

     

Ele deve ser capaz de resolver dependências do pacote deb diretamente. isto   contém gdebi-gtk e gdebi (e versão cli). Isso pode ser o que você   quer. Se não, por favor me avise e pode ser adicionado :) Se você   use / teste, feedback (via correio privado) é muito apreciado.

Esse é um tópico muito antigo, e tenho certeza de que você não está procurando uma ferramenta de gui, mas é importante notar que o problema existia em 2005 e alguém criou uma solução de gui que verificaria dependências, o que sugere que De fato, o dpkg --simulate não. Nem eu esperaria, eu fiz um monte de scripts automatizados para o Debian apt, e o dpkg, e os dois agem e se comportam de maneira muito diferente.

Várias opções para determinar dependências usando o dpkg

link

Esse é um antigo tópico do Debian sobre a mesma questão, novamente, você pode ver que o dpkg --dry-run não manipula dependências em geral.

link

dpkg-deb -I package.deb

É a sugestão lá. Isso mostra basicamente a mesma coisa que apt-cache show package-name .

Assim, pelo menos, você mesmo pode verificar as dependências.

 dpkg -I perl_5.26.0-8_i386.deb
 ....
 Pre-Depends: dpkg (>= 1.17.17)
 Depends: perl-base (= 5.26.0-8), perl-modules-5.26 (>= 5.26.0-8), libperl5.26 (= 5.26.0-8)
....

link

If you use dpkg --control pkg_file, then it will show you all of the control information for the package, including dependencies.

Eu testei isso, mas não mostra nada, pode ser obsoleto, não sei.

Como você pode ver, o Debian devs teve várias sugestões, mas nenhuma delas sugeriu que havia uma maneira de fazer com que dpgk --dry-run fizesse o que você queria.

Conclusão

Você tem algumas opções, uma, determinar as dependências manualmente, e isso certamente se aplicará ao seu caso futuro de criação de seus próprios debs e, em seguida, instalará essas dependências usando uma instalação com script ou o que encontrar. o pacote .deb depois disso.

Usar a vm também é uma boa opção, com snapshots, para testes.

    
por 15.11.2017 / 19:42
2

Para determinar se um pacote pode ser instalado sem precisar instalar outras dependências, sua melhor opção é usar o modo “simular” com apt :

apt -s install ./mysql-workbench_6.2.3+dfsg-7_armhf.deb

(observe o ./ , que é significativo). Isso gerará as operações dpkg que seriam executadas pela instalação real. As instalações de pacotes são marcadas com Inst ; Se houver mais de um, o pacote não pode ser instalado sozinho.

Agora, vamos para a parte carnuda ... Você não pode usar dpkg para isso, não porque dpkg não sabe sobre dependências (definitivamente faz), mas porque as dependências não são strongs o suficiente . Quando um pacote depende de outro, a dependência não impede que o pacote seja instalado , se não estiver satisfeito, impede que ele seja configurado . Veja seção 7.2 da Política Debian :

A Depends field takes effect only when a package is to be configured. It does not prevent a package being on the system in an unconfigured state while its dependencies are unsatisfied, and it is possible to replace a package whose dependencies are satisfied and which is properly installed with a different version whose dependencies are not and cannot be satisfied; when this is done the depending package will be left unconfigured (since attempts to configure it will give errors) and will not function properly.

Você pode ver isso em seu próprio teste: o processo falha com

dpkg: dependency problems prevent configuration of mysql-workbench

Note “configuração”, não “instalação”. Se você observar a saída de dpkg -l mysql-workbench , deverá ver iU , o que significa que o pacote está instalado, mas não configurado.

Quando você ativa o modo "simular" em dpkg , ele basicamente é executado no modo somente leitura. Isso é feito definindo um f_noact flag; você pode procurar isso no código-fonte. Ao instalar pacotes, a simulação passa pelos movimentos de instalação (sem escrever nada) e prossegue para a fase de configuração; mas que o apenas falsifica o sucesso , que é a única coisa que uma simulação pode fazer - a configuração envolve a execução de scripts do mantenedor no pacote, e seria difícil garantir que esses scripts não fizessem alterações, ou garantir que seu sucesso pudesse ser determinado sem permitir que eles fizessem alterações. Portanto, no seu caso, a simulação instala o pacote, que é bem-sucedido (como no teste não simulado), e falsifica a configuração. Assim, nenhum erro é detectado ...

    
por 15.11.2017 / 21:41