今天的 Tetralet 又在唧唧喳喳了



« 四月 2017 »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30






 

DPKG/APT 常用指令 (上)

Tetralet | 02 五月, 2009 07:57

在剛接觸 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

就會自動替您把系統裡的所有套件升級到最新的版本。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 符合 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 的設定,必要時可加以修改。以下為個人的 /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 "http://192.168.1.254:3128";
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 官方所發行的套件,包含了 lennysecuritysqueezesidexperimental

# 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

其語法說明如下:

deb  
http://ftp.tw.debian.org/debian   stable
  main contrib non-free
套件
主機路徑

版本

授權分類
deb 開頭的是『deb 套件檔』,而以 deb-src 開頭的是『原始碼』。
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 ./

Debian 在安裝套件時,會取用這個列表裡版本最高的套件,因此您可能會安裝到 unstable 甚至是 experimental 版的套件,這當然不是最好的做法。因此建議您能設定好 /etc/apt/apt.conf,讓 apt-get 預設是安裝 stable 或 testing 的套件。

更新套件來源:(/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
來取得這些 Key 的列表。或使用:
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
您可以用以下指令把 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 <joshk@triplehelix.org>
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 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

來得知 Debian 替某個套件提供了哪些版本,這可以做為安裝或升級套件時的依據。

提問等級:

在安裝套件的過程中,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

如果一個套件伺服器中同時提供了多個版本(這種情況比較常見於一些 Debian 非官方 Archiver),您也可以擇一安裝。例:
# 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
它會根據 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/ 目錄:
apt-get clean
不過日後如果您會用到那些 deb 檔的話,您將得重複再下載一次。

安裝單一套件檔

如果您下載到的是 *.deb 這種套件檔,您可以用 dpkg 指令直接把它安裝起來。例:

dpkg -i lilyterm_0.9.6-1_i386.deb
但因為用 dpkg 指令並不會自動把它的相依套件安裝進來,因此可能會導致安裝失敗。您必須再手動用 apt-get 把那些套件補齊來修復這個問題。

重新安裝單一套件:

最近在移除某些無用套件之後,發現系統竟損壞了:/usr/lib/libkrb5.so.3 不見了。後來查了一下,這個檔案原來是屬於 libkrb53 套件的,但改由 libk5crypto3 提供了,但我又用 apt-get autoremovelibk5crypto3 給移掉了,結果造成了系統損壞。

最簡單的修復方式就是用 apt-get 重新安裝這個套件:

apt-get install --reinstall libkrb53
aptitude 也有一個類似的 reinstall 指令提供了相同的功能(感謝 zerng07 指正!)。

重新設定套件

在套件安裝過程中,可能會需要您替套件設定某些功能或調整某些參數。如果您日後想要修改那些參數的話,像是重新產生 locale 資訊,請執行:

dpkg-reconfigure locales
在重新設定套件的過程中,會忽略前文中的『提問等級』的設定,所有的問題都會出現並要求使用者回答。

查看/解開套件檔

有時候我們取得一個套件檔並不是為了要把它安裝到系統裡,我們可能只需要取得那個套件的一些資訊,或只是想要其中的某些檔案。

以 GCIN 為例,您可以使用以下指令來取得它的套件檔但不進行安裝:
apt-get -d install 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.gzdata.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
以上指令只會檢查系統上的原有套件是否有新的版本,並試著在不需新增或移除任何套件的狀況下升級這些套件。也就是說,若某個新版本套件會因為相依性的關係而必須新增/移除其它套件的話,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: 損毀的套件

此時,可以試試其它方案來解決這個問題。像在上例中那些相依套件可能位於 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 套件:
aptitude hold tree
而在日後,您可以使用以下指令來 unhold 套件:
aptitude unhold tree
不 過 dpkgaptitude 的 hold 資料庫並不是共通的,也就是說,使用 apt-get 並不會理會被 aptitude 所 hold 的套件;但 aptitude不會升級被 dpkg 所 hold 的套件。這是在 hold 套件時所必須注意到的事項。

系統降級

在 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
註:gcin 的設定檔乃登記在 /var/lib/dpkg/info/gcin.conffiles 下。
您可以使用以下指令來檢查您的系統裡有哪些套件被 remove 了但其設定檔還留在系統之中:
dpkg -l | grep "^rc"
或者,您想移除 gcin,同時也移除其設定檔:
apt-get purge gcin
apt-get remove 以及 apt-get purge 並不會替您自動移除掉那些因相依關係而自動安裝進來的套件。例如,安裝 lilyterm 的同時,應該會同時把 libvte9libvte-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-getaptitude 的 autoremove 資料庫是共通的,但只有 apt-get 提供了命令列的 autoremove 指令。

如果系統會自動移除某個您不希望被移除的套件,您可以使用以下指令來設定某個套件並不是因為相依性才自動被安裝進來的:
apt-mark unmarkauto libvte9
那麼它就不會被 apt-get autoremove 所移除了。

(待續…)

迴響

Re: DPKG/APT 常用指令 (上)

「aptitude 似乎並沒有在命令列上提供 --reinstall 指令。」

只要

aptitude reinstall XXOO

即可。

[回應] zerng07 @ 04/05/2009, 21:30

Re: zerng07

原來還有這一招... 感謝指正!

[回應] Tetralet @ 05/05/2009, 18:09

谢谢 资料很详细

谢谢 资料很详细

[回應] 网友 @ 08/05/2009, 16:48

系統降級

最近有降級過,補充一點:
設定 /etc/apt/preferences 之後,不能設定 /etc/apt/apt.conf ,
就算設定目標版本為 Default-release 也不行,系統並不會降級。

[回應] Howard @ 16/05/2009, 02:21

Re: Howard

喔!我會將您所提供的資料補回到原文中的。謝謝您的意見!

[回應] Tetralet @ 16/05/2009, 10:32

Re: DPKG/APT 常用指令 (上)

debian-multimedia的mirror也在台湾〜。
http://www.debian-multimedia.org/debian-m.php
日本からも利用させてもらってます。

deb http://ftp.tw.debian.org/debian-multimedia/ stable main
deb-src http://ftp.tw.debian.org/debian-multimedia/ stable main
#deb http://ftp.tw.debian.org/debian-multimedia/ testing main
#deb-src http://ftp.tw.debian.org/debian-multimedia/ testing main
#deb http://ftp.tw.debian.org/debian-multimedia/ unstable main
#deb-src http://ftp.tw.debian.org/debian-multimedia/ unstable main
#deb http://ftp.tw.debian.org/debian-multimedia/ experimental main
#deb-src http://ftp.tw.debian.org/debian-multimedia/ experimental main

[回應] 山さん @ 24/09/2009, 20:40

authimage
驗證碼皆為英文大寫字母
僅輸入前4碼即可。後2碼是假的,欺敵用。
這是為了防制 Spam 而設計的。若造成您的不便還請見諒!
Accessible and Valid XHTML 1.0 Strict and CSS
Powered by LifeType - Design by BalearWeb