各大Linux发行版软件包管理参考

各大Linux发行版软件包管理参考(http://www.freeoa.net/osuport/botinstal/linux-package-manage-refer_9.html)

使用 Linux 系统总是免不了要接触包管理工具。比如,Debian/Ubuntu 的 apt、openSUSE 的 zypp、Fedora 的 yum、Mandriva 的 urpmi、Slackware 的 slackpkg、Archlinux 的 pacman、Gentoo 的 emerge、Foresight 的 conary、Pardus 的 pisi,等等。DistroWatch 针对上述包管理器的主要用法进行了总结,对各位 Linux 用户来说具有很好的参考作用。

任务:apt
Debian, Ubuntu:zypp
openSUSE:yum
Fedora, CentOS
安装包:apt-get install <pkg>:zypper install <pkg>:yum install <pkg>
移除包:apt-get remove <pkg>:zypper remove <pkg>:yum erase <pkg>
更新包列表:apt-get update:zypper refresh:yum check-update
更新系统:apt-get upgrade:zypper update:yum update
列出源:cat /etc/apt/sources.list:zypper repos:yum repolist
添加源:(edit /etc/apt/sources.list):zypper addrepo <path> <name>:(add <repo> to /etc/yum.repos.d/)
移除源:(edit /etc/apt/sources.list):zypper removerepo <name>:(remove <repo> from /etc/yum.repos.d/)
搜索包:apt-cache search <pkg>:zypper search <pkg>:yum search <pkg>
列出已安装的包:dpkg -l:rpm -qa:rpm -qa

任务:urpmi
Mandriva:slackpkg
Slackware:pacman
Arch
安装包:urpmi <pkg>:slackpkg install <pkg>:pacman -S <pkg>
移除包:urpme <pkg>:slackpkg remove <pkg>:pacman -R <pkg>
更新包列表:urpmi.update -a:slackpkg update:pacman -Sy
更新系统:urpmi --auto-select:slackpkg upgrade-all:pacman -Su
列出源:urpmq --list-media:cat /etc/slackpkg/mirrors:cat /etc/pacman.conf
添加源:urpmi.addmedia <name> <path>:(edit /etc/slackpkg/mirrors):(edit /etc/pacman.conf)
移除源:urpmi.removemedia <media>:(edit /etc/slackpkg/mirrors):(edit /etc/pacman.conf)
搜索包:urpmf <pkg>:--:pacman -Qs <pkg>
列出已安装的包:rpm -qa:ls /var/log/packages/:pacman -Qii

任务:conary
rPath, Foresight:pisi
Pardus:emerge
Gentoo
安装包:conary update <pkg>:pisi install <pkg>:emerge <pkg>
移除包:conary erase <pkg>:pisi remove <pkg>:emerge -C <pkg>
更新包列表: pisi update-repo:emerge --sync | layman -S [for added repositories]
更新系统:conary updateall:pisi upgrade:emerge -NuDa world
列出源: pisi list-repo:layman -L
添加源: pisi add-repo <name> <path>:layman -a
移除源: pisi remove-repo <name>:layman -d
搜索包:conary query <pkg>:pisi search <pkg>:emerge --search
列出已安装的包:conary query:pisi list-installed:cat /var/lib/portage | more

Red Hat Package Manager--rpm
RPM 是 Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。RPM包里面都包含什么?里面包含可执行的二进制程序,这个程序和Windows的软件包中的.exe文件类似是可执行的;RPM包中还包括程序运行时所需要的文件,这也和Windows的软件包类似,Windows的程序的运行,除了.exe文件以外,也有其它的文件。

一个RPM 包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系;依赖关系并不是Linux特有的,Windows操作系统中也是同样存在的;比如我们在Windows系统中运行3D游戏,在安装的时候,他可能会提示,要安装Direct 9 ;Linux和Windows原理是差不多的。

一、RPM包管理的用途
1、可以安装、删除、升级和管理软件;当然也支持在线安装和升级软件
2、通过RPM包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个软件包
3、可以在查询系统中的软件包是否安装以及其版本
4、作为开发者可以把自己的程序打包为RPM 包发布
5、软件包签名GPG和MD5的导入、验证和签名发布
6、依赖性的检查,查看是否有软件包由于不兼容而扰乱了系统

二、RPM 的使用权限
RPM软件的安装、删除、更新只有root权限才能使用;对于查询功能任何用户都可以操作;如果普通用户拥有安装目录的权限,也可以进行安装。

三、rpm 的一点简单用法
我们除了软件包管理器以外,还能通过rpm 命令来安装;是不是所有的软件包都能通过rpm 命令来安装呢?不是的,文件以.rpm 后缀结尾的才行;有时我们在一些网站上找到file.rpm ,都要用 rpm 来安装。

一)初始化rpm 数据库
通过rpm 命令查询一个rpm 包是否安装了,也是要通过rpm 数据库来完成的;所以我们要经常用下面的两个命令来初始化rpm 数据库
[root@localhost beinan]# rpm --initdb
[root@localhost beinan]# rpm --rebuilddb 注:这个要花好长时间

