Ir para o conteúdoIr para navegação de página: página anterior [tecla de acesso p]/próxima página [tecla de acesso n]
documentation.suse.com / Documentação do SUSE Linux Enterprise Desktop / Guia de Administração / Sistema / update-alternatives: gerenciando várias versões de comandos e arquivos
Aplica-se a SUSE Linux Enterprise Desktop 15 SP5

22 update-alternatives: gerenciando várias versões de comandos e arquivos

Normalmente, há várias versões da mesma ferramenta instaladas em um sistema. Para que os administradores possam escolher e para possibilitar a instalação e o uso de versões diferentes lado a lado, o sistema de alternativas permite gerenciar as versões consistentemente.

22.1 Visão Geral

No SUSE Linux Enterprise Desktop, vários programas executam tarefas iguais ou semelhantes. Por exemplo, se ambos Java 1.7 e Java 1.8 estiverem instalados no sistema, o script do sistema de alternativas (update-alternatives) será chamado do pacote RPM. Por padrão, o sistema de alternativas fará referência à versão 1.8: versões superiores também têm maior prioridade. No entanto, o administrador pode mudar o padrão e apontar o nome genérico para a versão 1.7.

A seguinte terminologia é usada neste capítulo:

Terminologia
Diretório administrativo

O diretório padrão /var/lib/rpm/alternatives contém informações sobre o estado atual das alternativas.

Alternativa

O nome de um arquivo específico no sistema de arquivos, que pode tornar-se acessível por meio de um nome genérico usando o sistema de alternativas.

Diretório de alternativas

O diretório padrão /etc/alternatives que contém links simbólicos.

Nome genérico

Um nome (por exemplo, /usr/bin/edit) que se refere a um arquivo, dentre vários disponíveis, usando o sistema de alternativas.

Grupo de links

Um conjunto de links simbólicos relacionados que podem ser atualizados como um grupo.

Link master

O link, em um grupo de links, que determina como os outros links no grupo são configurados.

Link escravo

Um link, em um grupo de links, controlado pelo link master.

Link simbólico (symlink)

Um arquivo que é uma referência a outro arquivo no mesmo sistema de arquivos. O sistema de alternativas usa os links simbólicos no diretório de alternativas para alternar entre as versões de um arquivo.

Os links simbólicos no diretório de alternativas podem ser modificados pelo administrador por meio do comando update-alternatives.

O sistema de alternativas oferece o comando update-alternatives para criar, remover, manter e mostrar informações sobre os links simbólicos. Esses links simbólicos normalmente apontam para comandos, mas eles também podem apontar para arquivos JAR, páginas de manual e outros arquivos. Os exemplos neste capítulo usam comandos e páginas de manual, mas também podem ser aplicáveis a outros tipos de arquivos.

O sistema de alternativas usa o diretório de alternativas para coletar os links para possíveis alternativas. Quando um novo pacote com uma alternativa é instalado, a nova alternativa é adicionada ao sistema. Dependendo da prioridade e do modo definido, a nova alternativa do pacote será selecionada como padrão. Os pacotes com uma versão superior também têm maior prioridade. O sistema de alternativas pode operar em dois modos:

  • Modo automático.  Nesse modo, o sistema de alternativas garante que os links no grupo apontem para as alternativas de prioridade mais alta apropriadas ao grupo.

  • Modo manual.  Nesse modo, o sistema de alternativas não faz quaisquer mudanças nas configurações do administrador do sistema.

Por exemplo, o comando java tem a seguinte hierarquia de links no sistema de alternativas:

Exemplo 22.1: Sistema de alternativas do comando java
/usr/bin/java 1
 -> /etc/alternatives/java 2
     -> /usr/lib64/jvm/jre-10-openjdk/bin/java 3

1

O nome genérico.

2

O link simbólico no diretório de alternativas.

3

Uma das alternativas.

22.2 Casos de uso

Por padrão, o script update-alternatives é chamado de um pacote RPM. Quando um pacote é instalado ou removido, o script se encarrega de todos os seus links simbólicos. Porém, você pode executá-lo manualmente da linha de comando para:

  • exibir as alternativas atuais para um nome genérico.

  • mudar os padrões de uma alternativa.

  • criar um conjunto de arquivos relacionados para uma alternativa.

22.3 Obtendo uma visão geral das alternativas

