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:
- 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:
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
efoo-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 parafoo-2
oufoo-3
.
Para oferecer alternativas no sistema, siga estas etapas:
Copie seus scripts para o diretório
/usr/local/bin
.Torne os scripts executáveis:
>
sudo
chmod +x /usr/local/bin/foo-{2,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 4As opções após
--install
têm os seguintes significados:O nome genérico. Para evitar confusão, ele costuma ser o nome do script sem um número de versão.
O nome do link master. Deve ser o mesmo.
O caminho para os scripts originais localizados em
/usr/local/bin
.A prioridade. Especificamos para
foo-2
uma prioridade mais baixa do que parafoo-3
. É recomendável usar um aumento significativo de número para separar as prioridades. Por exemplo, uma prioridade de 200 parafoo-2
e de 300 parafoo-3
.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
efoo-3.1.gz
, armazenadas no diretório/usr/local/man/man1
.Dois arquivos de configuração,
foo-2.conf
efoo-3.conf
, armazenados em/etc
.
Siga estas etapas para adicionar os outros arquivos às alternativas:
Copie os arquivos de configuração em
/etc
:>
sudo
cp foo-{2,3}.conf /etc
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/
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
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.