DPKG/APT 常用指令
时间:2009-05-04 来源:keelort
在剛接觸 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 裡,當然不會要您一個一個手動去安裝這上百個套件,只要下達如下的指令:
apt-get install gimp |
就可以輕鬆得把 GIMP 以及所有相依套件給全部安裝進來了。而若日後 GIMP 或其它套件有推出任何新的版本,您只要下達:
apt-get update apt-get upgrade |
也因為 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 年。之後便讓這個版本走入歷史。 |
代碼:
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 | 符合 Debian Free Software Guidelines (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-config dump |
// 主要採用哪一個版本的套件。 // 比如說,如果您使用 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 "http://192.168.1.254:3128"; |
套件來源:(/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 http://ftp.tw.debian.org/debian stable main contrib non-free deb-src http://ftp.tw.debian.org/debian 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 http://ftp.tw.debian.org/debian testing main contrib non-free deb-src http://ftp.tw.debian.org/debian testing main contrib non-free # sid (unstable) deb http://ftp.tw.debian.org/debian unstable main contrib non-free deb-src http://ftp.tw.debian.org/debian unstable main contrib non-free # experimental deb http://ftp.tw.debian.org/debian/ ../project/experimental main contrib non-free deb-src http://ftp.tw.debian.org/debian/ ../project/experimental main contrib non-free |
其語法說明如下:
|
http://ftp.tw.debian.org/debian 則是該主機的『路徑』。
stable 是『版本』,在此也可以用 lenny 來替代。
而 main contrib non-free 指的是『授權分類』。若您不想使用 contrib/non-free 裡的套件,您可以在此把 contrib non-free 移去僅留下 main 即可。
而您也可以使用其它 Debian 非官方所發行的套件,例:
# mplayer deb http://www.debian-multimedia.org sid main deb-src http://www.debian-multimedia.org sid main # wine deb http://www.lamaresh.net/apt lenny main # luna deb http://debian.luna.com.tw/debian ./ deb-src http://debian.luna.com.tw/debian ./ |
更新套件來源:(/var/lib/apt/lists/)
在設定好套件來源之後,接下來就下達:
apt-get update |
來取得或更新套件列表,這些列表檔將會被下載到 /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 的過程中應該會自動安裝這個套件。您可以用:apt-key list |
apt-key update |
來更新這些 Key。當然,debian-archive-keyring 套件也會隨著 apt-get upgrade 更新。
您也可以自行加上其它非 Debian 官方的 Archiver 的電子簽章(風險自負!)。以著名的 debian-multimedia.org 為例,如果您有使用該站台的套件的話,您在 apt-get update 的過程中應該會得到如下的警告訊息:
W: GPG error: http://www.debian-multimedia.org sid Release: 由於無法取得它們的公鑰,無法驗證以下簽章: NO_PUBKEY 07DC563D1F41B907 |
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-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 字型 |
# 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 show zsnes Package: zsnes Priority: optional Section: otherosfs Installed-Size: 4060 Maintainer: Joshua Kwan <[email protected]> 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 |
可取得版本:
我們可以利用以下指令:
# apt-cache policy pidgin pidgin: 已安裝:2.5.4-2 候選:2.5.4-2 版本列表: 2.5.5-1 0 500 http://ftp.tw.debian.org sid/main Packages *** 2.5.4-2 0 990 http://ftp.tw.debian.org squeeze/main Packages 100 /var/lib/dpkg/status 2.4.3-4 0 500 http://ftp.tw.debian.org lenny/main Packages |
提問等級:
在安裝套件的過程中,dpkg 可能會要求您輸入一些資訊來設定套件,像安裝 samba 時就會要求您輸入您的工作群組的名稱,否則 samba 無法正確運作。但有些瑣碎的設定其實用預設值就可以了,實在沒必要不斷操煩使用者。因此 dpkg 設定了個『提問等級』,唯有高於這個提問等級的問題才會在安裝套件的過程中出現。您可以使用以下指令:
dpkg-reconfigure debconf |
安裝套件:
接下來就是重頭戲,安裝套件了。在 Debian 裡要安裝套件只要一行指令即可。以 gcin 為例:
apt-get install gcin |
它會安裝列於 /etc/apt/sources.list 中可以找到的最高版本的套件,並把其相依套件全自動安裝進來。
不過您也可以指定要安裝的版本,例:
# 只安裝 testing 版的 gcin(以及 testing 版的相依套件) apt-get -t testing install gcin |
# apt-cache policy lilyterm lilyterm: 已安裝:(無) 候選:0.9.7~pre8-1 版本列表: 0.9.7~pre8-1 0 500 http://debian.luna.com.tw ./ Packages 0.9.6-1 0 500 http://debian.luna.com.tw ./ Packages # apt-get install lilyterm=0.9.6-1 正在讀取套件清單... 完成 正在重建相依關係 正在讀取狀態資料... 完成 下列【新】套件將會被安裝: lilyterm 升級 0 個,新安裝 1 個,移除 0 個,有 1 個未被升級。 需要下載 0B/58.3kB 的套件檔。 此操作完成之後,會多佔用 176kB 的磁碟空間。 |
apt-get -f install |
來試著修復套件管理系統的資料庫。
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/ 目錄:
apt-get autoclean |
如果您的硬碟空間已經嚴重不足,您可以下達以下指令來清空 /var/cache/apt/archives/ 目錄:
apt-get clean |
安裝單一套件檔
如果您下載到的是 *.deb 這種套件檔,您可以用 dpkg 指令直接把它安裝起來。例:
dpkg -i lilyterm_0.9.6-1_i386.deb |
重新安裝單一套件:
最近在移除某些無用套件之後,發現系統竟損壞了:/usr/lib/libkrb5.so.3 不見了。後來查了一下,這個檔案原來是屬於 libkrb53 套件的,但改由 libk5crypto3 提供了,但我又用 apt-get autoremove 把 libk5crypto3 給移掉了,結果造成了系統損壞。
最簡單的修復方式就是用 apt-get 重新安裝這個套件:
apt-get install --reinstall libkrb53 |
重新設定套件
在套件安裝過程中,可能會需要您替套件設定某些功能或調整某些參數。如果您日後想要修改那些參數的話,像是重新產生 locale 資訊,請執行:
dpkg-reconfigure locales |
查看/解開套件檔
有時候我們取得一個套件檔並不是為了要把它安裝到系統裡,我們可能只需要取得那個套件的一些資訊,或只是想要其中的某些檔案。以 GCIN 為例,您可以使用以下指令來取得它的套件檔但不進行安裝:
apt-get -d install gcin |
然後,使用以下指令來把它的控制檔,像是 conffiles、control、md5sums、postinst、postrm、prerm 等等,解開至 /tmp/gcin:
dpkg -e /var/cache/apt/archives/gcin_1.4.0-1_i386.deb /tmp/gcin |
dpkg -x /var/cache/apt/archives/gcin_1.4.0-1_i386.deb /tmp/gcin |
ar -x /var/cache/apt/archives/gcin_1.4.0-1_i386.deb |
升級單一套件:
若您正使用著 testing,您可以使用以下指令將某個套件直接升級至 unstable:
apt-get -t unstable install pidgin |
系統升級
您可以使用以下指令想讓整個系統以『較保守』的方式升級到最新的版本:
apt-get upgrade |
同時,這個指令並不會同時升級在 Debian 中被標示為『essential』的套件,因為胡亂升級這些基本套件可能讓系統環境變得複雜並影響到系統的穩定度。
但如果您不在乎,或是想進行發行版之間的升級,像是由 Etch 升級到 Lenny,請使用以下指令:
apt-get dist-upgrade |
它會計算系統裡的所有套件所有的相依性,並試著將其升級到最新版本。因此,您必須注意到它會新增或移除哪些套件,必要時可能得先 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: 損毀的套件 |
# 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 |
保留套件版本
在把套件降級後,您可能不希望這個套件日後又會被 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 |
echo "tree install" | dpkg --set-selections |
或是用
apt-get --ignore-hold upgrade |
另外,aptitude 則提供了方便的 hold 指令,您可以使用以下指令來 hold 套件:
aptitude hold tree |
aptitude unhold tree |
系統降級
在 Debian 裡想要把整個系統降級並不是件容易事 - 但如果您僅是混到了少數套件的話,或許可以試試看。首先,先編輯 /etc/apt/preferences 檔如下:
Package: * Pin: release a=stable Pin-Priority: 1001 |
apt-get upgrade |
顯示套件庫資訊
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,但保留其設定檔:
apt-get remove gcin |
您可以使用以下指令來檢查您的系統裡有哪些套件被 remove 了但其設定檔還留在系統之中:
dpkg -l | grep "^rc" |
apt-get purge gcin |
# apt-get purge lilyterm 下列套件將會被【移除】: lilyterm* 是否繼續進行 [Y/n]?Y 正在移除 lilyterm ... 正在清除 lilyterm 的設定檔 ... # apt-get autoremove 下列套件將會被【移除】: libvte-common libvte9 是否繼續進行 [Y/n]? |
如果系統會自動移除某個您不希望被移除的套件,您可以使用以下指令來設定某個套件並不是因為相依性才自動被安裝進來的:
apt-mark unmarkauto libvte9 |
取得原始碼
雖然 Debain 的套件管理主要是操作 deb 這類已編譯好的套件檔,但官方的 Debian Archiver 裡的所有套件同時都會附上原始碼,且這些原始碼會和 deb 檔放在同一個目錄之下。這種公開透明的作法是很讓人激賞的。
而在 Debian 中要取得套件的原始碼也出乎意料得簡單。首先,和 deb 類似的,您必須在 /etc/apt/sources.list 中加入 deb-src 項目,來指示 apt-get 如何取得原始碼。例:
# lenny deb http://ftp.tw.debian.org/debian stable main contrib non-free deb-src http://ftp.tw.debian.org/debian stable main contrib non-free |
apt-get source zsnes |
zsnes_1.510-2.2.dsc → 套件資訊及驗証碼 zsnes_1.510.orig.tar.gz → 原始碼 zsnes_1.510-2.2.diff.gz → 編譯套件所需的完整 debian 目錄 |
dpkg-source -x zsnes_1.510-2.2.dsc |
準備套件編譯環境:
如果您想手動編譯編譯,建議您能依照 在 Debian GNU/Linux 裡建立 chroot 環境 裡的說明,使用 chroot 環境來編譯套件。在 Debian 裡,已有方便的指令讓您能輕鬆得準備好某個套件的編譯環境。以 LilyTerm 為例:
apt-get build-dep lilyterm |
apt-get 將會依據 lilyterm 套件所提供的編譯資訊自動把所有相關的套件全部安裝進來。(此時就是 Package Maintainer 的功力大考驗了)
但如果出現了以下錯誤訊息:
# apt-get build-dep lilyterm E: 無法滿足套件 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 套件原始碼:
apt-get source zsnes |
wget http://zsnes.sf.net/zsnes151bsrc.tar.bz2 tar xvjf zsnes151bsrc.tar.bz2 |
cp -a zsnes-1.510/debian/ zsnes_1_51b |
vi debian/changelog |
dch -i |
在此建議在 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 套件一無所知,但您又不希望使用 ./configure; make; make install 來安裝軟體,Debian 也提供了一個 deb 套件懶人法。以 LilyTerm 為例,您按照其網站上的說明,安裝了 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 |
自行編譯 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 的原始碼目錄裡,下達:
make menuconfig |
來指定 Kernel 的編譯項目。Debian Kernel 的官方 config 可於 /boot 下找到。
在設定完成後,下達:
make-kpkg --config oldconfig --rootcmd fakeroot --uc --us --initrd kernel_image modules_image |
自行編譯 Kernel Module
Debian 對於如何編譯 Kernel Module 也提供了很方便的作法:利用 module-assistant。首先,安裝 module-assistant 套件:
apt-get install module-assistant |
module-assistant prepare |
# 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 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 |
如果您不是使用 chroot 環境來編譯模組的話,您或許想使用以下指令:
# module-assistant auto-install nvidia-kernel-source |
# m-a a-i nvidia-kernel-source |
不過以上作法僅可用於 Debian 有提供的 *-source 套件。至於 Debian 沒有提供的套件,請參考上文中的 make-kpkg 及 checkinstall 吧!
系統預設指令
有些指令,像是 visudo 或是 crontab -e,它們會呼叫『預設文字編輯器』來編輯設定檔。
在 Debian 裡,使用了一套『替代指令』來讓使用者可以方便的指定這些系統的預設指令。例如,您想指定要將哪個指令做為預設文字編輯器:
update-alternatives --config editor |
update-alternatives --config x-window-manager |
update-alternatives --config x-terminal-emulator |
update-alternatives --all |
錯誤回報
當然,Debian 絕非盡善盡美的系統。如果您發現了 Debian 套件裡的任何錯誤,或是希望 Debian 套件提供什麼功能時,您可以利用 reportbug 向 Debian bug tracking system (BTS) 回報。例如,向 gcin 的 Debian Package Maintainer 回報錯誤:
reportbug gcin |
您可以在 ~/.reportbugrc 中設定您的名字及 E-mail 帳號:
realname "Tetralet" email "[email protected]" |
smtphost smtp.gmail.com:587 smtpuser [email protected] smtppasswd XXX smtptls |
不過,相反的,因為有了 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 |