How-To среда: Система alternatives
06.02.2008

Часто существуют два или больше пакетов для Fedora, которые делают одно и то же. Система alternatives обеспечивает механизм для выбора активного приложения из нескольких доступных.

Работа alternatives основана на создании символических ссылок в своей папке (/etc/alternatives) с именем программы, а затем — выбора нужной ссылки из этой директории. Такой же механизм используется для переключения между страничками man.

Пример: sendmail и postfix оба являются агентами передачи и приема почты (mail transfer agent или MTA) — они могут отсылать и принимать почту. По различным причинам, одни администраторы предпочитают sendmail, а другие — postfix. При установке оба эти пакета требуют наличия системы alternatives (а именно, файла /usr/sbin/alternatives):

# rpm -q --requires sendmail | grep alternatives
/usr/sbin/alternatives
# rpm -q --requires postfix | grep alternatives
/usr/sbin/alternatives

Во многих скриптах для вызова sendmail прописан /usr/sbin/sendmail, и, соответственно, этот скрипт имеет две версии: для работы с sendmail и для работы с postfix. На самом деле /usr/sbin/sendmail — это символическая ссылка на /etc/alternatives/mta:

# ls -l /usr/sbin/sendmail
lrwxrwxrwx 1 root root 21 Dec 20 00:25 /usr/sbin/sendmail -> /etc/alternatives/mta

А /etc/alternatives/mta — это  символическая ссылка на одну из программ — на /usr/sbin/sendmail.sendmail или на /usr/sbin/sendmail.postfix, в зависимости от предпочтений системного администратора. Допустим, на какой-то системе она ссылается на /usr/sbin/sendmail.sendmail:

# ls -l /etc/alternatives/mta
lrwxrwxrwx 1 root root 27 Mar 13 22:52 /etc/alternatives/mta -> /usr/sbin/sendmail.sendmail

На первый взгляд, для переключения на использование postfix нужно просто удалить ссылку mta и создать новую, ссылающуюся на /usr/sbin/sendmail.postfix. Однако, файл в папке /usr/sbin/sendmail — это только один файл из всех файлов, относящихся к MTA объекту; также к нему относятся различные утилиты, такие, как newaliases и mailq, страницы man, и init-скрипты для запуска MTA при старте системы. Чтобы упростить процесс переключения между двумя пакетам, Fedora предоставляет специальные команды.

После установки пакета postfix выполните данную команду:

/usr/sbin/alternatives --install /usr/sbin/sendmail mta /usr/sbin/sendmail.postfix 30 \
--slave /usr/bin/mailq mta-mailq /usr/bin/mailq.postfix \
--slave /usr/bin/newaliases mta-newaliases /usr/bin/newaliases.postfix \
--slave /etc/pam.d/smtp mta-pam /etc/pam.d/smtp.postfix \
--slave /usr/bin/rmail mta-rmail /usr/bin/rmail.postfix \
--slave /usr/lib/sendmail mta-sendmail /usr/lib/sendmail.postfix \
--slave /usr/share/man/man1/mailq.1.gz mta-mailqman /usr/share/man/man1/mailq.postfix.1.gz \
--slave /usr/share/man/man1/newaliases.1.gz mta-newaliasesman /usr/share/man/man1/newaliases.postfix.1.gz \
--slave /usr/share/man/man8/sendmail.8.gz mta-sendmailman /usr/share/man/man1/sendmail.postfix.1.gz \
--slave /usr/share/man/man5/aliases.5.gz mta-aliasesman /usr/share/man/man5/aliases.postfix.5.gz \
--initscript postfix

После установки sendmail выполните следующую команду:

