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

dpkg详解:


1. dpkg描述   

  dpkg是一个安装、创建、移除和管理debian包的工具。更多使用界面友好的dpkg的前端"dselect",。

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

3. 软件包处理

    dpkg可用作dpkg-deb的前端,处理本地Debian软件包. 可以提取从.deb文件中提取软件包信息和数据. 以下是dpkg-deb操作方式:
    -b, --build            // dpkg-deb -b nano nano_1.3.10-2_ill.deb  重新打包
    -c, --contents       // dpkg-deb -c nano_1.3.10-2_i386.deb  |more  列出软件包的内容
    -I, --info              // dpkg-deb -I nano_1.3.10-2_i386.deb  查看软件包的信息
    -f, --field            // 重新构建软件包,比如nano(1.3.10)需要满足以下依赖关系:$ dpkg-deb -f nano_1.3.10-2_i386.deb depends     depends 为对应查询段)
    -e, --control        // dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN  解压控制文件
    -x, --extract        // dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano   解压程序文件
    -X, --vextract, and  --fsystarfile.   // dpkg-deb -X ./nano_1.3.10-2_i386.deb ./nano   解压程序文件并列出软件包内容。


4. 数据库查询

当前版本的 dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单, 依赖关系, 软件状态, 等等详细的内容,通常在 /var/lib/dpkg 目录下。 通常在 status 文件中存储软件状态和控制信息。 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码。

$ dpkg -l

期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称                                 版本                             Architecture 描述
+++-======================================-==================================-============-==============================================================================
rc  0ad                                    0~r11863-2                         i386         Real-time strategy game of ancient warfare
ii  accountsservice                        0.6.21-8                           i386         query and manipulate user account information
ii  acl                                    2.2.51-8                           i386         Access control list utilities
ii  acpi                                   1.6-1                              i386         displays information on ACPI devices

...... ......

每条记录对应一个软件包, 注意每条记录的第一, 二, 三个字符. 这就是软件包的状态标识, 后边依此是软件包名称, 版本号, 和简单描述.
    * 第一字符为期望值,它包括:
          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*

期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称                               版本                  Architecture            描述
+++-====================================-=======================-=======================-==============================================================================
ii  nano                                 2.2.6-1+b1              i386                    small, friendly text editor inspired by Pico
pn  nano-tiny                                                                               (no description available)

un  nanoblogger                                                             (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


5. 安装软件包
dpkg -i | --install package_file...
例如:$dpkg -i ./nano_1.3.10-2_i386.deb
如果指定--recursive 或 -R 选项,必须指定一个目录代替包文件。
安装步骤如下:
1). 导出新包的控制文件。               
2). 如果相同包的另一个版本在新包安装前已经被安装,执行旧包的prerm脚本程序。
3). 如果由包提供,运行postinst脚本。
4). 解压新文件同时备份旧文件,如果遇到问题以便修复。
5). 如果另一个版本的同一个包在新包安装前已经安装,执行旧包的postrm脚本。注意:执行postrm 脚本后执行新文件的preint脚本,因为写新文件的同时移除旧文件。
6). 配置软件包。
或者
$dpkg-deb  -e ./nano_1.3.10-2_i386.deb

当使用 dpkg 安装软件包时, 主要分为两个阶段: 首先解包; 然后运行postinst控制脚本(如果有的话),这就是所谓的配置阶段. 当完成软件包当解包后, dpkg 的--install选项自动调用配置阶段. 注意, 操作时应当指定 .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


6. 软件卸载
dpkg -r | --remove | -P | --purge package ... | -a | --pending
在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


清除
-P or --purge 删除所有的包括配置文件。 (主要删除的是/var/lib/dpkg/status中指定文件,)如果给出的是-a或者--pending而不是包的名字,那么所有的包都被打开(解压缩),但是在/var/bin/dpkg/status文件中标记被移除或清除的,将会分别被移除或清除(但是在 /var/bin/dpkg/status文件中标记“要”移除)
    #dpkg -P nano
    * 删除所有的文件. 所有的文件都被解除了(从系统中删除了).
    * 运行postrm脚本.如果还存在,运行postrm脚本.
    * 删除 postrm 和 list 文件.保留的两个文件,从系统中解除postfix.postrm和postfix.files.
    * 在dpkg的数据库中将软件包标记为未安装