注:这两个参数是极为有用,有时rpm 系统出了问题,不能安装和查询,大多是这里出了问题。

二)RPM软件包管理的查询功能:
命令格式
rpm {-q|--query} [select-options] [query-options]
RPM的查询功能是极为强大,是极为重要的功能之一;举几个常用的例子,更为详细的具体的,请参考#man rpm

1、对系统中已安装软件的查询
1)查询系统已安装的软件
语法:rpm -q 软件名
举例:
[root@localhost beinan]# rpm -q gaim
gaim-1.3.0-1.fc4
-q就是 --query ,中文意思是“问”,此命令表示的是,是不是系统安装了gaim ;如果已安装会有信息输出;如果没有安装,会输出gaim 没有安装的信息;查看系统中所有已经安装的包,要加 -a 参数 :
[root@localhost RPMS]# rpm -qa
如果分页查看,再加一个管道 |和more命令:
[root@localhost RPMS]# rpm -qa |more
在所有已经安装的软件包中查找某个软件,比如说 gaim ;可以用 grep 抽取出来。
[root@localhost RPMS]# rpm -qa |grep gaim
上面这条的功能和 rpm -q gaim 输出的结果是一样的。

2)查询一个已经安装的文件属于哪个软件包
语法 rpm -qf 文件名
注:文件名所在的绝对路径要指出
举例:
[root@localhost RPMS]# rpm -qf /usr/lib/libacl.la
libacl-devel-2.2.23-8

3)查询已安装软件包都安装到何处
语法:rpm -ql 软件名 或 rpm rpmquery -ql 软件名
举例:
[root@localhost RPMS]# rpm -ql lynx
[root@localhost RPMS]# rpmquery -ql lynx

4)查询一个已安装软件包的信息
语法格式: rpm -qi 软件名
举例:
[root@localhost RPMS]# rpm -qi lynx

5)查看一下已安装软件的配置文件
语法格式:rpm -qc 软件名
举例:
[root@localhost RPMS]# rpm -qc lynx

6)查看一个已经安装软件的文档安装位置
语法格式: rpm -qd 软件名
举例:
[root@localhost RPMS]# rpm -qd lynx

7)查看一下已安装软件所依赖的软件包及文件
语法格式: rpm -qR 软件名
举例:
[root@localhost beinan]# rpm -qR rpm-python
查询已安装软件的总结:对于一个软件包已经安装,我们可以把一系列的参数组合起来用;比如 rpm -qil ;比如:
[root@localhost RPMS]# rpm -qil lynx

2、对于未安装的软件包的查看
查看的前提是您有一个.rpm 的文件,也就是说对既有软件file.rpm的查看等。

1)查看一个软件包的用途、版本等信息
语法: rpm -qpi file.rpm
举例:
[root@localhost RPMS]# rpm -qpi lynx-2.8.5-23.i386.rpm

2)查看一件软件包所包含的文件
语法: rpm -qpl file.rpm
举例:
[root@localhost RPMS]# rpm -qpl lynx-2.8.5-23.i386.rpm

3)查看软件包的文档所在的位置
语法: rpm -qpd file.rpm
举例:
[root@localhost RPMS]# rpm -qpd lynx-2.8.5-23.i386.rpm

4)查看一个软件包的配置文件
语法: rpm -qpc file.rpm
举例:
[root@localhost RPMS]# rpm -qpc lynx-2.8.5-23.i386.rpm

5)查看一个软件包的依赖关
语法: rpm -qpR file.rpm
举例:
[root@localhost archives]# rpm -qpR yumex_0.42-3.0.fc4_noarch.rpm
/bin/bash
/usr/bin/python
config(yumex) = 0.42-3.0.fc4
pygtk2
pygtk2-libglade
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
usermode
yum >= 2.3.2

三)软件包的安装、升级、删除等
1、安装和升级一个rpm 包
[root@localhost beinan]#rpm -vih file.rpm 注:这个是用来安装一个新的rpm 包
[root@localhost beinan]#rpm -Uvh file.rpm 注:这是用来升级一个rpm 包
如果有依赖关系的,请解决依赖关系,其实软件包管理器能很好的解决依赖关系,请看前面的软件包管理器的介绍;如果您在软件包管理器中也找不到依赖关系的包;那只能通过编译他所依赖的包来解决依赖关系,或者强制安装。

[root@localhost beinan]# rpm -ivh file.rpm --nodeps --force
[root@localhost beinan]# rpm -Uvh file.rpm --nodeps --force
更多的参数,请查看 man rpm。
举例应用:
[root@localhost RPMS]# rpm -ivh lynx-2.8.5-23.i386.rpm
Preparing... ########################################### [100%]
1:lynx ########################################### [100%]
[root@localhost RPMS]# rpm -ivh --replacepkgs lynx-2.8.5-23.i386.rpm
Preparing... ########################################### [100%]
1:lynx ########################################### [100%]
注: --replacepkgs 参数是以已安装的软件再安装一次;有时没有太大的必要。
测试安装参数 --test ,用来检查依赖关系;并不是真正的安装;
[root@localhost RPMS]# rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm
Preparing... ########################################### [100%]

