UbuntuManual:Ubuntu 軟件包管理

出自Ubuntu中文

序言 Ubuntu 基礎 Ubuntu 系統安裝提示 Ubuntu指南
發行版升級 Ubuntu 軟件包管理 Ubuntu下的 Linux 內核 Ubuntu 小技巧
Ubuntu 系統微調 網絡設置 編輯器 版本控制系統
編程 GnuPG Ubuntu 技術支持 附錄

目錄

[編輯] 第 6 章 - Ubuntu 軟件包管理

高級包管理工具 aptitude 是目前首選的字符界面的 APT 前端程序。 它會記住哪些包是你安裝的,哪些是為了滿足依賴關係而安裝的;在不被已安裝包需要的情況下aptitude 會自動卸載後者。它內建一套高級的包過濾器,但是比較難上手。

synaptic 是目前首選的基於 GTK 的圖形化 APT 前端程序。它的包過濾器比 aptitude 的好用多了。它包含了對 Debian Package Tags 的實驗性支持。

為了減少 Ubuntu 倉庫的網絡負擔和加快你下載的速度,你應該從 Ubuntu 鏡像下載。

如果你需要在你本地網絡的許多台機器上安裝相同的包。在使用 APT 下載包的時候,請考慮使用 squid 來設置本地 HTTP 代理。必要的話,可以設置環境變量 http_proxy 或者在 /etc/apt/apt.conf 裏面設置 http 的值。

儘管 apt_preferences(5) 中描述的 APT 的 pinning 功能非常強大,但造成的影響是難以察覺和管理的。你應該把它作為一個高級功能來看待。

在 chroot, 第 8.6.35 節 中描述的使用方法非常適合於需要同時確保系統的穩定性和使用最新軟件的情況。


[編輯] 介紹

如果你沒有精力閱讀完所有的開發者文檔,那麼先看看本章的內容,然後開始體驗 Ubuntu 的威力吧:-)

[編輯] 主要的包管理工具

dpkg      – Debian 包安装工具
apt-get   – APT 的命令行前端
aptitude  – APT 的高级的字符和命令行前端
synaptic  – 图形界面的 APT 前端
dselect   – 使用菜单界面的包管理工具
tasksel   – Task 安装工具

這些工具不是用來取代對方的,比如 dselect 同時使用 APT 和 dpkg。