Para recuperar os nomes de todas as alternativas configuradas, use:

> ls /var/lib/alternatives

Para obter uma visão geral de todas as alternativas configuradas e os respectivos valores, use

> sudo update-alternatives --get-selections
asadmin                        auto     /usr/bin/asadmin-2.7
awk                            auto     /usr/bin/gawk
chardetect                     auto     /usr/bin/chardetect-3.6
dbus-launch                    auto     /usr/bin/dbus-launch.x11
default-displaymanager         auto     /usr/lib/X11/displaymanagers/gdm
[...]

22.4 Vendo detalhes das alternativas específicas

A maneira mais fácil de verificar as alternativas é seguir os links simbólicos do seu comando. Por exemplo, para descobrir a que o comando java se refere, use o seguinte comando:

> readlink --canonicalize /usr/bin/java
/usr/lib64/jvm/jre-10-openjdk/bin/java

Se aparecer o mesmo caminho (em nosso exemplo, o caminho é /usr/bin/java), não haverá alternativas disponíveis para esse comando.

Para ver as alternativas completas (incluindo escravos), use a opção --display:

> sudo update-alternatives --display java
java - auto mode
  link best version is /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java
  link currently points to /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java
  link java is /usr/bin/java
  slave java.1.gz is /usr/share/man/man1/java.1.gz
  slave jre is /usr/lib64/jvm/jre
  slave jre_exports is /usr/lib64/jvm-exports/jre
  slave keytool is /usr/bin/keytool
  slave keytool.1.gz is /usr/share/man/man1/keytool.1.gz
  slave orbd is /usr/bin/orbd
  slave orbd.1.gz is /usr/share/man/man1/orbd.1.gz
[...]

22.5 Definindo a versão padrão das alternativas

Por padrão, os comandos em /usr/bin fazem referência ao diretório de alternativas com a prioridade mais alta. Por exemplo, por padrão, o comando java mostra o seguinte número da versão:

> java -version
openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-suse-lp150.1.11-x8664)
OpenJDK 64-Bit Server VM (build 10.0.1+10-suse-lp150.1.11-x8664, mixed mode)

Para mudar o comando java padrão para fazer referência a uma versão anterior, execute:

> sudo update-alternatives --config java
root's password:
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                       Priority   Status
------------------------------------------------------------
* 0            /usr/lib64/jvm/jre-10-openjdk/bin/java      2005      auto mode
  1            /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java   1805      manual mode
  2            /usr/lib64/jvm/jre-10-openjdk/bin/java      2005      manual mode
  3            /usr/lib64/jvm/jre-11-openjdk/bin/java      0         manual mode

Press <enter> to keep the current choice[*], or type selection number:

Dependendo do sistema e das versões instaladas, o número exato da versão do Java será diferente. Depois que você selecionar 1, o java mostrará o seguinte número de versão:

> java -version
java version "1.8.0_171"
OpenJDK Runtime Environment (IcedTea 3.8.0) (build 1.8.0_171-b11 suse-lp150.2.3.1-x86_64)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

Além disso, tenha em mente os seguintes pontos:

  • Ao trabalhar no modo manual e instalar outra versão do Java, o sistema de alternativas não afeta os links nem muda o nome genérico.

  • Ao trabalhar no modo automático e instalar outra versão do Java, o sistema de alternativas muda o link master do Java e todos os links escravos (como você pode ver na Seção 22.4, “Vendo detalhes das alternativas específicas”). Para verificar os relacionamentos entre master e escravo, use:

    > sudo update-alternatives --display java

22.6 Instalando alternativas personalizadas

Esta seção descreve como configurar alternativas personalizadas em um sistema. O exemplo faz as seguintes suposições:

  • Há dois scripts, foo-2 e foo-3, com funcionalidade semelhante.

  • Os scripts são armazenados no diretório /usr/local/bin para evitar conflitos com as ferramentas do sistema em /usr/bin.

  • Há um link master foo que aponta para foo-2 ou foo-3.