由新版本降级为旧版本,要加 --oldpackage 参数;
[root@localhost RPMS]# rpm -qa gaim
gaim-1.5.0-1.fc4
[root@localhost RPMS]# rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm
Preparing... ########################################### [100%]
1:gaim ########################################### [100%]
[root@localhost RPMS]# rpm -qa gaim
gaim-1.3.0-1.fc4

为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中:
[root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm
Preparing... ########################################### [100%]
1:gaim ########################################### [100%]
[root@localhost RPMS]# ls /opt/
gaim

为软件包指定安装目录:要加 -relocate 参数;下面的举例是把lynx-2.8.5-23.i386.rpm 指定安装在 /opt/lynx 目录中:
[root@localhost RPMS]# rpm -ivh --relocate /=/opt/lynx --badreloc lynx-2.8.5-23.i386.rpm
Preparing... ########################################### [100%]
1:lynx ########################################### [100%]
我们安装在指定目录中的程序如何调用呢?一般执行程序,都放在安装目录的bin或者sbin目录中;看下面的例子;如果有错误输出,就做相应的链接,用 ln -s 。
[root@localhost RPMS]# /opt/lynx/usr/bin/lynx
Configuration file /etc/lynx.cfg is not available.
[root@localhost RPMS]# ln -s /opt/lynx/etc/lynx.cfg /etc/lynx.cfg
[root@localhost RPMS]# /opt/lynx/usr/bin/lynx www.linuxsir.org

2、删除一个rpm 包
首先您要学会查询rpm 包 ;请看前面的说明;
[root@localhost beinan]#rpm -e 软件包名
举例:我想移除lynx 包,完整的操作应该是:
[root@localhost RPMS]# rpm -e lynx
如果有依赖关系,您也可以用--nodeps 忽略依赖的检查来删除。但尽可能不要这么做,最好用软件包管理器 systerm-config-packages 来删除或者添加软件。
[root@localhost beinan]# rpm -e lynx --nodeps

四、导入签名:
[root@localhost RPMS]# rpm --import 签名文件
举例:
[root@localhost fc40]# rpm --import RPM-GPG-KEY
[root@localhost fc40]# rpm --import RPM-GPG-KEY-fedora
关于RPM的签名功能,详情请参见 man rpm。

五、RPM管理包管理器支持网络安装和查询
比如我们想通过 Fedora Core 4.0 的一个镜像查询、安装软件包。
地址:http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/

举例:
命令格式:
rpm 参数 rpm包文件的http或者ftp的地址

rpm -qpi http://mirrors.kernel.org/fedora/core/4/i386/os/ Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm

rpm -ivh http://mirrors.kernel.org/fedora/core/4/i386/os/ Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm

举一反三吧。

六、对已安装软件包查询的一点补充
[root@localhost RPMS]# updatedb
[root@localhost RPMS]# locate 软件名或文件名
通过updatedb,我们可以用 locate 来查询一些软件安装到哪里了;系统初次安装时要执行updatedb ,每隔一段时间也要执行一次;以保持已安装软件库最新;updatedb 是slocate软件包所有;如果您没有这个命令,就得安装slocate 。
举例:
[root@localhost RPMS]# locate gaim

七、从rpm软件包抽取文件
命令格式: rpm2cpio file.rpm |cpio -div

举例:
[root@localhost RPMS]# rpm2cpio gaim-1.3.0-1.fc4.i386.rpm |cpio -div
抽取出来的文件就在当用操作目录中的 usr 和etc中,其实这样抽到文件不如指定安装目录来安装软件来的方便;也一样可以抽出文件。为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中。

[root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm
Preparing... ########################################### [100%]
1:gaim ########################################### [100%]
[root@localhost RPMS]# ls /opt/
gaim
这样也能一目了然;gaim的所有文件都是安装在 /opt/gaim 中,我们只是把gaim 目录备份一下,然后卸掉gaim,这样其实也算提取文件的一点用法。

debian高级软件包工具-apt
APT 提供另一个简单的命令行方式, 与 dpkg 不同, 其本身不会处理 .deb 文件, 而是智能从资源库下载, 然后调用 dpkg 仅此处理. APT 是 dpkg 的一个智能前端。
dpkg 采取的方式较为保守, 当发现进一步操作可能会将问题引入系统时(比如使系统中出现了不能满足依赖关系的软件), 将拒绝执行这一操作(默认方式), APT则会根据出现的问题, 智能的给出解决方案, 并继续进行操作. 比如,安装操作出现依赖关系时, dpkg 会拒绝操作, APT 则不同, 将会自动安装这些依赖包以完成安装请求.
APT 提供另一个简单的命令行方式, 与 dpkg 不同, 其本身不会处理 .deb 文件, 而是智能从资源库下载, 然后调用 dpkg 仅此处理. APT 是 dpkg 的一个智能前端。

apt-get 指令操作
o 软体资料库同步:(apt-get update)
是『 apt-get 』指令的起点,在下达任何 『 apt-get 』 相关软体安装或升级指令前,一定得先下『 apt-get update 』指令,这会让系统依照 『 sources.list 』设定档内纪录的软体来源伺服器位置,进行软体资料库同步动作,如此才能知道目前系统上安装的软体跟伺服器上可抓取的软体版本是否一致,如不一致表示有更新版的软体可以升级或安装,接下来的『 apt-get install 、apt-get upgrade 、apt-get dist-upgrade..』才能完成后续动作。

o 软体安装:(apt-get install)
安装软体最怕的就是恼人的相依、相斥问题,但是在 Debian 里头安装软体是一件非常愉悦的事情,只要『 apt-get install package 』一行指令简简单单轻轻松松即可完成,所有相依、相斥的细节 Debian APT 系统都会帮我们处理好,您要做的就是『 Say Yes 』。

o 以安装 vim 为例:

apt-get install vim

o 软体移除:(apt-get remove)
与 install 一样,Debian 一样会帮您处理移除软体时所发生的相依问题。

o 以移除 vim 为例:

apt-get remove vim

  • 软体升级:(apt-get upgrade)
    平常我们很难顾虑到系统上所安装的数十甚至数百套软体的版本是否有新版出现,现在只要下这个指令 Debian 便会自动找出所有有新版的软体套件并逐一升级。

  • 用法:

apt-get upgrade

  • 系统升级:(apt-get dist-upgrade)
    当转移整个系统时,如 『 stable 』 转换到 『 testing 』,或是系统运行好一段时间都应该下这个指令,它会聪明的处理到很多软体相依、相斥的问题并做好系统升级的工作。

  • 用法:

apt-get dist-upgrade

  • 取得 package 原始码:(apt-get source)
    如果您想取得某个软体套件 ( packages ) 的原始码可以透过这个指令达成。

  • 以取得 vim 原始码为例:

apt-get source vim

这个功能对于程式开发者而言十分方便,当开发者遇到瓶颈时可以轻松的找寻相关的程式码来研究。

  • 清除下载回来的 .deb 档案:(apt-get clean)
    我们透过 apt-get 安装的任何软体都会先下载到『 /var/cache/apt/archives/ 』及『 /var/cache/apt/archive/partial/ 』目录底下,一般预设 apt-get 在安装完软体后是不会把上述位置底下的『 .deb 』档杀除,一段时间后您如果觉得系统空间不足,您可以下『 apt-get clean 』让系统自动清理这个目录。

debian软件包管理系统-dpkg

  1. 简单介绍dpkg
    dpkg 是 Debian 软件包管理系统的中流砥柱, 负责安装卸载软件包、配置、以及维护已安装的软件包.也是Debian系统中众多软件包管理工具的后端. 有关 dpkg 的更多介绍请参阅: http://www.dpkg.org

dpkg 通过数据库来维护系统中软件, 这包括文件清单, 依赖关系, 软件状态, 等等详细的内容, 通常在/var/lib/dpkg目录下. 并确保系统与数据库的情况相一致.因此,dpkg在处理程序时非常健壮,和优秀。

  1. dpkg的构成
    dpkg 在处理软件包时, 首先要判断是否会引起系统的混乱, 当发现可能出现时, dpkg 将拒绝安装此软件, 而不是自作主张将软件装入系统, 然后把烂摊子扔给用户了之。dpkg是一个庞大的家族, 不仅提供了大量的参数选项, 同时也提供了许多子命令比如:
    dpkg-deb
    dpkg-divert
    dpkg-query
    dpkg-split
    dpkg-statoverride
    start-stop-daemon
    ...
    本文档不是 dpkg 的 manpage, 将不会对所有的参数和子命令加以介绍, 同时记住所有参数也是相当痛苦的事情, 在这里只对常用参数和命令做示例性介绍。dpkg 涵盖了 dpkg 家族的大部分功能, 因此dpkg可以作为一个多合一(ALL-IN-ONE)的软件使用,以更好的使用 dpkg 家族的全部功能.。

  2. deb软件包命名规则:
    Debian软件包命名遵循下列约定: <软件包名称><版本>-<修订号><平台>.deb

  • 软件包名称(Package Name):
  • 版本(Version Number):
  • 修订号(Build Number):
  • 平台(Architecture):
    o i386
    o all: 平台无关. 即适用于所有平台.比如文本, 网页, 图片, 媒体, pdf 等。

例如

  • nano_1.3.10-2_i386.deb
    o 软件包名称: nano
    o 版本: 1.3.10
    o 修订号: 2
    o 平台: i386
  1. 软件包处理
    (注:本文的中的操作以nano为例)
    dpkg-deb : 用于处理本地Debian软件包. 可以提取从.deb文件中提取软件包信息和数据. 详细信息,请参阅 dpkg-deb 的联机手册.
  • 列出软件包的内容:
    tony@tony:~/doc/dpkg$ dpkg-deb -c nano_1.3.10-2_i386.deb |more
    drwxr-xr-x root/root 0 2006-02-05 00:29:18 ./
    drwxr-xr-x root/root 0 2006-02-05 00:29:07 ./etc/
    -rw-r--r-- root/root 11887 2006-02-05 00:29:07 ./etc/nanorc
    drwxr-xr-x root/root 0 2006-02-05 00:29:14 ./usr/
    drwxr-xr-x root/root 0 2006-02-05 00:29:12 ./usr/share/
    drwxr-xr-x root/root 0 2006-02-05 00:29:01 ./usr/share/doc/
    drwxr-xr-x root/root 0 2006-02-05 00:29:15 ./usr/share/doc/nano/
    -rw-r--r-- root/root 1847 2005-08-30 02:29:02 ./usr/share/doc/nano/AUTHORS
    -rw-r--r-- root/root 2338 2005-03-20 05:33:13 ./usr/share/doc/nano/README
    -rw-r--r-- root/root 3175 2005-11-21 17:36:11 ./usr/share/doc/nano/THANKS
    -rw-r--r-- root/root 2206 2005-06-08 10:28:06 ./usr/share/doc/nano/TODO
    -rw-r--r-- root/root 1066 2003-03-24 21:09:26 ./usr/share/doc/nano/UPGRADE
    -rw-r--r-- root/root 35996 2005-11-22 05:45:07 ./usr/share/doc/nano/faq.html
    ... ...

  • 查看软件包的信息
    tony@tony:~/doc/dpkg$ dpkg-deb -I nano_1.3.10-2_i386.deb
    new debian package, version 2.0.
    size 477372 bytes: control archive= 2656 bytes.
    12 bytes, 1 lines conffiles
    714 bytes, 18 lines control
    3529 bytes, 51 lines md5sums
    613 bytes, 21 lines * postinst #!/bin/sh
    160 bytes, 5 lines * postrm #!/bin/sh
    379 bytes, 20 lines * preinst #!/bin/sh
    288 bytes, 14 lines * prerm #!/bin/sh
    Package: nano
    Version: 1.3.10-2
    Section: editors
    Priority: important
    Architecture: i386
    Depends: libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)
    Suggests: spell
    Conflicts: nano-tiny (<= 1.0.0-1), pico
    Replaces: pico
    Provides: editor
    Installed-Size: 1108
    Maintainer: Jordi Mallach jordi@debian.org
    Description: free Pico clone with some new features
    GNU nano is a free replacement for Pico, the default Pine editor. Pine is
    copyrighted under a restrictive licence, that makes it unsuitable for
    Debian's main section. GNU nano is an effort to provide a Pico-like
    editor, but also includes some features that were missing in the original,
    such as 'search and replace', 'goto line' or internationalization support.

  • 重新构建软件包
    比如nano(1.3.10)需要满足以下依赖关系:
    $ dpkg-deb -f nano_1.3.10-2_i386.deb depends //depends 为对应查询段
    libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)

