Como escapar do inferno da dependência?

21

Eu tenho um computador Ubuntu sem internet e um computador Ubuntu com internet. Aquele sem internet requer que um driver seja instalado através do ndiswrapper. O problema é que ndiswrapper-dkmsdepende de dkmsqual depende de algumas coisas, e essas poucas coisas dependem de muitas coisas, que dependem de mais e assim por diante. Até agora, baixei 92 dependências manualmente e ainda estou precisando de mais. Eu tenho usado o código

for i in $(apt-cache depends <package> | grep -E 'Depends|Recommends|Suggests' | cut -d ':' -f 2,3 | sed -e s/'<'/''/ -e s/'>'/''/); do sudo apt-get download $i 2>>errors.txt; done

que realiza o trabalho, mas apenas para as dependências de um pacote, não as dependências das dependências do pacote e assim por diante. Isso se transformou em uma luta de várias horas para obter todos os pacotes e é realmente tedioso. Estou executando esse código para baixar os arquivos .deb para a unidade USB no meu computador online, depois para o computador offline para inserir a unidade, para executar sudo apt install ./*na pasta e esperar pelo melhor. Geralmente cospe algo como isto:

...
The following packages have unmet dependencies:
 binutils : Depends: binutils-common (= 2.30-21ubuntu1~18.04.1) but 2.30-21ubuntu1~18.04 is to be installed
            Depends: libbinutils (= 2.30-21ubuntu1~18.04.1) but 2.30-21ubuntu1~18.04 is to be installed
            Depends: binutils-x86-64-linux-gnu (= 2.30-21ubuntu1~18.04.1) but 2.30-21ubuntu1~18.04 is to be installed
 cpp-doc : Depends: cpp-7-doc (>= 7.4.0-1~) but it is not installable
 file : Depends: libmagic1 (= 1:5.32-2ubuntu0.2) but 1:5.32-2ubuntu0.1 is to be installed
 g++-7 : Depends: libstdc++-7-dev (= 7.4.0-1ubuntu1~18.04) but it is not installable
 g++-multilib : Depends: g++-7-multilib (>= 7.4.0-1~) but it is not installable
 gcc-7-multilib : Depends: lib32gcc-7-dev (= 7.4.0-1ubuntu1~18.04) but it is not installable
                  Depends: libx32gcc-7-dev (= 7.4.0-1ubuntu1~18.04) but it is not installable
 gfortran : Depends: gfortran-7 (>= 7.4.0-1~) but it is not installable
 glibc-doc : Depends: glibc-doc-reference (>= 2.18) but it is not installable
 libasan4-dbg : Depends: libasan4 (= 7.4.0-1ubuntu1~18.04) but it is not installable
 libatomic1-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
                  Depends: libatomic1 (= 8.3.0-6ubuntu1~18.04) but it is not installable
 libbabeltrace1 : Depends: libdw1 (>= 0.126) but it is not installable
 libcc1-0 : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libcilkrts5-dbg : Depends: libcilkrts5 (= 7.4.0-1ubuntu1~18.04) but it is not installable
 libfl-dev : Depends: libfl2 (= 2.6.4-6) but it is not installable
 libgcc-7-dev : Depends: libitm1 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libatomic1 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libasan4 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: liblsan0 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libtsan0 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libubsan0 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libcilkrts5 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
                Depends: libmpx2 (>= 7.4.0-1ubuntu1~18.04) but it is not installable
 libgcc1 : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libgcc1-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libgomp1-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
                Depends: libgomp1 (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libitm1-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
               Depends: libitm1 (= 8.3.0-6ubuntu1~18.04) but it is not installable
 liblsan0-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
                Depends: liblsan0 (= 8.3.0-6ubuntu1~18.04) but it is not installable
 libmpx2-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
               Depends: libmpx2 (= 8.3.0-6ubuntu1~18.04) but it is not installable
 libquadmath0-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
                    Depends: libquadmath0 (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libstdc++6 : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
 libtsan0-dbg : Depends: gcc-8-base (= 8.3.0-6ubuntu1~18.04) but 8.2.0-1ubuntu2~18.04 is to be installed
                Depends: libtsan0 (= 8.3.0-6ubuntu1~18.04) but it is not installable
 libubsan0-dbg : Depends: libubsan0 (= 7.4.0-1ubuntu1~18.04) but it is not installable
 libumfpack5 : Depends: libcholmod3 (>= 1:4.5.2) but it is not going to be installed
 m4 : Depends: libsigsegv2 (>= 2.9) but it is not installable
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

Alguém sabe de um método para apenas despejar todos os arquivos .deb para dependências de pacotes e todas as subdependências em uma única pasta para salvar minha sanidade? THX!

TriVoxel
fonte
Você também pode conectar as duas máquinas em rede diretamente por Ethernet, para que a máquina offline use a conexão de máquinas online. Pelo que me lembro, o processo apt-offline parece muito mais direto; mas esta resposta diz que é "plug and play".
pbhj
1
Contanto que você use Recommendse, em Suggestsvez de apenas Depends, espero que você acabe instalando toda a Internet, não importa de qual pacote você comece.
pipe
1
@ N0rbert Eu nunca achei essas respostas satisfatórias. Sei que esse não é o objetivo do sistema duplicado.
wizzwizz4
@ N0rbert Essa não é uma pergunta óbvia para resolver situações infernais da dependência. Qualquer duplicação entre os dois está na resposta , não na pergunta .
Rich

Respostas:

27

Dê uma olhada apt-offline, uma maneira (mais) fácil de gerenciar dependências offline. Você precisará instalá-lo primeiro baixando o arquivo de depuração e transferindo-o para sua máquina offline. Você pode usar algo parecido sudo apt download apt-offlinecom o download. A instalação pode ser feita usando sudo dpkg -i /path/to/your/debfile.deba máquina offline e apenas sudo apt installna sua máquina online.

Feito isso, você precisará preparar várias coisas para a instalação real.

  1. Comece criando uma assinatura do seu sistema offline pedindo para instalar os ndiswrapperpacotes:

    sudo apt-offline set offline.sig --install-packages ndiswrapper-dkms
    
  2. Copie o arquivo para sua máquina online e execute o seguinte comando na máquina online para baixar todos os arquivos necessários:

    apt-offline get offline.sig --bundle ndis-ao.zip
    
  3. Mova o pacote zipfile de volta para sua máquina offline e execute este comando:

    sudo apt-offline install ndis-ao.zip
    

Você deveria ter ndiswrapper-dkmsinstalado neste momento e tudo deve estar bem.


Se o seu apt-offlinepacote falhar na instalação, anote os pacotes dependentes que falharam e resolva-os um por um (copiando manualmente, conforme necessário). O inferno das dependências é irritante, mas infelizmente esse é um dos problemas de um sistema mais offline.

Você pode tentar dar uma olhada apt-rdepends, bem como para gerar um completo gráfico de dependência. Combine isso apt downloade você poderá ter uma solução alternativa para o problema, embora meus testes com isso tenham sido inconclusivos, para dizer o mínimo.

Kaz Wolfe
fonte