Para oferecer alternativas no sistema, siga estas etapas:

  1. Copie seus scripts para o diretório /usr/local/bin.

  2. Torne os scripts executáveis:

    > sudo chmod +x /usr/local/bin/foo-{2,3}
  3. Execute update-alternatives para os dois scripts:

    > sudo update-alternatives --install \
       /usr/local/bin/foo 1\
       foo 2\
       /usr/local/bin/foo-2 3\
       200 4
    > sudo update-alternatives --install \
       /usr/local/bin/foo 1\
       foo 2\
       /usr/local/bin/foo-3 3\
       300 4

    As opções após --install têm os seguintes significados:

    1

    O nome genérico. Para evitar confusão, ele costuma ser o nome do script sem um número de versão.

    2

    O nome do link master. Deve ser o mesmo.

    3

    O caminho para os scripts originais localizados em /usr/local/bin.

    4

    A prioridade. Especificamos para foo-2 uma prioridade mais baixa do que para foo-3. É recomendável usar um aumento significativo de número para separar as prioridades. Por exemplo, uma prioridade de 200 para foo-2 e de 300 para foo-3.

  4. Verifique o link master:

    > sudo update-alternatives --display foo
    foo - auto mode
      link best version is /usr/local/bin/foo-3
      link currently points to /usr/local/bin/foo-3
      link foo is /usr/local/bin/foo
    /usr/local/bin/foo-2 - priority 200
    /usr/local/bin/foo-3 - priority 300

Após concluir as etapas descritas, você poderá usar o link master /usr/local/bin/foo.

Se necessário, você poderá instalar outras alternativas. Para remover uma alternativa, use o seguinte comando:

> sudo update-alternatives --remove foo /usr/local/bin/foo-2

Depois que esse script for removido, o sistema de alternativas do grupo foo terá esta aparência:

> sudo update-alternatives --display foo
foo - auto mode
  link best version is /usr/local/bin/foo-3
  link currently points to /usr/local/bin/foo-3
  link foo is /usr/local/bin/foo
/usr/local/bin/foo-3 - priority 300

22.7 Definindo alternativas dependentes

Se você tem alternativas, o próprio script não é suficiente. A maioria dos comandos não é independente. Eles são fornecidos com arquivos adicionais, como extensões, configurações ou páginas de manual. Para criar alternativas que dependem de um link master, use as alternativas de escravos.

Vamos supor que desejamos estender nosso exemplo na Seção 22.6, “Instalando alternativas personalizadas” e fornecer páginas de manual e arquivos de configuração:

  • Duas páginas de manual, foo-2.1.gz e foo-3.1.gz, armazenadas no diretório /usr/local/man/man1.

  • Dois arquivos de configuração, foo-2.conf e foo-3.conf, armazenados em /etc.

Siga estas etapas para adicionar os outros arquivos às alternativas:

  1. Copie os arquivos de configuração em /etc:

    > sudo cp foo-{2,3}.conf /etc
  2. Copie as páginas de manual para o diretório /usr/local/man/man1:

    > sudo cp foo-{2,3}.1.gz /usr/local/man/man1/
  3. Adicione os links escravos aos scripts principais com a opção --slave:

    > sudo update-alternatives --install \
       /usr/local/bin/foo foo /usr/local/bin/foo-2 200 \
       --slave /usr/local/man/man1/foo.1.gz \
       foo.1.gz \
       /usr/local/man/man1/foo-2.1.gz \
       --slave /etc/foo.conf \
       foo.conf \
       /etc/foo-2.conf
    > sudo update-alternatives --install \
       /usr/local/bin/foo foo /usr/local/bin/foo-3 300 \
       --slave /usr/local/man/man1/foo.1.gz \
       foo.1.gz \
       /usr/local/man/man1/foo-3.1.gz \
       --slave /etc/foo.conf \
       foo.conf \
       /etc/foo-3.conf
  4. Verifique o link master:

    foo - auto mode
      link best version is /usr/local/bin/foo-3
      link currently points to /usr/local/bin/foo-3
      link foo is /usr/local/bin/foo
      slave foo.1.gz is /usr/local/man/man1/foo.1.gz
      slave foo.conf is /etc/foo.conf
    /usr/local/bin/foo-2 - priority 200
      slave foo.1.gz: /usr/local/man/man1/foo-2.1.gz
      slave foo.conf: /etc/foo-2.conf
    /usr/local/bin/foo-3 - priority 300
      slave foo.1.gz: /usr/local/man/man1/foo-3.1.gz
      slave foo.conf: /etc/foo-3.conf

Se você mudar os links com update-alternatives --config foo para foo-2, todos os links escravos também serão mudados.