Linux从2000年开始流行起来软件包安装的方式,最主流为rpm与deb两大派系,时至2020年,包安装方式已经成为主流(还带来了类似的应用商店的源站特性),如今在日常使用中已经鲜有使用软件源码包的安装方式了(除开部分特定场合或需求);本文以2012年为时间界限,总结了2012年前后Linux系统下的软件包管理方式,2012年后的参考了钱魏Way的文章,向原作者致敬。


2012年前的软件包管理解决方案
2012年后的软件包管理解决方案


2012年前的软件包管理解决方案


使用 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 』让系统自动清理这个目录。


以下是apt-get是经常会用到的参数:

-d, --download-only 仅仅是下载该软件包

-m, --ignore-missing, --fix-missing  忽视丢失的包

--no-download        Disables downloading of packages

-y, --yes, --assume-yes    在安装过程中,自动回答yes

--assume-no                  在安装过程中,自动回答no

-u, --show-upgraded       显示哪些包会被升级

--reinstall                      重装已经安装的包

--purge                        remove并且删除配置文件

--allow-unauthenticated   忽略包的认证机制



debian软件包管理系统-dpkg

1. 简单介绍dpkg

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


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


2. 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 家族的全部功能.。


3. 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


4. 软件包处理

(注:本文的中的操作以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 //重新打包


5. 数据库查询

当前版本的 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


6. 安装软件包

运行下面的命令:

  $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


7. 软件卸载

在 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, 在软件包数据库中出现过,并且现在已被完全清除.


8. 异常处理

有时,因为不能满足依赖关系, 或存在冲突, 文件会被覆盖, 或控制脚本中存在错误而安装失败. 在 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


2. 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



下面是yum与apt软件包管理常用命令对比


YUM包管理

APT包管理

备注

yum install package-name

apt-get install package-name

安装软件包

yum remove package-name

apt-get remove package-name

卸载软件包(保留配置文件)加入 --purge 则删除配置文件

yum upgrade

apt-get upgrade

更新所有已安装的软件包,apt-get dist-upgrade -- 将系统升级到新版本

yum clean package-name

apt-get clean

清除cache中包文件

yumdownloader source package-name

apt-get source package-name

下载程序的源代码包

yum search package-name

apt-cache search package-name

在软件资料库中搜索软件包

yum info  package-name

apt-cache show package-name

查看包信息


下面是rpm与dpkg软件包管理常用命令对比


RPM包管理

Debian包管理

备注

rpm  -qa

dpkg -l

查询当前系统中已安装的所有软件包

rpm  -qi package-name

dpkg -s package-name

查询系统中某个软件包的详细信息

rpm  -ql package-name

dpkg -L package-name

显示已安装软件包的文件列表

rpm  -qf file

dpkg -S file

查询系统中指定的文件属于哪个包

rpm  -qpi file.rpm

dpkg -I pkg.deb

显示指定deb软件包文件的详细信息

rpm  -qlp file.rpm

dpkg -c pkg.deb

显示deb包中的文件列表

rpm  -ivh file.rpm

dpkg -i pkg.deb

安装deb软件包

rpm  -e package-name

dpkg -P package-name

彻底卸载deb软件包

rpm2cpio file.rpm|cpio -id

dpkg -x pkg.deb .

解包到当前目录

rpm -qpR file.rpm

apt-cache depends package-name

查询软件对环境的依赖关系

rpm --force --nodpes -i file.rpm

dpkg -i --force-all pkg.deb

强行安装软件包

rpm -qp --scripts file.rpm

dpkg -e pkg.deb 

查询管理软件包脚本

rpmbuild -bb filename.spec

dpkg -b pkg.deb

建软件包

rpm -V package-name

debsums -a package-name

校建软件包中的文件是否被修改

rpm -checksig file.rpm

debsig -c pkg.deb

检证软件包签名是否正确




2012年后的软件包管理解决方案



软件包(package)这个概念是用来解决在软件安装、升级过程中的复杂性的。包将软件安装升级中需要的多个数据文件合并成一个单独的文件,这将便于传输和(通过压缩文件来)减小存储空间,包中的二进制可执行文件已根据开发者所选择的编译标识预编译。包本身包括了所有需要的元数据,如软件的名字、软件的说明、版本号,以及要运行这个软件所需要的依赖包等等。


不同流派的 Linux 发行版都创造了它们自己的包格式,其中最常用的包格式有:

.deb:这种包格式由 Debian、Ubuntu、Linux Mint 以及其它的变种使用。这是最早被发明的包类型。

.rpm:这种包格式最初被称作 红帽包管理器(Red Hat Package Manager)(LCTT 译注: 取自英文的首字母)。使用这种包的 Linux 发行版有 Red Hat、Fedora、SUSE 以及其它一些较小的发行版。

.tar.xz:这种包格式只是一个软件压缩包而已,这是 Arch Linux 所使用的格式(LCTT 译注:这种格式无需特别的包管理器,解压即可)。


尽管上述的包格式自身并不能直接管理软件的依赖问题,但是它们的出现将 Linux 软件包管理向前推进了一大步。


多年以前,非 Linux 世界的用户是很难理解软件仓库的概念的。但智能手机传播了软件商店(AppStore/应用)市场这样一个概念,其用户获取软件的方式和包管理器的工作方式已经非常相近了。些许不同的是,尽管大多数软件商店还在费力美化它的图形界面来吸引用户,大多数 Linux 用户还是愿意使用命令行来安装软件。总而言之,软件仓库是一个中心化的可安装软件列表,上面列举了在当前系统中预先配置好的软件仓库里所有可以安装的软件。


在Linux发行版中,几乎每一个发行版都有自己的包管理器。常见的有:

Debian的dpkg以及它的

    前端apt(使用于Debian、Ubuntu)。

Red Hat的RPM包管理器以及它的

    前端dnf(使用于Fedora、 CentOS 8)

    前端yum(使用于Red Hat Enterprise Linux、CentOS 7及以下)

    前端ZYpp(使用于openSUSE)

    前端urpmi(使用于Mandriva Linux、Mageia)

其他包管理器有

    ArchLinux中使用的Pacman

    Gentoo使用的基于源代码的Portage

    Mac系统下的Homebrew等


使用包管理器将大大简化在Linux发行版中安装软件的过程。


有了包管理器为什么还要有其前端工具?


包管理器如RPM与DPKG只能做到检查相依性,在安装或移除时告知相依性的不满足,接下来就需要用户自行去找出所需的组件来安装。这样非常不方便,为了实现可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装,前端工具如APT及YUM就诞生了。



DEB系的包管理器


dpkg


dpkg 是Debian Packager的简写。为 Debian专门开发的套件管理系统,方便软件的安装、更新及移除。软件都是以.deb结尾的编译好的二进制包。所有源自“Debian”的“Linux ”发行版都使用 “dpkg”,例如“Ubuntu”、“Knoppix ”等。


常用命令:

1)安装软件