APT 使用 /var/lib/apt/lists/* 來跟蹤可用的軟件包,而 dpkg 使用的是 /var/lib/dpkg/available。如果你使用了 aptitude 或者其他 APT 前端來安裝軟件包,同時你希望使用 dselect 來安裝軟件包,請不要忘記使用 dselect 菜單上的 [U]pdate (或者運行"dselect update") 來更新 /var/lib/dpkg/available。

在處理依賴關係上 apt-get 會自動下載安裝依賴的軟件包,但是不會處理所安裝軟件推薦的或者建議的軟件包。

相反 aptitude 可以設置成安裝所安裝軟件推薦的或者建議的軟件包。

dselect 給使用者列出所安裝軟件推薦或建議的軟件包,可以進行單獨選擇。 參閱 軟件包依賴關係, 第 2.2.8 節.

[編輯] 方便的工具

dpkg-reconfigure  - 重新配置已安装的软件包
                (如果它是使用 debconf 进行配置的)
dpkg-source       - 管理源码包
dpkg-buildpackage - 自动生成包文件
apt-cache         - 在本地缓冲区检查包文件

[編輯] Ubuntu 軟件包管理基礎

[編輯] 設置 APT

參考 準備升級工作, 第 5.2 節 來設置 sources.list。 請參考 Ubuntu 系統安裝提示, 第 3 章, 發行版升級到 Breezy、Dapper 或 Edgy, 第 5 章, 和 應急的編輯器, 第 11.2 節.

[編輯] 安裝 tasks

你可以安裝一些軟件包集合,這些集合是由使 Ubuntu 系統滿足某些特定用途的典型軟件包組成的。 這些集合被稱為“tasks”。

在初始化安裝中,安裝 tasks 最簡單的方法就是使用 tasksel。 注意在使用之前,你需要運行

dselect update

建議使用 aptitude 來安裝 tasks。 它能讓你在選擇好 tasks 並準備安裝之前,刪除 tasks 中的某些軟件包。

[編輯] aptitude

aptitude 是全新的可菜單操作的包安裝工具,和 dselect 類似,但是是針對 APT 從頭設計的。從大多數參數來講,aptitude 完全可以作為 apt-get 的一個兼容的代替品。 參閱 aptitude(1) 和 /usr/share/doc/aptitude/README.

一旦開始使用 aptitude,你最好繼續使用它,而不是選擇其他替代工具。否則你將失去 aptitude 包存的軟件安裝清單,你就不能享受自動刪除多餘軟件包的功能了。

全屏狀態下 aptitude 接受單鍵的命令,大多數是小寫的。主要的幾個功能鍵如下:

按键	    动作
F10         菜单
?           按键命令帮助(完整的清单)
u           更新软件包信息
+           标记软件包为升级或者新安装
-           标记软件包为删除(保留配置文件)
_           标记软件包为完全删除(删除配置文件)
===           保持软件包的当前版本,阻止其被升级
U           标记所有可以升级的软件包为升级
g           下载和安装选择的软件包
q           退出当前屏幕,保存改变
x           退出当前屏幕,忽略改变
Enter       查看一个软件包的信息
C           查看一个软件包的更新日志
l           改变软件包树状显示限制
/           搜索第一个匹配的软件包
\           重复最后一次搜索

和 apt-get 一樣, aptitude 安裝軟件包的時候自動解決依賴問題。 aptitude 還能安裝即將安裝的軟件包推薦或者建議的軟件包。你通過 F10 -> 選項 -> 處理依賴關係 在菜單上更改這一默認設置。

aptitude 的其他特點如下:

  • aptitude 能訪問所有版本的軟件包。
  • aptitude 的動作記錄在 /var/log/aptitude。
  • aptitude 能輕鬆的追蹤陳舊的和本地建立的軟件包,並在“過期的和在本地創建的軟件包”上列出。
  • aptitude 內建強大的包搜索和顯示功能。熟悉 mutt 的用戶很容易上手,因為這個顯示方法的靈感來源於 mutt。 參閱 /usr/share/doc/aptitude/README 中的 “SEARCHING, LIMITING, AND EXPRESSIONS”
  • aptitude 在全屏狀態下有嵌入的 su 功能。普通用戶都可以執行,直到安裝或刪除軟件的時候再取得管理員權限。

[編輯] dselect

dselect 一直是主要的包維護工具。你可以考慮用 aptitude 代替。

當你啟動程序的時候,dselect 會自動選擇所有“Required”“Important”和“Standard”的包。

dselect 的用戶界面是有些奇怪,但是大部分人已經習慣了。 它有四個主要命令: (指令都是大寫的!):

按键	    动作
Q           退出。确认当前的选择并退出。 
(忽略依赖关系)
R           撤销! 我不是那个意思。
D           不管他!我不管你 dselect 怎么想的,照做就好了!
U           都照建议的来做

使用 D 和 Q,你可以選擇有衝突的選項。請小心使用這個命令。

在 /etc/dpkg/dselect.cfg 中加上一行“expert”來減少干擾。

如果你的機器運行 dselect 的速度很慢,你可以考慮在速度快一點的機器上運行 dselect,確定你要安裝的軟件包之後,在慢的機器上通過 apt-get 來安裝它們。

[編輯] 使用 APT 來維護髮行版本

請編輯 /etc/apt/preferences 並加入以下內容來維持系統為 dapper 版本:

Package: *
Pin: release a=edgy
Pin-Priority: 800

Package: *
Pin: release a=dapper
Pin-Priority: 600

更多複雜的例子請參考 apt_preferences(5),可以讓您做更多的事情,例如安裝 edgy 的軟件包的同時還能把系統維持在 dapper。

關於限制特定軟件在特定版本上,而其他軟件隨系統升級的設置在 examples subdirectory 找到,即 preferences.dapper 和 preferences.edgy。

如果你混用不同的發行版本,例如 dapper 和 breezy 或 edgy 和 dapper,你終究還是會安裝上 dapper 或 edgy 版本的核心軟件,例如 libc6,這樣作無法確保系統中沒有臭蟲。你需要特別小心。

另外一個例子,preferences.breezy,會強制降級所有的軟件到 breezy。

Ubuntu 不支持將某個軟件包降級到先前的發行版本。然而在新的軟件包出問題時,你會發現你不得不安裝舊的可用的軟件包。你可以在本地的 /var/cache/apt/archives/ 或遠端的 http://archive.ubuntu.com/ 中找到先前的版本。請參考 使用 dpkg 救助, 第 6.3.3 節。

從某個發行版本降級到先前的發行版本也是不被支持的,而且這樣做往往造成很多問題。不過你願意冒險的話,作為最後的手段這樣做也是值得的。

[編輯] aptitude, apt-get 和 apt-cache 命令

還是以上面使用 testing 發行版的用戶為例,可使用下列命令來管系統:

  • aptitude upgrade (或 apt-get upgrade 或 aptitude dist-upgrade 或 apt-get dist-upgrade)

這樣就會跟隨 dapper 版本 — 它們會跟蹤 dapper 版本的更新情況,對系統上所有軟件包進行升級,並從 dapper 處重新分析依賴關係並安裝相關的包。

  • apt-get dselect-upgrade

這個命令跟蹤 dapper 版本 — 根據 dselect 的選擇對系統上的軟件包進行升級。

  • aptitude install package/edgy

從 edgy 中安裝 package,並由 dapper 版本提供安裝依賴的包。

  • aptitude install -t edgy package

通過設置 edgy 的 Pin-Priority 為 990,可以從 edgy 處安裝 package 及其依賴的包。

  • apt-cache policy foo bar ...

檢查 foo bar ... 軟件包的狀態。

  • aptitude show foo bar ... | less (或 apt-cache show foo bar ... | less)

查看 foo bar ... 軟件包的有關信息。

  • aptitude install foo=2.2.4-1

安裝 foo 軟件包的特定版本 2.2.4-1。

  • aptitude install foo bar-

安裝 foo 軟件包並刪除 bar 軟件包。

  • aptitude remove bar

刪除 bar 軟件包,但保留其配置文件。

  • aptitude purge bar

刪除 bar 軟件包及其所有配置文件。

在上面的例子中使用 -u 選項的作用是在實際升級之前將所有將要升級的軟件包列出,並提示用戶確認。下面的操作可將 -u 設置為默認行為:

$ cat >> /etc/apt/apt.conf << .
// Always show packages to be upgraded (-u)
APT::Get::Show-Upgraded "true";
.

使用 --no-act 可進行模擬升級,並不是進行真正的升級行為。

[編輯] Ubuntu 生存命令

掌握了這些知識,你就能夠享受無盡的“升級”了 :-)

[編輯] 檢測程序錯誤尋求幫助

如你使用某個軟件包出現問題,在尋求幫助或發送錯誤報告之前請確認查看過下列站點 (lynx, links 和 w3m 都很好用):

$ lynx https://launchpad.net/distros/ubuntu/+bugs/
$ lynx https://launchpad.net/distros/ubuntu/+bugs/package-name  # 如果你知道软件包的名字
$ lynx https://launchpad.net/distros/ubuntu/+bugs/bugnumber     # 如果你知道错误序号

在 Google(www.google.com)中使用關鍵字“site:launchpad.net”搜索。

如有疑問,可閱讀幫助文件。設置 CDPATH 如下:

export CDPATH=.:/usr/local:/usr/share/doc

然後輸入

$ cd packagename
$ pager README.Debian # 如果存在的话
$ mc

更多技術支持資源列在 Debian 技術支持, 第 15 章。

[編輯] APT 升級錯誤以及解決方法

從 edgy/dapper 進行升級時可能出現 升級, 第 5.3 節 中提到的軟件包關聯問題。多數情況下,是因為升級的軟件包所需的新增的關聯包沒有安裝。可使用如下方法解決:

# aptitude dist-upgrade

如果這招無效,可以重複下面的方法至到問題解決:

# aptitude -f upgrade        # 即使遇到错误也继续 upgrade
... 或
# aptitude -f dist-upgrade   # 即使遇到错误也继续 dist-upgrade

一些的確存在問題的升級腳本會引起持續出錯。最好的解決方法是檢查該軟件包的安裝腳本 /var/lib/dpkg/info/packagename.{post-,pre-}{install,removal} 然後運行:

# dpkg --configure -a    # 配置所有安装的软件包

如果腳本報告缺少配置文件,查看一下 /etc 中相關的配置文件。如果配置文件有 .dpkg-new 擴展名(或其它類似的擴展名),去掉(mv)它的擴展名。

從 edgy/dapper 進行升級時可能出現軟件包關聯問題。可用這個方法智取:

# aptitude -f install package # 重载坏关联

還可以用 equivs 包來解決此類問題。參閱 /usr/share/doc/equivs/README.Debian 和 equivs 軟件包, 第 6.5.2 節。

[編輯] 使用 dpkg 救助

如果你在使用 APT 的時候遇到死胡同了,那麼可以從 Ubuntu 的鏡像站點下載軟件包並使用 dpkg 來安裝。如果你不能訪問網絡,可以在 /var/cache/apt/archives/ 中找到被緩存的軟件包。

# dpkg -i fetchmail_6.2.5-4_i386.deb

如果你用這種方法安裝軟件包,但是遇到了依賴問題安裝失敗了,並且你確實需要安裝這個軟件包。你可以用 dpkg 的 --ignore-depends,--force-depends 和其他參數來安裝軟件包。dpkg(8) 有更詳細的介紹。

[編輯] 恢復軟件包選擇狀態的數據

如果 /var/lib/dpkg/status 因為某種原因壞掉了,Ubuntu 系統將會完全丟失軟件包選擇狀態的數據。趕快到 /var/lib/dpkg/status-old 或 /var/backups/dpkg.status.* 下找找舊的 /var/lib/dpkg/status 文件。

將 /var/backups/ 放在其它的分區是個好習慣,因為該目錄包含了許多非常重要的系統數據。

如果舊的 /var/lib/dpkg/status 文件也壞了,仍可以從 /usr/share/doc/ 下的目錄進行恢復這些信息。

# ls /usr/share/doc | \
grep -v [A-Z] | \
grep -v '^texmf$' | \
grep -v '^debian$' | \
awk '{print $1 " install"}' | \
dpkg --set-selections
# dselect --expert # 重新安装系统,如果需要的话去除一些选项

[編輯] /var 崩潰之後如何恢復系統

/var 目錄包含着定時更新的數據如 mail,它們很容易遭破壞。將目錄放到別的分區可降低風險,如果最壞的事情發生了,可以通過重建 /var 目錄來挽救 Ubuntu 系統。

從相同或舊版本的最簡 Ubuntu 系統中取得 /var 目錄的內容框架,例如 var.tar.gz,然後它放入受損系統的 root 目錄,接着

# cd /
# mv var var-old      # 如果里面还有其他有用资料的话
# tar xvzf var.tar.gz # 使用 Woody 框架文件
# aptitude            # 或是用 dselect

上述步驟可使系統恢復工作。使用 恢復軟件包選擇狀態的數據, 第 6.3.4 節 中描述的技術加速軟件包選擇數據的恢復。([FIXME]:該過程需要更多的實踐來檢驗)

[編輯] 為無法啟動的系統安裝軟件包

使用 Ubuntu 急救軟盤 /CD 或從多啟動 Linux 系統其它分區啟動。 參閱 啟動系統, 第 8.1 節. 將無法啟動的系統掛載到 /target 並使用 dpkg 的 chroot 安裝模式。

# dpkg --root /target -i packagefile.deb 

接下來就可以着手配置並解決問題。

如是只是由於 lilo 損壞而造系統無法啟動,可使用標準 Ubuntu 急救盤啟動。假設你的 root 分區位於 /dev/hda12 且想使用 runlevel 3,在啟動提示符輸入:

boot: rescue root=/dev/hda12 3

這樣,你就可以使用軟盤中內核啟動系統,新系統的功能基本齊全。(可能丟失某些內核特性或模塊)

[編輯] 如果 dpkg 命令出錯怎麼辦

如果 dpkg 損壞就不能安裝任何 .deb 文件。下面的操作可幫助你修復這種狀況。(在第一行,你可將“links”替換成你喜歡的瀏覽器。)

$ links http://archive.ubuntu.com/ubuntu/pool/main/d/dpkg/
... 下载完好的 dpkg_version_arch.deb
$ su
password: *****
# ar x dpkg_version_arch.deb
# mv data.tar.gz /data.tar.gz
# cd /
# tar xzfv data.tar.gz

對 i386,亦可用 http://packages.ubuntu.com/dpkg 作為 URL。

[編輯] Ubuntu 必殺技

有了這些命令的啟迪,你將會從無休止的升級衝突的地獄中解放出來,達到 Ubuntu 天堂。 :-)

[編輯] 文件信息

在已安裝的軟件包中許找特定文件所屬的軟件包:

$ dpkg {-S|--search} pattern

或者搜索 Ubuntu archive:

$ wget http://archive.ubuntu.com/ubuntu/dists/dapper/Contents-i386.gz
$ zgrep -e pattern Contents-i386.gz 

或是用專門的軟件包命令:

# aptitude install dlocate  
# 和 slocate 冲突 (locate 的安全版本)
$ dlocate filename         # dpkg -L 和 dpkg -S 的高效代替品
...
# aptitude install auto-apt # 请求式软件包安装工具
# auto-apt update          # 为 auto-apt 建立 db 文件
$ auto-apt search pattern  
# 在所有软件包中搜索 pattern,不论安装与否

[編輯] 軟件包信息

搜索並顯示包文件的信息。編輯 /etc/apt/sources.list,讓 APT 指向正確的包文件。如果想了解 dapper/edgy 中的相應軟件包與當前系統安裝的軟件包有何差別,使用 apt-cache policy — 更好。

# apt-get   check           # 更新缓冲区并检查损坏的软件包
$ apt-cache search  pattern # 按文本描述搜索软件包
$ apt-cache policy  package # 软件包的 priority/dists 信息
$ apt-cache show -a package # 显示所有 dists 中软件包描述信息
$ apt-cache showsrc package # 显示相应源码包的信息
$ apt-cache showpkg package # 软件包调试信息
# dpkg  --audit|-C          # 搜索未完成安装的软件包
$ dpkg {-s|--status} package ... # 已安装软件包描述
$ dpkg -l package ...       # 已安装软件包的状态(每个占一行)
$ dpkg -L package ...       # 列出软件包安装的文件的名称

你也這可這樣查看軟件包信息(我用 mc 瀏覽):

/var/lib/apt/lists/*
/var/lib/dpkg/available

比較下面的文件可以確切了解最近的安裝過程對系統造成了那些改變。

/var/lib/dpkg/status
/var/backups/dpkg.status*

[編輯] 使用 APT 無人執守安裝

使用 APT 無人執守安裝,要在 /etc/apt/apt.conf 中加上一行: /etc/apt/apt.conf:

Dpkg::Options {"--force-confold";}

另一種等價的方法是運行 apt-get -q -y packagename。這種方法可能產生嚴重的副作用,所以使用起來要小心。參閱 apt.conf(5)和 dpkg(1)。

安裝完畢以後,可以用 重新配置已安裝的軟件包, 第 6.4.4 節 中的方法配置特定的軟件包。

[編輯] 重新配置已安裝的軟件包

使用下列方法重新配置已安裝的軟件包。

# dpkg-reconfigure --priority=medium package [...]
# dpkg-reconfigure --all   # 重新配置所有的软件包
# dpkg-reconfigure locales # 生成额外的 locales
# dpkg-reconfigure --p=low xserver-xfree86 # 重新配置 X 服务器

如果你想永久改變 debconf 對話框模式,可這麼做。

某些程序用於生成特殊的配置腳本。

apt-setup     - 创建 /etc/apt/sources.list
install-mbr   - 安装主引导(Master Boot Record)管理器
tzconfig      - 设定本地时间
gpmconfig     - 设置 gpm 鼠标 daemon
sambaconfig   - 在 Potato 中配置 Samba( Woody 使用 debconf 来配置)
eximconfig    - 配置 Exim (MTA)
texconfig     - 配置 teTeX
apacheconfig  - 配置 Apache (httpd)
cvsconfig     - 配置 CVS
sndconfig     - 配置声音系统
...
update-alternatives - 设定默认启动命令,例如设定 vi 启动 vim
update-rc.d         - System-V init 脚本管理工具
update-menus        - Debian 菜单系统
...

[編輯] 刪除和清除軟件包

刪除軟件包但保留其配置文件:

# aptitude remove package ...
# dpkg   --remove package ...

刪除軟件包並清除配置文件:

# aptitude purge  package ...
# dpkg   --purge  package ...

[編輯] 阻止舊軟件包升級

舉個例子,要阻止 libc6 和 libc6-dev 通過 dselect 或使用 aptitude install package 命令升級,可執行:

# echo -e "libc6 hold\nlibc6-dev hold" | dpkg --set-selections

這種方法不影響 aptitude install package 命令操作。要阻止 aptitude upgrade package 或 aptitude dist-upgrade 命令對軟件包執行的強制自動降級行為,可在 /etc/apt/preferences 中加上:

Package: libc6
Pin: release a=dapper
Pin-Priority: 2000

這裏“Package:”后不能使用通配符如“libc6*”,如果要保持所有與 glibc 源碼包相關的二進制包的版本同步,可以明確的列出它們。

該命令可以顯示處於“阻止”狀態的軟件包:

dpkg --get-selections "*"|grep -e "hold$"

[編輯] breezy/dapper/edgy 混合系統

apt-show-versions 可以列出發行版中可用軟件包的版本。

$ apt-show-versions | fgrep /dapper | wc
... 你有多少 testing 软件包
$ apt-show-versions -u
... 列出可升级的软件
$ aptitude install `apt-show-versions -u -b | fgrep /edgy`
... 将所有 edgy 软件包升级到最新版本

[編輯] 刪除緩存包文件

使用 APT 安裝軟件包會在 /var/cache/apt/archives 目錄留下緩存文件,要清除這些文件可使用:

# aptitude autoclean # 仅删除无用的包
# aptitude clean     # 删除所有的包

[編輯] 記錄/拷貝系統配置

對軟件包選擇情況進行本地備份:

$ dpkg --get-selections "*" >myselections   # 或使用 \*

"*" 使 myselections 包含那些被指定“完全刪除(purge)”的文件。

你可將這個文件發送到另一台電腦並在那兒按文件中的選擇進行軟件包安裝。

# dselect update
# dpkg --set-selections <myselections
# apt-get -u dselect-upgrade    # 或者 dselect install

[編輯] 向 breezy 系統引入軟件包

對 breezy 系統進行部分升級,在軟件運行環境中重新編譯源碼的確是個誘人的想法,這樣可以避免由於關聯關係不得不對大量軟件包升級。首先,將下列鏡像源加入 /etc/apt/sources.list:

deb-src http://archive.ubuntu.com/ubuntu dapper \
main multiverse restricted universe
deb-src http://archive.ubuntu.com/ubuntu edgy \
main multiverse restricted universe

由於屏幕輸出的限制,上述每條 deb-src 命令均分成了 2 行,實際上在 sources.list 中它們均為單行。

然後下載源碼並在本地生成軟件包:

$ apt-get update  # 更新软件包搜索列表
$ apt-get source package
$ dpkg-source -x package.dsc
$ cd package-version
... 查找需要的软件包(编译所需的关联包列在.dsc文件中)并安装它们,
你还需要“fakerroot”软件包。

$ dpkg-buildpackage -rfakeroot 

……或者(没有签名)
$ dpkg-buildpackage -rfakeroot -us -uc # 如果需要,再使用“debsign”

……然后安装
$ su -c "dpkg -i packagefile.deb"

通常,需要安裝一些帶 “-dev” 後綴的軟件包以滿足關聯關係。debsign 在 devscripts 軟件包中。auto-apt 可以輕鬆解決這些關聯問題。請使用 fakeroot,如是沒有必要,就別使用 root 帳號。

現在,這些關聯問題已被簡化。例如,編譯 pine 源碼包:

# apt-get build-dep pine
# apt-get source -b pine

[編輯] 本地軟件包文件

為了創建與 APT 和 dselect 系統兼容的本地軟件包文件,需要創建 Packages,包中文件要放在特定的目錄樹中。

Ubuntu 官方包文件喜歡存放于本地 deb 倉庫,下面就來創建倉庫:

# aptitude install dpkg-dev
# cd /usr/local
# install -d pool # 软件包存放的物理地址
# install -d dists/edgy/main/binary-i386
# ls -1 pool | sed 's/_.*$/ priority section/' | uniq > override
# 编辑 override # 调整 priority and section
# dpkg-scanpackages pool override /usr/local/ \
> dists/edgy/main/binary-i386/Packages
# cat > dists/unstable/main/Release << EOF
Archive: edgy
Version: 3.0
Component: main
Origin: Local
Label: Local
Architecture: i386
EOF
# echo "deb file:/usr/local unstable main" \
>> /etc/apt/sources.list

還有一種快速但是骯髒的方法來創建本地 deb 倉庫:

# aptitude install dpkg-dev
# mkdir /usr/local/debian
# mv /some/where/package.deb /usr/local/debian
# dpkg-scanpackages /usr/local/debian /dev/null | \
gzip - > /usr/local/debian/Packages.gz
#  echo "deb file:/usr/local/debian ./" >> /etc/apt/sources.list

在 /etc/apt/sources.list 中設置相應鏡像源入口地址,就可以通過 HTTP 或 FTP 方式遠程訪問存放在其中的包文件了。

[編輯] 轉換或安裝外來的二進制軟件包

alien 可將其它格式的二進制軟件包如 Redhat 的 rpm、Stampede 的 slp 、Slackware 的 tgz 和 Solaris 的 pkg 等轉化成 Ubuntu 的 deb 格式軟件包,如果你想在自己的系統上使用別的 Linux 發行版中的軟件包,可使用 alien 將它轉化成系統首選的軟件包格式后安裝。alien 還支持 LSB 的軟件包。

[編輯] 自動安裝命令

auto-apt 是一種請求式軟件包安裝工具。

$ sudo auto-apt update
... 升级数据库
$ auto-apt -x -y run
进入 auto-apt 模式:/bin/bash
退出这个命令继而退出 auto-apt 模式。
$ less /usr/share/doc/med-bio/copyright # 访问不存在的文件
... 安装提供了这个文件的软件包。
... 同样安装依赖的包

[編輯] 校驗已安裝的軟件包

debsums 可以校驗已安裝軟件包的 MD5 編碼,對某些軟件包沒有可用的 MD5 編碼,系統管理員可使用一個臨時的解決辦法:

# cat >>/etc/apt/apt.conf.d/90debsums
DPkg::Post-Install-Pkgs {"xargs /usr/bin/debsums -sg";};
^D

per Joerg Wendland joergland@debian.org (untested).

[編輯] 優化 sources.list

簡而言之,我嘗試過用各種優化方法來創建 sources.list,但任何一種方法對我這個住在美國的人來說都沒有明顯的改善。最後我還是用 apt-setup 手工選擇近一點的站點。

apt-spy 會根據站點回應時間和帶寬自動創建 sources.list。netselect-apt 會創建一個更完整的 sources.list 文件,但它使用更落後的方法來選擇鏡像站點(比較 ping 時間)。

# aptitude install apt-spy
# cd /etc/apt ; mv sources.list sources.list.org
# apt-spy -d dapper -l sources.apt

[編輯] 其他 Ubuntu 的特性

[編輯] dpkg-divert 命令

使用文件轉移(diversions)的方法可以強令 dpkg 將文件安裝到 轉移 目錄而非默認目錄。對於某個引起衝突的文件,可以在 Ubuntu 軟件包腳本中使用 Diversions 將它安裝到別的目錄。系統管理員還可以使用 diversion 來重載軟件包配置文件,或者用來保留某些舊配置文件(這些文件沒有在 conffiles 中登記)當安裝新版軟件時這些文件會被覆蓋。(參閱 保存本地配置, 第 2.2.4 節)。

# dpkg-divert [--add]  filename # 添加 “转移”
# dpkg-divert --remove filename # 删除 “转移”

記住,不到萬不得已不要使用 dpkg-divert。

[編輯] equivs 軟件包

如果你從源碼編譯程序,最好將它做成本地 Ubuntu 化軟件包(*.deb)。最新的方法是使用 equivs。

Package: equivs
Priority: extra
Section: admin
Description: Circumventing Debian package dependencies
This is a dummy package which can be used to create Debian
packages, which only contain dependency information.

[編輯] Alternative 命令

如果想用 vi 來啟動 vim,請用 update-alternatives:

# update-alternatives --display vi
...
# update-alternatives --config vi
Selection    Command
-------------------------------------------1        /usr/bin/elvis-tiny
2        /usr/bin/vim
*****+    3        /usr/bin/nvi

Enter to keep the default[*], or type selection number: 2

Ubuntu alternatives 系統中的這些項目,都是以符號連接的形式存放在 /etc/alternatives 下的。

想設置你喜愛的 X window 環境,執行 update-alternatives 來指定 /usr/bin/x-session-manager 和 /usr/bin/x-window-manager。詳情參閱 自定義 X 會話, 第 9.4.5.1 節。

/bin/sh 是指向 /bin/bash 或 /bin/dash 的鏈接。想兼容舊的 Bash 腳本,使用 /bin/bash 比較保險,但更好還是使用 /bin/dash,因為它更符合 POSIX 標準。升級到 2.4 版 Linux 內核,系統一般將它設置為 /bin/dash。

[編輯] 運行級別 Runlevel

安裝好之後,大部分 Ubuntu 軟件包的服務被設定為在 runlevel 2 到 5 時運行。所以,在沒有定製過的 Ubuntu 系統中,runleve 2、3、4、5、6 是沒有區別的Ubuntu 保留這些給本地管理員使用。 自定義運行級別, 第 2.4.3 節 說明如何定製 runlevels。 這樣的 runlevels 系統和其他流行的 GNU/Linux 發行版本完全不同。 你可能要做的改變之一就是取消 runlevel 2 上的 xdm 和 gdm,使得在完成啟動之後 X 顯示管理去不會自動啟動;然後你可以通過切換到 runlevel 3 來啟動 X 顯示管理器。

參閱 運行級別, 第 2.4.2 節 來獲得更多關於 runlevels 的信息。

[編輯] 停止 daemon 服務

Ubuntu 發行版非常注重系統安全,並期望系統管理員能擔此重任。它將系統的易用性放在了第二位,許多 daemon 服務都定位在最高安全級別,因而,默認安裝狀態下系統只啟動最少的(甚至沒有)可用的服務。

如果拿不定把握(有關 Exim、DHCP...),可執行 ps aux 或檢查 /etc/init.d/* 和 /etc/inetd.conf 下的內容,還可以使用 用 PAM 來控制登錄, 第 9.2.1 節 中提到的方法檢查 /etc/hosts.deny。pidof 命令也很有用(參閱 pidof(8))

在 Ubuntu 系統中,默認狀態下 X11 不允許 TCP/IP(遠程)連接。參閱 在 TCP/IP 中使用 X, 第 9.4.6 節,但是使用 SSH 進行 X 傳送是允許的,參閱 聯接遠程的 X 服務器 – ssh, 第 9.4.8 節。