/usr/sbin/alternatives --install /usr/sbin/sendmail mta /usr/sbin/sendmail.sendmail 90 \
--slave /usr/bin/mailq mta-mailq /usr/bin/mailq.sendmail \
--slave /usr/bin/newaliases mta-newaliases /usr/bin/newaliases.sendmail \
--slave /usr/bin/rmail mta-rmail /usr/bin/rmail.sendmail \
--slave /usr/lib/sendmail mta-sendmail /usr/lib/sendmail.sendmail \
--slave /etc/pam.d/smtp mta-pam /etc/pam.d/smtp.sendmail \
--slave /usr/share/man/man8/sendmail.8.gz mta-sendmailman /usr/share/man/man8/sendmail.sendmail.8.gz \
--slave /usr/share/man/man1/mailq.1.gz mta-mailqman /usr/share/man/man1/mailq.sendmail.1.gz \
--slave /usr/share/man/man1/newaliases.1.gz mta-newaliasesman /usr/share/man/man1/newaliases.sendmail.1.gz \
--slave /usr/share/man/man5/aliases.5.gz mta-aliasesman /usr/share/man/man5/aliases.sendmail.5.gz \
--initscript sendmail

После выполнение данных команд было создано два варианта (две альтернативы) MTA — postfix и sendmail. Главный файл каждой программы теперь стал символической ссылкой на ту программу, которая выбрана для использования в данный момент. Все файлы, относящиеся к данным программам, также будут переключаться в зависимости от выбранной программы. И init-скрипты тоже (через команду chkconfig).

Чтобы выбрать для использования один из двух пакетов в интерактивном режиме, используйте опцию --config, после которой укажите название этих пакетов:

# alternatives --config mta

There are 2 programs which provide 'mta'.

Selection Command
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail
2 /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number:

Заметим, что выбранная программа отмечена звездочкой, а программа, которую вы выбрали сейчас, отмечена плюсом.

Для выбора текущей программы одной командой, используйте опцию --set:

# alternatives --set mta /usr/sbin/sendmail.postfix

Для того, чтобы узнать, какая программа выбрана в данный момент как текущая, используйте опцию --display:

# alternatives --display mta
mta — status is manual.
link currently points to /usr/sbin/sendmail.sendmail
/usr/sbin/sendmail.sendmail — priority 90
slave mta-pam: /etc/pam.d/smtp.sendmail
slave mta-mailq: /usr/bin/mailq.sendmail
slave mta-newaliases: /usr/bin/newaliases.sendmail
slave mta-rmail: /usr/bin/rmail.sendmail
slave mta-sendmail: /usr/lib/sendmail.sendmail
slave mta-mailqman: /usr/share/man/man1/mailq.sendmail.1.gz
slave mta-newaliasesman: /usr/share/man/man1/newaliases.sendmail.1.gz
slave mta-aliasesman: /usr/share/man/man5/aliases.sendmail.5.gz
slave mta-sendmailman: /usr/share/man/man8/sendmail.sendmail.8.gz
/usr/sbin/sendmail.postfix — priority 30
slave mta-pam: /etc/pam.d/smtp.postfix
slave mta-mailq: /usr/bin/mailq.postfix
slave mta-newaliases: /usr/bin/newaliases.postfix
slave mta-rmail: /usr/bin/rmail.postfix
slave mta-sendmail: /usr/lib/sendmail.postfix
slave mta-mailqman: /usr/share/man/man1/mailq.postfix.1.gz
slave mta-newaliasesman: /usr/share/man/man1/newaliases.postfix.1.gz
slave mta-aliasesman: /usr/share/man/man5/aliases.postfix.5.gz
slave mta-sendmailman: /usr/share/man/man1/sendmail.postfix.1.gz
Current `best' version is /usr/sbin/sendmail.sendmail.

Вместо выбора текущей программы вручную, вы можете включить автоматический выбор программы. Тогда текущий выбор будет изменяться при удалении и добавлении пакетов:

# alternatives --auto mta

Наиболее распространенные способы использования системы alternatives — это выбор разных реализаций java, выбор сервера печати и выбор почтового сервера. Реализация системы alternatives в Fedora — это расширение той же системы под Debian.

(Символические ссылки на программы расположены именно в папке /etc/alternatives, а не в какой-нибудь другой, так как /etc — это папка, содержащая все настройки системы, а данные ссылки также относятся к настройкам).