在剛接觸 GNU/Linux 時,總覺得 Linux 發行版實在多到讓人無所適從。光是主流的 Linux 發行版就有
Archlinux、Debian、Fedora、Gentoo、Mandriva、OpenSUSE、Slackware、Ubuntu…
等等不及備載,而其它較小眾的 Linux
發行版則更是不可勝數。那時我一直在想:若能採用單一發行版,事情不就單純多了嗎?把所有資源集中在單一發行版上,才能有效發揮力量不是嗎?但為什麼 Linux 卻不採取這種作法呢?
但慢慢的,我發現這種想法太不切實際了。世界上的人那麼多,每個人的喜好都有所不同:有人愛一磚一瓦得打造系統,但也有人不想浪費精力在建構系統
上;有人愛親手編譯、有人則希望不要那麼費事;有人希望系統能包山包海、有人則是精簡至上;有人希望系統法則嚴謹、但有人則希望事情單純就好,才不想理那麼多
規定……既然人們的想法非僅一種,那麼會有那麼多的 Linux 發行版也就不足為奇了。
而拜 Open Source 之賜,Linux 發行版可以說是多如繁星,每種發行版其外觀、特色、訴求都各有其獨到之處,也難怪時常看到『我的 Linux
比較好』之類的論戰了。敝人從不認為這類論戰就是『無知』、『幼稚』、『蝸角之爭』、『破壞 OSS
團結』之類的:各吹各的調本來就是 OSS 的常態,看不慣就 fork 在 OSS 裡更是司空見慣。難道有人表明他就是愛吃蘋果不愛吃梨子,梨子愛好者就有理由群起攻之?OSS 界可不會狹隘到連這麼一點異音都聽不進去。
而若想深入某個 Linux
發行版,個人認為,先深入了解其『套件管理』的運作方式是個很不錯的著力點,畢竟如果連如何在系統裡安裝移除軟體都不了解,那麼想要對系統有進一步的認識就顯得困難重重了。而以下介紹的,便是 Debian GNU/Linux 的套件管理機制。
概論:
和其它的 Linux 發行套件類似的,在 Debian 系統上,一套軟體通常會先被打包 (Package) 成 Debian 可用的套件,然後再用 Debian 的套件管理系統把它給安裝進來。Debian 的套件檔是以 .deb 為副檔名,但一般我們並不是直接安裝這些套件檔,取而代之的是用 apt-get 指令及套件名稱來直接取得並安裝套件。
而在套件之間往往存在著相依性。
比如說,若您想安裝 GIMP 這個 Gtk+2 based 的繪圖軟體,因為相依性的關係,您必須也同時安裝 Gtk+2
才行。若這個套件的相依關係過於複雜,有時為了安裝一套軟體您可能得連帶安裝上百個套件才行。在 Debian
裡,當然不會要您一個一個手動去安裝這上百個套件,只要下達如下的指令:
就可以輕鬆得把 GIMP 以及所有相依套件給全部安裝進來了。而若日後 GIMP 或其它套件有推出任何新的版本,您只要下達:
apt-get update
apt-get upgrade
|
就會自動替您把系統裡的所有套件升級到最新的版本。Debian 方便的套件管理機制正是它如此受歡迎的主因之一。
也因為 apt-get 指令讓在 Debian 上安裝軟體變得如此得簡單,因此只要學會這一行指令就可以輕鬆把玩 Debian 了。
另外,在此要特別強調:為了保持系統的一致性,在 Debian 系統上請儘量使用 apt-get 來安裝軟體;自行使用 ./configure; make; make install 來安裝軟體可能會造成系統混亂,甚至導致系統的不穩定,這絕對不是恰當的作法。
版本:
Debian 的套件依版本大致可分為 oldstable / stable / testing / unstable 以及 experimental 版。
experimental |
體驗版。套件維護者自行測試版本。不適合於日常使用。
像 OpenOffice.org、X.org、Wine、GNOME、KDE 都是 experimental 的常客。但並非每一個套件都會有 experimental 版。 |
unstable |
嘗鮮版。
適合有經驗的使用者。
套件維護者在測試過新套件大致沒問題後,會先放入 unstable 讓使用者使用測試並回報錯誤。
|
testing |
測試版。
適合 Desktop 使用者。
套件在 unstable 中一段時間沒有重大問題 (rc bug) 便會進入 testing 裡。
|
stable |
Debian 的正式發行版。
適合 Server 使用。
Debian 會訂立一些階段性目標,在這些目標達成後便釋出 1 次發行版。約莫每隔 1 至 3 年會發佈一次。
Debian 有專門的 stable 安全維護小組以確保 stable 的品質。
|
oldstable |
上一個 stable 版。
Debian 會在下個 stable 發佈後繼續維護這些套件 1 年。之後便讓這個版本走入歷史。
|
個
人建議,若是架設 Server 請務必使用 stable 版本的套件,若是使用 Desktop 時則儘量僅使用 testing
版本的套件。建議能讓系統的套件版本儘量單純,若在一個系統中同時混雜了 stable/testing/unstable
的套件可能會導致系統混亂且可能會遭遇到難以預料的問題。
代碼:
Debian 每個發行版都有其代碼以方便讓人們引用,以及進行套件管理。現行代碼如下:
oldstable |
Etch,發行於 2007/4/8
|
stable |
Lenny,發行於 2009/2/14 |
testing |
Squeeze,開發中。 |
unstable |
Sid,unstable 的代碼永遠為 sid。
|
比如說之前在 Lenny 將要發行之時,您想要安裝一台 Server,但希望使用的是 testing 的 Lenny 而不是版本過舊的 Etch,但又不希望會在 Lenny 發行時不小心升級到 Squeeze 去。此時,您可以指定只使用 Lenny(而不是 testing)這個版本,那麼在 Lenny 變成 stable 之時,您就直接變成使用著 stable 而不會誤用到 testing 裡的東西了。
而當某人說他還在用著 Debian Etch,您就可以推想到他所使用的版本實在太舊了。
授權分類:
Debian 依授權之不同將套件分為 3 類:
main |
符合 (DFSG) 的自由軟體。 |
non-free |
不符合 DFSG 的非自由軟體。 |
contrib |
符合 DFSG 的自由軟體,但必須和 non-free 套件搭配使用。 |
在上表中的 DFSG 是 Debian 用來衡量某個軟體是否能進入 Debian 官方發行版的準則。它被公認為一個軟體能否被承認為
Free Software 的重要指標。像之前 Liberation fonts 就是被討論了很久才終於被承認為是可以放入 Debian
中的自由軟體;而 Firefox 則因為必須強制搭載 non-free 的商標而被 Debian 視為非自由軟體。為此,Debian 自行維護了一個
fork 自 Firefox 的 IceWeasel 套件,讓 Firefox 也能被放入 Debian 之中。
Debian 只負責維護及發行 main 的部份。至於 contrib 和 non-free 有時候連原始碼都不可得,所以就不是 Debian 所能掌控的了。
操作軟體:
Debian 的套件主要是使用 dpkg(底層)及 apt / aptitude(前端)來進行管理套件:
dpkg:用來安裝/移除單一套件檔案,或查詢套件資料庫狀態等等。
apt:主要的套件管理程式,提供了安裝/移除/查詢套件等等功能。僅提供命令列模式,但有提供一些 aptitude 未能提供的指令。
aptitude:官方推薦的套件管理程式。除了指令模式外,也提供了一個友善的視覺模式 (visual mode)。在指令和參數上幾乎和 apt 相同,但在處理複雜的相依關係時會比 apt 好一些。
設定 APT:(/etc/apt/apt.conf)
您可以使用以下指令:
來取得 APT 的設定,必要時可加以修改。以下為個人的 /etc/apt/apt.conf 的內容:
// 主要採用哪一個版本的套件。
// 比如說,如果您使用 apt-get install gcin 時,
// 預設會安裝 testing 版的 gcin(以及 testing 版的相依套件)
// 也就是相當於 apt-get -t testing install gcin
APT::Default-Release "testing";
// APT 的 Cache 大小
APT::Cache-Limit "33554432";
// 不要安裝 Recommends 套件
APT::Install-Recommends "0";
// 指定 Proxy 資訊
Acquire::Http::Proxy "";
|
而 aptitude 則主要是在 visual mode 下用選單的方式設定,在此就不贅述了。
套件來源:(/etc/apt/sources.list)
Debian 是使用 /etc/apt/sources.list 來設定 apt-get 如何取得 Debian 套件,可使用的來源包括 HTTP、FTP、本機路徑、光碟機、SSH/RSH 等等。
因為 Debian 上版本的更新太快了,所以敝人大多直接透過 HTTP/FTP 來取得 Debian 的套件,光碟版的 Debian 在安裝完成後就幾乎再也用不著。
而以下為個人的 /etc/apt/sources.list 的內容,主要是使用 Taiwan Debian FTP,上面放的是 Debian 官方所發行的套件,包含了 lenny、security、squeeze、sid 及 experimental:
# lenny (stable)
deb stable main contrib non-free
deb-src stable main contrib non-free
# security
deb http://security.debian.org lenny/updates main contrib non-free
deb-src http://security.debian.org lenny/updates main contrib non-free
# squeeze (testing)
deb testing main contrib non-free
deb-src testing main contrib non-free
# sid (unstable)
deb unstable main contrib non-free
deb-src unstable main contrib non-free
# experimental
deb / ../project/experimental main contrib non-free
deb-src / ../project/experimental main contrib non-free
|
其語法說明如下:
deb |
|
|
|
stable
|
|
main contrib non-free |
套件 |
|
主機路徑
|
|
版本
|
|
授權分類
|
|
以 deb 開頭的是『deb 套件檔』,而以 deb-src 開頭的是『原始碼』。
則是該主機的『路徑』。
stable 是『版本』,在此也可以用 lenny 來替代。
而 main contrib non-free 指的是『授權分類』。若您不想使用 contrib/non-free 裡的套件,您可以在此把 contrib non-free 移去僅留下 main 即可。
而您也可以使用其它 Debian 非官方所發行的套件,例:
# mplayer
deb sid main
deb-src sid main
# wine
deb lenny main
# luna
deb ./
deb-src ./
|
Debian
在安裝套件時,會取用這個列表裡版本最高的套件,因此您可能會安裝到 unstable 甚至是 experimental
版的套件,這當然不是最好的做法。因此建議您能設定好 /etc/apt/apt.conf,讓 apt-get 預設是安裝 stable 或
testing 的套件。
更新套件來源:(/var/lib/apt/lists/)
在設定好套件來源之後,接下來就下達:
來取得或更新套件列表,這些列表檔將會被下載到 /var/lib/apt/lists/ 裡。
為
了降低這個指令所會佔用到的頻寬,Debian 採取了『差異檔』的作法:也就是在 update
時下載的都只是會下載有所更新的部份,而不是下載整個套件列表,如此可以有效節省頻寬,不過 update
時因為要合併這些差異檔,所以將會佔用大量的 CPU Loading。
另外,偶爾偶爾那些差異檔會損壞或是故障,此時只要把 /var/lib/apt/lists/partial/ 裡的檔案刪除後再執行一次 apt-get update 後大多就能夠修復這個問題了。
套件驗証:
為了確保您連上的是正確的伺服器,且下載到的是正確的套件,Debian 會在套件檔下載完之後,使用電子簽章及 md5sum/ SHA1/SHA256 碼來驗証這些套件。
Debian 套件驗証機制流程簡介:
首
先,任何上傳至 Debian Archiver 中的套件必須先經由 Debian Developer
以電子簽章簽名,之後會計算其 md5sum/SHA1/SHA256 碼再將其放入 Debian Archiver 中的 Packages
檔裡,然後這個 Packages 檔必須加上 Debian Archiver 的電子簽章以確保 Packages 檔不至於被人所篡改。而既然
Packages 檔無法被篡改,那麼只要是 md5sum/SHA1/SHA256 符合的套件應該就能確保它是由 Debian
官方所提供的套件。
而 Debian Archiver 的 Key 則由 debian-archive-keyring 套件提供,您在安裝 Debian Lenny 的過程中應該會自動安裝這個套件。您可以用:
來取得這些 Key 的列表。或使用:
來更新這些 Key。當然,debian-archive-keyring 套件也會隨著 apt-get upgrade 更新。
您也可以自行加上其它非 Debian 官方的 Archiver 的電子簽章(風險自負!)。以著名的 debian-multimedia.org 為例,如果您有使用該站台的套件的話,您在 apt-get update 的過程中應該會得到如下的警告訊息:
W: GPG error: sid Release: 由於無法取得它們的公鑰,無法驗證以下簽章: NO_PUBKEY 07DC563D1F41B907
|
您可以用以下指令把 debian-multimedia.org 加入系統的 Keyring 裡:
gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 07DC563D1F41B907
gpg --armor --export 07DC563D1F41B907 | apt-key add -
|
之後就會自動信任來自 debian-multimedia.org 的套件了。
而您日後若已不想再使用這個 Key,可以使用以下指令把這個 Key 由您系統中刪除:
apt-key del 07DC563D1F41B907
|
一般而言,若無特別指定,apt 並不會替您安裝沒有提供套件驗証機制的套件,您必須手動指定才能安裝這些套件。
以關鍵字搜尋套件 / 顯示套件資訊:
既然 apt-get 是以『套件名』來安裝套件的,那麼要如何找到正確的套件名稱就是個麻煩事了。為此,Debian 提供了 apt-cache 指令來讓您能方便得尋找套件。例如,我們要找 Debian 所提供的文鼎字型:
# apt-cache search 文鼎
ttf-arphic-bsmi00lp - 由文鼎科技製作的文鼎PL細上海宋 (Big5 碼) TrueType 字型
ttf-arphic-gkai00mp - 由文鼎科技製作的文鼎PL簡中楷 (GB 碼) TrueType 字型
ttf-arphic-gbsn00lp - 由文鼎科技製作的文鼎PL簡報宋 (GB 碼) TrueType 字型
ttf-arphic-bkai00mp - 由文鼎科技製作的文鼎PL中楷 (Big5 碼) TrueType 字型
|
或要找找 Debian 是否有提供 Super Nintendo 的模擬器:
# apt-cache search "Super Nintendo"
snes9x-x - X binaries for snes9x - Super NES Emulator
zsnes - Emulator of the Super Nintendo Entertainment System (TM)
|
然後,再用 apt-cache 來查看這個套件是不是我們想要的:
# apt-cache show zsnes
Package: zsnes
Priority: optional
Section: otherosfs
Installed-Size: 4060
Maintainer: Joshua Kwan
Architecture: i386
Version: 1.510-2.2
Depends: libao2 (>= 0.8.8), libc6 (>= 2.7-1), libgcc1 (>= 1:4.1.1),
libgl1-mesa-glx | libgl1, libpng12-0 (>= 1.2.13-4),
libsdl1.2debian (>= 1.2.10-1), libstdc++6 (>= 4.1.1),
zlib1g (>= 1:1.2.2.3)
Filename: pool/main/z/zsnes/zsnes_1.510-2.2_i386.deb
Size: 894268
MD5sum: 02983151804b9fb80abbc9e6e3961ed9
SHA1: a2313d3f4c80ceeeec665d1e667bcdf9e81bdd56
SHA256: 95de648d8d04386410673ff42d4efc2f7a6d2a5a93a60b242eecdf93d380ed6b
Description-zh_TW: 超級任天堂 (TM) 模擬器
ZSNES 可以讓您在 GNU/Linux 系統上玩 "超任" 遊戲平台上的遊戲。
它支援多種進階的功能如透過 TCP/IP 網路多人共同遊樂。
.
請注意:大部份於此模擬器可執行的遊戲都不是自由軟體。請閱
讀 /usr/share/doc/zsnes/README.Debian 以獲得更多資訊。
Tag: hardware::emulation, role::program, uitoolkit::sdl,
use::gameplaying, x11::application
|
由於 Debian 支援套件說明的翻譯,所以很多套件都已有中文的說明。不過並不是所有套件都有中文說明就是了。
另外,我們也可以利用 apt-file 來尋找某個檔案是由哪個套件所提供的。不過 Debian 預設並不會安裝 apt-file 這個套件,所以在使用 apt-file 之前要先把它安裝起來,並更新 apt-file 的資料庫:
apt-get install apt-file
apt-file update
|
接下來,試著尋找看看吧:
# apt-file search bin/pstree
psmisc: /usr/bin/pstree
psmisc: /usr/bin/pstree.x11
|
或是:
# apt-file search vte.h
libvte-dev: /usr/include/vte/vte.h
|
只要熟悉幾個指令,應該可以發現 Debian 的套件系統真是便利到不可思議呀!
可取得版本:
我們可以利用以下指令:
# apt-cache policy pidgin
pidgin:
已安裝:2.5.4-2
候選:2.5.4-2
版本列表:
2.5.5-1 0
500 sid/main Packages
*** 2.5.4-2 0
990 squeeze/main Packages
100 /var/lib/dpkg/status
2.4.3-4 0
500 lenny/main Packages
|
來得知 Debian 替某個套件提供了哪些版本,這可以做為安裝或升級套件時的依據。
提問等級:
在安裝套件的過程中,dpkg 可能會要求您輸入一些資訊來設定套件,像安裝 samba
時就會要求您輸入您的工作群組的名稱,否則 samba 無法正確運作。但有些瑣碎的設定其實用預設值就可以了,實在沒必要不斷操煩使用者。因此
dpkg 設定了個『提問等級』,唯有高於這個提問等級的問題才會在安裝套件的過程中出現。您可以使用以下指令:
來指定這個『提問等級』。但一般維持其預設值即可。
安裝套件:
接下來就是重頭戲,安裝套件了。
在 Debian 裡要安裝套件只要一行指令即可。以 gcin 為例:
它會安裝列於 /etc/apt/sources.list 中可以找到的最高版本的套件,並把其相依套件全自動安裝進來。
不過您也可以指定要安裝的版本,例:
# 只安裝 testing 版的 gcin(以及 testing 版的相依套件)
apt-get -t testing install gcin
|
如果一個套件伺服器中同時提供了多個版本(這種情況比較常見於一些 Debian 非官方 Archiver),您也可以擇一安裝。例:
# apt-cache policy lilyterm
lilyterm:
已安裝:(無)
候選:0.9.7~pre8-1
版本列表:
0.9.7~pre8-1 0
500 ./ Packages
0.9.6-1 0
500 ./ Packages
# apt-get install lilyterm=0.9.6-1
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
下列【新】套件將會被安裝:
lilyterm
升級 0 個,新安裝 1 個,移除 0 個,有 1 個未被升級。
需要下載 0B/58.3kB 的套件檔。
此操作完成之後,會多佔用 176kB 的磁碟空間。 |
如果在安裝過程中若遇到像是 磁碟空間不足 或是 安裝到一半突然重開機 等等問題往往會導致安裝失敗。此時,可以下達以下指令:
來試著修復套件管理系統的資料庫。
apt-get install 會把下載中的 deb 檔放在 /var/cache/apt/archives/partial/ 這個暫存目錄裡,如果 apt-get 一直回報說下載到的 deb 檔的 md5 碼有誤,您可以試著刪除這個目錄裡的所有 deb 檔然後再進行下載,看看可否解決這個問題。
另
外,使用 apt-get 來安裝套件時,apt
會把這個套件標示為『手動安裝』,但其它因為相依性而被安裝進來的套件則會被為標示為『自動安裝』。這些被標示為『自動安裝』的套件可能在日後因新增移除
套件或因為相依性關係的改變而已不會再用到,此時它會被視為『無用套件』,您可以用 apt-get autoremove 來移除這些無用套件。
共用 deb 檔以節省硬碟空間
apt-get install 會把下載完成後的 deb 檔放在 /var/cache/apt/archives/ 這個目錄裡。如果您的網路中有數台 Debian 主機,或是您的主機裡同時運行著數個虛擬 Debian 系統,您可以使用 sshfs 或是 mount --bind 來共用這個目錄,如此就不用浪費時間和頻寬來重複下載那些 deb 檔了。
如果您重新安裝系統,建議您能保留這個目錄裡的檔案,然後在安裝完成後再放回去,如此可以有效節省重複下載那些 deb 檔的時間和頻寬。
刪除 deb 檔以節省硬碟空間
請定期執行以下指令來清理 /var/cache/apt/archives/ 目錄:
它會根據 dpkg 資料庫的內容清除無用的 deb 檔。比如說,在 /etc/apt/sources.list 裡已沒有任何的 Debian Archiver 提供 gcin 1.4.5~pre1-0~1 了,那麼下達 apt-get autoclean 就會把 gcin 1.4.5~pre1-0~1 的所有 deb 檔給刪除掉。
如果您的硬碟空間已經嚴重不足,您可以下達以下指令來清空 /var/cache/apt/archives/ 目錄:
不過日後如果您會用到那些 deb 檔的話,您將得重複再下載一次。
安裝單一套件檔
如果您下載到的是 *.deb 這種套件檔,您可以用 dpkg 指令直接把它安裝起來。例:
dpkg -i lilyterm_0.9.6-1_i386.deb
|
但因為用 dpkg 指令並不會自動把它的相依套件安裝進來,因此可能會導致安裝失敗。您必須再手動用 apt-get 把那些套件補齊來修復這個問題。
重新安裝單一套件:
最近在移除某些無用套件之後,發現系統竟損壞了:/usr/lib/libkrb5.so.3 不見了。後來查了一下,這個檔案原來是屬於 libkrb53 套件的,但改由 libk5crypto3 提供了,但我又用 apt-get autoremove 把 libk5crypto3 給移掉了,結果造成了系統損壞。
最簡單的修復方式就是用 apt-get 重新安裝這個套件:
apt-get install --reinstall libkrb53 |
aptitude 似乎並沒有在命令列上提供 --reinstall 指令。
重新設定套件
在套件安裝過程中,可能會需要您替套件設定某些功能或調整某些參數。如果您日後想要修改那些參數的話,像是重新產生 locale 資訊,請執行:
在重新設定套件的過程中,會忽略前文中的『提問等級』的設定,所有的問題都會出現並要求使用者回答。
查看/解開套件檔
有時候我們取得一個套件檔並不是為了要把它安裝到系統裡,我們可能只需要取得那個套件的一些資訊,或只是想要其中的某些檔案。
以 GCIN 為例,您可以使用以下指令來取得它的套件檔但不進行安裝:
它會把 gcin 下載到 /var/cache/apt/archives/ 裡。
然後,使用以下指令來把它的控制檔,像是 conffiles、control、md5sums、postinst、postrm、prerm 等等,解開至 /tmp/gcin:
dpkg -e /var/cache/apt/archives/gcin_1.4.0-1_i386.deb /tmp/gcin
|
或是使用以下指令來把它所包含的檔案解開至 /tmp/gcin:
dpkg -x /var/cache/apt/archives/gcin_1.4.0-1_i386.deb /tmp/gcin
|
若您使用的不是 Debian 系統的話,也可以使用 ar 指令將其解開成 control.tar.gz 及 data.tar.gz:
ar -x /var/cache/apt/archives/gcin_1.4.0-1_i386.deb
|
然後再用 tar/gzip 來解開這些檔案。
升級單一套件:
若您正使用著 testing,您可以使用以下指令將某個套件直接升級至 unstable:
apt-get -t unstable install pidgin
|
系統升級
您可以使用以下指令想讓整個系統以『較保守』的方式升級到最新的版本:
以上指令只會檢查系統上的原有套件是否有新的版本,並試著在不需新增或移除任何套件的狀況下升級這些套件。也就是說,若某個新版本套件會因為相依性的關係而必須新增/移除其它套件的話,apt-get upgrade 並不會升級這些套件。
同時,這個指令並不會同時升級在 Debian 中被標示為『essential』的套件,因為胡亂升級這些基本套件可能讓系統環境變得複雜並影響到系統的穩定度。
但如果您不在乎,或是想進行發行版之間的升級,像是由 Etch 升級到 Lenny,請使用以下指令:
它會計算系統裡的所有套件所有的相依性,並試著將其升級到最新版本。因此,您必須注意到它會新增或移除哪些套件,必要時可能得先 hold 住某些套件,或是在稍後再把那些被移掉的套件裝回來。
由於 Debian 的套件可以說是包山包海,因此只要善用 Debian 的套件管理機制,我們可以輕易得把系統上所有的軟體都永遠保持在最新版。這和 Win32 系統各自為政的軟體管理機制可以說有雲壤之別。
Debian 的套件管理系統可以讓您一路由 Woody → Sarge → Etch → Lenny 而不會遭遇到太大的困難,這可是非常了不起的一件事。
如果在以上指令的過程中發現有些套件無法順利升級,例:
# apt-get dist-upgrade
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
籌備升級中... 完成
下列套件將會維持其原有版本:
mplayer
升級 0 個,新安裝 0 個,移除 0 個,有 1 個未被升級。
|
您可以試著手動安裝這個套件,應該就能找到原因:
# apt-get install mplayer
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是
unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming 了。
以下的資訊或許有助於解決當前的情況:
下列的套件有未滿足的相依關係:
mplayer: 相依關係: libasound2 (> 1.0.18) 但 1.0.16-2 卻將被安裝
相依關係: libpulse0 (>= 0.9.14) 但 0.9.10-3 卻將被安裝
E: 損毀的套件
|
此時,可以試試其它方案來解決這個問題。像在上例中那些相依套件可能位於 unstable 裡,所以我們試著安裝 unstable 版的 mplayer:
# apt-get -t unstable install mplayer
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
以下套件是被自動安裝進來的,且已不再會被用到了:
libcap1
使用 'apt-get autoremove' 來將其移除。
下列的額外套件將被安裝:
libasound2 libdirectfb-1.2-0 libpulse0
建議套件:
libasound2-plugins pulseaudio mplayer-doc
下列【新】套件將會被安裝:
libdirectfb-1.2-0
下列套件將會被升級:
libasound2 libpulse0 mplayer
升級 3 個,新安裝 1 個,移除 0 個,有 110 個未被升級。
需要下載 6238kB/7378kB 的套件檔。
此操作完成之後,會多佔用 2552kB 的磁碟空間。
是否繼續進行 [Y/n]?
|
果然就解決問題了。
降級套件
若您升級了某個套件後,發現新版的套件有問題或不合用,是否能夠將套件降級呢?
在 Debian 裡要降級套件並不是不可能的,只是您可能得同時把所有的相關套件都降級才行。例如,要把 Pidgin 由 unstable 降級至 testing:
apt-get install pidgin/testing pidgin-data/testing libpurple0/testing |
只是有時因為相依性的關係,您必須可能同時降級多個套件才能成功。有時狀況太複雜時,像是由 X.org 降級回 XFree86,您可能在 apt-get 的降級作業完成後,還要手動修正或重新安裝某些套件才能讓系統恢復運作。不過所有套件的升級過程都被記錄於 /var/log/dpkg.log 裡,您應該可以從那裡找到哪些套件被升級或取代了,如此應該可以有助於降級作業順利進行。
保留套件版本
在把套件降級後,您可能不希望這個套件日後又會被 apt-get upgrade 給升級,方法是『保留 (hold)』這個套件。例如,在 stable/testing/unstable 的 tree 這個套件無法正確顯示中文目錄及檔案名稱,反而是 oldstable 的 tree 無此問題,所以您希望它能永遠保留為 oldstable 版本:
# apt-get install tree/oldstable
# echo "tree hold" | dpkg --set-selections
# dpkg -l tree
hi tree 1.5.0-2 displays directory tree, in color
|
而在日後,您可以使用以下指令來 unhold 套件:
echo "tree install" | dpkg --set-selections
|
或是用
apt-get --ignore-hold upgrade
|
讓 apt-get 在升級時同時也升級那些被 hold 住的套件。
另外,aptitude 則提供了方便的 hold 指令,您可以使用以下指令來 hold 套件:
而在日後,您可以使用以下指令來 unhold 套件:
不
過 dpkg 及 aptitude 的 hold 資料庫並不是共通的,也就是說,使用 apt-get 並不會理會被 aptitude 所
hold 的套件;但 aptitude 則不會升級被 dpkg 所 hold 的套件。這是在 hold 套件時所必須注意到的事項。
系統降級
在 Debian 裡想要把整個系統降級並不是件容易事 - 但如果您僅是混到了少數套件的話,或許可以試試看。
首先,先編輯 /etc/apt/preferences 檔如下:
Package: *
Pin: release a=stable
Pin-Priority: 1001 |
然後再執行:
即可。
顯示套件庫資訊
dpkg --status gcin
顯示 gcin 這個套件的詳盡狀況
dpkg -L gcin
顯示 gcin 這個套件所包含的檔案
dpkg -l
顯示系統已安裝的套件列表
dpkg -l gcin
顯示 gcin 這個套件的狀態及簡要說明
dpkg -S bin/pstree
搜尋 *bin/pstree* 這個檔案是屬於哪個套件。
而以上的內容則是取自 dpkg 的資料庫,所以也許和您的現行系統可能並不一致。比如說,某些套件可能會自行在 /etc 裡產生設定檔,而這些自行產生的設定檔應該不會登錄於 dpkg 資料庫裡,因此在移除該套件時很可能不會移除到這些檔案。
也就是說,即使是用 apt-get purge
來移除套件,在系統裡還是可能會留下一些垃圾檔案。如何確保能完全清除這些垃圾檔案其實應該是 Package Maintainer
所該注意的事,但大部份時候是談何容易,等到真要實作時,才會發現要考慮的因素實在太多,有時候真的是無法勉強,只好睜一隻眼閉一隻眼了。
移除套件
您可以使用以下指令來移除 gcin,但保留其設定檔:
註:gcin 的設定檔乃登記在 /var/lib/dpkg/info/gcin.conffiles 下。
您可以使用以下指令來檢查您的系統裡有哪些套件被 remove 了但其設定檔還留在系統之中:
或者,您想移除 gcin,同時也移除其設定檔:
但
apt-get remove 以及
apt-get purge 並不會替您自動移除掉那些因相依關係而自動安裝進來的套件。例如,安裝
lilyterm 的同時,應該會同時把
libvte9 及
libvte-common 這兩個套件安裝進來,但
apt-get purge lilyterm 並不會自動移除這兩個套件。取而代之的,您必須使用
apt-get autoremove 來移除這些無用的套件。例:
# apt-get purge lilyterm
下列套件將會被【移除】:
lilyterm*
是否繼續進行 [Y/n]?Y
正在移除 lilyterm ...
正在清除 lilyterm 的設定檔 ...
# apt-get autoremove
下列套件將會被【移除】:
libvte-common libvte9
是否繼續進行 [Y/n]?
|
從 Debian Lenny 開始,
apt-get 和
aptitude 的 autoremove 資料庫是共通的,但只有
apt-get 提供了命令列的 autoremove 指令。
如果系統會自動移除某個您不希望被移除的套件,您可以使用以下指令來設定某個套件並不是因為相依性才自動被安裝進來的:
apt-mark unmarkauto libvte9
|
那麼它就不會被
apt-get autoremove 所移除了。
取得原始碼
雖然 Debain 的套件管理主要是操作 deb 這類已編譯好的套件檔,但官方的 Debian Archiver 裡的所有套件同時都會附上原始碼,且這些原始碼會和 deb 檔放在同一個目錄之下。這種公開透明的作法是很讓人激賞的。
而在 Debian 中要取得套件的原始碼也出乎意料得簡單。首先,和 deb 類似的,您必須在 /etc/apt/sources.list 中加入
deb-src 項目,來指示 apt-get 如何取得原始碼。例:
# lenny
deb stable main contrib non-free
deb-src stable main contrib non-free |
然後,在進行 apt-get update 後,就可以使用 apt-get 直接取得放在 Debian Archiver 中的原始碼了。以 zsnes 為例:
一般下載回來的原始碼會包含以下檔案:
zsnes_1.510-2.2.dsc → 套件資訊及驗証碼
zsnes_1.510.orig.tar.gz → 原始碼
zsnes_1.510-2.2.diff.gz → 編譯套件所需的完整 debian 目錄
|
如果您有安裝 dpkg-dev 套件,在下載完成後 apt-get 還會自動替您解壓縮。您也可以自行手動解開那些 *.tar.gz 檔,或是在稍後安裝了 dpkg-dev 套件後,使用以下指令來解開套件:
dpkg-source -x zsnes_1.510-2.2.dsc |
但並不是所有的 deb 套件主機都會提供原始碼就是了。
準備套件編譯環境:
如果您想手動編譯編譯,建議您能依照 在 Debian GNU/Linux 裡建立 chroot 環境 裡的說明,使用 chroot 環境來編譯套件。
在 Debian 裡,已有方便的指令讓您能輕鬆得準備好某個套件的編譯環境。以 LilyTerm 為例:
apt-get build-dep lilyterm
|
apt-get 將會依據 lilyterm 套件所提供的編譯資訊自動把所有相關的套件全部安裝進來。(此時就是 Package Maintainer 的功力大考驗了)
但如果出現了以下錯誤訊息:
# apt-get build-dep lilyterm
E: 無法滿足套件 lilyterm 的編譯相依關係。
|
請試著以以下指令找出 LilyTerm 的相依套件:
apt-cache showsrc lilyterm | grep '^Build-Depends' |
並手動安裝這些套件,來找出這些套件無法安裝的原因。
重新編譯 deb 套件
若您想自行編譯這些套件,請在取得 deb 套件原始碼並準備好編譯環境後,進入套件的目錄裡,並下達以下指令:
dpkg-buildpackage -rfakeroot -us -uc |
就會開始編譯套件並生成 deb 檔了。
不過,建議您在編譯之前,能修改 debian/changelog 檔,並在原始版號後面加上 .foo,像是由 1:0.17.4-2 → 1:0.17.4-2.im,如此可以避免下次下達 apt-get upgrade 時,又將原始的 1:0.17.4-2 給裝了進來。apt-get 預設遇到相同版號時,會以列在 source.lists 裡的套件為優先。
而加上了 .foo 另一個優點是,若有新的版本出現時,如 1:0.17.4-3,它將會安裝更新後的版本。若您在 apt-get upgrade 時發現這個軟體有推出了新版本,您可能想要確認新的版本是不是已符合您的需求,或再重新編譯這個新版本,並在新版號後面再次加上 .foo,並待及下次版本更新。如此應該是比較合宜的做法。
自行編譯新版的 deb 套件
如果某個軟體推出了新版本,但卻未能及時進入 Debian Archiver 之中,您可能會希望自行編譯 deb 套件。但如何編譯新版的套件會是個不小的挑戰,以下為個人的作法:
首先,先取得 deb 套件原始碼:
然後,取得新版的 zsnes 的原始碼,並適當得更改目錄名稱及原始檔名以符合 Debian 套件的命名規則(否則 dpkg-buildpackage 會出現警告訊息…但因為只是警告訊息,所以其實不改也無所謂。感謝 caleb 的指正!):
wget
tar xvjf zsnes151bsrc.tar.bz2 |
並將原本 deb 套件原始碼中的 debian 目錄複製到新版本的目錄裡:
cp -a zsnes-1.510/debian/ zsnes_1_51b
|
然後,進入套件的目錄,並修改 debian/changelog 以反應新版本的變化:
或
在此建議在 debian/changelog 裡使用像是 1.510+b-0~1 之類的版本號碼,那麼在該新版(Debian 可能會用 1.510+b-1 這個版本號碼)進入 Debian 時,就可以利用 apt-get 直接升級為 Debian 官方的版本了。
接下來,依據新版本的變化修改 debian 目錄裡的檔案,而這可不是件容易事。
完成後,下達以下指令,就應該能產生新的 deb 套件了:
dpkg-buildpackage -rfakeroot -us -uc
|
當然,過程肯定不會如此輕鬆寫意,您必須對如何打包 deb 套件有一定的認識才能讓以上過程更容易些。但其實大部份套件在版本間的變化不會太過劇烈,以上步驟的成功機率其實蠻高的。
自行編譯 deb 套件懶人法
如果您對於如何打包 deb 套件一無所知,但您又不希望使用 ./configure; make; make install 來安裝軟體,Debian 也提供了一個 deb 套件懶人法。
以 為例,您按照其網站上的說明,安裝了 libvte-dev、autoconf、automake、gettext、libxml-parser-perl 及 intltool 等套件,並執行 ./autogen.sh 來產生 configure 檔案,並進行編譯。然後不要下達 make install,取而代之的是執行 checkinstall 指令:
bash ./autogen.sh
./configure --prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/etc
make
checkinstall
|
在回答幾個問題後,不一會兒一個懶人版的 lilyterm_0.9.7-1_i386.deb 就會出現了。這個作法雖然不盡完美,但實在十分的方便,您或許想要嘗試看看。
自行編譯 Linux Kernel
如果您想要自行編譯 Linux Kernel,Debain 也提供了極便利的作法。
首先,就如同一般編譯 Linux Kernel 的做法,您得先取得 Linux Kernel 的原始碼,然後解壓縮。當然,您可以去 Linux Kernel 官方站台下載;但在 Debian 裡也提供了個方便的方法:
apt-get install linux-source-2.6.29
|
它會把 Linux Kernel 放在 /usr/src 裡。
接下來,依您的需求套用像 L7-filter 或是 reiser4 之類的 patch,在此就不贅述了。
然後,進入 Linux Kernel 的原始碼目錄裡,下達:
來指定 Kernel 的編譯項目。Debian Kernel 的官方 config 可於 /boot 下找到。
在設定完成後,下達:
make-kpkg
--config oldconfig --rootcmd fakeroot --uc --us --initrd kernel_image
modules_image |
就會開始編譯 Kernel 的 deb 檔了。依您的編譯選項及機器等級,有時得需數個小時才能完成編譯工作。
自行編譯 Kernel Module
Debian 對於如何編譯 Kernel Module 也提供了很方便的作法:利用 module-assistant。
首先,安裝 module-assistant 套件:
apt-get install module-assistant |
然後,準備好 module-assistant 編譯環境:(註:module-assistant 有個命令縮寫:m-a)
然後,試著找出 module-assistant 所使用的模組名稱:
# module-assistant search nvidia
nvidia-kernel-source (source package not installed):
-- Binary package(s) for kernel(s):
+ (2.6.26-1-vserver-686):
|
接下來,指定 module-assistant 編譯該套件即可:
# module-assistant auto-build nvidia-kernel-source
Extracting the package tarball, /usr/src/nvidia-kernel.tar.bz2, please wait...
Done with /usr/src/nvidia-kernel-2.6.26-1-vserver-686_173.14.09-5+2.6.26-13_i386.deb .
|
以上命令也可以縮寫成:
# m-a a-b nvidia-kernel-source |
之後安裝那個由 module-assistant 所生成的 deb 套件就大功告成了。
如果您不是使用 chroot 環境來編譯模組的話,您或許想使用以下指令:
# module-assistant auto-install nvidia-kernel-source |
或是縮寫:
# m-a a-i nvidia-kernel-source |
它會自動編譯 deb 套件,並在編譯完成後,自動安裝該 deb 套件,並一併把所有相依套件都自動裝進來。
不過以上作法僅可用於 Debian 有提供的 *-source 套件。至於 Debian 沒有提供的套件,請參考上文中的 make-kpkg 及 checkinstall 吧!
系統預設指令
有些指令,像是 visudo 或是 crontab -e,它們會呼叫『預設文字編輯器』來編輯設定檔。
在 Debian 裡,使用了一套『替代指令』來讓使用者可以方便的指定這些系統的預設指令。例如,您想指定要將哪個指令做為預設文字編輯器:
update-alternatives --config editor
|
或是要指定系統的預設 Window Manager:
update-alternatives --config x-window-manager
|
或是要指定系統的預設 X Terminal Emulator:
update-alternatives --config x-terminal-emulator
|
或是重設系統的所有預設指令:
update-alternatives --all
|
而哪些套件可當做系統預設指令基本上是由套件的維護者指定的,不過您也可以手動設定。請參考 update-alternatives 的說明文件以取得更多的資訊。
錯誤回報
當然,Debian 絕非盡善盡美的系統。如果您發現了 Debian 套件裡的任何錯誤,或是希望 Debian 套件提供什麼功能時,您可以利用 reportbug 向 (BTS) 回報。例如,向 gcin 的 Debian Package Maintainer 回報錯誤:
您可以在 ~/.reportbugrc 中設定您的名字及 E-mail 帳號:
realname "Tetralet"
email "tetralet@gmail.com"
|
一般而言,您還必須同時設定您的 SMTP Server。以 GMAIL 為例:
smtphost smtp.gmail.com:587
smtpuser tetralet@gmail.com
smtppasswd XXX
smtptls |
另外,像是 Debian Package 的翻譯檔也都可以利用 BTS 來提交。個人認為,Debian 的錯誤回報系統正是 Debian 如此與眾不同的主因之一,它的確有助於提昇 Debian 套件的品質。
不過,相反的,因為有了 BTS 這套錯誤回報系統,Debian 的 Package Maintainer
常常會為了修正某些比較罕見的問題而打上一些未經過完整測試的修正檔,這有時會讓 Debian 的套件和其它 Linux
發行版比起來是過於激進了,有時候甚至會造成不小的問題,像之前的 SSH 事件便是一例。
以上所列出的僅是敝人常用的 DPKG/APT 指令,至於其它的指令及參數請參閱各指令的說明文件,在此卓實無法一一列出。
Debian 提供了很強大的套件管理機制,對於一般的使用者而言,只要熟習幾個指令並按照 Debian
的規則走,它是很方便很容易上手的;對於熟習於 Debian 套件管理機制的人,有時要轉換到其它系統去還會適應不良呢!
但相對的,對於已熟習於其它系統的進階使用者或是套件維護者而言,Debian
的套件管理規則就顯得過於複雜且艱澀,也難怪有人在抱怨某些 Debian 套件包得實在不怎麼樣 - 因為 Debian
的規則實在多到讓人很難消化。不過,只要熟悉以上操作,基本上 Debian 的套件系統是很強大很穩定的;就算套件若真有什麼問題,透過 Debian 的 BTS 系統大部份應該都能有效解決;再加上 Debian
的使用者眾多,只要有任何問題大多都會在短期間被發掘出來,也因此 Debian
系統的品質一直是在水準之上的。個人認為,不管對於初學者或進階使用者而言,Debian 絕對是一個很不錯的選擇。
咦?aptitude 呢?
個人在使用上,發現
apt 除了在要 hold 套件時沒有比較直覺的指令外,其它的地方都比
aptitude 好用多了。(也許是我不熟悉
aptitude 啦!);反正系統中只需一組套件管理程式就夠了,所以,我安裝好系統的第一件事,就是把
aptutide 給 purge 掉:
apt-get purge aptitude tasksel tasksel-data |
嗯,還是單純的命令列比較好用呀! XD
阅读(971) | 评论(0) | 转发(0) |