命令:dpkg -i <.deb file name>

示例:dpkg -i avg71flm_r28-1_i386.deb


2)安装一个目录下面所有的软件包

命令:dpkg -R

示例:dpkg -R /usr/local/src


3)释放软件包,但是不进行配置

命令:dpkg –-unpack package_file 如果和-R一起使用,参数可以是一个目录

示例:dpkg –-unpack avg71flm_r28-1_i386.deb


4)重新配置和释放软件包

命令:dpkg –configure package_file

如果和-a一起使用,将配置所有没有配置的软件包

示例:dpkg –configure avg71flm_r28-1_i386.deb


5)删除软件包(保留其配置信息)

命令:dpkg -r

示例:dpkg -r avg71flm


6)替代软件包的信息

命令:dpkg –update-avail


7)合并软件包信息

dpkg –merge-avail


8)从软件包里面读取软件的信息

命令:dpkg -A package_file


9)删除一个包(包括配置信息)

命令:dpkg -P


10)丢失所有的Uninstall的软件包信息

命令:dpkg –forget-old-unavail


11)删除软件包的Avaliable信息

命令:dpkg –clear-avail


12)查找只有部分安装的软件包信息

命令:dpkg -C


13)比较同一个包的不同版本之间的差别

命令:dpkg –compare-versions ver1 op ver2


14)显示帮助信息

命令:dpkg –help


15)显示dpkg的Licence

命令:dpkg –licence (or) dpkg –license


16)显示dpkg的版本号

命令:dpkg –version


17)建立一个deb文件

命令:dpkg -b directory [filename]


18)显示一个Deb文件的目录

命令:dpkg -c filename


19)显示一个Deb的说明

命令:dpkg -I filename [control-file]


20)搜索Deb包

命令:dpkg -l package-name-pattern