当系统不能满足依赖关系, 比如不能满足里来版本, 可以通过下边的方法处理, 当然这种情况下安装的nano并不一定运行正常, 这种方法可以应用于某些软件的变通安装.
$ mkdir nano //创建nano目录
$ dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN //解压控制文件
$ dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano //解压程序文件
$ vi ./nano/DEBIAN/control //修改控制信息
$ dpkg-deb -b nano nano_1.3.10-2_ill.deb //重新打包

  1. 数据库查询
    当前版本的 dpkg 使用文本文件来作为数据库.通称在 /var/lib/dpkg 目录下. 通称在 status 文件中存储软件状态,和控制信息. 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码。体验使用数据库的时刻到了:$ dpkg -l
    Desired=Unknown/Install/Remove/Purge/Hold
    | Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
    |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
    ||/ Name Version Description
    +++-===========-================-========================================
    ii aalib1 1.4p5-28 ascii art library - transitional package
    ii adduser 3.85 Add and remove users and groups
    ii alien .63 install non-native packages with dpkg
    ... ...

每条记录对应一个软件包, 注意每条记录的第一, 二, 三个字符. 这就是软件包的状态标识, 后边依此是软件包名称, 版本号, 和简单描述。

  • 第一字符为期望值,它包括:
    o u 状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
    o i 用户请求安装软件包.
    o r 用户请求卸载软件包.
    o p 用户请求清除软件包.
    o h 用户请求保持软件包版本锁定.
  • 第二列,是软件包的当前状态.此列包括软件包的六种状态.
    o n 软件包未安装.
    o i 软件包安装并完成配置.
    o c 软件包以前安装过,现在删除了,但是它的配置文件还留在系统中.
    o u 软件包被解包,但还未配置.
    o f 试图配置软件包,但是失败了.
    o h 软件包安装,但是但是没有成功.
  • 第三列标识错误状态,可以总结为四种状态. 第一种状态标识没有问题,为空. 其它三种符号则标识相应问题.
    o h 软件包被强制保持,因为有其它软件包依赖需求,无法升级.
    o r 软件包被破坏,可能需要重新安装才能正常使用(包括删除).
    o x 软包件被破坏,并且被强制保持.

