Sunday, January 6, 2008

aptitude tutorial

aptitude 是 sarge 之後建議的套件管理器, etch 之後應該是預設的,同時支援指令介面和文字 cursor 介面,是基於 apt-get 的模式發展的,我想他是想解決 apt 相關指令太過繁瑣的問題吧,另外也加上了自動解除不被相依套件的功能,以及 mutt-like 正規式搜尋的支援,後者還頗為重要,我想這是使 .deb 系統領先 .rpm 系統的關鍵(註:yum 管理器可以支援 shell 的 pattern 查詢,apt-cache 不支援任何 pattern),他也相容 dselect,可以說把 debian 之前的所有套件管理方式都包含進來,使用 aptitude 也一段時間了,不過最近才弄清楚他的特性。

Review

首先,回顧一下 apt 套件管理器運作的方法,這在 aptitude 中也是一樣的,利用 /etc/apt/source.list 內指定的套件庫來源,aptitude 可以取得這些伺服器上準備好的套件列表,當然是有註記相依性在裡面,使用者只要指定要安裝的套件,aptitude 便會下載所有相依套件,交給 dpkg 解壓縮,配置到正確位置,和 apt 不同的是 aptitude 會將未被指定安裝,但相依性上需要而安裝的套件標記一個 A (Append),表示是個附加套件,當使用者移除當初指定安裝的套件時,如果附加套件沒有被其他套件相依,aptitude 便會移除他。

Interactive Interface

接下來來實際使用一下,先看比較簡單的互動式介面,在 shell 下直接輸入 aptitude 就可以得到文字 cursor 的介面。

這裡使用了樹狀的分類,主分類分成七個,只要用方向鍵移動就可以瀏覽套件庫:
1.資安更新 security update:這裡列出已經安裝且有更新的套件
2.新套件 new package:列出這次套件庫中的新套件,也就是之前不曾出現過的套件,按下 f 會將這些套件歸類為已知而不再出現在這裡,直到下次有新增套件才會羅列在此
3.已安裝套件 installed package:列出已經安裝的套件,而且都已經是最新版的
4.未安裝套件 not installed package:列出還未安裝的套件
5.過期的和自行建立的套件 obsolete and locally created packages:已安裝的套件但沒有出現在套件庫的
6.虛擬套件 virtual package:虛擬套件指的是一個邏輯上的套件名稱,這些套件實際上會由其他套件提供,例如 mail-transport-agent 由 postfix, sendmail, exim 來提供
7.作業 task:有點類似 deselect,利用預定義的方式安裝特定任務套件,還可以利用 .aptitude 檔案對任務進行瀏覽和安裝

文字 cursor 介面使用方式非常直覺,進入後第一件是就是按下 u 來更新套件庫資訊,利用 Ctrl-t 來選擇上方選單標定套件要進行的動作,最後按下 g 就可以得到想要的效果,如果嫌太麻煩,選單旁邊還有標示快速鍵,其中有許多快速鍵是支援 vi 模式的,例如按下 / 就可查詢,查詢完按 n 可以跳到下一個符合項目,上下方向鍵也是,其中最重要的當然是標定哪些套件要安裝/移除的快速鍵,分別是 + 和 - ,標定好狀態後按下 g,就會執行更動。常用的快速鍵列表有:

F10:和 Ctrl-t 一樣顯示 menu
Enter 觀看套件內容
q 離開這個頁面,在主頁面按下會離開 aptitude
?:幫助頁面
f:清除新套件標記,也就是將新套件這個分類內的套件都標示為已知的套件
u:更新套件庫資訊

/ 搜尋
\ 反向搜尋 (這項在 debian reference 內寫錯)

g 執行所有套件異動
+ 將套件標記為新安裝或更新
- 將套件標記為要移除,此選項會保留組態檔
_ 將套件標記為清除,包含組態檔也刪除
= 將套件標記為固定
: 在此次執行期間鎖定該套件

U 將所有可升級套件標記為升級
C 觀看套件變更紀錄
L 將套件標示為重新安裝
R 將套件標示為重新配置


Command Line Interface

不過對於習慣在文字介面下過活的人,上述方法未免太痛苦了:D,aptitude 提供的強大 command line,可以讓你更快速達到目的,而且和 apt 系列指令基本上相容,具官方說法,aptitude 和 apt-get 管理不同資料庫來維護相依性,實際上使用,apt-get 和 aptitude 可以看到彼此安裝的套件。

aptitude 的命令形式為 aptitude action [argument],如 aptitude update,使用 update 這個 action 指示更新最近套件列表,可用的 action 為:

