Linux 较早采用了维护一个中心化的软件仓库来发布软件更新这种做法,用户可以在这个软件仓库里查找并安装软件。在这篇文章里, 笔者将回顾在 Linux 上的如何进行软件安装的历史,以及现代操作系统如何保持更新以应对软件安全漏洞(CVE)不断的曝光。
那么在包管理器出现之前在 Linux 上是如何安装软件的呢?
曾几何时,软件都是通过 FTP 或邮件列表(LCTT 译注:即通过邮件列表发布源代码的补丁包)来分发的(最终这些发布方式在互联网的迅猛发展下都演化成为一个个现今常见的软件发布网站)。(一般在一个 tar 文件中)只有一个非常小的文件包含了创建二进制的说明。你需要做的是先解压这个包,然后仔细阅读当中的 README 文件, 如果你的系统上恰好有 GCC(LCTT 译注:GNU C Compiler)或者其它厂商的 C 编译器的话,你得首先运行 ./configure 脚本,并在脚本后添加相应的参数,如库函数的路径、创建可执行文件的路径等等。除此之外,这个配置过程也会检查你操作系统上的软件依赖是否满足安装要求。如果缺失了任何主要的依赖,该配置脚本会退出不再继续安装,直到你满足了该依赖。如果该配置脚本正常执行完毕,将会创建一个 Makefile 文件。
当有了一个 Makefile 文件时, 你就可以接下去执行 make 命令(该命令由你所使用的编译器提供)。make 命令也有很多参数,被称为 make 标识 ,这些标识能为你的系统优化最终生成出来的二进制可执行文件。在计算机世界的早期,这些优化是非常重要的,因为彼时的计算机硬件正在为了跟上软件迅速的发展而疲于奔命。今日今时,编译标识变得更加通用而不是为了优化哪些具体的硬件型号,这得益于现代硬件和现代软件相比已经变得成本低廉,唾手可得。
最后,在 make 完成之后, 你需要运行 make install (或 sudo make install)(LCTT 译注:依赖于你的用户权限) 来“真正”将这个软件安装到你的系统上。可以想象,为你系统上的每一个软件都执行上述的流程将是多么无聊费时,更不用说如果更新一个已经安装的软件将会多复杂,多么需要精力投入。(LCTT 译注:上述流程也称 CMMI 安装, 即Configure、Make、Make Install)
.deb:这种包格式由 Debian、Ubuntu、Linux Mint 以及其它的变种使用。这是最早被发明的包类型。
.rpm:这种包格式最初被称作 红帽包管理器 (LCTT 译注: 取自英文的首字母)。使用这种包的 Linux 发行版有 Red Hat、Fedora、SUSE 以及其它一些较小的发行版。
.tar.xz:这种包格式只是一个软件压缩包而已,这是 Arch Linux 所使用的格式。
尽管上述的包格式自身并不能直接管理软件的依赖问题,但是它们的出现将 Linux 软件包管理向前推进了一大步。
软件仓库到底是什么?
多年以前(当智能电话还没有像现在这样流行时),非 Linux 世界的用户是很难理解软件仓库的概念的。甚至今时今日,大多数完全工作在 Windows 下的用户还是习惯于打开浏览器,搜索要安装的软件(或升级包),下载然后安装。但是,智能电话传播了软件“商店”(LCTT 译注: 对应 Linux 里的软件仓库)这样一个概念。智能电话用户获取软件的方式和包管理器的工作方式已经非常相近了。些许不同的是,尽管大多数软件商店还在费力美化它的图形界面来吸引用户,大多数 Linux 用户还是愿意使用命令行来安装软件。总而言之,软件仓库是一个中心化的可安装软件列表,上面列举了在当前系统中预先配置好的软件仓库里所有可以安装的软件。下面我们举一些例子来说在各个不同的 Linux 发行版下如何在对应的软件仓库里搜寻某个特定的软件(输出有截断)。
在 Arch Linux 下使用 aurman:
1 2 3 4 5 6 7 8 9
user@arch ~ $ aurman -Ss kate
extra/kate 18.04.2-2 (kde-applications kdebase) Advanced Text Editor aur/kate-root 18.04.0-1 (11, 1.139399) Advanced Text Editor, patched to be able to run as root aur/kate-git r15288.15d26a7-1 (1, 1e-06) An advanced editor component which is used in numerous KDE applications requiring a text editing component
在 CentOS 7 下使用 yum:
1 2 3 4 5 6
[user@centos ~]$ yum search kate
kate-devel.x86_64 : Development files for kate kate-libs.x86_64 : Runtime files for kate kate-part.x86_64 : Kate kpart plugin
在 Ubuntu 下使用 apt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
user@ubuntu ~ $ apt search kate Sorting... Done Full Text Search... Done
kate/xenial 4:15.12.3-0ubuntu2 amd64 powerful text editor
kate-data/xenial,xenial 4:4.14.3-0ubuntu4 all shared data files for Kate text editor
kate-dbg/xenial 4:15.12.3-0ubuntu2 amd64 debugging symbols for Kate
kate5-data/xenial,xenial 4:15.12.3-0ubuntu2 all shared data files for Kate text editor
最好用的包管理器有哪些?
如上示例的输出,包管理器用来和相应的软件仓库交互,获取软件的相应信息。下面对它们做一个简短介绍。
基于 PRM 包格式的包管理器
更新基于 RPM 的系统,特别是那些基于 Red Hat 技术的系统,有着非常有趣而又详实的历史。实际上,现在的 YUM 版本(用于 企业级发行版)和 DNF(用于社区版)就融合了好几个开源项目来提供它们现在的功能。
Red Hat 最初使用的包管理器,被称为 RPM( 红帽包管理器 ),时至今日还在使用着。不过,它的主要作用是安装本地的 RPM 包,而不是去在软件仓库搜索软件。后来开发了一个叫 up2date 的包管理器,它被用来通知用户包的最新更新,还能让用户在远程仓库里搜索软件并便捷的安装软件的依赖。尽管这个包管理器尽职尽责,但一些社区成员还是感觉 up2date 有着明显的不足。
现在的 YUM 来自于好几个不同社区的努力。1999-2001 年一群在 Terra Soft Solution 的伙计们开发了 黄狗更新器 (YUP),将其作为 Yellow Dog Linux 图形安装器的后端。 杜克大学 喜欢这个主意就决定去增强它的功能,它们开发了 黄狗更新器–修改版 (YUM),这最终被用来帮助管理杜克大学的 Red Hat 系统。Yum 壮大的很快,到 2005 年,它已经被超过一半的 Linux 市场所采用。今日,几乎所有的使用 RPM 的的 Linux 都会使用 YUM 来进行包管理(当然也有一些例外)。
artwiz-aleczapka-kates-fonts.noarch : Kates font in Artwiz family ghc-highlighting-kate-devel.x86_64 : Haskell highlighting-kate library development files kate-devel.i686 : Development files for kate kate-devel.x86_64 : Development files for kate kate-libs.i686 : Runtime files for kate kate-libs.x86_64 : Runtime files for kate kate-part.i686 : Kate kpart plugin
localhost:~ # zypper what-provides kate Command 'what-provides' is replaced by 'search --provides --match-exact'. See 'help search' for all available options. Loading repository data... Reading installed packages...
S | Name | Summary | Type ---|------|----------------------|------------ i+ | Kate | Advanced Text Editor | application i | kate | Advanced Text Editor | package
user@ubuntu:~$ apt-cache search kate aterm-ml - Afterstep XVT - a VT102 emulator for the X windowsystem frescobaldi - Qt4 LilyPond sheet music editor gitit - Wiki engine backed by a git or darcs filestore jedit - Plugin-based editorfor programmers kate - powerful texteditor kate-data - shared data files for Kate texteditor kate-dbg - debugging symbols for Kate katepart - embeddable texteditor component
extra/kate 18.04.2-2 (kde-applications kdebase) Advanced Text Editor extra/libkate 0.4.1-6 [installed] A karaoke and text codec for embedding in ogg extra/libtiger 0.3.4-5 [installed] A rendering library for Kate streams using Pango and Cairo extra/ttf-cheapskate 2.0-12 TTFonts collection from dustimo.com community/haskell-cheapskate 0.1.1-100 Experimental markdown processor.
Arch 也使用和别的包管理器类似的软件仓库。在上面的输出中,搜索结果前面有标明它是从哪个仓库里搜索到的(这里是 extra/ 和 community/)。同 Red Hat 和 Debian 系统一样,Arch 依靠用户将软件仓库的信息加入到一个特定的文件里:/etc/pacman.conf。下面的例子非常接近一个仓库系统。笔者还打开了 [multilib] 仓库来支持 Steam:
:: Synchronizing package databases... core 130.2 KiB 851K/s 00:00 [##########################################################] 100% extra 1645.3 KiB 2.69M/s 00:01 [##########################################################] 100% community 4.5 MiB 2.27M/s 00:02 [##########################################################] 100% multilib is up to date
:: Synchronizing package databases... core is up to date extra is up to date community is up to date multilib is up to date :: Starting full system upgrade... resolving dependencies... looking for conflicting packages...
aurman -S telegram-desktop-bin ~~ initializing aurman... ~~ the following packages are neither in known repos nor in the aur ... ~~ calculating solutions...
:: The following 1 package(s) are getting updated: aur/telegram-desktop-bin 1.3.0-1 -> 1.3.9-1
?? Do you want to continue? Y/n: Y
~~ looking for new pkgbuilds and fetching them... Cloning into 'telegram-desktop-bin'...
remote: Counting objects: 301, done. remote: Compressing objects: 100% (152/152), done. remote: Total301 (delta 161), reused 286 (delta 147) Receiving objects: 100% (301/301), 76.17 KiB | 639.00 KiB/s, done. Resolving deltas: 100% (161/161), done. ?? Do you want to see the changes of telegram-desktop-bin? N/y: N