也可以以统配符模式进行模糊查询, 比如我要查找以nano字符开始的所有软件包:
$ dpkg -l nano*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-==============-==============-============================================
ii nano 1.3.10-2 free Pico clone with some new features
pn nano-tiny <none> (no description available)
un nanoblogger <none> (no description available)

以上状态说明: 系统中安装了 nano 版本为 1.3.10-2;安装过 nano-tiny, 后来又清除了; 从未安装过nanoblogger.如果觉得 dpkg 的参数过多, 不利于记忆的话, 完全可以使用 dpkg-query 进行 dpkg 数据库查询.

应用范例:

  • 查询系统中属于nano的文件:
    $ dpkg --listfiles nano
    or
    $ dpkg-query -L nano

  • 查看软件nano的详细信息:
    $ dpkg -s nano
    or
    $ dpkg-query -s nano

  • 查看系统中软件包状态, 支持模糊查询:
    $ dpkg -l
    or
    $dpkg-query -l

  • 查看某个文件的归属包:
    $ dpkg-query -S nano
    or
    $ dpkg -S nano

  1. 安装软件包
    运行下面的命令:
    $dpkg -l nano
    un nano <none> (no description available)
    当前 nano 的状态说明在系统中从未安装过 nano 软件包, 可以通过以下命令安装本地的 nano 包:
    $dpkg-deb -e ./nano_1.3.10-2_i386.deb
    当使用 dpkg 安装软件包时, 主要分为两个阶段: 首先解包; 然后运行postinst控制脚本(如果有的话),这就是所谓的配置阶段. 当完成软件包当解包后, dpkg 的--intall选项自动调用配置阶段. 注意, 操作时应当指定 .deb 文件的实际路径, 仅仅给出文件名无法找到对应文件.这样, 软件的安装就可被拆分为两个对立的过程:
  • dpkg --unpack
  • dpkg --configure
    解包、运行