示例:dpkg -I vim


21)显示所有已经安装的Deb包,同时显示版本号以及简短说明

命令:dpkg -l


22)报告指定包的状态信息

命令:dpkg -s package-name

示例:dpkg -s ssh


23)显示一个包安装到系统里面的文件目录信息

命令:dpkg -L package-Name

示例:dpkg -L apache2


24)搜索指定包里面的文件(模糊查询)

命令:dpkg -S filename-search-pattern


25)显示包的具体信息

命令:dpkg -p package-name

示例:dpkg -p cacti


apt


APT(全称为Advanced Packaging Tools)与 YUM对应, 是Linux下的一款安装包管理工具。APT由几个名字以“apt-”打头的程序组成。apt-get、apt-cache 和apt-cdrom是处理软件包的命令行工具。


常用命令:

apt-cache search package #搜索包

apt-cache show package #获取包的相关信息,如说明、大小、版本等

apt-cache depends package #了解使用依赖

apt-cache rdepends package #查看该包被哪些包依赖

apt-get source package #下载该包的源代码

sudo apt-get install package #安装包

sudo apt-get install package=version #安装指定版本的包

sudo apt-get install package --reinstall #重新安装包

sudo apt-get -f install #修复安装, "-f = --fix-missing"

sudo apt-get remove package #删除包

sudo apt-get remove package --purge #删除包,包括删除配置文件等

sudo apt-get update #更新apt软件源信息

sudo apt-get upgrade #更新已安装的包

sudo apt-get dist-upgrade #升级系统

sudo apt-get dselect-upgrade #使用dselect升级

sudo apt-get build-dep package #安装相关的编译环境

sudo apt-get clean && sudo apt-get autoclean #清理无用的包

sudo apt-get check #检查是否有损坏的依赖

apt与apt-get命令的区别


Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。那么,apt-get 与 apt 命令之间到底有什么区别呢?如果它们有类似的命令结构,为什么还需要新的 apt 命令呢?是否 apt 真的比 apt-get 更好?普通用户应该使用新的 apt 命令还是坚持旧有习惯继续使用 apt-get 呢?


在开始对比 apt 与 apt-get 命令的区别之前,我们先来看看这两个命令的背景,以及它们要试图达到的目的。Debian 作为 Ubuntu、Linux Mint 和 elementary OS 等 Linux 操作系统的母板,其具有强健的「包管理」系统,它的每个组件和应用程序都内置在系统中安装的软件包中。Debian 使用一套名为 Advanced Packaging Tool(APT)的工具来管理这种包系统,不过请不要把它与 apt 命令混淆,它们之间是其实不是同一个东西。在基于 Debian 的 Linux 发行版中,有各种工具可以与 APT 进行交互,以方便用户安装、删除和管理的软件包。apt-get 便是其中一款广受欢迎的命令行工具,另外一款较为流行的是 Aptitude 这一命令行与 GUI 兼顾的小工具。


如果你已阅读apt-get 命令指南,可能已经遇到过许多类似的命令,如apt-cache、apt-config 等。如你所见,这些命令都比较低级又包含众多功能,普通的 Linux 用户也许永远都不会使用到。换种说法来说,就是最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项。简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。


通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以「让终端用户满意」的方式来处理 Linux 软件包的有效方式。apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt 命令安装或删除程序时看到进度条。apt 还会在更新存储库数据库时提示用户可升级的软件包个数。如果你使用 apt 的其它命令选项,也可以实现与使用 apt-get 时相同的操作。


虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。也就是说,可以用 apt 替换部分 apt-get 系列命令,但不是全部。


apt 命令

取代的命令

命令的功能

apt install

apt-get install

安装软件包

apt remove

apt-get remove

移除软件包

apt purge

apt-get purge

移除软件包及配置文件

apt update

apt-get update

刷新存储库索引

apt upgrade

apt-get upgrade

升级所有可升级的软件包

apt autoremove

apt-get autoremove

自动删除不需要的包

apt full-upgrade

apt-get dist-upgrade

在升级软件包时自动处理依赖关系

apt search

apt-cache search

搜索应用程序

apt show

apt-cache show

显示装细节



当然,apt 还有一些自己的命令:

新的apt命令

命令的功能

apt list

列出包含条件的包(已安装,可升级等)

apt edit-sources

编辑源列表



需要大家注意的是:apt 命令也还在不断发展, 因此,你可能会在将来的版本中看到新的选项。


