🢂Ściągawka (cheatsheet) z update‑alternatives dla administratorów

Ten cheatsheet zawiera krótkie podsumowanie podstawowych pojęć, komend i opcji update-alternatives. Zawiera również informacje o źródłach dodatkowych informacji.

update-alternatives to narzędzie w systemach Debian, Ubuntu i pochodnych, które zarządza symbolicznymi linkami do domyślnych wersji komend, gdy w systemie jest dostępnych kilka alternatyw.

Co to jest system alternatives?

System alternatives w dystrybucjach bazujących na Debianie (Ubuntu, Mint, itp.) umożliwia współistnienie kilku wersji tego samego oprogramowania na jednym systemie. Mechanizm działa poprzez tworzenie systemu symbolicznych linków, które wskazują na różne implementacje tej samej funkcjonalności.

Główne zalety systemu alternatives:

  • Możliwość łatwego przełączania między różnymi wersjami programów
  • Utrzymywanie spójności systemu przy jednoczesnym umożliwieniu wyboru
  • Automatyczne zarządzanie zależnościami między programami

Podstawowe polecenia

Polecenie Opis
update-alternatives --display NAZWA Wyświetla informacje o alternatywach dla danej komendy
update-alternatives --query NAZWA Wyświetla szczegółowe informacje w formacie parsowanym
update-alternatives --install LINK NAZWA ŚCIEŻKA PRIORYTET Dodaje nową alternatywę
update-alternatives --remove NAZWA ŚCIEŻKA Usuwa alternatywę
update-alternatives --config NAZWA Interaktywnie wybiera domyślną alternatywę
update-alternatives --set NAZWA ŚCIEŻKA Ustawia wskazaną alternatywę jako domyślną
update-alternatives --auto NAZWA Przywraca automatyczny wybór alternatywy (wg priorytetu)
update-alternatives --list NAZWA Wyświetla wszystkie alternatywy dla danej nazwy
update-alternatives --all Konfiguruje wszystkie alternatywy w trybie interaktywnym
update-alternatives --remove-all NAZWA Usuwa wszystkie alternatywy dla danej nazwy

Ważne parametry

  • LINK - ścieżka do głównego dowiązania symbolicznego (np. /usr/bin/java)
  • NAZWA - nazwa grupy alternatyw (np. java, editor)
  • ŚCIEŻKA - pełna ścieżka do pliku wykonywalnego (np. /opt/jdk-11/bin/java)
  • PRIORYTET - liczba całkowita określająca priorytet danej alternatywy (wyższa wartość = wyższy priorytet)

Przykłady użycia

Wyświetlanie alternatyw dla komendy

sudo update-alternatives --display java

Przykładowy wynik który zawiera informacje o tym, że domyślną alternatywą jest Java 11, a priorytetem tej alternatywy jest 1111.

java - auto mode
  link best version is /usr/lib/jvm/java-11-openjdk-amd64/bin/java
  link currently points to /usr/lib/jvm/java-11-openjdk-amd64/bin/java
  link java is /usr/bin/java
  slave java.1.gz is /usr/share/man/man1/java.1.gz
  /usr/lib/jvm/java-8-openjdk-amd64/bin/java - priority 1081
  /usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1111

Dodawanie nowej alternatywy

sudo update-alternatives --install /usr/bin/java java /opt/jdk/bin/java 100

Dodawanie z podrzędnymi (slave) alternatywami:

sudo update-alternatives --install /usr/bin/java java /opt/jdk-11/bin/java 1100 \
  --slave /usr/bin/javac javac /opt/jdk-11/bin/javac \
  --slave /usr/bin/jar jar /opt/jdk-11/bin/jar

Zmiana domyślnej alternatywy (interaktywnie)

sudo update-alternatives --config editor

Przykładowy wynik:

Dostępne są 4 alternatywy dla "editor".

  Wybór      Ścieżka               Priorytet  Status
------------------------------------------------------------
* 0            /usr/bin/nano          40        tryb auto
  1            /bin/ed               -100       tryb ręczny
  2            /bin/nano              40        tryb ręczny
  3            /usr/bin/vim.basic     30        tryb ręczny
  4            /usr/bin/vim.tiny      15        tryb ręczny

Proszę wcisnąć enter, aby pozostawić bieżący wybór[*], lub wpisać numer wyboru:

Ustawienie alternatywy bez interakcji

sudo update-alternatives --set editor /usr/bin/vim

Usuwanie alternatywy

sudo update-alternatives --remove editor /usr/bin/vim

Usuwanie wszystkich alternatyw dla danej nazwy

sudo update-alternatives --remove-all editor

Praktyczne zastosowania

Zarządzanie wersją Java

# Dodanie nowej wersji Java
sudo update-alternatives --install /usr/bin/java java /opt/jdk-11/bin/java 110
sudo update-alternatives --install /usr/bin/java java /opt/jdk-8/bin/java 100

# Przełączanie między wersjami
sudo update-alternatives --config java

# Sprawdzenie aktualnie używanej wersji
java -version

Zmiana domyślnego edytora

# Lista dostępnych edytorów
sudo update-alternatives --list editor

