Como instalar apenas atualizações de um repositório específico?

39

Como limite as atualizações instaladas às de um conjunto específico de repositórios? Tudo isso é possível?

Ton van den Heuvel
fonte
Deseja especificar um repo durante o tempo de execução ou deve ser mais uma coisa estática? As duas respostas abaixo assumem a última opção.
tshepang
Idealmente, seria durante o tempo de execução. A opção estática é suficiente.
Ton van den Heuvel
2
Seu título e a ajuda real que você está solicitando são diferentes.
sundar

Respostas:

29

Usar Fixação

Fixar é um processo que permite que você permaneça em uma versão estável do Ubuntu (ou qualquer outro sistema debian) enquanto obtém pacotes de uma versão mais recente. - help.ubuntu.com

Você pode desativar as atualizações automáticas de determinados repositórios sem removê-las completamente por meio de aptpolíticas:

Para desativar as atualizações automáticas do repositório repo, adicione um arquivo
/etc/apt/preferences.d/repocom o seguinte conteúdo:

Package: *
Pin: release n=repo
Pin-Priority: 50

O que dará a todos os pacotes deste repositório uma prioridade mais baixa do que os pacotes já instalados (que possuem 100).

Para mais informações man apt_preferencesou consulte o Wiki da Comunidade Ubuntu .

kynan
fonte
3
É uma pena que a única apt_preferences resposta é a última ...
Robert Siemer
como descobrir qual versão é de qual repositório?
Max N
2
@MaxN você costuma encontrar essa informação, executandoapt-cache policy package-name
Anwar
Isso não forçará um repositório a não ser considerado durante a atualização. porque release n=repovontade não cache de ninguém
Anwar
35

Você pode especificar uma liberação com a -topção Como exemplo, eu adicionei o seguinte repositório /etc/apt/sources.listpara instalar o Iceweasel versão mais recente:

deb http://mozilla.debian.net/ squeeze-backports iceweasel-release

Como você sabe, existe um mesmo pacote iceweaselno repositório oficial da Debian. Se eu quiser instalar o Iceweasel a partir desta versão específica, eu corro:

apt-get install -t squeeze-backports iceweasel

da página de manual do apt-get:

-t, --target-release, --default-release
           This option controls the default input to the policy engine, it creates a default pin at priority 990 using the specified
           release string. This overrides the general settings in /etc/apt/preferences. Specifically pinned packages are not affected by
           the value of this option. In short, this option lets you have simple control over which distribution packages will be retrieved
           from. Some common examples might be -t '2.1*', -t unstable or -t sid. Configuration Item: APT::Default-Release; see also the
           apt_preferences(5) manual page.

Eu acho que essa é uma solução melhor.

ATUALIZAÇÃO : Como o @SuB mencionado no comentário, " -tespecifica o nome do repositório, não o repositório. Não há nome no repositório no Ubuntu (diferente do Linux baseado no RedHat, como RHEL, Fedora, CentOS, ...)".

cartunista
fonte
4
Como você vê no apt-getmanual, -tespecifique release, não nome do repositório. Não existe um nome de repositório no Ubuntu (ao contrário do Linux baseado em RedHat, como RHEL, Fedora, CentOS, ...)
SuB
11
@SuB Sim, você está certo! Confundi o nome do repositório com o release!
cartunista
-t xenialtrabalha para um único pacote. mas tudo o que é dependências ainda será buscada a partir pacotes mais elevados
Anwar
11

Resposta curta

Você precisa fixar os repositórios dos quais não deseja instalar com uma prioridade menor que 100. O que significa (na apt_preferencepágina de manual)

100 <= P <500
faz com que uma versão seja instalada, a menos que exista uma versão disponível pertencente a alguma outra distribuição ou a versão instalada seja mais recente

E para selecionar um repositório para fixação, você usaria campos do Releasearquivo dos repositórios . Tais como archive, label, release, versionetc. Ao especificar os valores desses campos, você pode precisamente selecionar um repositório e atribuir a sua prioridade preferido a ele. Verifique a página apt_preference para mais detalhes.


Resposta longa

Antes de prosseguir, precisamos saber algo importante sobre a fixação. Isso inclui

  1. Campos de Releasearquivos e mapeamento para apt-cache policysaída

  2. Formato dos arquivos de preferência do apt

  3. Usando Releasecampos de arquivos para definir a prioridade