目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。既然两个命令都有用,那么我该使用 apt 还是 apt-get 呢?作为一个常规 Linux 用户,建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。


RPM系包格式的包管理器


rpm


RPM包管理员(简称RPM,全称为The RPM Package Manager或Redhat Package Manager)是在Linux下广泛使用的软件包管理器。使用RPM的发行版:

Fedora和Red Hat Enterprise Linux

openSUSE和SUSE Linux Enterprise

Mandriva Linux和Mageia

PCLinuxOS


RPM软件包分为二进制包(Binary)、源代码包(Source)和Delta包三种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。RPM仅适用于安装用RPM来打包的软件,目前是GNU/Linux下软件包资源最丰富的软件包类型之一。


rpm的常用命令:

1)安装软件包

rpm -ivh PACKAGE_NAME-VERSION.rpm


2)测试安装软件包,不做真实的安装

rpm -ivh --test PACKAGE_NAME-VERSION.rpm


3)安装软件包,并重新定义安装路径

rpm -ivh --relocate /=/usr/local/PACKAGE_NAME PACKAGE_NAME-VERSION.rpm


4)强行安装软件包,忽略依赖关系

rpm -ivh PACKAGE_NAME-VERSION.rpm --force --nodeps


5)升级软件包

rpm -Uvh PACKAGE_NAME-VERSION.rpm


6)强行升级软件包,忽略依赖关系

rpm -Uvh PACKAGE_NAME-VERSION.rpm --force --nodeps


7)删除软件包,并忽略依赖关系

rpm -e PACKAGE_NAME --nodeps #只是包名,不需要跟版本号


8)导入签名

rpm --import RPM-GPG-KEY


9)查询某个包是否已经安装

rpm -q PACKAGE_NAME


10)查询系统中所有已安装的包

rpm -qa


11)查询某个文件属于哪个包

rpm -qf /etc/auto.misc


12)查询某个已安装软件所包含的所有文件

rpm -ql PACKAGE_NAME


13)查询某个包的依赖关系

rpm -qpR PACKAGE_NAME-VERSION.rpm


14)查询某个包的信息

rpm -qpi PACKAGE_NAME-VERSION.rpm


15)删除软件包

rpm -e PACKAGE_NAME


yum


yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系。在建立好yum服务器后,yum客户端可以通过http、ftp方式获得软件包,并使用方便的命令直接管理、更新所有的rpm包,甚至包括kernel的更新。


yum的常用命令:

1.安装yum包:

$ yum install PACKAGE_NAME


2.删除yum包:

$ yum remove PACKAGE_NAME


3.重新安装一个yum包:

$ yum reinstall PACKAGE_NAME


4.搜索yum包:

$ yum search PACKAGE_NAME


5.显示yum包的信息:

$ yum info PACKAGE_NAME


6.更新安装的yum包:

$ yum update


7.更新具体的yum包:

$ yum update PACKAGE_NAME


8.显示yum历史:

$ yum history


9.显示已启用的yum存储库的列表:

$ yum repolist


10.找出哪个yum包提供了一个特定的文件(例如:/usr/bin/nc)):

$ yum whatprovides "*bin/nc"


11.清除yum缓存:

$ yum clean all


查询相关:

1.使用YUM查找软件包

命令:yum search ~


2.列出所有可安装的软件包

命令:yum list


3.列出所有可更新的软件包

命令:yum list updates


4.列出所有已安装的软件包

命令:yum list installed


5.列出所有已安装但不在Yum Repository內的软件包

命令:yum list extras


6.列出所指定软件包

命令:yum list ~


7.使用YUM获取软件包信息

命令:yum info ~


8.列出所有软件包的信息

命令:yum info


9.列出所有可更新的软件包信息

命令:yum info updates


10.列出所有已安裝的软件包信息

命令:yum info installed


11.列出所有已安裝但不在Yum Repository內的软件包信息

命令:yum info extras


12.列出软件包提供哪些文件

命令:yum provides~


dnf


DNF 是新一代的rpm软件包管理器。它首现于 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。


dnf的常用命令:

1. 查看 DNF 包管理器版本

# dnf –version


2.查看系统中可用的 DNF 软件库

# dnf repolist


3.查看系统中可用和不可用的所有的 DNF 软件库

# dnf repolist all


4.列出所有 RPM 包

# dnf list


