O que o -f no comando “apt-get -f install” faz?

6

Eu sei que o -f significa --fix-broken do manual e que ele tenta consertar problemas com os pacotes, mas o que exatamente faz? Como decide como consertar os pacotes ou se eles precisam de conserto e o método de consertar? E por que às vezes falha?

    
por Braiam 05.08.2016 / 21:25

1 resposta

6

O --fix-broken ou -f apenas define a opção APT::Get::Fix-Broken como true, mas essa não é a parte interessante. Sempre que APT::Get::Fix-Broken for verdadeiro define um bollean chamado FixBroken para true, que permite mais lógica no apt-get . Essa lógica faz duas coisas: ela chama a função pkgFixBroken que reside no arquivo algorithm.cc, que deve retornar false e verifica se BrokenCount() function retorna 0. O último é óbvio, se BrokenCount for diferente de 0, então temos pacotes quebrados e têm problemas, mas a parte relevante aqui é uma instância de uma classe pkgFixBroken que é inicializada e depois chamada com a função Resolve() .

O método pkgFixBroken para corrigir pacotes é simples, marque todos os pacotes instalados como atualizáveis e marque os pacotes que não possuem uma versão para download disponível para correção. Uma vez feito isso, ele chama a função pkgProblemResolver (ou o que parece ser), o que torna as coisas um pouco complicadas de seguir, mas há um comentário que explica mais ou menos o que está acontecendo:

This routines works by calculating a score for each package. The score is derived by considering the package's priority and all reverse dependents giving an integer that reflects the amount of breakage that adjusting the package will inflict.

It goes from highest score to lowest and corrects all of the breaks by keeping or removing the dependent packages. If that fails then it removes the package itself and goes on. The routine should be able to intelligently go from any broken state to a fixed state.

The BrokenFix flag enables a mode where the algorithm tries to upgrade packages to advoid problems.

Isso explica mais ou menos coisas. Ele atribui pontuações e tenta que, a partir dos pacotes de pontuação mais alta, todas tenham suas dependências resolvidas.

Isso parece bom o suficiente para consertar a maioria das coisas, exceto quando isso não acontece. A razão para isto é que o Fix Broken não tenta "consertar" os pacotes na medida em que apenas se certifica de que todos os pacotes tenham suas dependências satisfeitas. Em outras palavras, se A depende de B e C, ele garante que B e C estejam instalados antes de A e nada mais .

As razões usuais para isso falhar não são porque dependências não satisfeitas, no sentido de que todos os pacotes estão lá e podem, em teoria, ser instalados, mas porque o dpkg, que tem outros testes, falha. Nesses casos, dpkg --audit , dpkg --configure -a pode fornecer mais informações do que o apt.

Eu recomendo que você leia todos os comentários e, se você tiver experiência em C ++, tente ler o código caso precise de uma explicação mais cuidadosa do que ele faz.

    
por 05.08.2016 / 21:25

Tags