Alternatives – wygodny system zarządzania dowiązaniami symbolicznymi

Alternatives pomaga zarządzać dowiązaniami symbolicznymi wskazującymi na domyślne programy w systemie Linux. W artykule przyjrzymy się zasadzie działania Alternatives i w przykładach pokażemy sposób jego obsługi.

W systemie możemy mieć zainstalowanych kilka wersji jednego programu bądź różne programy dostarczające tę samą funkcjonalność (przykładowo kilka edytorów tekstu). Administrator staje wówczas przed problemem zarządzania domyślnymi wyborami w systemie. Linki symboliczne są wyśmienitym rozwiązaniem, jakie dostarcza nam GNU/Linux, pozwalającym zaradzić temu problemowi. W przypadku dużych systemów i potrzeby zarządzania wielką ilością dowiązań symbolicznych, skłonność do popełniania błędów wzrasta wykładniczo. W rodzinie systemów Enterprise przychodzi nam z pomocą Alternatives – reimplementacja dobrze znanego użytkownikom Debiana narzędzia update-alternatives.

Zasada działania Alternatives

Alternatives zarządza domyślnymi wersjami programów poprzez sieć symlinków. Program, który dodamy do systemu, wskazuje na link w katalogu /etc/alternatives/, który następnie wskazuje na pełną ścieżkę wersji domyślnej. Najlepiej będzie to zobrazować na przykładzie:

[[email protected] vagrant]$ which python
/usr/bin/python
[[email protected] vagrant]$ ls -l /usr/bin/python
lrwxrwxrwx. 1 root root 24 07-22 16:06 /usr/bin/python -> /etc/alternatives/python
[[email protected] vagrant]$ ls -l /etc/alternatives/python
lrwxrwxrwx. 1 root root 16 07-22 16:06 /etc/alternatives/python -> /usr/bin/python2

Po zmianie domyślnej aplikacji dostarczającej daną funkcjonalność, system alternatives podmieni link w katalogu /etc/alternatives tak, aby wskazywał na nowo zadaną ścieżkę.

Listę ustawionych przy użyciu alternatives symlinków uzyskamy przy pomocy następującego polecenia:

[[email protected] ~]$ alternatives --list
libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
ld  auto    /usr/bin/ld.bfd
mkisofs auto    /usr/bin/genisoimage
java    auto    /usr/java/jdk-12.0.1/bin/java
jre_openjdk auto
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre
jre_1.8.0   auto
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre
jre_1.8.0_openjdk   auto
/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
xinputrc    auto    /etc/X11/xinit/xinput.d/ibus.conf
print   auto    /usr/bin/lpr.cups
cifs-idmap-plugin   auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
libjavaplugin.so.x86_64 auto    /usr/lib64/IcedTeaPlugin.so
mta auto    /usr/sbin/sendmail.postfix
cdrecord    auto    /usr/bin/wodim
libwbclient.so.0.14-64  auto    /usr/lib64/samba/wbclient/libwbclient.so.0.14
jaxp_parser_impl    auto    /usr/share/java/xerces-j2.jar
jaxp_transform_impl auto    /usr/share/java/xalan-j2.jar
servlet auto    /usr/share/java/tomcat-servlet-3.0-api.jar
python  manual  /usr/bin/python2

Przełączenie domyślnego programu

Aby ustawić domyślny wybór dla programu, należy skorzystać z opcji alternatives --config NAZWA. Poniżej przykładowy wybór wersji drugiej interpretera Python jako domyślnej wersji w systemie:

[[email protected] ~]$ sudo alternatives --config python

Jest 2 programów dostarczających „python”.

  Wybór    Polecenie
-----------------------------------------------
 + 1           /usr/bin/python2
*  2           /usr/bin/python3

Proszę nacisnąć klawisz Enter, aby zachować bieżący wybór[+] lub podać numer wyboru: 1

Dodawanie nowych wpisów

W celu dodania (czy też bardziej poprawnie w nomenklaturze alternatives „zainstalowania”) nowego wpisu, powinniśmy skorzystać z następującej składni:

alternatives --install <dowiązanie> <nazwa> <ścieżka> <priorytet>

Gdzie:

  • dowiązanie – pełna ścieżka symlinka
  • nazwa – identyfikator w systemie alternatives
  • ścieżka – pełna ścieżka programu udostępniającego daną funkcjonalność
  • priorytet – liczba nadająca priorytet programowi ze ścieżki wykorzystywany w przypadku automatycznego zarządzania.

Dodatkowo można stworzyć grupy, które przy użyciu systemu master-slave będą zmieniały cały szereg symlinków.

Znów zobrazuję to za pomocą przykładu. Powiedzmy, że mamy w systemie zainstalowany interpreter języka Python i pip (menadżer zarządzania pakietami Pythona) w dwóch wersjach. Przy zmianie domyślnego wyboru z python2 na python3 chcemy, aby zmieniła się również wersja pip2 na pip3. Możemy osiągnąć to przy pomocy następujących komend:

[[email protected] vagrant]$ sudo alternatives --install /usr/bin/python
python /usr/bin/python2 666 --slave /usr/bin/pip pip /usr/bin/pip2
[[email protected] vagrant]$ sudo alternatives --install /usr/bin/python
python /usr/bin/python3 333 --slave /usr/bin/pip pip /home/cmd/.local/bin/pip3

Domyślną wersją będzie python2 oraz pip2 ze względu na wyższy priorytet:

[[email protected] vagrant]$ alternatives --display python
python — stan: automatycznie.
 dowiązanie obecnie wskazuje na /usr/bin/python2
/usr/bin/python2 - priorytet 666
 podrzędne pip: /usr/bin/pip2
/usr/bin/python3 - priorytet 333
 podrzędne pip: /home/cmd/.local/bin/pip3
Obecnie „najlepszą” wersją jest /usr/bin/python2.
[[email protected] vagrant]$ pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)

Natomiast po przełączeniu na wersję python3 przy pomocy sudo alternatives --config python, możemy zobaczyć, że zmiana ta pociągnęła za sobą również zmianę domyślnego pip:

[[email protected] vagrant]$ sudo alternatives --config python 

Jest 2 programów dostarczających „python”.

  Wybór    Polecenie
-----------------------------------------------
*+ 1           /usr/bin/python2
   2           /usr/bin/python3

Proszę nacisnąć klawisz Enter, aby zachować bieżący wybór[+] lub podać numer wyboru: 2
[[email protected] vagrant]$ pip --version
pip 19.1.1 from /home/cmd/.local/lib/python3.6/site-packages/pip (python 3.6)

Podsumowanie

Program alternatives został przeportowany do systemów z rodziny Enterprise. Pomimo pełnej jego funkcjonalności nie jest zintegrowany z systemami operacyjnymi Enterprise w takim stopniu, w jakim znamy go z dystrybucji opartych na Debianie. Z tego też powodu jego konfiguracja w dużej mierze spoczywać będzie na barkach administratora. Ta początkowa niedogodność może jednak zaowocować sporym ułatwieniem pracy w dłuższej perspektywie.