红联Linux门户
Linux帮助

Debian软件包管理详解

发布时间:2005-11-27 22:35:18来源:红联作者:golshing
主要工具

  dselect --- 使用菜单界面的软件包管理工具(最上层的包管理工具)

  dpkg --- 安装软件包(管理软件包中的文件)

  apt-get --- 安装软件包(管理软件包,CLI APT)

  tasksel --- 安装任务套件(管理面向某方面任务的一套软件包)

  aptitude --- 安装软件包(管理软件包和任务套件,ncurses APT)

  deity --- 另一种ncurses APT

  synaptic, gsynaptic --- 另一种GUI APT


  它们不是同级的工具。`dselect'运行于APT(命令行命令是`apt-get')和`dpkg'之上。


  APT使用`/var/lib/apt/lists/*'来跟踪可用的软件包,而`dpkg'使用的是 `/var/lib/dpkg/available'。如果直接用`apt-get'或同类工具如`aptitude'等来安装软件包,千万别忘了更新 `/var/lib/dpkg/available'文件,可以使用dselect的`[U]pdate'选项或在运行`dselect

  update'、`tasksel'或`dpkg -l'前执行shell命令行“`dselect update'”。


  在理关联软件包的方式上,`apt-get'会自动搜索下载_depends_类软件包,但不会理睬_recommends_和_suggests_类软件包,而`dselect'在软件包的选择方面采用菜单方式操作,对_depends_、_recommends_和_suggests_三类相关软件包均给出提示。`aptitude'则提供了选项下载安装所有_depends_、_recommends_和_suggests_类软件包。


  方便的工具


  apt-cache - 在本地缓冲区检查包文件

  dpkg-reconfigure - 重新配置已安装的软件包(如果它是使用debconf进行配置的)

  dpkg-source - 管理源码包

  dpkg-buildpackage - 自动生成包文件

  ...


  Debian软件包管理基础


  地安装软件包称之为_task_,还可以使用软件包管理工具逐个地安装软件包或升级系统。


  使用`tasksel'或`aptitude'进行_task_安装


  `tasksel'是_Debian的任务安装器_,系统安装过程中它为用户提供了一种`简易'软件包选择方式。


  如果你希望完装的某项常规功能包含了许多软件包,最好的办法就是使用它来安装。运行如下命令:


  # dselect update

  # tasksel


  `aptitude'亦可访问_task_。用它不仅可以选择_tasks_还可以对_task_选项菜单中的软件包进行逐个取舍。


  设置APT系统


  使用`testing'发布版的用户,有时需要对系统进行有选择性地升级

  首先,在`/etc/apt/sources.list'中添加`stable'、`testing'和`unstable'镜像源,接着编辑`/etc/apt/preferences',设置合适的Pin-Priority。

  [1]


  Package: *

  Pin: release a=stable

  Pin-Priority: 500


  Package: *

  Pin: release a=testing

  Pin-Priority: 600


  Package: *

  Pin: release a=unstable

  Pin-Priority: 50


  [1] I kept the description around here as is to maintain consistency with

  other parts. If you are really tracking `testing' or `unstable', you

  should actually remove references to `stable' in

  `/etc/apt/sources.list' and `/etc/apt/preferences'. This is because

  `testing' starts as a copy of `stable'.


  用 dselect代替apt:


  `dselect'会自动选上所有“Required”、“Important”和“Standard”类软件包,在Potato系统中,某些大型应用程序如TeX和Emacs处于这些分类中,在初次安装系统时最好手工取消对它们的选择(输入“_”)。在Woody稳定版中,这些大型应用程序被移入 “Optional”类软件包。


  `dselect'的用户界面有点怪。有4个相似命令(注意是大写字母!):


  Key-stroke Action

  Q 退出。确认当前的选择然后退出。

  (override dependencies)

  R 恢复!我放弃我做出的选择

  D 不管它!我不管dselect有什么建议,照我说的做!

  U 照系统的建议做


  使用`D'和`Q'可以选择有冲突的选项,你要自负风险,所以使用这些命令要小心。当前`dselect'是一款成熟的菜单驱动式工具,在对_suggests_和_recommends_类软件包的选择控制方面,它提供相当棒的微操作能力。


  在`/etc/dpkg/dselect.cfg'中加上一行包含“expert”选项以减少干扰。对于速度慢的机器,请在其它速度快的机器上运行`dselect'选好软件包,然后用`apt-get

  install'安装它们。


  对于没有定义Pin-Priority的软件包,`dselect'不会访问它们。


  使用 aptitude程序:


  `aptitude'是一款新的菜单驱动式软件包安装工具,与`dselect'很相似。它亦可作为命令行工具`apt-get'的替代品。


  `aptitude'可接受单字符命令,通常是小写字母。


  Key-stroke Action

  F10 菜单

  ? 键盘命令帮助

  u 更新软件包信息

  g 下载并安装选定的软件包

  q 保存修改并退出当前屏幕

  x 放弃修改并退出当前屏幕

  Enter 浏览某软件包的相关信息


  `aptitude'提供了选项可自动选取所有_depends_、_recommends_和_suggests_类软件包。可在`F10

  -> Options -> Dependency handling'菜单中设置它。


  通过`aptitude'可访问某软件包的所有版本。


  apt-cache和apt-get命令


  还是以上面使用`testing'发布版的用户为例,可使用下列命令管理系统:


  * `apt-get -u upgrade'


  跟踪`testing'发布版的更新情况,对系统上所有软件包进行升级并从`testing'处安装关联软件包。


  * `apt-get -u dist-upgrade'


  跟踪`testing'发布版的更新情况,对系统上所有软件包进行升级并从`testing'处重新分析关联关系并安装关联包。


  * `apt-get -u dselect-upgrade'


  跟踪`testing'发布版的更新情况,对系统上所有在`dselect'中选定了的软件包进行升级。


  * `apt-get -u install '


  从`testing'处安装及其关联包。


  * `apt-get -u install /unstable'


  从`unstable'处安装并从`testing'处安装关联包。


  * `apt-get -u install -t unstable '


  从`unstable'处安装及其关联包。注意须设置`unstable'的Pin-Priority为990。


  * `apt-cache policy '


  检查软件包的状态。


  * `apt-cache show | less'


  查看软件包的有关信息。


  * `apt-get install '


  安装软件包的特定版本<2.2.4-1>。


  * `apt-get -u install '


  安装软件包并删除软件包。


  * `apt-get remove '


  删除软件包,但保留其配置文件。


  * `apt-get remove --purge '


  删除软件包及其配置文件。


  在上面的例子中用`-u'选项的作用是在实际升级之前将所有将要升级的软件包列出,并提示用户确认。下面的操作可将`-u'设置为默认行为:


  $ cat >> /etc/apt/apt.conf << .

  // Always show packages to be upgraded (-u)

  APT::Get::Show-Upgraded "true";

  .


  使用`-s'可进行模拟升级,并不进行真正的升级行为。


  跟踪某Debian发行版


  根据个人的喜好,选择要跟踪的Debian发行版

  `设置APT系统'的样例文件`/etc/apt/preferences':


  track stable: 将testing的Pin-Priority改为50

  track testing: 保持上面的设置不变

  track testing(unstable): 将unstable的Pin-Priority改为500

  track unstable(testing): 将unstable的Pin-Priority改为800


  有关如何选定Pin-Priority的说明:在上表中,从上而下代表了某个版本

  从上个版本刚刚发布之后到下一版进入冻结期之前这段时间经历的各个阶段。


  请注意,跟踪`testing'发行版的Debian有一个负面影响,安全补丁的更新很慢。


  请注意,如果将Debian各版本混合,例如将`testing'混入`stable'或将`unstable'混入`stable',这会造成众多关键软件包不自觉地从`testing'处或`unstable'处获得,结果引起许多麻烦。


  如何对`/etc/apt/preferences'进行设置,将某些关键包锁定在成熟版本,而让其它非关键包跟踪不太成熟的新版本,可参考样例目录

  (http://www.debian.org/doc/manuals/debian-reference/examples/)中的 `preferences.testing'和`preferences.unstable'文件。另一方面,`preferences.stable' 强制所有软件包降级到“stable”。


  将所有软件包降级到`stable'


  要将所有软件包降级到`stable',可按下面的方法编辑`/etc/apt/preferences':


  Package: *

  Pin: release a=stable

  Pin-Priority: 1001


  然后运行“`apt-get upgrade'”,由于Pin-priority >

  1000而引起强制降级。注意,该操作可能会在关联性方面发生一点问题。


  /etc/apt/preferences概述


  `设置APT系统'中展示的`/etc/apt/preferences'样例文件里,首行`Package:

  *'表示该段落指令作用于所有软件包。可以通过指定软件包名称来为某个特定的软件包设置指定的Pin-Priority。


  接下来的一行是`Pin: release a=stable'表示`apt-get'从包含`Archive:

  stable'节的`Release'文件所在的目录获得`Packages.gz'文件。


  最后一行`Pin-Priority: 500'指定Pin-Priority为500。


  如果多个软件包同名,系统通常会安装拥有最高Pin-Priority的软件包。


  在此,Pin-Priority表示:


  * 1001及以上:可降级优先级。


  Pin-Priority处于该范围的软件包允许降级操作。


  * 100到1000:标准优先级。


  不允许降级。几个key Pin-Priority的值:


  * 990:由`--target-release'或apt-get(8)`-t'选项设置的优先级。


  * 500:所有默认软件包文件的优先级。


  * 100:当前安装软件包文件的优先级。


  * 0到99:非自动优先级。(仅用于软件包没有安装或没有别的可用版本时。)


  * 小于0:决不选择该版本。


  按下面的方法设置`/etc/apt/apt.conf'可获得与`--target-release'一样的效果:


  # echo 'APT:efault-Release "testing";' >> /etc/apt/apt.conf


  命令行选项`--target-release'和`/etc/apt/apt.conf'中的设置会顶替`/etc/apt/preferences'的设置。在玩`/etc/apt/preferences'的时候小心两者冲突。


  检测程序错误寻求帮助


  如你使用某个软件包出现问题,在寻求帮助或发送错误报告之前请确认查看过下列站点(`lynx'、`links'和`w3m'同样好用):


  $ lynx http://bugs.debian.org/

  $ lynx http://bugs.debian.org/ # 如果你知道软件包名称

  $ lynx http://bugs.debian.org/ # 如果你知道错误序号


  如有疑问,可阅读帮助文件。设置`CDPATH'如下:


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


  然后输入


  $ cd $ pager README.Debian # if this exists

  $ mc


  APT升级错误及解决方法


  从`unstable'/`testing'进行升级时可能出现第 5.3 节,

  `升级Debian系统'中提到的软件包关联问题。多数情况下,是因为升级的软件包所需的新增的关联包没有安装。可使用如下方法解决:


  # apt-get dist-upgrade


  如果这招无效,可以重复下面的方法至到问题解决:


  # apt-get upgrade -f # continue upgrade even after error

  ... 或

  # apt-get dist-upgrade -f # continue dist-upgrade even after error


  一些的确存在问题的升级脚本会引起持续出错。最好的解决方法是检查该软件包的安装脚本`/var/lib/dpkg/info/packagename.<{post-,pre-}{install,removal}>'然后运行:


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


  如果脚本报告缺少配置文件,查看一下`/etc'中相关的配置文件。如果配置文件有`.new'扩展名(或其它类似的扩展名),去掉(`mv')它的扩展名。


  从unstable/testing进行升级时可能出现软件包关联问题。可用这个方法智取:


  # apt-get install -f # 重载坏关联


  使用dpkg救助


  如果系统的`dselect'(APT)受损无法完成安装,可使用`dpkg'来恢复:


  # cd /var/cache/apt/archives

  # dpkg -i libc6* libdb2* perl*

  # dpkg -i apt* dpkg* debconf*

  # dpkg -i * # 直至不再出错


  如果软件包丢失,用下述方法从镜像源

  (http://www.debian.org/mirror/)下载:


  # mc # use "FTP link" pointing to Debian FTP server


  现在,在HTTP/FTP服务器上,软件包的真正位置不再是传统的`/dist'目录而是新的`/pool'目录。


  然后开始安装:


  # dpkg -i /var/cache/apt/archives/


  对于坏关联,可这样解决:


  # dpkg --ignore-depends=,... -i # dpkg --force-depends -i # dpkg --force-depends --purge # dpkg --force-confmiss -i # Install missing conffile


  恢复软件包选择状态的数据


  如果`/var/lib/dpkg/status'因为某种原因坏掉了,Debian系统将会完全丢失软件包选择状态的数据。赶快到 `/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 # reinstall system, de-select as needed


  /var被删除后如何恢复系统


  `/var'目录包含着定时更新的数据如mail,它们很容易遭破坏。将目录放到别的分区可降低风险,如果最坏的事情发生了,可以通过重建`/var'目录来挽救Debian系统。


  从相同或旧版本的最简Debian系统中取得`/var'目录的内容框架,例如var.tar.gz

  (http://people.debian.org/~osamu/pub...?oot目录,接着


  # cd /

  # mv var var-old # 如果剩有有用内容

  # tar xvzf var.tar.gz # 使用Woody框架文件

  # aptitude # 或用dselect


  上述步骤可使系统恢复工作。

  `恢复软件包选择状态的数据'中描述的技术加速软件包选择数据的恢复。

  ([FIXME]:该过程需要更多的实践来检验)


  为无法启动的系统安装软件包


  使用Debian急救软盘/CD或从多启动Linux系统其它分区启动。

  `启动系统'.

  将无法启动的系统挂载到`/target'并使用`dpkg'的chroot安装模式。


  # dpkg --root /target -i


  接下来就可以着手配置并解决问题。


  如是只是由于`lilo'损坏而造系统无法启动,可使用标准Debian急救盘启动。假设你的root分区位于`/dev/hda12'且想使用runlevel

  3,在启动提示符输入:


  boot: rescue root=/dev/ 3


  这样,你就可以使用软盘中内核启动系统,新系统的功能基本齐全。(可能丢失某些内核特性或模块)


  如果dpkg命令出错该怎么办


  如果`dpkg'损坏就不能安装任何`.deb'文件。下面的操作可帮助你修复这种状况。(在第一行,你可将“links”替换成你喜欢的浏览器。)


  $ links http:///debian/pool/main/d/dpkg/

  ... 下载完好的dpkg__.deb

  $ su

  password: *****

  # ar x dpkg__.deb

  # mv data.tar.gz /data.tar.gz

  # cd /

  # tar xzfv data.tar.gz


  对`i386',亦可用`http://packages.debian.org/dpkg'作为URL。


  文件信息


  查找特定文件所属的软件包:


  $ dpkg {-S|--search} pattern # search for pattern in installed packages

  $ wget http://ftp.us.debian.org/debian/dists//

  $ zgrep -e pattern

  # find filename-pattern of files in the debian archive


  或使用专门的软件包命令:


  # apt-get install dlocate

  # conflicts with slocate (secure version of locate)

  $ dlocate # fast alternative to dpkg -L and dpkg -S

  ...

  # apt-get install auto-apt # on-demand package installation tool

  # auto-apt update # create db file for auto-apt

  $ auto-apt search # search for pattern in all packages, installed or not


  软件包信息


  搜索并显示包文件的信息。编辑`/etc/apt/sources.list',让APT指向正确的包文件。如果想了解testing/unstable中的相应软件包与当前系统安装的软件包有何差别,使用`apt-cache

  policy'---更好。


  # apt-get check # 更新缓冲区并检查损坏的软件包

  $ apt-cache search # 按文本描述搜索软件包

  $ apt-cache policy # 软件包的priority/dists信息

  $ apt-cache show -a # 显示所有dists中软件包描述信息

  $ apt-cache showsrc # 显示相应源码包的信息

  $ apt-cache showpkg # 软件包调试信息

  # dpkg --audit|-C # 搜索未完成安装的软件包

  $ dpkg {-s|--status} ... # 已安装软件包描述

  $ dpkg -l ... # 已安装软件包的状态(每个占一行)

  $ dpkg -L ... # 列出软件包安装的文件的名称


  如果是Woody发布版没有为`apt-cache showsrc'建档,但该命令可用


  你也这可这样查看软件包信息(我用`mc'浏览):


  /var/lib/apt/lists/*

  /var/lib/dpkg/available


  比较下面的文件可以确切了解最近的安装过程对系统造成了那些改变。


  /var/lib/dpkg/status

  /var/backups/dpkg.status*


  使用APT进行全自动系统安装


  进行全自动安装,要在`/etc/apt/apt.conf'中加上一行:


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


  另一种等阶的方法是运行`apt-get -q -y

  '。这种方法可能产生严重的负作用,所以使用起来要小心。参阅apt.conf(5)和dpkg(1)。


  安装完毕以后重新配置已安装软件包'中的方法配置特定的软件包。


  重新配置已安装软件包


  使用下列方法重新配置已安装软件包。


  # dpkg-reconfigure --priority= [...]

  # dpkg-reconfigure --all # 重新配置所有的软件包

  # dpkg-reconfigure locales # 生成别的locales

  # dpkg-reconfigure --p= 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菜单系统

  ...


  删除软件包


  删除软件包但保留其配置文件:


  # apt-get remove ...

  # dpkg --remove ...


  删除软件包并删除配置文件:


  # apt-get remove --purge ...

  # dpkg --purge ...


  阻止旧软件包升级


  举个例子,要阻止`libc6'和`libc6-dev'通过`dselect'或使用`apt-get -u

  upgrade '命令升级,可执行:


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


  这种方法不影响`apt-get -u install '命令操作。要阻止`apt-get

  -u upgrade '或`apt-get -u

  dist-upgrade'命令对软件包执行的强制自动降级行为,可在`/etc/apt/preferences'中加上:


  Package: libc6

  Pin: release a=stable

  Pin-Priority: 2000


  这里“`Package:'”后不能使用通配符如“`libc6*'”,如果要保持所有与`glibc'源码包相关的二进制包的版本同步,可以明确的列出它们。


  该命令可以显示处于“阻止”状态的软件包:


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


  stable/testing/unstable混合系统


  `apt-show-versions'可以列出发行版中可用软件包的版本。


  $ apt-show-versions | fgrep /testing | wc

  ... 你有多少testing软件包

  $ apt-show-versions -u

  ... 列出可升级的软件包

  $ apt-get install `apt-show-versions -u -b | fgrep /unstable`

  ... 将所有unstable软件包升级到最新版本


  删除缓存包文件


  使用APT安装软件包会在`/var/cache/apt/archives'目录留下缓存文件,要清除这些文件可使用:


  # apt-get autoclean # removes only useless package files

  # apt-get clean # removes all cached package files


  记录/拷贝系统配置


  对软件包选择情况进行本地备份:


  $ dpkg --get-selections "*" > # or use *


  `“*”'使`'包含那些被指定“完全删除(purge)”的文件。


  你可将这个文件发送到另一台电脑并在那儿按文件中的选择进行软件包安装。


  # dselect update

  # dpkg --set-selections <

  # apt-get -u dselect-upgrade # dselect install


  stable系统引入软件包


  对stable系统进行部分升级,在软件运行环境中重新编译源码的确是个诱人的想法,这样可以避免由于关联关系不得不对大量软件包升级。首先,将下列镜像源加入

  /etc/apt/sources.list:(以下是美国的Debian源)


  deb-src http://http.us.debian.org/debian testing

  main contrib non-free

  deb-src http://non-us.debian.org/debian-non-US testing/non-US

  main contrib non-free

  deb-src http://http.us.debian.org/debian unstable

  main contrib non-free

  deb-src http://non-us.debian.org/debian-non-US unstable/non-US

  main contrib non-free


  由于屏幕输出的限制,上述每条`deb-src'命令均分成了2行,实际上在`sources.list'中它们均为单行。


  然后下载源码并在本地生成软件包:


  $ apt-get source $ dpkg-source -x $ cd ... 查找需要的软件包(编译所需的关联包列在.dsc文件中)并安装它们,

  你还需要“fakerroot”软件包。


  $ dpkg-buildpackage -rfakeroot


  ...or (no sig)

  $ dpkg-buildpackage -rfakeroot -us -uc # use "debsign" later if needed


  ...Then to install

  $ su -c "dpkg -i "


  通常,需要安装一些带“-dev”后缀的软件包以满足关联关系。`debsign'在`devscripts'软件包中。`auto-apt'可以轻松解决这些关联问题。请使用`fakeroot',如是没有必要,就别使用root帐号。


  在Woody中,这些关联问题已被简化。例如,编译`pine'源码包:


  # apt-get build-dep pine

  # apt-get source -b pine


  完结:以上全部方法同样可用于ubuntu
文章评论

共有 1 条评论

  1. golshing 于 2005-12-03 19:04:35发表:

    不错的,自己顶下