Friday, 12 June 2015

[Debian] update-alternatives: thay đổi là sự lựa chọn!

update-alternatives là tên của một chương trình trong Debian (tất nhiên cả Ubuntu), phục vụ cho việc quản lý các symlink để quyết định câu lệnh nào là default (mặc định).

Chú ý 1: có chữ ``s`` ở cuối tên câu lệnh
Chú ý 2: phiên âm là /ɔːlˈtəːnətɪv/  - Việt sub: ôl tơ nơ tiv 
 
Chào hỏi theo phong cách CCGU
$ for cmd in whatis whereis which; do echo -n $cmd: ; $cmd update-alternatives; done
whatis:update-alternatives (8) - maintain symbolic links determining default commands
whereis:update-alternatives: /usr/bin/update-alternatives /usr/sbin/update-alternatives /usr/share/man/man8/update-alternatives.8.gz
which:/usr/sbin/update-alternatives
Là một câu lệnh thuộc man8, update-alternatives nhắm tới đối tượng sử dụng là các sysadmin, tên câu lệnh khá dài và cho thấy một sự thật rằng dài nhiều khi không phải đã là hay.

update-alternatives giải quyết vấn đề gì?
Khi có nhiều chương trình cùng cung cấp 1 tính năng (ví dụ emacs, nano và vim đều cung cấp tính năng "editor"), việc này tiện cho user được lựa chọn nhưng với các chương trình thì đây lại là một vấn đề, chúng sẽ không biết lấy cái gì để dùng. ``alternatives system`` của Debian đảm bảo cung cấp 1 cái tên chung (cụ thể là 1 symlink file: vd /usr/bin/editor), và nó sẽ chọn một chương trình phù hợp để cung cấp tính năng ấy.



update-alternatives có 2 mode
- auto: mặc định, tự chọn dựa trên priority của mỗi alternative, chọn cái có điểm cao nhất
- manual: do sysadmin chọn

"alternative" là path của chương trình thực sự cung cấp tính năng.

Với ví dụ nói trên thì ``/usr/bin/vim`` là một "alternative" của "alternative link (đôi khi gọi ngắn là link)" ``editor``. Nếu vim được chọn, symlink ``/usr/bin/editor`` sẽ link tới ``/etc/alternatives/editor`` và symlink này lại link đến ``/usr/bin/vim``.

alternative directory
Các link được nằm tập trung trong thư mục /etc/alternatives cho dễ quản lý: 
$ ls /etc/alternatives/ | wc -l
88
link group/ master-slave
Mỗi ``link`` có khái niệm về master-slave như sau:
- master link sẽ quyết định sự thay đổi của các slave link.
- master link và slave links tạo thành một link group.

Ví dụ với alternative link editor:
# update-alternatives --query editor
Link: editor
Status: auto
Best: /usr/bin/vim.basic
Value: /usr/bin/vim.basic

Alternative: /usr/bin/mcedit
Priority: 25
Slaves:
 editor.1.gz /usr/share/man/man1/mcedit.1.gz

Alternative: /usr/bin/vim.basic
Priority: 30
Slaves:
 editor.1.gz /usr/share/man/man1/vim.1.gz
 editor.fr.1.gz /usr/share/man/fr/man1/vim.1.gz
 editor.it.1.gz /usr/share/man/it/man1/vim.1.gz
 editor.pl.1.gz /usr/share/man/pl/man1/vim.1.gz
 editor.ru.1.gz /usr/share/man/ru/man1/vim.1.gz
Với ví dụ trên, link là "editor", các group được phân cách nhau ứng với các "alternative", master link trong ví dụ là ``/usr/bin/vim.basic`` nó có các slave là các link của manpages (khi link editor thay đổi từ ``mcedit`` sang ``vim`` thì man editor cũng cần thay đổi sang man vim)

Làm sao để thay đổi 1 link?
# update-alternatives --config editor
chương trình sẽ đưa ra các lựa chọn để user chọn.
Sau khi user đã chọn, link này sẽ tự động được chuyển sang mode "manual". Muốn nó trở lại auto thì dùng
# update-alternatives --auto editor

Hiển thị thông tin của tất cả các alternative link
# cd /etc/alternatives/; for i in *; do update-alternatives --query $i; echo ================; done

Tham khảo: man 8 update-alternatives
http://manpages.ubuntu.com/manpages/precise/man8/update-alternatives.8.html

Hết.
hvn@familug.org
 
happy sytadminting!