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 symlinkanazwa
– identyfikator w systemiealternatives
ś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.