# Wybór domyślnego edytora
sudo update-alternatives --config editor

# Szybkie ustawienie vim :D jako domyślnego edytora
sudo update-alternatives --set editor /usr/bin/vim

Zarządzanie alternatywami dla PHP

# Dodanie wersji PHP
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74

# Przełączanie wersji PHP
sudo update-alternatives --set php /usr/bin/php8.1

# Wybór domyślnego php
sudo update-alternatives --config php

# Sprawdzenie aktualnie używanej wersji
php --version

Zarządzanie alternatywami dla Python

# Przełączanie między wersjami Python (jeśli są zainstalowane)
sudo update-alternatives --config python

# Dodanie Pythona 3.9 jako alternatywy dla 'python'
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1

# Dodanie Pythona 3.10 z wyższym priorytetem
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2

Zarządzanie kompilatorem C/C++

# Dodawanie GCC jako alternatywy
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110

# Przełączanie między wersjami
sudo update-alternatives --config gcc

# Sprawdzenie aktualnie używanej wersji
gcc --version

Struktura katalogów

  • /etc/alternatives/ - katalog zawierający symboliczne linki do obecnie wybranych alternatyw
  • /var/lib/dpkg/alternatives/ - miejsce przechowywania konfiguracji alternatives
  • /usr/share/man/man8/update-alternatives.8.gz - podręcznik (man page) dla narzędzia

Jak działa system alternatives?

System alternatives opiera się na trzech poziomach linków symbolicznych:

  1. Link główny (np. /usr/bin/java) - wskazuje na link w katalogu alternatives
  2. Link alternatives (np. /etc/alternatives/java) - wskazuje na faktyczny program
  3. Faktyczny program (np. /usr/lib/jvm/java-11-openjdk-amd64/bin/java)

Gdy wywołujesz komendę java, ścieżka wygląda tak:

/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java

Uwagi

  • Wyższy priorytet oznacza, że alternatywa będzie preferowana w trybie automatycznym
  • Po instalacji pakietów, które zarządzane są przez update-alternatives, często automatycznie dodawane są odpowiednie wpisy
  • Operacje --install i --remove wymagają uprawnień administratora (sudo)
  • Można zarządzać grupami alternatyw za pomocą opcji --slave
  • Gdy w systemie pojawia się alternatywa z wyższym priorytetem, automatycznie staje się domyślna, chyba że ręcznie ustawiono inną opcję

Tryby pracy alternatives

System alternatives może działać w dwóch trybach:

  • Tryb automatyczny - automatycznie wybiera alternatywę z najwyższym priorytetem
  • Tryb ręczny - administrator ręcznie wybiera preferowaną alternatywę

Aby przełączyć się między trybami:

# Przełączenie na tryb automatyczny
sudo update-alternatives --auto java

# Przełączenie na tryb ręczny (poprzez wybranie konkretnej alternatywy)
sudo update-alternatives --set java /path/to/java

Rozwiązywanie problemów

System alternatyw został uszkodzony

Jeśli system alternatyw został uszkodzony, można go naprawić za pomocą:

sudo update-alternatives --auto NAZWA

Poważniejsze problemy

W przypadku poważniejszych problemów:

# Przebudowanie całego systemu alternatyw
sudo dpkg --configure -a

# Sprawdzenie i naprawa pakietów
sudo apt-get install -f

Błędy z linkami symbolicznymi

Jeśli zauważysz błędy z linkami symbolicznymi:

# Sprawdzenie linków symbolicznych
ls -la /etc/alternatives/
ls -la /usr/bin/NAZWA

# Ręczne naprawienie linku symbolicznego (jeśli potrzebne)
sudo ln -sf /etc/alternatives/NAZWA /usr/bin/NAZWA

Przydatne skrypty

Skrypt do szybkiego przełączania Javy

#!/bin/bash
# Skrypt do szybkiego przełączania wersji Javy
# Użycie: ./switch_java.sh 8|11|17

case "$1" in
  "8")
    sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
    ;;
  "11")
    sudo update-alternatives --set java /usr/lib/jvm/java-11-openjdk-amd64/bin/java
    ;;
  "17")
    sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java
    ;;sudo update-alternatives --display java
  *)
    echo "Użycie: $0 8|11|17"
    exit 1
    ;;
esac

echo "Przełączono na Javę:"
java -version

Skrypt do tworzenia alternatyw dla PHP

#!/bin/bash
# Skrypt do konfiguracji alternatyw dla PHP
# Użycie: ./setup_php_alternatives.sh

# Dodawanie PHP 7.4
if [ -f /usr/bin/php7.4 ]; then
  sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74
  sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config7.4 74
  sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize7.4 74
fi

# Dodawanie PHP 8.0
if [ -f /usr/bin/php8.0 ]; then
  sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.0 80
  sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.0 80
  sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.0 80
fi

# Dodawanie PHP 8.1
if [ -f /usr/bin/php8.1 ]; then
  sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
  sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.1 81
  sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.1 81
fi

echo "Skonfigurowano alternatywy dla PHP"
echo "Aby wybrać domyślną wersję, uruchom: sudo update-alternatives --config php"

Źródła dodatkowych informacji