1. Campos de Releasearquivo e apt-cache policysaída

Do artigo da Debian Wiki

  • Descrição
  • Rótulo
  • Origem
  • Versão
  • Suíte
  • Nome de código
  • Componentes
  • Arquiteturas

Você veria resultados apt-cache policycomo esses

 500 http://mirrors.ircam.fr/pub/ubuntu/archive xenial/main amd64 Packages
 release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=main,b=amd64

Os valores nessas linhas são provenientes de Releasearquivos.

  • Descrição define a descrição para um repositório. Isso não é mostrado na apt-cache policysaída

  • Label é o rótulo do repositório. Muitos repositórios têm rótulos vazios. É mostrado na l=<label>saída.

  • Origem: informa sobre a origem do repositório. Repositório oficial do Ubuntu tem Ubuntucomo valor. Mostrado como o=na saída

  • Version é a versão de uma distribuição. É 16.04 para o Xenial. Mostrado como v=na saída

  • O conjunto é o mesmo que o arquivo morto . No wiki do debian é is O nome da distribuição do Debian aos quais os pacotes deste diretório pertencem (ou foram projetados), ou seja, estável, testando ou instável. . Para o Ubuntu, estes são release-updates, release-securityetc. Por exemplo, xenial-updates, xenial-security. É mostrado na saída como a=xenial, a=xenial-security. Os PPAs usam apenas o nome do release para isso, é por isso que não ajuda muito em Pinning.

  • O componente fala sobre o licenciamento. É main, multiverse, restricted, universeno Ubuntu. Na saída, é mostrado como c=mainou c=restrictedetc. A maioria dos PPAs usa mainpara esse campo, portanto, também não ajuda a fixar muito.

  • Arquitetura é sobre a arquitetura do SO. Mostrado como b=i386ou b=amd64na saída

  • Codename é o nome do release da distribuição. Para 16.04 é xenial. Para 14.04 é trusty. Mostrado na apt-cache policysaída como n=xenialou n=trusty. É o mesmo para todos os repositórios para uma única distribuição normalmente. É por isso que não ajuda em fixar muito.

A outra linha na apt-cache policysaída iniciada por origininforma a origem da Internet do repositório. Também pode ser usado na fixação. Mas não deve ser misturado com o campo Releasearquivos Origin. Aqueles são diferentes.

Usaremos esses valores para fixar um repositório.

Então, como usamos a fixação de 1 para restringir o repositório?

Existem várias maneiras de controlar a fixação e apenas um pequeno subconjunto é eficaz para o Ubuntu. Uma explicação detalhada está além do escopo da resposta. Por favor, consulte a apt_preferencepágina de manual para isso.

2. Formato do arquivo PIN

Os arquivos de preferência para fixar ou apt residem na /etc/apt/preferences.dpasta. Cada fixação contém três linhas.

  • A primeira linha começa com Package:e os nomes de pacotes separados por vírgula. Expressões regulares e globs são permitidos

  • A segunda linha começa com Pin:e é usada para direcionar um conjunto de pacotes.

    Se quisermos fixar pacotes com valores xenialsuperiores a xenial-updates, usaremos release a=xenial.

    Se quisermos fixar a versão 5.0, usaremos version 5.0aqui. Pattens Glob são permitidos.

    Ou, se quisermos fixar pacotes da origem http://archive.ubuntu.com, usaremos origin "archive.ubuntu.com". Note, não escrevemos http://protocolo lá.

  • A terceira linha começa com Pin-Priority:e seu valor é um número. O que significa a prioridade dos itens segmentados acima.

3. Usando Releasecampos de arquivos para definir a prioridade

Aqui está um exemplo

Package: *
Pin: release a=xenial
Pin-Priority: 1001

Neste exemplo, os pacotes dos xenialarquivos têm prioridade mais alta que xenial-updatese xenial-security.

Após a fixação, a execução de um apt-cache policy nautilusmostra que ele realmente deu uma prioridade mais alta a uma versão inferior do xenialarquivo morto do que a uma versão superior do xenial-updatesarquivo morto . Observe a Candidate:linha.

nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.4.is.3.14.3-0ubuntu4
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 100
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Mas, se também queremos dar prioridade aos pacotes fornecidos pelo PPA, isso não funcionará. Porque PPAs usam o mesmo nome do arquivo xenialpor padrão. Portanto, atribuir uma prioridade a a=xenialtambém se aplicará a esses pacotes. Por exemplo (após o PPA ativado),

13:31 $ apt-cache policy nautilus
nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.5-0ubuntu1~xenial1
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 1001
        500 http://ppa.launchpad.net/budgie-remix/ppa/ubuntu xenial/main amd64 Packages
        500 http://ppa.launchpad.net/gnome3-team/gnome3/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Agora a versão candidata é de um PPA. Ambos os pacotes do xenialarquivo de repositório oficial do Ubuntu e o PPA têm a mesma prioridade 1001, porque usam o mesmo valor Archiveno arquivo Release. Para fixar com sucesso, precisamos combinar mais campos no arquivo Fixar.


Alguns exemplos

Fixar um repositório PPA

Para fixar pacotes de um repositório, precisamos direcioná-lo usando as informações encontradas no apt-cache policycomando Acabamos de ver que a=xenialisso não ajudará a apontar um repositório. Precisamos usar vários campos juntos usando vírgula em um arquivo de preferência para direcionar com precisão um repositório.

Por exemplo, para impedir todos os pacotes do http://ppa.launchpad.net/oibaf/graphics-drivers/ppa, podemos usar

Package: *
Pin: release n=xenial,o=LP-PPA-oibaf-graphics-drivers
Pin-Priority: 10

Aqui estamos usando o valor do codinome e o Originvalor do PPA. (Embora o valor do codinome não seja necessário aqui, na verdade). Às vezes, o repositório pode perder esses valores. Nesses casos, algumas outras técnicas devem ser usadas. A saída de apt-cache policy libgl1-mesa-glxdiz que funciona. Reduziu a prioridade de todos os pacotes deste PPA.

libgl1-mesa-glx:
  Installed: 12.1~git1608200730.16ef7a~gd~x
  Candidate: 12.1~git1608200730.16ef7a~gd~x
  Version table:
 *** 12.1~git1608200730.16ef7a~gd~x 100
        -10 http://ppa.launchpad.net/oibaf/graphics-drivers/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     11.2.0-1ubuntu2.1 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     11.2.0-1ubuntu2 500
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Ignore o fato de que é candidato. Isso aconteceu porque já está instalado no meu sistema . Verifique a prioridade à direita

Fixar um repositório quando faltam informações da versão

Se queremos fixar um repositório cujas informações de liberação estão ausentes, como este http://download.opensuse.org/repositories/home:/sarimkhan/xUbuntu_14.04, devemos usar outro método. Como nenhum outro repositório está usando essa origem, podemos usar origincom segurança para fixar esse repositório.

Package: *
Pin: origin download.opensuse.org
Pin-Priority: 10

Nota 1: Esta origem é a origem da Internet, não a que especifica o Fornecedor no arquivo de Liberação.

Nota 2: Pin-Priority número tem um significado especial. Consulte apt_preferencea página do manual para obter detalhes.

Anwar
fonte
7

Uma alternativa baseada em GUI seria abrir o centro de software e selecionar editar> fontes de software ...

Fontes de software com a guia Software Ubuntu selecionada

Fontes de software com a outra guia de software selecionada

tudo o que você precisa fazer é desmarcar os repositórios dos quais você não deseja atualizações.

Espero que isto ajude

Allan
fonte
5

A escolha óbvia é modificar /etc/apt/sources.liste comentar todos os outros repositórios e, em seguida, executar

apt-get update && apt-get upgrade && apt-get autoclean

E, em seguida, remova os comentários de sources.list. Talvez não seja a melhor maneira, mas pelo menos as apt-getpáginas de manual não especificam nenhuma maneira de fazer isso.

Em nota relacionada, por exemplo, o processo de atualização da distribuição Ubuntu desativa todos os repositórios de terceiros durante a atualização (e não basta executar alguma opção para excluí-los temporariamente).

Olli
fonte
1

Uma outra opção da GUI é escolher apenas a origem no gerenciador de pacotes Synaptic.

  1. Procure o nome do pacote que você deseja instalar
  2. Clique no botão Origem
  3. Escolha o repositório do qual deseja instalar
  4. Escolha os pacotes
  5. Aplique
woot
fonte