包管理系统简介
曾几何时,软件都是通过 FTP 或邮件列表(即通过邮件列表发布源代码的补丁包)来分发的(最终这些发布方式在互联网的迅猛发展下都演化成为一个个现今常见的软件发布网站)。(一般在一个 tar 文件中)只有一个非常小的文件包含了创建二进制的说明。你需要做的是先解压这个包,然后仔细阅读当中的 README 文件,然后通过 ./configure、make、make install 进行软件安装。可以想象,为你系统上的每一个软件都执行上述的流程将是多么无聊费时,更不用说如果更新一个已经安装的软件将会多复杂,多么需要精力投入。
软件包(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 世界的用户是很难理解软件仓库的概念的。甚至今时今日,大多数完全工作在 Windows 下的用户还是习惯于打开浏览器,搜索要安装的软件(或升级包),下载然后安装。但是,智能手机传播了软件商店(App Store/应用)市场这样一个概念。智能手机用户获取软件的方式和包管理器的工作方式已经非常相近了。些许不同的是,尽管大多数软件商店还在费力美化它的图形界面来吸引用户,大多数 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)
- 其他包管理器有
- Arch Linux 中使用的 Pacman
- Gentoo 使用的基于源代码的 Portage
- Mac 系统下的 Homebrew 等
使用包管理器将大大简化在 Linux 发行版中安装软件的过程。
有了包管理器为什么还要有其前端工具?
包管理器如 RPM 与 DPKG 只能做到检查相依性,在安装或移除时告知相依性的不满足,接下来就需要用户自行去找出所需的组件来安装。这样非常不方便,为了实现可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装,前端工具如 APT 及 YUM 就诞生了。
基于 Debian 的包管理器
dpkg
dpkg 是 Debian Packager 的简写。为 Debian 专门开发的套件管理系统,方便软件的安装、更新及移除。软件都是以 .deb 结尾的编译好的二进制包。所有源自“Debian”的“Linux”发行版都使用“dpkg”,例如“Ubuntu”、“Knoppix”等。
常用命令:
1)安装软件 命令:dpkg -i<.deb filename> 示例: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软件包管理器。他首先出现在Fedora18这个发行版中。而最近,它取代了yum,正式成为Fedora22的包管理器。DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用RPM,libsolv和hawkey库进行包管理操作。尽管它没有预装在CentOS和RHEL7中,但你可以在使用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 group list 21.安装一个软件包组 # dnf group install ‘Educational Software’ 22.升级一个软件包组中的软件包 # dnf group update ‘Educational Software’ 23.删除一个软件包组 # dnf group remove ‘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包管理器取代。