一、软件包管理基础
各种主流的 Linux 发行版都采用了某种形式的软件包管理系统来控制软件和库的安装。
-
软件包管理系统使用数据库来记录下列内容:
- Linux 系统中已安装的软件包。
- 每个软件包安装了哪些文件。
- 每个已安装的软件包的版本。
-
软件包存储在称为仓库( repository )的服务器上,可以利用本地 Linux 系统中的软件包管理器通过 Internet 访问,在其中搜索新的软件包,或是更新系统中已安装的软件包。
-
软件包通常存在依赖关系,为了能够正常运行,被依赖的包必须提前安装。
-
软件包管理器会检测这些依赖关系并提前安装好所有额外的软件包。
-
软件包管理器的不足之处在于目前没有统一的标准工具。
-
Linux 中广泛使用的两种主要的软件包管理系统工具是
dpkg和rpm。 -
基于 Debian 的发行版( 比如 Ubuntu 和 Linux Mint )使用的是
dpkg命令。 -
基于 Red Hat 的发行版( 比如 Fedora、CentOS 和 openSUSE )使用的是
rpm命令。
二、基于 Debian 的系统
dpkg命令是基于 Debian 的软件包管理器的核心,用于在 Linux 系统中安装、更新、删除 DEB 包文件。
- 通常情况下,从 Linux 发行仓库中安装软件包。为此,需要使用 APT( advanced package tool )工具集:
apt-cacheapt-getapt
apt命令本质上是apt-cache命令和apt-get命令的前端。apt命令基本格式:apt[ options ] command
apt与dpkg区别:apt与dpkg均为 Ubuntu 下面的包管理工具。dpkg侧重于本地软件的管理。apt基于dpkg,侧重于远程包的下载和依赖管理,相当于dpkg的前端。
2.1 使用 apt 管理软件包
- 列出所有已安装的包:
aptlist --installed - 列出所有已安装的包的版本信息:
aptlist --all-versions - 显示软件包具体信息( 例如:版本号,安装大小,依赖关系等等 ):
sudoaptshow package_name - 得到特定软件包相关的所有文件:
dpkg-L package_name - 也可以执行相反的操作,找出特定的文件属于哪个包:
dpkg--search < absolute_file_name >
2.2 使用 apt 安装软件包
- 查找软件包命令:
sudoaptsearch package_name - 只想搜索软件包名称:
sudoapt--names-only search package_name - 安装指定的软件命令:
sudoaptinstall package_name - 安装多个软件包:
sudoaptinstall package_1 package_2 package_3 - 注意事项:
sudo命令允许以 root 用户身份执行命令。像安装软件这类管理任务都需要使用sudo命令帮助完成。- 在安装指定的软件包时,
apt也会要求安装其他软件包。这是因为apt会自动解析必要的依赖关系,根据需要安装额外的库和软件包。
2.3 使用 apt 升级软件
- 列出所有可更新的软件清单命令:
sudoaptupdate - 更新指定的软件命令:
sudoaptupdate package_name - 升级软件包:
sudoaptupgrade - 列出可更新的软件包及版本信息:
aptlist --upgradeable - upgrade 命令在升级过程中不会删除任何软件包。如果必须删除某个软件包才能完成升级则可以使用:
sudoaptfull-upgrade - 注意事项:
- upgrade 命令可以使用仓库中的任何新版本安全地升级系统中所有的软件包。
- upgrade 命令无须使用任何软件包名称作为参数。
- 应该定期执行
sudoaptupgrade ,保持系统处于最新状态( 很多安全补丁和更新通常是在完整的发行版发布之后提供的 )。
2.4 使用 apt 卸载软件包
- 删除软件包命令( 同时保留数据和配置文件 ):
sudoaptremove package_name - 如果要将软件包以及相关的数据和配置文件全部删除:
sudoaptpurge package_name - 清理不再使用的依赖和库文件:
sudoaptautoremove - autoremove 命令会检查所有被标记为存在依赖关系且不再被需要的软件包。
2.5 apt 仓库
apt默认的软件存储库位置是在安装 Linux 发行版时设置的。仓库位置保存在文件 /etc/apt/sources.list 中。
- 大多数情况下,用不着添加 / 删除软件仓库,所以也就无须修改此文件。
apt只会从这些仓库中拉取软件。此外,在搜索要安装或更新的软件时,apt也只检查这些仓库。- 如果想要为软件包管理系统加入一些额外的软件仓库,那就得修改文件了。
三、基于 Red Hat 的系统
和基于 Debian 的发行版类似,基于 Red Hat 的系统有以下几种前端工具。
yum:用于 Red Hat、CentOS 和 Fedora。zypper:用于 openSUSE。dnf:yum的升级版,有一些新增的特性。- 上述前端全部基于命令行工具
rpm。
以下是关于
rpm、yum以及dnf的介绍:
rpm:
- 为了解决在安装、升级、卸载服务程序时还要考虑到其他程序、库的依赖关系,
rpm机制应运而生。 - 但是
rpm机制也只能帮助运维人员查询缺少的依赖关系,安装还是需要自己来进行。这是yum软件仓库就来了。
yum:
- 底层为
rpm包,搭建的一套基于rpm包的yum软件仓库。即yum方式下载的包都是rpm包。 - 而
yum的好处在于在下载指定的rpm包时,会在自己的yum软件仓库中自动寻找其所有依赖包,并进行统一安装,节省了运维人员的时间。 yum软件仓库,可以是基于官方的、也可以是基于第三方的,还可以是自己搭建的。
dnf:
- 在
yum机制如此优秀的情况下,仍然存在一些问题,如分析不准确,占用内存量大,不能多人同时安装软件等硬伤。 - 因此在随着 Fedora 22 系统的发布,Red Hat 又给了我们一个新的选择—
dnf,即dnf实际上就是yum的升级版,也称为yumv4 版本。 - 且在使用上面,
dnf也是和yum命令方式一样,都是同样的使用方式,只需把yum换为dnf即可。
3.1 列出已安装的软件包
- 找出系统中已安装的软件包:
dnflist installed - 将已安装软件的列表重定向到一个文件中,可以使用:
dnflist installed > file_name - 找出文件系统中的某个文件是由哪个软件包安装的:
dnfprovides file_name
3.2 使用 dnf 安装软件
- 安装软件包:
sudodnfinstall package_name
3.3 使用 dnf 升级软件
- 查看已安装软件包的所有可用更新( 没输出,则说明没什么可升级的。):
dnflist upgrades - 升级某个软件包:
dnfupgrade package_name - 升级更新列表中的所有软件包:
dnfupgrade - 将软件包升级至最新的 bug 修复版或安全补丁版( 不是最新的最高版本!):
dnfupgrade-minimal
3.4 使用 dnf 卸载软件
- 卸载软件:
dnfremove package_name
3.5 处理损坏的依赖关系
有时在安装多个软件包时,一个软件包的依赖关系可能会被另一个软件包搞乱。这称为依赖关系损坏( broken dependency )。
- 如果系统出现了这种情况,可以先尝试命令:
dnfclean all - 然后再使用:
dnfupgrade - 上述操作可以清理放错位置的文件,但如果还解决不了问题,可以试试 ( 显示指定软件包的所有依赖关系以及哪些软件包提供了这种依赖,知道需要哪个库就可以自行安装了。):
dnfrepoquery --deplist package_name
- 注意事项:
yum工具的 upgrade 命令支持 --skip-broken 选项,可以跳过依赖关系损坏的软件包,同时仍尝试继续升级其他包。dnf工具则自动执行该操作。
3.6 RPM 仓库
就像
apt系统一样,dnf在安装时也设置了软件仓库。
- 查看拉取软件的仓库:
dnfrepolist - 如果发现其中没有所需的仓库,可以编辑配置文件,其中有两个地方可以找到
dnf仓库的定义:- 配置文件 /etc/dnf/dnf.conf
- /etc/yum.repos.d 目录中的单独文件
四、使用容器管理软件
软件包管理系统不止一种,彼此之间呈竞争关系。每个应用程序都依赖于某种库函数才能正常运行。除此之外,还需考虑库文件的版本。而应用程序容器( application container )创建了一个环境,其中包含了应用程序运行所需的全部文件,包括运行时库文件。可以将程序容器作为单个软件包开发,保证能够在任何 Linux 系统中正常运行。其中又有两个比较流行的标准:
snap和flatpak。
4.1 使用 snap 容器
Ubuntu Linux 发行版的创建者开发了一种称为
snap的应用程序容器格式。它会将应用程序所需的所有文件集中到单个snap分发文件中。
-
检查
snap是否正在运行:snapversion -
查看已安装的
snap应用程序列表:snaplist -
snap仓库中搜索指定程序:snapfind package_name -
查看
snap应用程序的详细信息:snapinfo package_name -
安装新的
snap:sudosnapinstall package_name -
删除某个
snap:sudosnapremove package_name -
也可以通过禁用来代替删除:
sudosnapdisable package_name -
恢复禁用:
sudosnapenable package_name
4.2 使用 flatpak 容器
flatpak应用程序容器格式是作为一个独立的开源项目创建的,与任何特定的 Linux 发行版都没有直接关系。如果你的 Linux 发行版支持flatpak,则可以使用以下命令。
- 列出已安装的应用程序容器:
flatpaklist - 搜索指定应用程序:
flatpaksearch package_name - 安装应用程序:
sudoflatpakinstall package_name - 检查安装是否正确,可以再次使用:
flatpaklist - 删除应用程序容器:
sudoflatpakuninstall package_name - 应用程序容器的用法和软件包管理系统类似,但背后的原理完全不同。不过,殊途同归,安装在 Linux 系统中的应用程序能够轻松地进行维护和升级。
五、从源代码安装
如果经常在开源软件环境中工作,就很有可能会遇到打包成 tarball 形式的软件。
-
解压软件包:
tar-Jxvf package_name.tar.xz -
使用
cd命令进入新的软件目录。 -
运行
configure工具( 检查你的 Linux 确保拥有合适的能够编译源代码的编译器,以及正确的库依赖关系。):./configure -
下一步,使用
make命令构建二进制文件:make -
make命令结束后,可运行的程序就出现在目录中了。但从这个目录运行程序有点不方便。可以执行 install 选项将其安装在常用位置:sudomakeinstall
六、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。