dpkg --unpack nano_1.3.10-2_i386.deb

然后
$ dpkg -l nano
iU nano 1.3.10-2 free Pico clone with some new features
说明此时系统中安装了nano 包, 但是未经配置.解包可能包括一下步骤:

  • 将控制文件解压到临时目录.
  • 运行 preinst(如果有的话). 通常为停止相关服务.
  • 解压配置文件到 /etc 目录, 并添加.dpkg-new 后缀, 以防止冲突.
  • 解压 data.tar.gz 到系统根目录,(--root=dir).
  • 将控制文件解压到 /var/lib/dpkg/info 目录并添加软件名前缀. 对数据库进行更新.
  • 数据库中将软件包的状态设置为"unpacked".

仅仅解包, 并不能确保软件可以正常运行.
配置

dpkg --configure nano

$ dpkg -l nano
ii nano 1.3.10-2 free Pico clone with some new features

如输出所示, nano 已经正常安装.
软件解包后, 还需要对其进行调整, 比如根据实际情况对配置文件进行修改. 这一步通常是在安装过程中自动进行的, 当然可以手动调用, 这次用到的是软件名, 而不是deb文件名.

通过命令 dpkg -L nano 可以得以验证,这一过程可能包括一下步骤:

  • 询问对配置文件的处理方法, 覆盖当前版本, 还是不做处理.(当软件升级时会碰到这种情况)
  • 运行 postinst 脚本
  • 将软件包标记为 "installed"

如果想再次修改配置选项, 可以运行:

dpkg-reconfigure nano

  1. 软件卸载
    在 Debian中卸载和清除软件包是两个不同的概念. 不同之处在于软件包被删除(卸载)后,它的配置文件仍会留在系统中,只有清除时才会删除它们. 默认情况下, Debian 仅会做删除操作, 除非你明确指出, 才会将配置文件删除. 如果要清除软件包, 则在清除前将会隐含地执行删除操作。

要删除一个软件包,dpkg需要使用--remove选项将软件包卸载.与安装不同,删除只需要软件包名,而不是实际的deb文件名。

删除

dpkg -r nano

  • 首先运行 prerm 脚本(如果有的话).
  • 然后, 保留配置文件, 其他文件全部删除.
  • 删除 /var/lib/dpkg/info 目录下软件包的所有配置文件, 保留postrm和list文件.
  • 最后, dpkg 在数据库中将软件状态修改为删除.

运行
$dpkg -l nano
rc nano 1.3.10-2 free Pico clone with some new features

清除

dpkg -P nano

  • 删除所有的文件. 所有的文件都被解除了(从系统中删除了).
  • 运行postrm脚本.如果还存在,运行postrm脚本.
  • 删除 postrm 和 list 文件.保留的两个文件,从系统中解除postfix.postrm和postfix.files.
  • 在dpkg的数据库中将软件包标记为未安装

$dpkg -l nano
pn nano <none> (no description available)

注意输出的状态: pn 这意味着软件包实际上是被清除了,但是在数据库中还有这个软件包的记录.因此,pn 明确指出以前安装过 nano, 在软件包数据库中出现过,并且现在已被完全清除.

  1. 异常处理
    有时,因为不能满足依赖关系, 或存在冲突, 文件会被覆盖, 或控制脚本中存在错误而安装失败. 在 stable 发行版中从不会存在这类问题(这被视为重大错误). 但是, 在运行 unstable 发行版的系统中,有时却是难免的.

