第 6 章 – Ubuntu 软件包管理
admin
- 10 minutes read - 2093 words高级包管理工具 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 节 中描述的使用方法非常适合于需要同时确保系统的稳定性和使用最新软件的情况。
6.1 介绍
- 如果你没有精力阅读完所有的开发者文档,那么先看看本章的内容,然后开始体验 Ubuntu 的威力吧:-)
6.1.1 主要的包管理工具
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 节.
6.1.2 方便的工具
dpkg-reconfigure - 重新配置已安装的软件包 (如果它是使用 debconf 进行配置的) dpkg-source - 管理源码包 dpkg-buildpackage - 自动生成包文件 apt-cache - 在本地缓冲区检查包文件
6.2 Ubuntu 软件包管理基础
6.2.1 设置 APT
- 参考 准备升级工作, 第 5.2 节 来设置 sources.list。 [ 34] 请参考 Ubuntu 系统安装提示, 第 3 章, 发行版升级到 Breezy、Dapper 或 Edgy, 第 5 章, 和 应急的编辑器, 第 11.2 节.
6.2.2 安装 tasks
你可以安装一些软件包集合,这些集合是由使 Ubuntu 系统满足某些特定用途的典型软件包组成的。 这些集合被称为“tasks”。 在初始化安装中,安装 tasks 最简单的方法就是使用 tasksel。 注意在使用之前,你需要运行
dselect update建议使用 aptitude 来安装 tasks。 它能让你在选择好 tasks 并准备安装之前,删除 tasks 中的某些软件包。
6.2.3 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 功能。普通用户都可以执行,直到安装或删除软件的时候再取得管理员权限。
* * *
### 6.2.4 dselect
- dselect 一直是主要的包维护工具。你可以考虑用 aptitude 代替。 当 你启动程序的时候,dselect 会自动选择所有“Required”“Important”和“Standard”的包。 dselect 的用户界面是有些奇怪,但是大部分人已经习惯了。 它有四个主要命令: (指令都是大写的!):
按键 动作
Q 退出。确认当前的选择并退出。
(忽略依赖关系)
R 撤销! 我不是那个意思。
D 不管他!我不管你 dselect 怎么想的,照做就好了!
U 都照建议的来做
使用 D 和 Q,你可以选择有冲突的选项。请小心使用这个命令。 在 /etc/dpkg/dselect.cfg 中加上一行“expert”来减少干扰。 如果你的机器运行 dselect 的速度很慢,你可以考虑在速度快一点的机器上运行 dselect,确定你要安装的软件包之后,在慢的机器上通过 apt-get 来安装它们。
* * *
### 6.2.5 使用 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](http://wiki.ubuntu.org.cn/UbuntuManual/examples) 找到,即 preferences.dapper 和 preferences.edgy。 如 果你混用不同的发行版本,例如 dapper 和 breezy 或 edgy 和 dapper,你终究还是会安装上 dapper 或 edgy 版本的核心软件,例如 libc6,这样作无法确保系统中没有臭虫。你需要特别小心。 另外一个例 子,preferences.breezy,会强制降级所有的软件到 breezy。
Ubuntu 不支持将某个 **软件包** 降级到先前的发行版本。然而在新的软件包出问题 时,你会发现你不得不安装旧的可用的软件包。你可以在本地的 /var/cache/apt/archives/ 或远端的 [http://archive.ubuntu.com/](http://archive.ubuntu.com/) 中找到先前的版本。请参考 [使用 dpkg 救助, 第 6.3.3 节](http://www.phpx.com/man/Ubuntu/ch-package.zh-cn.html#s-rescue-dpkg)。
从某个 **发 行版本** 降级到先前的发行版本也是不被支持的,而且这样做往往造成很多问题。不过你愿意冒险的话,作为最后的手段这样做也是值得的。
* * *
### 6.2.6 aptitude, apt-get 和 apt-cache 命令
- 还是以上面使用 testing 发行版的用户为例,可使用下列命令来管系统:
- aptitude upgrade (或 apt-get upgrade 或 aptitude dist-upgrade 或 apt-get dist-upgrade)
- 这样就会跟随 dapper 版本 — 它们会跟踪 dapper 版本的更新情况,对系统上所有软件包进行升级,并从 dapper 处重新分析依赖关系并安装相关的包。 [ [35](http://wiki.ubuntu.org.cn/UbuntuManual/footnotes.zh-cn.html)]
- 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 可进行模拟升级,并不是进行真正的升级行为。
* * *
## 6.3 Ubuntu 生存命令
- 掌握了这些知识,你就能够享受无尽的“升级”了 
* * *
### 6.3.1 检测程序错误寻求帮助
- 如你使用某个软件包出现问题,在寻求帮助或发送错误报告之前请确认查看过下列站点 (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 章](http://www.phpx.com/man/Ubuntu/ch-support.zh-cn.html)。
* * *
### 6.3.2 APT 升级错误以及解决方法
- 从 edgy/dapper 进行升级时可能出现 [升级, 第 5.3 节](http://www.phpx.com/man/Ubuntu/ch-woody.zh-cn.html#s-upgrade-system) 中提到的软件包关联问题。多数情况下,是因为升级的软件包所需的新增的关联包没有安装。可使用如下方法解决:
# 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 节](http://www.phpx.com/man/Ubuntu/ch-package.zh-cn.html#s-equivs)。
* * *
### 6.3.3 使用 dpkg 救助
- 如果你在使用 APT 的时候遇到死胡同了,那么可以从 Ubuntu 的镜像站点下载软件包并使用 dpkg 来安装。如果你不能访问网络,可以在 /var/cache/apt/archives/ 中找到被缓存的软件包。
# dpkg -i fetchmail_6.2.5-4_i386.deb
如果你用这种方法安 装软件包,但是遇到了依赖问题安装失败了,并且你确实需要安装这个软件包。你可以用 dpkg 的 –ignore-depends,–force-depends 和其他参数来安装软件包。dpkg(8) 有更详细的介绍。
* * *
### 6.3.4 恢复软件包选择状态的数据
- 如果 /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 # 重新安装系统,如果需要的话去除一些选项
* * *
### 6.3.5 /var 崩溃之后如何恢复系统
- /var 目录包含着定时更新的数据如 mail,它们很容易遭破坏。将目录放到别的分区可降低风险,如果最坏的事情发生了,可以通过重建 /var 目录来挽救 Ubuntu 系统。从相同或旧版本的最简 Ubuntu 系统中取得 /var 目录的内容框架,例如 [var.tar.gz](http://people.debian.org/%7Eosamu/pub),然后它放入受损系统的 root 目录,接着
# cd /
# mv var var-old # 如果里面还有其他有用资料的话
# tar xvzf var.tar.gz # 使用 Woody 框架文件
# aptitude # 或是用 dselect
上述步骤可使系统恢复工作。使用 [恢复软件包选择状态的数据, 第 6.3.4 节](http://www.phpx.com/man/Ubuntu/ch-package.zh-cn.html#s-recover-status) 中描述的技术加速软件包选择数据的恢复。([FIXME]:该过程需要更多的实践来检验)
* * *
### 6.3.6 为无法启动的系统安装软件包
- 使用 Ubuntu 急救软盘 /CD 或从多启动 Linux 系统其它分区启动。 参阅 [启动系统, 第 8.1 节](http://www.phpx.com/man/Ubuntu/ch-tips.zh-cn.html#s-booting). 将无法启动的系统挂载到 /target 并使用 dpkg 的 chroot 安装模式。
# dpkg --root /target -i packagefile.deb
接 下来就可以着手配置并解决问题。 如是只是由于 lilo 损坏而造系统无法启动,可使用标准 Ubuntu 急救盘启动。假设你的 root 分区位于 /dev/hda12 且想使用 runlevel 3,在启动提示符输入:
boot: rescue root=/dev/hda12 3
这样,你就可以使用 软盘中内核启动系统,新系统的功能基本齐全。(可能丢失某些内核特性或模块)
* * *
### 6.3.7 如果 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](http://packages.ubuntu.com/dpkg) 作为 URL。
* * *
## 6.4 Ubuntu 必杀技
- 有了这些命令的 **启迪**, 你将会从无休止的升级冲突的地狱中解放出来,达到 Ubuntu **天堂**。 
* * *
### 6.4.1 文件信息
- 在已安装的软件包中许找特定文件所属的软件包:
$ 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,不论安装与否
* * *
### 6.4.2 软件包信息
- 搜索并显示包文件的信息。编辑 /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*
* * *
### 6.4.3 使用 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 节](http://www.phpx.com/man/Ubuntu/ch-package.zh-cn.html#s-reconfigure) 中的方法配置特定的软件包。
* * *
### 6.4.4 重新配置已安装的软件包
- 使用下列方法重新配置已安装的软件包。
# dpkg-reconfigure --priority=medium package [...]
# dpkg-reconfigure --all # 重新配置所有的软件包
# dpkg-reconfigure locales # 生成额外的 locales
# dpkg-reconfigure --p=low xserver-xfree86 # 重新配置 X 服务器
如果你想永久改变 debconf 对话框模式,可这么做。某些程序用于生成特殊的配置脚本。 [ [36](http://wiki.ubuntu.org.cn/UbuntuManual/footnotes.zh-cn.html)]
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 菜单系统
...
* * *
### 6.4.5 删除和清除软件包
- 删除软件包但保留其配置文件:
# aptitude remove package ...
# dpkg --remove package ...
删除软件包并清除配 置文件:
# aptitude purge package ...
# dpkg --purge package ...
* * *
### 6.4.6 阻止旧软件包升级
- 举个例子,要阻止 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$"
* * *
### 6.4.7 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 软件包升级到最新版本
* * *
### 6.4.8 删除缓存包文件
- 使用 APT 安装软件包会在 /var/cache/apt/archives 目录留下缓存文件,要清除这些文件可使用:
# aptitude autoclean # 仅删除无用的包
# aptitude clean # 删除所有的包
* * *
### 6.4.9 记录/拷贝系统配置
- 对软件包选择情况进行本地备份:
$ dpkg --get-selections "*" >myselections # 或使用 \*
“*” 使 myselections 包含那些被指定“完全删除(purge)”的文件。 你可将这个文件发送到另一台电脑并在那儿按文件中的选择进行软件包安装。
# dselect update
# dpkg --set-selections <myselections
# apt-get -u dselect-upgrade # 或者 dselect install
* * *
### 6.4.10 向 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
* * *
### 6.4.11 本地软件包文件
- 为了创建与 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 方式远程访问存放在其中的包文件了。
* * *
### 6.4.12 转换或安装外来的二进制软件包
- alien 可将其它格式的二进制软件包如 Redhat 的 rpm、Stampede 的 slp 、Slackware 的 tgz 和 Solaris 的 pkg 等转化成 Ubuntu 的 deb 格式软件包,如果你想在自己的系统上使用别的 Linux 发行版中的软件包,可使用 alien 将它转化成系统首选的软件包格式后安装。alien 还支持 LSB 的软件包。
* * *
### 6.4.13 自动安装命令
- auto-apt 是一种请求式软件包安装工具。
$ sudo auto-apt update
... 升级数据库
$ auto-apt -x -y run
进入 auto-apt 模式:/bin/bash
退出这个命令继而退出 auto-apt 模式。
$ less /usr/share/doc/med-bio/copyright # 访问不存在的文件
... 安装提供了这个文件的软件包。
... 同样安装依赖的包
* * *
### 6.4.14 校验已安装的软件包
- debsums 可以校验已安装软件包的 MD5 编码,对某些软件包没有可用的 MD5 编码,系统管理员可使用一个临时的解决办法:
# cat >>/etc/apt/apt.conf.d/90debsums
DPkg::Post-Install-Pkgs {"xargs /usr/bin/debsums -sg";};
^D
per Joerg Wendland [[email protected]](mailto:[email protected]) (untested).
* * *
### 6.4.15 优化 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
* * *
## 6.5 其他 Ubuntu 的特性
* * *
### 6.5.1 dpkg-divert 命令
- 使用文件 **转移**(diversions) 的方法可以强令 dpkg 将文件安装到 **转移** 目录而非默认目录。对于某个引起冲突的文件,可以在 Ubuntu 软件包脚本中使用 **Diversions** 将它安装到别的目录。系统管理员还可以使用 diversion 来重载软件包配置文件,或者用来保留某些旧配置文件(这些文件没有在 **conffiles** 中登记)当安装新版软件时这些文件会被覆盖。(参阅 [保存本地配置, 第 2.2.4 节](http://www.phpx.com/man/Ubuntu/ch-system.zh-cn.html#s-conffile))。
# dpkg-divert [--add] filename # 添加 “转移”
# dpkg-divert --remove filename # 删除 “转移”
记住,不到万不得已 不要使用 dpkg-divert。
* * *
### 6.5.2 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.
* * *
### 6.5.3 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 节](http://www.phpx.com/man/Ubuntu/ch-tune.zh-cn.html#s-custom-x)。 /bin/sh 是指向 /bin/bash 或 /bin/dash 的链接。想兼容旧的 Bash 脚本,使用 /bin/bash 比较保险,但更好还是使用 /bin/dash,因为它更符合 POSIX 标准。升级到 2.4 版 Linux 内核,系统一般将它设置为 /bin/dash。
* * *
### 6.5.4 运行级别 Runlevel
- 安装好之后,大部分 Ubuntu 软件包的服务被设定为在 runlevel 2 到 5 时运行。所以,在没有定制过的 Ubuntu 系统中,runleve 2、3、4、5、6 是没有区别的Ubuntu 保留这些给本地管理员使用。 [自定义运行级别, 第 2.4.3 节](http://www.phpx.com/man/Ubuntu/ch-system.zh-cn.html#s-custombootscripts) 说明如何定制 runlevels。 这样的 runlevels 系统和其他流行的 GNU/Linux 发行版本完全不同。 你可能要做的改变之一就是取消 runlevel 2 上的 xdm 和 gdm,使得在完成启动之后 X 显示管理去不会自动启动;然后你可以通过切换到 runlevel 3 来启动 X 显示管理器。
参阅 [运行级别, 第 2.4.2 节](http://www.phpx.com/man/Ubuntu/ch-system.zh-cn.html#s-runlevels) 来获得更多关于 runlevels 的信息。
* * *
### 6.5.5 停止 daemon 服务
Ubuntu 发行版非常注重系统安全,并期望系统管理员能担此重任。它将系统的易用性放在了第二位,许多 daemon 服务都定位在最高安全级别,因而,默认安装状态下系统只启动最少的(甚至没有)可用的服务。
如果拿不定把握(有关 Exim、DHCP…),可执行 ps aux 或检查 /etc/init.d/* 和 /etc/inetd.conf 下的内容,还可以使用 [用 PAM 来控制登录, 第 9.2.1 节](http://www.phpx.com/man/Ubuntu/ch-tune.zh-cn.html#s-loginctrl) 中提到的方法检查 /etc/hosts.deny。pidof 命令也很有用(参阅 pidof(8))
在 Ubuntu 系统中,默认状态下 X11 不允许 TCP/IP(远程)连接。参阅 [在 TCP/IP 中使用 X, 第 9.4.6 节](http://www.phpx.com/man/Ubuntu/ch-tune.zh-cn.html#s-xtcp),但是使用 SSH 进行 X 传送是允许的,参阅 [联接远程的 X 服务器 – ssh, 第 9.4.8 节](http://www.phpx.com/man/Ubuntu/ch-tune.zh-cn.html#s-xssh)。