update 從來源處更新套件列表
upgrade 更新所有資安更新
dist-upgrade 更新所有版本更新

search pattern1 [pattern2...] 搜尋滿足樣式的套件
show package1 [package2...] 顯示套件資訊
changelog 顯示套件更改紀錄

install package1 [package2...] 安裝套件
reinstall package1 [package2...] 再次安裝套件
remove package1 [package2...] 移除套件
purge package1 [package2...] 清除套件

download 下載套件的 .deb 檔案
clean 刪除已下載的套件檔案
autoclean 刪除舊的已下載的套件檔案

hold 將套件標示為保持狀態
unhold 取消對一套件的保持命令

markauto 將套件標記為自動安裝
unmarkauto 將套件標記為手動安裝

forbid-version 禁止升級特定的套件版本
forget-new 將新套件辨識為已知套件

可用的 argument 請自行參閱 aptitude -h 所顯示的內容,可最為命令時的輔助用。

另外在搜尋中有些判斷語句可以作為輔助
~ahold 代表標示為保持現狀的套件
~b 為損壞套件
~g 無用的套件
~c 未清除的套件
~n{text}名稱中含有{text}的套件
~d{text} 描述中含有{text}的套件
~m{maintainer} 由指定維護者維護的套件
~V{version} 版本號{version}的套件

這在清潔系統時非常有用,例如,可以下

# aptitude purge ~g

這樣的命令,就會清除系統內所有無用的套件,這個功能在 deborphan 套件內也有提供且更為強大,但 aptitude 這樣的整合提供了很高的便利性。

文字介面的彈性不只於此,在互動式介面中可以用的標記這裡全都可以用,例如,可以下這樣的命令

# aptitude install A+ B- C_ D=

這樣便代表了安裝A,移除B,清除C,保持D,僅用一行便可以完成。

Tag Definition

無論利用 aptitude 瀏覽套件庫或是使用文字介面查詢,可以看到每個套件前面標示有一些 tag,標示套件目前的狀況或種類:
p 已清除或未安裝的
v 虛擬套件
B 損壞
u 已由 dpkg 解開
C 配置到一半的的
H 安裝到一半的的
c 移除 (remove) 但尚未清除 (purge) 組態的
i 已經安裝的
E 內部錯誤的

moo


OK,寫程式總是要來點樂趣,可是寫這種套件管理程式哪有什麼樂趣可言,又是正規式又是相依性的,那...作者到底在哪裡找樂趣呢?如果你仔細瞧瞧 aptitude -h 所顯示的幫助頁面,會發現在最後一行有個 "這個 aptitude 沒有超級牛力 (This aptitude does not have Super Cow Powers.)",如果你有用過 apt-get,那還會發現 apt-get -h 所顯示的幫助頁面最後一行有個 "這個 apt 有著超級牛力 (This APT has Super Cow Powers.)",什麼是超級牛力呢?嘿嘿,超級牛力是 debian 系統中一股神秘的力量喔~。請試著鍵入

# aptitude moo

有東西嗎?那...再多加個 -v 進去看看。
哈哈,你肚子痛了嗎?那...再多加幾個 v 看看XD。

Reference Document


[1] aptitude 簡明手冊
[2] debian reference
[3] aptitude user manual
第[2],[3]項在 debian 上分別為 debian-reference-zh-tw, aptitude-doc-en 這兩個套件

後記


寫這篇大概寫了我五六個小時不只,剛開始寫真的沒想到會寫這麼久阿。我可以了解 Rails 聖經作者 Dave Thomas 說 "我每寫一本書,就發誓這是最後一本了" 的心情:D

Saturday, January 5, 2008

debian 上的 apache2 manual

適才偶然發現了 debian 上的一個 apache 小秘密,還頗有趣的。

事實上,debian 上的軟體很多都有提供 xxx-doc 這樣的文件套件,安裝位置都在 /usr/share/doc/ 底下,apache2 也不例外,預設上 /etc/apache2/site-available/default 這個 site configure file 是有 alias /doc /usr/share/doc 這樣的配置,所以雖然我有裝了apache2-doc,一直以來我也都是連到 http://mymachine/doc/ 來看的。不過 apache2-doc 提供的 html doc 就是特別奇怪,連結都連結不好,所以我都會重新配置檔案,copy 一份 en 的到特定資料夾,這樣才會比較正常。

但沒想到這份文件其實提供了一個 configure 在 /etc/apache/conf.d/apache2-doc,cat 一下這個檔案,會發現裡面寫好了 /manual 這個 alias 並且做了一些 redirection 來符合文件內的超連結。所以其實連到 http://mymachine/manual/ 就可以正常觀看。

我只能說......真是服了XD。