处理文件冲突
dpkg 不会允许一个软件包覆盖属于其它软件包的文件.可以强制dpkg覆盖属于其它软件包的软件(使用 --force-overwrite), 但是这样做十分危险. 如果这只是暂时的冲突(在 unstable 中, 这种情况常有), 覆盖没有太大问题。请注意, 遇到这种情况应该向软件包的维护者提交相关错误报告.如果你使用的是非官方包, 或是通过 alien 或 checkinstall自己构建的软件包, 那么应该对包内文件改名, 或者放弃使用这类软件包。处理在安装过程中控制脚本脚本出现了问题. 问题脚本是出现问题的另一原因. 如果, 软件包的 postinst 控制文件中有错误,那么就无法用 dpkg 完成对这个软件包的配置。
这种错误一定要作为严重问题向错误跟踪系统提交报告.象这种脚本的问题,自己对其进行调试, 以判断问题所在, 比如您可以简单的在脚本的第一行以后插入 set -x, 对其运行情况进行跟踪.除非必要, 您也应该拒绝使用这类软件包。

处理卸载过程中损坏的控制文件
当软件包的卸载脚本出现问题时.即使您可以强制删除控制脚本没有清除干净的文件,这也会妨碍dpkg正确的维护您的系统,从而有可能在系统中留下垃圾文件. 对于这类问题, 还没有太好的处理方法(强烈建议您提交错误报告), 唯有等待软件更新(或自行对软件包包修复). 然后借助更新包将相关文件卸载。


mandriva软件包管理工具—urpm*
1.什么是urpm
"urpm" ('User RPM') 起源于 Mandrake 7.0时代的 rpmdrake!原本就是用来个在线更新的功能!特色是自动的处理掉函式库相容的问题,帮您快速的安装或移除软件!

2.urpmi 运作方式
取得来源软件档案来源
产生列表
抓取档案
处理兼容性问题
抓取其它相容档案
安装所有元件

看起来很覆杂吧!但是这些过程大概看一下就好你不需要记,总而言之Mandrake 会帮你处理掉很多的工作!

以下是urpm系列的相关指令
urpme
urpmi.addmedia
urpmi.update
urpmf
urpmi.removemedia
urpmq
urpmi
urpmi_rpm-find-leaves
等一下我们一一介绍!

3.媒体管理
什么叫媒体管理,就是管理来源的煤体在您使用 8.1,或8.2的系统时.大概已经新增了几个媒体,
也就是安装光盘!当你用 xwindow 设定打印机,或是档案分享时,第一次他会要求你放入 "第x片光盘"
这就是他正在运作urpm系统了哦!

首先我们看看我们的几个媒体!

urpmi.removemedia

缺少了须要删除的项目
(xxx cd1,xxx cd2 , xxx cd3,xxx cd4 的其中一个)

第三片光盘包含 RPMS3及RPMS4
所以在装好时有四个媒体 (Powerpack 的话会比较少 )

首先我们先新增一个媒体
语法说明: urpmi.addmedia [选项] [名称] [位置] [其它相对应关系]

先谈一下关于Mandrake 相关档案的ftp站台的习惯!
Mandrake 习惯把 升级档 放在 ftp://path/to/Mandrake/版本/updates/RPMS " 下
一些发展中的套件会放在Cooker中 .

我们先把一个更新的目录加入吧!

urpmi.addmedia update ftp://mdk.linux.org.tw/pub/mandrake/updates/8.2/RPMS/

with ../base/hdlist.cz

执行之后系统会自动连结到所在的位置读取所有的相关档案
注: ../base/hdlist.cz 是习惯!大概不会去更动他放在
ftp://mdk.linux.org.tw/pub/mandrake/updates/8.2/base/hdlist.cz
(只有ftp 及http方式需要)
这样一个叫 update 的媒体柜就完成了!
如果我们要把这一个移除的话只需要打上

urpmi.removemedia updates

我们也可以把本机的目录的加入哦!
先把 所有下载的rpm
例如: kde3的相关套件放到/mnt/kde3

接下来新增一个目录

urpmi.addmedia kde3 file://mnt/kde3

这样就会自动产生一个kde3的媒体柜啦..
是不是很简单呢?当然你也可以像预设安装的一样使用可移除装置,例如 cdrom flappy.....(可能要先mount 好才行)。用法如下:

urpmi.addmedia Othercd removable://mnt/cdrom

接下来对方的ftp站台会不断的更新资料!
所以我们最好在安装前确认是否有较新的版本可以下载,更新的方式如下
urpmi.update [媒体名称]
例:

urpmi.update kde3

说到这里 我们的管理媒体的部份是谈完了!

4.urpm 系列使用
接下来我们开始使用urpm 系列了!
如果您使用过rpm的话.
您大概会记得

安装软件为 : rpm -i
移除软件为 : rpm -e
所以您也没有什么好想的!