$dpkg -l nano
pn  nano                                          (no description available)
注意输出的状态: pn 这意味着软件包实际上是被清除了,但是在数据库中还有这个软件包的记录.因此,pn 明确指出以前安装过 nano, 在软件包数据库中出现过,并且现在已被完全清除.
附加:
dpkg-reconfigure
重新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面).你能够重新配制 debconf 它本身,如你想改变它的前端或提问的优先权.例如,重新配制 debconf ,使用一个 dialog 前端,简单运行:
dpkg-reconfigure --frontend=dialog debconf (如果你安装时选错了,这里可以改回来哟
echo " hold" | dpkg --set-selections
设置  的状态为 hlod (命令行方式)
dpkg --get-selections ""
取的  的当前状态 (命令行方式)

支持通配符,如:

# dpkg --get-selections *wine*
libwine hold
libwine-alsa hold
libwine-arts hold
libwine-dev hold
libwine-nas hold
libwine-print hold
libwine-twain hold
wine hold
wine+ hold
wine-doc hold
wine-utils hold
dpkg-source -x

如果你手工下载了一个程序的源码包,其中包含了几个类似 .orig.tar.gz , .dsc ,
以及 .diff.gz 之类的文件,

那么你就可以对 .dsc 文件使用这个命令来 unpack 源码包。


dpkg-buildpackage
从 Debian 源码树建立一个deb包。你必须在source tree的主目录才能生效。例如:
dpkg-buildpackage -rfakeroot -uc -b
这里 '-rfakeroot' 指定命令使用 fakeroot 程序来模仿 root 权限 (来实现所有者(ownership)目的),

'-uc' 表示 "Don't cryptographically sign the changelog", '-b' 代表只建立二进制包.


debuild
一个快速打包脚本类似 dpkg-buildpackage ,能自动的识别是否使用 fakeroot,

同时为你运行 lintian 和 gpg


修正依赖关系
dpkg --configure --pending
如果dpkg在apt-get install upgrade dist-uptradeing 的时候出错退出,
尝试使用此命令来配置已经unpack的包。
然后再用 apt-get install ,upgrade, or dist-upgrade -f ,
然后再用 apt-get install, upgrade, or dist-upgrade.
可能会重复多次,这样通常可以解决大多数的依赖性问题。
(同时,如果提示由于某种原因需要某个特定的包裹,你可以常识安装或卸载这个包)
apt-get install -f
apt-get upgrade -f
apt-get dist-upgrade -f
尝试修正上述过程中出现依赖性关系
注意 apt-get install -f 不需要  作为参数。 

 


apt命令:

  • apt-get update - 在你更改了/etc/apt/sources.list 或 /etc/apt/preferences 后,需要运行这个命令以令改动生效。同时也要定期运行该命令,以确保你的源列表是最新的。该命令等价于新立得软件包管理器中的“刷新”,或者是 Windows和OS X 下的 Adept 软件包管理器的 “check for updates”。
  • apt-get upgrade - 更新所有已安装的软件包。类似一条命令完成了新立得软件包管理器中的“标记所有软件包以便升级”并且“应用”。
  • apt-get dist-upgrade - 更新整个系统到最新的发行版。等价于在新立得软件包管理器中“标记所有更新”,并在首选项里选择“智能升级” -- 这是告诉APT更新到最新包,甚至会删除其他包(注:不建议使用这种方式更新到新的发行版)。
  • apt-get -f install -- 等同于新立得软件包管理器中的“编辑->修正(依赖关系)损毁的软件包”再点击“应用。如果提示“unmet dependencies”的时候,可执行这行命令。
  • apt-get autoclean - 如果你的硬盘空间不大的话,可以定期运行这个程序,将已经删除了的软件包的.deb安装文件从硬盘中删除掉。如果你仍然需要硬盘空间的话,可以试试apt-get clean,这会把你已安装的软件包的安装包也删除掉,当然多数情况下这些包没什么用了,因此这是个为硬盘腾地方的好办法。
  • apt-get clean 类似上面的命令,但它删除包缓存中的所有包。这是个很好的做法,因为多数情况下这些包没有用了。但如果你是拨号上网的话,就得重新考虑了。
  • 包缓存的路径为/var/cache/apt/archives,因此,du -sh /var/cache/apt/archives将告诉你包缓存所占用的硬盘空间。
  • dpkg-reconfigure foo - 重新配置“foo”包。这条命令很有用。当一次配置很多包的时候, 要回答很多问题,但有的问题事先并不知道。例如,dpkg-reconfigure fontconfig-config,在Ubuntu系统中显示字体配置向导。每次我安装完一个 Ubuntu 系统,我都会运行这行命令,因为我希望位图字体在我的所有应用程序上都有效。
  • echo "foo hold" | dpkg --set-selections - 设置包“foo”为hold,不更新这个包,保持当前的版本,当前的状态,当前的一切。类似新立得软件包管理器中的“软件包->锁定版本”。
  • 注: apt-get dist-upgrade 会覆盖上面的设置,但会事先提示。 另外,你必须使用 sudo。输入命令echo "foo hold" | sudo dpkg --set-selections而不是sudo echo "foo hold" | dpkg --set-selections
  • echo "foo install -- 删除“hold”“locked package”状态设置。命令行为echo "foo install" | sudo dpkg --set-selections

软件包删除

  • apt-get remove 软件包名称 - 删除已安装的软件包(保留配置文件)
  • apt-get --purge remove 软件包名称 - 删除已安装包(不保留配置文件)
  • 特别技巧:如果你想在删除‘foo’包同时安装‘bar’: apt-get --purge remove foo bar+
  • apt-get autoremove - 删除为了满足其他软件包的依赖而安装的,但现在不再需要的软件包。

软件包搜索

  • apt-cache search foo - 搜索和"foo"匹配的包。
  • apt-cache show foo - 显示"foo"包的相关信息,例如描述、版本、大小、依赖以及冲突。
  • dpkg --print-avail 软件包名称 - 与上面类似。
  • dpkg -l *foo* - 查找包含有"foo"字样的包。与apt-cache show foo类似,但是还会显示每个包是安装了还是没安装。
  • dpkg -l package-name-pattern - 列出名为package-name-pattern的软件包。除非你知道软件包的正确全称,否则可以使用“*package-name-pattern*”.
  • dpkg -L foo - 显示名为“foo”的包都安装了哪些文件以及它们的路径,很有用的命令。
  • dlocate foo - 在已安装的包中搜索“foo”的文件。对于回答“这个文件来源于哪个包”这个问题,是非常实用的。dlocate是一个软件包,必须安装它才能使用本命令。
  • dpkg -S foo - 和上面的命令一样,但相比更慢一些。他只能在Debian或Ubuntu系统下运行。另外,不需要安装dlocate包。
  • apt-file search foo - 类似dlocate和dpkg -S,但搜索所有有效软件包,不单单只是你系统上的已安装的软件包。-- 它所回答的问题是“哪些软件包提供这些文件”。你必须安装有apt-file软件包,并且确保apt-file数据库是最新的。
  • dpkg -c foo.deb - “foo.deb”包含有哪些文件?注:foo.deb是含路径的文件名。-- 这个是针对你自己下载的.deb包。
  • apt-cache dumpavail - 显示所有可用软件包,以及它们各自的详细信息(会产生很多输出)。
  • apt-cache show 软件包名称 - 显示软件包记录,类似dpkg --print-avail 软件包名称
  • apt-cache pkgnames - 快速列出已安装的软件包名称。
  • apt-file search filename - 查找包含特定文件的软件包(不一定是已安装的),这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须先使用 apt-get install 来安装它,然后运行 apt-file update。如果 apt-file search filename 输出的内容太多,您可以尝试使用 apt-file search filename | grep -w filename(只显示指定字符串作为完整的单词出现在其中的那些文件名)或者类似方法,例如:apt-file search filename | grep /bin/(只显示位于诸如/bin或/usr/bin这些文件夹中的文件,如果您要查找的是某个特定的执行文件的话,这样做是有帮助的)。

rpm命令

yum命令

pacman


参考文章:

https://linuxtoy.org/archives/linux-package-management-cheatsheet.html


http://blog.csdn.net/astraylinux/article/details/7039744

http://blog.csdn.net/heihuifeng/article/details/6610899

你可能感兴趣的:(linux,package,manage)