5.列出所有安装了的 RPM 包

# dnf list installed


6.列出所有可供安装的 RPM 包

# dnf list available


7.搜索软件库中的 RPM 包

# dnf search nano


8.查找某一文件的提供者

# dnf provides /bin/bash


9.查看软件包详情

# dnf info nano


10.安装软件包

# dnf install nano


11.升级软件包

# dnf update systemd


12.检查系统软件包的更新

# dnf check-update


13.升级所有系统软件包

# dnf update 或 # dnf upgrade


14.删除软件包

# dnf remove nano 或 # dnf erase nano


15.删除无用孤立的软件包

# dnf autoremove


16.删除缓存的无用软件包

# dnf clean all


17.获取有关某条命令的使用帮助

# dnf help clean


18.查看所有的 DNF 命令及其用途

# dnf help


19.查看 DNF 命令的执行历史

# dnf history


20.查看所有的软件包组

# dnf grouplist


21.安装一个软件包组

# dnf groupinstall ‘Educational Software’


22.升级一个软件包组中的软件包

# dnf groupupdate ‘Educational Software’


23.删除一个软件包组

# dnf groupremove ‘Educational Software’


24.从特定的软件包库安装特定的软件

# dnf –enablerepo=epel install phpmyadmin


25.更新软件包到最新的稳定发行版

# dnf distro-sync


26.重新安装特定软件包

# dnf reinstall nano


27.回滚某个特定软件的版本

# dnf downgrade acpid


DNF 和 Yum 的区别


由于 Yum 中许多长期存在的问题仍未得到解决,这些问题包括性能差、内存占用过多、依赖解析速度变慢等。因此 Yum 包管理器已被 DNF 包管理器取代。

编号

DNF(Dandified YUM)

YUM(Yellowdog Updater, Modified)

1

DNF 使用 libsolv 来解析依赖关系,由 SUSE 开发和维护

YUM 使用公开的 API 来解析依赖关系

2

API 有完整的文档

API 没有完整的文档

3

由 C、C++、Python 编写的

只用 Python 编写

4

DNF 目前在 Fedora、RHEL 8、CentOS 8、OEL 8 和 Mageia 6/7 中使用

YUM 目前在 RHEL 6/7、CentOS 6/7、OEL 6/7 中使用

5

DNF 支持各种扩展

Yum 只支持基于 Python 的扩展

6

API 有良好的文档,因此很容易创建新的功能

因为 API 没有正确的文档化,所以创建新功能非常困难

7

DNF 在同步存储库的元数据时,使用的内存较少

在同步存储库的元数据时,YUM 使用了过多的内存

8

DNF 使用满足性算法来解决依赖关系解析(它是用字典的方法来存储和检索包和依赖信息)

由于使用公开 API 的原因,Yum 依赖性解析变得迟钝

9

从内存使用量和版本库元数据的依赖性解析来看,性能都不错

总的来说,在很多因素的影响下,表现不佳

10

DNF 更新:在 DNF 更新过程中,如果包中包含不相关的依赖,则不会更新

YUM 将在没有验证的情况下更新软件包

11

如果启用的存储库没有响应,DNF 将跳过它,并继续使用可用的存储库处理事务

如果有存储库不可用,YUM 会立即停止

12

dnf update 和 dnf upgrade 是等价的

在 Yum 中则不同

13

安装包的依赖关系不更新

Yum 为这种行为提供了一个选项

14

清理删除的包:当删除一个包时,DNF 会自动删除任何没有被用户明确安装的依赖包

Yum 不会这样做

15

存储库缓存更新计划:默认情况下,系统启动后 10 分钟后,DNF 每小时会对配置的存储库检查一次更新。这个动作由系统定时器单元 dnf-makecache.timer 控制

Yum 也会这样做

6

内核包不受 DNF 保护。不像 Yum,你可以删除所有的内核包,包括运行中的内核包

Yum 不允许你删除运行中的内核

17

libsolv:用于解包和读取资源库。hawkey: 为 libsolv 提供简化的 C 和 Python API 库。librepo: 提供 C 和 Python(类似 libcURL)API 的库,用于下载 Linux 存储库元数据和软件包。libcomps: 是 yum.comps 库的替代品。它是用纯 C 语言编写的库,有 Python 2 和 Python 3 的绑定。

Yum 不使用单独的库来执行这些功能

18

DNF 包含 29000 行代码

Yum 包含 56000 行代码

