El directorio /etc/alternatives en GNU/Linux

En mi opinión uno de los grandes olvidados. Todo el mundo se acuerda del /etc/profile, bash_profile, /etc/hosts… pero en los sistemas Linux tenemos todo un directorio que cumple una función bastante curiosa. Para entendernos, de una forma simple aunque también algo imprecisa (porque no es estrictamente lo mismo) lo que hay en ese directorio es similar a “Aplicaciones predeterminadas o por defecto”. No confundir en cualquier caso con los conceptos de variable local o de entorno.

En el directorio /etc/alternatives tenemos un conjunto de enlaces simbólicos a los binarios que por defecto utiliza nuestro sistema.

Veamos, por ejemplo, qué resultado me da comprobar la versión de Java:

jota@jotadebian:~$ java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-2)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

A su vez, debemos saber que el enlace puede estar configurado en modo auto o manual. En auto, el sistema elegirá por sí mismo el programa por defecto al instalar paquetes o actualizaciones. En manual, es el propio administrador del sistema el que tendrá que modificar el enlace.

Puede que quiera modificar la versión de Java que utiliza el sistema por defecto. Vamos a verlo en el apartado siguiente.

Modificar y actualizar alternativas: un ejemplo con Java

Vamos a suponer que tenemos la versión anterior de Java como predeterminada en el sistema. Resulta que ha salido una nueva versión y queremos actualizar el enlace simbólico para que el sistema tome por defecto esa nueva versión, que hemos instalado en el directorio.

/opt/java/jdk1.7.0_65

Si esta nueva versión la hubiéramos instalado desde repositorios, tenemos un update específico para java:

update-java-alternatives -s <paquete Java> 

Podríamos ver las distintas opciones con:

update-java-alternatives -l 

Sin embargo esa versión jdk1.7.0 la he instalado yo manualmente después de descargarme la JDK desde la web de Oracle. El update específico de Java en este caso no siempre funciona como debería, por lo que voy a coger el camino de enmedio para quitarme de problemas. Tendré que optar por utilizar update-alternatives, eliminando el anterior:

update-alternatives --remove java /usr/lib/jvm/java-7-openjdk-amd64/bin/java

Y ahora procedo a instalar el nuevo.

update-alternatives --install /usr/bin/java java /opt/java/jdk1.7.0_65/bin/java  200
update-alternatives: using /opt/java/jdk1.7.0_65/bin/java to provide /usr/bin/java (java) in auto mode

Donde /usr/bin/java apunta a /etc/alternatives/java que a su vez apunta a /opt/java/jdk1.7.0_65/bin/java con una prioridad de 200. En caso de que haya más alternativas, se escoge la que tenga un número de prioridad mayor.

Comprobamos:

root@jotadebian:/opt/java/jdk1.7.0_65/bin# java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

Para ver el estado actual:

root@jotadebian:~# update-alternatives --display java
java - auto mode
  link currently points to /opt/java/jdk1.7.0_65/bin/java
/opt/java/jdk1.7.0_65/bin/java - priority 200
Current 'best' version is '/opt/java/jdk1.7.0_65/bin/java'.

En otros casos que no sean Java, que es muy puñetero, se puede configurar la alternativa instalando como he hecho anteriormente y después seleccionando la que queremos por defecto con:

update-alternatives --config [nombre alternativa]

Donde podremos elegir entre las distintas alternativas del sistema y el modo (manual o auto) según queramos. De todas formas, podéis ver todas las posibilidades de la utilidad en man update-alternatives.

En Debian, mi sistema favorito más mejor, tenéis una GUI para gestionar todo esto: galternatives

aptitude install galternatives