urpmi 就是安装
urpme 就是移除
urpmf 搜寻
urpmq 就是安装查询

urpm e,f,q 这三个大概没有什么好说的大緻上和urpmi 一样,所以我们只谈 urpmi。

urpm 系统的软件管理方式有搜寻的功能
例如 :

urpmi m

他会把出安装档名中有m的所有套件出来
如果你的关键刚好是唯一的值,例如:php-mysql
他就会开始进入下一个安装画面~

或者你的目录中 有这一个rpm档案也可以直接下

urpmi /path/to/rpmsile

例:

urpmi acroread-5.0.5-1mdk.i586.rpm

这样是不是很清楚了呢!接下来我们谈一些特殊的情形!如果我们要安装整个系列的套件,例如 php,mozilla我们可以直接下

urpmi -a mozilla

这样所有关于mozilla的元件都将会被安装:
例如 mozilla ,mozilla-mail,mozilla-irc .....。

有时候我们用旧式的rpm在进行安装时经当会发生
缺少了那一个函式库的状况!
这时候urpmi可大大的派上用埸了!
我们可以使用

urpmi -p [函式库]

他就会帮您找到这一个函式库相关的套件了哦!
例:

urpmi -p libe2p.so.2

urpme和 urpmi的用法完全相同

谈到这里大家大概可以了解,为什么许的的Mandrake 使用者可以很快速的更新到最新的版本!

5.其它设定及运作说明
1.自动化的缺点
你有想过当你升级某些元件时,整个系统设定全都变乱,中文不见,无法开机.不可预期 ....所以这个时候我们在升级时必须特别小 心!当然发展 urpmi 的Mandrake早想到了这一点,所以为了避免这种情形,我们必须先告訢系统,如果碰到那一些套件不进行升级。

修改 : /etc/urpmi/skip.list
将您不进行升级的名称写入:
建议您不要让他自己升级kernel及glibc,所以把这二行加进去吧
kernel
glibc

  1. urpmi 好慢
    用 过urpmi的人大概会觉得当系统安装矢败时!
    为什么还要重新抓取档案一次~!
    我猜是为了节约空间吧,总不能把升级好的元件留在系统吧.,如果你觉得这样太慢了,而且不想再浪费一次频宽,建议你可以先把 这些rpm copy 出来,要执行 urpmi 时再把他copy回 cache的目录。
    目录在 /var/cache/urpmi/rpms/

3.Xwindow 模式
如果你有在玩xwindow的话.mandrake 内建了一个管理介面可以让您快速的完成多个项目!有兴趣的话可以找找选单!"software manager"

gentoo软件包管理系统—emerge
emerge命令介绍

每个条目下列的两条指令是等效的
options都可以组合使用。

避免升级覆盖掉版本更高的软件
emerge -uU world
emerge --update --upgradeonly world

查找名称包含mozilla的包
emerge -s mozilla
emerge search mozilla

查找描述包含mozilla
emerge -S mozilla
emerge --searchdesc mozilla

使用本地编好的包,没有就下源码(尽量避免编译)
emerge -k mozilla
emerge --usepkg mozilla

只使用本地编好的,否则不安装(绝对不编译,所有依赖的包都有binary才装)
emerge -K mozilla
emerge --usepkgonly mozilla

卸载
emerge -C mozilla
emerge unmerge mozilla

升级portage树
emerge sync

下载snapshot包来完成sync
emerge-webrsync

查看已安装包的changelog
emerge -pl mozilla
emerge --pretend --changelog mozilla

查看依赖关系(这个包还没装)
(--pretend保证这一次操作实际上不做任何事情,可以跟任何options组合)
emerge -p mozilla
emerge --pretend mozilla

只下载某个软件的源码(以及它所依赖的)
emerge -f mozilla
emerge --fetchonly mozilla

查看从哪下的源码
emerge -fp mozilla

安装指定版本号的
emerge "<mozilla-1.6"
emerge "=..........."
.......">..........."

emerge -k "<mozilla-1.6".....

从网上下binary包来装
emerge -g mozilla
emerge --getbinpkg mozilla
(注意,实际上没有任何binary包存在于官方的mirror中所以这个基本上是无用,在manpage也没有出现。除非自己用livecd来setup一个这样的站点。不知道以后会不会出现这样的mirror。gentoo.org论坛上似乎也有讨论这个。)

查看binary包依赖
emerge -gp mozilla
emrege --getbinpkg --pretend mozilla

查看依赖关系(这个包已经装了)
emerge -ep opera
emerge --emptytree --pretend opera
(不用pretend会重新编译这所有依赖的包,glibc因为安全关系没有列出)

不使用依赖关系安装软件
emerge -O opera
emerge --nodeps opera

只安装其依赖的软件
emerge -o opera
emerge --onlydeps opera

升级软件
emerge -u opera
emerge --update opera

升级系统软件
emerge -u system

升级整个系统
emerge -u world

避免升级覆盖掉版本更高的软件
emerge -uU world
emerge --update --upgradeonly world

推荐阅读更多精彩内容