文章目录
Ubuntu使用apt来管理软件包,而apt包从哪里获取软件包呢?apt
将软件库存储在如下文件中:
/etc/apt/sources.lis
t文件和/etc/apt/sources.list.d/
目录中带.list和.sources(实际上是两种格式的配置文件)后缀的文件。可以使用命令man sources.list来查看apt的完整存储机制。通过编辑这些文件,我们可以添加、删除、或者临时关闭某些软件库。
注意:在更改上述文件之前,最好先备份一下。例如, sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
。
前面说过,apt的源配置文件有两种格式,分别以.list和.sources结尾。apt在版本1.1之后引进了新的格式,叫deb282,以.sources结尾。
下面详细分析文件sources.list的格式和写法。
以字符’#'开头的行代表该行是一行注释
不以’#'开头的行是apt repository,它的格式为:
sources.list 条目格式
sources.list
文件中的条目一般都有如下所示的形式:
deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3
档案类型 (Archive type),有deb和deb-src两种,分别表示deb包和deb源码包
仓库地址 (Repository URI),支持http、https、file等
发行版 (Distribution)
软件包分类 (Component)
档案类型 (Archive type)
条目的第一个词 deb
或是 deb-src
表明了所获取的软件包档案类型。
其中,
deb
档案类型为二进制预编译软件包,一般我们所用的档案类型。
deb-src
档案类型为用于编译二进制软件包的源代码。
仓库地址 (Repository URI)
条目的第二个词则是软件包所在仓库的地址。我们可以更换仓库地址为其他地理位置更靠近自己的镜像来提高下载速度。
URI支持http,ftp,以及本地文件(file)等协议。
发行版 (Distribution)
跟在仓库地址后的是发行版。发行版有两种分类方法,一类是发行版的具体代号,如ubuntu 16 、14的代号分别是 xenial
,trusty
;还有一类则是发行版的发行类型,如oldstable
, stable
, testing
和 unstable
。
另外,在发行版后还可能有进一步的指定,如 xenial-updates
, trusty-security
, stable-backports
等。
软件包分类 (Component)
跟在发行版之后的就是软件包的具体分类了,可以有一个或多个。
不同的 Linux 发行版对软件有着不同的分类,如:
Debian
main
包含符合 DFSG 指导原则的自由软件包,而且这些软件包不依赖不符合该指导原则的软件包。这些软件包被视为 Debian 发型版的一部分。
contrib
包含符合 DFSG 指导原则的自由软件包,不过这些软件包依赖不在 main 分类中的软件包。
non-free
包含不符合 DFSG 指导原则的非自由软件包。
Ubuntu
Ubuntu 对软件包的分类可以用下表来表示(参考自 Wikipedia):
自由软件 | 非自由软件 | |
---|---|---|
官方支持的 | Main | Restricted |
非官方支持的 | Universe | Multiverse |
下面以deb http://us.archive.ubuntu.com/ubuntu/ trusty universe为例进行说明。
我们访问实例的源路径:http://us.archive.ubuntu.com/ubuntu/ 可以看到如下内容:
其中,比较重要的就是dists目录和pool目录。dists目录包含了当前库的所有软件包的索引。这些索引通过系统版本分类在不同的文件夹。
进入dists目录,看到如下内容:
可以看到很多文件夹,这些文件夹都是以下格式命名的:
codename
codename-backports
codename-proposed
codename-security
codename-updates
其中codename就是Ubuntu不同版本的代号,上图中的文件夹名其实就是对应了uri后面的发行版本。
可以看到Ubuntu14.04版本对应的代号是trusty。上述文件夹的差别在于:
Security - Important Security Updates.
Updates - Recommended Updates.
Proposed - Pre-released Updates.
Backports - Unsupported Updates.
因此我们可以根据需要填写不同的suite。
打开上面的任意一个文件夹,可以看到如下内容:
有main, multiverse, restricted, universe文件夹,这些文件夹名其实对应发行版本后面的component。这些文件夹里面包含了不同软件包索引。这几个文件夹内包的区别在于:
main: 完全的自由软件。
restricted: 不完全的自由软件。
universe: Ubuntu官方不提供支持与补丁,全靠社区支持。
multiverse:非自由软件,完全不提供支持和补丁。
如果我们打开main目录下的binary-i386子目录下的Packages.gz文件,可以看到如下内容:
Package: flashplugin-downloader
Architecture: i386
Version: 29.0.0.171ubuntu0.17.10.1
Multi-Arch: foreign
Priority: optional
Section: multiverse/web
Source: flashplugin-nonfree
Origin: Ubuntu
Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com
Original-Maintainer: Bart Martens bartm@knars.be
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 25
Depends: flashplugin-installer (>= 11.1.102.55ubuntu3)
Filename: pool/multiverse/f/flashplugin-nonfree/flashplugin-downloader_29.0.0.171ubuntu0.17.10.1_i386.deb
Size: 1894
MD5sum: a25f9bd19b8c6b4247e7b4f556f96eb5
SHA1: 08358cfd6a59f7724ef6fab66dc0cfabe4792c17
SHA256: 0ee2d3fa22cd37e80cd9180b5795c7dc8ac5de942b23c56252fde31276b93fe1
Homepage: http://www.adobe.com/products/flashplayer.html
Description: Adobe Flash Player plugin installer (transitional package)
Description-md5: 66ea91f4e504085408ea841953dc65d0
…
说明: Packages.gz这个文件其实是一个“索引”文件,里面记录了各种包的包名Package、运行平台(Architecture)、版本号(Version)、依赖关系(Depends)、deb包地址(Filename)等 。注意到Filename指向的是源服务器pool目录下的某个deb。因此我们可以猜测,apt-get install 某个软件时,其实就是基于这些Packages.gz来计算依赖关系,然后根据其中的Filename地址来下载所需的deb,然后再执行dpkg -i xxx.deb来完成软件包的安装。
注意:修改sources.list之后需要执行命令sudo apt-get update
Ubuntu的官方库地址:https://launchpad.net/ubuntu/+archivemirrors
Ubuntu中国的官方地址:http://mirrors.aliyun.com/ubuntu/