19

DNF 由 Ales Kozumplik 开发

YUM 由 Zdenek Pavlas、Jan Silhan 和团队成员开发



zypp


Zypper 是用来管理 RPM 包的另外一个包管理器。这个包管理器主要用于 SUSE(和 openSUSE),在MeeGo、Sailfish OS、Tizen 上也有使用。它最初开发于 2006 年,已经经过了多次迭代。除了作为系统管理工具 YaST 的后端和有些用户认为它比 YUM 要快之外也没有什么好多说的。


zyppd的常用命令:

1. 安装包

语法: # zypper install 示例:安装Mozilla firefox

# zypper install MozillaFirefox


2. 安装源码包

语法:# zypper source-install 示例:从库中安装 apache

# zypper source-install apache2-mod_nss


3. 更新包

更新某一软件包: # zypper update 更新所有软件包: # zypper update

查看所有可用的更新列表:# zypper list-updates


4. 删除包

语法:# zypper remove 示例:移除Mozilla Firefox

# zypper remove MozillaFirefox


5. 查找包

语法:# zypper search 示例:查找所有usb开头的软件包

# zypper search usb*


6. 查看软件包详情

语法: zypper info 示例:查看usbutils的信息

# zypper info usbutils


7. 打补丁

查看所有可打补丁: zypper patches

安装指定补丁:zypper patch


8. 锁住包

软件包被锁之后将不能被移除或升级,下面演示一下如何加锁

1)加al选项锁住包文件“usbutils”, al 是 add lock的缩写

# zypper al usbutils

Specified lock has been successfully added.

2) 加ll选项查看所有已被锁住的软件包, ll 是 List Locks的缩写

# zypper ll

# | Name            | Type    | Repository

--+-----------------+---------+-----------

1 | usbutils        | package | (any)


9. 解锁包

加rl选项解锁usbutils, rl 是 remove lock的缩写

#  zypper rl usbutils


10. 用zypper添加库

语法:# zypper addrepo

# zypper addrepo --check --refresh --name "Mozilla-repo"


11. 创建本地库

我们可以使用zypper从本地目录中创建一个包含所有rpm文件的本地库

语法: # zypper addrepo

示例:创建一个名为Linuxprobe_Repo的本地目录,包含所有rpm文件

# zypper addrepo /var/stormgt/dsminst Linuxprobe_Repo


12. 查看库

# zypper lr


13. 在库中搜索包

列出指定库Mozillarepo的所有软件包

# zypper search --repo Mozillarepo


14. 库重命名

重命名库可以用 renamerepo 选项

示例:将库"Linuxprobe_Repo"的名字改成"MyLinuxRepo"

# zypper renamerepo Linuxprobe_Repo MyLinuxRepo


15. 删除库

用removerepo选项来移除库

# zypper removerepo MyLinuxRepo


16. 备份库

用export选项可以备份一系列库文件

# zypper lr --export /var/tmp/backup.repo


17. 从备份文件中添加库

# zypper addrepo /var/tmp/backup.rep


18. 禁用/使用库

示例:用 modifyrepo 选项的 -d 参数来禁用Mozilla库

# zypper modifyrepo -d Mozillarepo

Repository 'Mozillarepo' has been successfully disabled.

示例:用 modifyrepo选项 -e 参数来允许使用Mozilla库

# zypper modifyrepo -e Mozillarepo

Repository 'Mozillarepo' has been successfully enabled.


19. 刷新库

示例:刷新Mozilla库

# zypper refresh Mozillarepo

示例:自动刷新指定库

# zypper modifyrepo --refresh Linuxprobe_Repo

Autorefresh has been enabled for repository 'Linuxprobe_Repo'.


urpmi


urpmi是Mageia/MandrivaLinux及其派生发布版的软件包管理系统,用于安装、移除、升级和查询本机或远程(即提供软件包的服务器)的软件包。它解决了RPM包管理员容易让用户经常遇到相依性地狱的问题。它可以从官方或非官方的来源获得软件包(非官方来源如企鹅解放阵线)。它有一个图形前端:Rpmdrake。除了被MandrivaLinux所使用外,它也被用在MageiaLinux(一个基于MandrivaLinux的派生版本),以及ROSALinux(同样是基于MandrivaLinux的分支)。很可惜,Mandriva已经于几年前破产倒闭了。


urpmi系列命令:

urpmi  安装或升级

urpme  删除

urpmq  软件包查找

urpmf  文件名查找

urpmi.addmedia 添加源

urpmi.removemedia  删除源

urpmi.update 更新 (升级)

urpmi.update -a 查看所有升级包

urpmi --auto --auto-select 自动升级

urmq --list        列出所有软件包

urpmq --list-media  列出软件源的media

urpmq -d 输出某软件包的依赖信息

urpmq -f 输出某软件包的名字、版本、所属架构

urpmq -i 安装,相当于urpmi

urpmq -y yword> 查找包含某关键字的软件包(或者-a)

urpmf   按某RPM包的准确名字查找


主要的 urpmi 配置文件 :

/etc/urpmi/urpmi.cfg   软件源信息

/etc/urpmi/skip.list  非自动升级的软件包列表

/etc/urpmi/inst.list  需安装而非升级的软件包列表

/var/lib/urpmi/list.*  库中所有软件包列表

/var/lib/urpmi/hdlist.* 库中所有软件包的headers

/var/lib/urpmi/synthesis.hdlist.*  软件包的依赖信息


基于 Arch 的包管理器


Arch Linux 使用称为 pacman 的包管理器。和 .deb 以及 .rpm 不同,它使用更为传统的 LZMA2 压缩包形式 .tar.xz 。这可以使 Arch Linux 包能够比其它形式的压缩包(如 gzip)有更小的尺寸。自从 2002 年首次发布以来, pacman 一直在稳定发布和改善。使用它最大的好处之一是它支持 Arch Build System,这是一个从源代码级别构建包的构建系统。该构建系统借助一个叫 PKGBUILD 的文件,这个文件包含了如版本号、发布号、依赖等等的元数据,以及一个为编译遵守 Arch Linux 需求的包所需要的带有必要的编译选项的脚本。而编译的结果就是前文所提的被 pacman 所使用的 .tar.xz 的文件。


上述的这套系统技术上导致了 Arch 用户仓库(Arch User Respository)(AUR)的产生,这是一个社区驱动的软件仓库,仓库里包括有 PKGBUILD 文件以及支持补丁或脚本。这给 Arch Linux 带了无穷无尽的软件资源。最为明显的好处是如果一个用户(或开发者)希望他开发的软件能被广大公众所使用,他不必通过官方途径去在主流软件仓库获得许可。而不利之处则是它必须将依赖社区的流程,类似于 Docker Hub、 Canonical 的 Snap Packages,或者其它类似的机制。有很多特定于 AUR 的包管理器能被用来从 AUR 里的 PGKBUILD 文件下载、编译、安装。


使用 pacman 和官方软件仓库


Arch 的主要包管理器:pacman,使用标识位而不是像 yum 或 apt 一样使用命令词。例如,要搜索一个包,你要用 pacman -Ss 。和 Linux 上别的命令一样,你可以找到 pacman 的手册页和在线帮助。pacman 大多数的命令都使用了同步(-S)这个标识位。


Pacman 命令详解

Pacman 是一个命令行工具,这意味着当你执行下面的命令时,必须在终端或控制台中进行。


1、更新系统

在 Arch Linux 中,使用一条命令即可对整个系统进行更新:

pacman -Syu


如果你已经使用 pacman -Sy 将本地的包数据库与远程的仓库进行了同步,也可以只执行:

pacman -Su


2、安装包

pacman -S  包名 例如,执行 pacman -S firefox 将安装 Firefox。你也可以同时安装多个包,只需以空格分隔包名即可。

pacman -Sy 包名 与上面命令不同的是,该命令将在同步包数据库后再执行安装。

pacman -Sv 包名 在显示一些操作信息后执行安装。

pacman -U  安装本地包,其扩展名为 pkg.tar.gz。


3、删除包

pacman -R  包名 该命令将只删除包,不包含该包的依赖。

pacman -Rs 包名 在删除包的同时,也将删除其依赖。

pacman -Rd 包名 在删除包时不检查依赖。


4、搜索包

pacman -Ss 关键字 这将搜索含关键字的包。

pacman -Qi 包名 查看有关包的信息。

pacman -Ql 包名 列出该包的文件。


5、其他用法

pacman -Sw 包名 只下载包,不安装。

pacman -Sc Pacman 下载的包文件位于 /var/cache/pacman/pkg/ 目录。该命令将清理未安装的包文件。

pacman -Scc 清理所有的缓存文件。