软件运行和编译
软件相关概念
ABI
ABI:(Application Binary Interface) 应用程序二进制接口
windows 与 linux 中的 ABI 格式是不兼容的
-
windows 中的是 PE (Portable Executable ) 格式
-
Linux 中的是 ELF ( Executable and Linkable Format ) 格式
查看可执行文件格式
file <文件名>
API
API 即 Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完 全相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows 系统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux API。在Windows 平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了 软件移植困难,POSIX 标准的出现就是为了解决这个问题。
POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序 提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。
linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了。
C语言程序的实现过程
C 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
C语言的程序编译主要经过四个过程:
预处理(Pre-Processing)
-
将所有的#define删除,并且展开所有的宏定义
-
处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等
-
处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置
-
删除所有的注释,//,/**/
-
添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
-
保留所有的#pragma编译指令,因为编译需要使用它们
编译 (Compiling)
编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生 成的汇编代码
汇编 (Assembling)
汇编是将汇编代码转变成机器码可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇 编相对于编译过程比较简单,根据汇编指令和机器指令的对 照表一一翻译即可
链接 (Linking)
通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成 可执行文件
软件模块的静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态 和动态链接
静态链接
-
把程序对应的依赖库复制一份到包
-
生成模块文件libxxx.a
-
嵌入程序包
-
升级难,需重新编译
-
占用较多空间,迁移容易
动态链接
-
只把依赖加做一个动态链接
-
生成模块文件libxxx.so
-
连接指向
-
占用较少空间,升级方便
模块(库)文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
#加载配置文件中指定的库文件
ldconfig
#配置文件
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
#缓存文件
/etc/ld.so.cache
软件包和包管理器
软件包介绍
开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软 件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具 dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的“package”概念第一次出现在 GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统。
软件包中的文件分类
-
二进制文件
-
库文件
-
配置文件
-
帮助文件
利用 cpio工具查看包文件列表
rpm2cpio 包文件|cpio –itv #预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” #释放包内文件
程序包管理器
软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序 包的安装、卸载、查询、升级和校验等管理操作
主流的程序包管理器:
-
redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
-
debian:deb文件, dpkg 包管理器
包命名
源代码打包文件命名
name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
#nginx-1.25.4.tar.gz
#major 主版本号
#minor 次版本号
#release 修正版本号
rpm包命名方式
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release:release.OS
#http-parser-2.8.0-9.el8.x86_64.rpm
#httpd-2.4.37-41.module+el8.5.0+695+1fa8055e.x86_64.rpm
#nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64.rpm
#major 主版本号
#minor 次版本号
#release 修正版本号
#el8 EL是Red Hat Enterprise Linux(EL)的缩写, EL8是Red Hat 8.x,CentOS 8.x,el8.4.0+ 是指 适配redhat8.4.0以上及centos8.4.0以上的系统
常见的arch:
-
x86: i386, i486, i586, i686
-
x86_64: x64, x86_64, amd64
-
powerpc: ppc
-
跟平台无关:noarch
分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。
包的分类
-
Application-VERSION-ARCH.rpm: 主包
-
Application-devel-VERSION-ARCH.rpm 开发子包
-
Application-utils-VERSION-ARHC.rpm 其它子包
-
Application-libs-VERSION-ARHC.rpm 其它子包
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包,安装软 件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
-
yum:rpm包管理器的前端工具
-
dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
-
apt:deb包管理器前端工具
-
zypper:suse上的rpm前端管理工具
程序包管理器相关文件
包文件组成 (每个包独有)
-
包内的文件
-
元数据,如:包的名称,版本,依赖性,描述等
-
可能会有包安装或卸载时运行的脚本
数据库(公共):/var/lib/rpm
-
程序包名称及版本
-
依赖关系
-
功能说明
-
包安装后生成的各文件路径及校验码信息
包管理器rpm
CentOS系统上使用rpm命令管理程序包
功能:安装、卸载、升级、查询、校验、数据库维护
安装
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v|verbose #显示详细信息
-vv #更详细
-h #显示安装进度条
--test #测试安装,但不真正执行安装,即dry run模式
--nodeps #忽略依赖关系
--replacefiles #忽略软件包之间的冲突的文件
--replacepkgs #如果软件包已经有了,重新安装软件包
--nosignature #不检查来源合法性
--nodigest #不检查包完整性
--noscripts #不执行程序包脚本,相当于 --nopre --nopost --nopreun --nopostun --nopretrans --noposttrans
--nopre #不执行程序包中安装前脚本
--nopost #不执行程序包中安装前脚本
--nopreun #不执行程序包中卸载前脚本
--nopostun #不执行程序包中卸载后脚本
--nopretrans #安装前不执行与程序同名脚本
--noposttrans #安装后不执行与程序同名脚本
#常用组合
rpm -ivh PACKAGE_FILE ...
升级和降级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade #安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen #安装有旧版程序包,则“升级”, 如果不存在旧版程序包,则不执行安装操作
--oldpackage #降级
--force #强制安装
#常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
-
不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
-
如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老 版本的配置文件,而把旧版本文件重命名(FILENAME.rpmnew)后保留
包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a #所有包
-f #查看指定的文件由哪个程序包安装生成
-p rpmfile #针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY #查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY #查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog #查询rpm包的changelog
-c #查询程序的配置文件
-d #查询程序的文档
-i #information
-l #查看指定的程序包安装后生成的所有文件
--scripts #程序包自带的脚本
--provides #列出指定程序包所提供的CAPABILITY
-R #查询指定的程序包所依赖的CAPABILITY
#常用查询组合
-qi PACKAGE #查询包详细信息
-qf FILE #根据文件查询包信息
-qc PACKAGE #查询配置文件
-ql PACKAGE #列出包内所有文件
-qd PACKAGE #查询文档文件
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE
-qa
包卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
#常用组合
rpm -evh
注意:当包卸载时,对应的配置文件不会删除(前提是该文件被改动过), 以FILENAME.rpmsave形式保 留
包校验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
rpm -K|checksig rpmfile
在检查包的来源和完整性前,必须导入所需要公钥
#导入公钥
[root@rocky86 v]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
#查看己导入的公钥
[root@rocky86 v]# rpm -qa "gpg-pubkey"
gpg-pubkey-2f86d6a1-5cf7cefb
gpg-pubkey-6d745a60-60287f36
#查看
[root@rocky86 v]# rpm -qi gpg-pubkey-6d745a60-60287f36
Name : gpg-pubkey
Version : 6d745a60
Release : 60287f36
Architecture: (none)
......
检查信息
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来, 可以用来检查包中的文件是否和当初安装时有所变化
格式:
rpm {-V|--verify} [select-options] [verify-options]
#字段说明
S #文件大小不一样
M #文件权限不一样或文件类型不一样
5 #md5 校验值不一样
D #版本号值不一样
L #链接路径不一样
U #属主发生了改变
G #属组发生了改变
T #修改时间发生了改变
P #功能发生了改变
c|d|g|l|r #文件类型 c配置文件, d数据文件,g该文件不属于此处,l许可文件(licens file),r自述文件(READ ME)
#如果占位符是 . 则表示该处与安装时没有任何改变
#示例
#安装之后没有修改任何文件
[root@rocky86 v]# rpm -V vsftpd
[root@rocky86 v]# echo $?
0
#安装之后修改了配置文件
[root@rocky86 v]# rpm -V nginx
S.5....T. c /etc/nginx/nginx.conf
[root@rocky86 v]# echo $?
1
数据库
rpm包安装时生成的信息,都放在rpm数据库中
[root@rocky86 v]# ll /var/lib/rpm
total 144016
-rw-r--r--. 1 root root 5218304 Jul 27 16:11 Basenames
-rw-r--r--. 1 root root 16384 Jul 20 16:09 Conflictname
-rw-r--r-- 1 root root 286720 Jul 27 16:21 __db.001
......
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb #初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb #重建已安装的包头的数据库索引目录
包更新日志
rpm -q --changelog packageName
yum和dnf
CentOS使用 yum, dnf 解决 rpm 的包依赖关系
YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定 位软件包,up2date的替代工具
CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
yum/dnf 工作原理
yum/dnf 是基于C/S 模式
-
yum 服务器存放rpm包和相关包的元数据库
-
yum 客户端访问yum服务器进行安装或查询等
yum 实现过程
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装包时,会自动下载 repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
yum客户端配置
yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置(一般不进行更改)
/etc/yum.repos.d/*.repo #为每个仓库的提供配置文件
获得帮助
man 5 yum.conf
公共配置
[root@rocky86 ~]# cat /etc/yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
installonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依赖
skip_if_unavailable=False #跳过不可用的
repo仓库配置文件指向的定义
[repositoryID]
name=Some name for this repository #仓库名称
baseurl=url://path/to/repository/ #仓库地址
mirrorlist=http://list/ #仓库地址列表,在这里写了多个 baseurl指向的地址
enabled={1|0} #是否启用,默认值为1,启用
gpgcheck={1|0} #是否对包进行校验,默认值为1
gpgkey={URL|file://FILENAME} #校验key的地址
enablegroups={1|0} #是否启用yum group,默认值为 1
failovermethod={roundrobin|priority} #有多个baseurl,此项决定访问规则,
roundrobin 随机,priority:按顺序访问
cost=1000 #开销,或者是成本,YUM程序会根据此值来决定优先访问哪个源,默认为1000
metadata_expire=6h #rocky-9中新增配置,metadata 过期时间
countme=1 #rocky-9中新增配置,默认值false,附加在mirrorlist之后,便于仓库收集客户端信息
baseurl 有多种写法,支持多种协议
baseurl=file:///cdrom/AppStream/
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=http://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=ftp://10.0.0.159/
#常见变量
$arch #CPU架构 aarch64|i586|i686|x86_64
$basearch #系统基本体系结构i386|x86_64
$releasever #系统版本
#带变量的写法
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?
arch=$basearch&repo=BaseOS-$releasever
#替换后的值
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-8
注意:yum仓库指向的路径一定必须是repodata目录所在目录
Rocky8.6上配置aliyun的repo源
[root@rocky86 yum.repos.d]# cat aliyun-baseos.repo
[aliyun-baseos]
name=aliyun baseos
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/x86_64/os/
gpgcheck=0
yum-config-manager
安装
该命令来自 yum-utils 包
[root@rocky86 yum.repos.d]# rpm -qf `which yum-config-manager `
yum-utils-4.0.21-11.el8.noarch
#常用选项
--add-repo=URL #添加repo源
--disable repoid #禁用源
--enable repoid #启用源
yum命令
yum命令的用法
yum [options] COMMAND
#常用选项
-c file|--config file #指定配置文件,默认使用/etc/yum.conf
-v|--verbose #显示详细信息
-b|--best #尝试在可用包中寻找最匹配的版本
-y|--assumeyes #自动回答为 yes
--nogpgcheck #不进行包校验
--repo repoid|--repoid repoid #指定repo源
--enablerepo repoid #临时启用repo源,可用通配符
--disablerepo repoid #临时禁用repo源,可用通配符
--nodocs #不安装文档
--skip-broken #跳过有问题的包
--enable #启用源,配合 configmanager
--disable #禁用源,配合 configmanager
-x package|--exclude package|--excludepkgs package #排除指定包,可用通配符
--downloadonly #只下载,不安装
#常用子命令
autoremove #卸载包,同时卸载依赖
check-update #检查可用更新
clean #清除本地缓存
downgrade #包降级
group #包组相关
help #显示帮助信息
history #显示history
info #显示包相关信息
install #包安装
list #列出所有包
makecache #重建缓存
reinstall #重装
remove #卸载
repolist #显示或解析repo源
search #包搜索,包括包名和描述
显示仓库列表
格式:
yum repolist [options]
#常用选项
-v|--verbose #显示详细信息
--repo repoid|--repoid repoid #指定repo源
--all #显示所有源
--enabled #所有enabled状态的源,默认项
--disabled #所有disabled 的源
#特别提醒
#yum repolist enabled 等价于 yum repolist --enabled
#但是
#yum repolist --enabled 可以写成 yum --enabled repolist
#yum repolist enabled 不能写成 yum enabled repolist
#要理解哪些是子命令,哪些是选项,哪些是参数
显示程序包
格式:
yum list [options] [PACKAGE [PACKAGE ...]
#常用选项
--all #显示所有包,包括己安装的和repo源中的可用包
--available #所有可用包
--installed #所有己安装的包
--extras #所有额外包
--updates #所有可更新的包
#上述选项可以替换成对应的 all,installed 这种子命令,但要注意位置
--showduplicates #相同的包,显示所有版本
安装程序包
yum install [options] PACKAGE [...]
yum reinstall [options] PACKAGE [...]
#常用选项
--installroot path #指定安装目录
--downloadonly #只下载,不安装
--downloaddir path|--destdir path #指定下载目录,如果下载目录不存在,则自动创建
卸载程序包
yum remove [options] PACKAGE [...]
yum erase [options] PACKAGE [...]
升级和降级
yum update [options] PACKAGE [...] #升级
yum downgrade [options] PACKAGE [...] #降级
yum check-update #检查可用升级
查询
yum info [options] PACKAGE [...] #查看程序包的 information 信息
yum provides [options] PROVIDE #查看文件是由哪个包提供
yum search [options] KEYWORD #根据关健字搜索,范围包括包名和描述信息
yum deplist [options] PACKAGE [...] #查询包的依赖
仓库缓存
缓存目录为 /var/cache/dnf/ ( /var/cache/yum/ )
yum clean [options] {metadata,packages,dbcache,expire-cache,all} #清空缓存
yum makecache #构建缓存
查看yum事务历史
yum 执行安装卸载命令会记录到相关日志中
日志文件 /var/log/dnf.log ( /var/log/yum.log )
yum history [options] [info|list|redo|undo]
yum history #默认查看所有
yum history list #同上
yum history package #查看与指定包有关的日志
info N #查看第N条记录的具体执行内容
undo N #回滚第N条记录
redo N #重新执行第N条记录
安装及升级本地程序包
yum localinstall|install [options] rpmfile1 [...] #安装本地RPM包
yum localupdate|update [options] rpmfile1 [...] #使用本地RPM包升级
包组管理的相关命令
yum grouplist [options] #列出所有包组
yum groupinstall [options] group1 [...] #包组安装
yum groupupdate [options] group1 [...] #包组升级
yum groupremove [options] group1 [...] #包组卸载
yum groupinfo [options] group1 [...] #包组查询
yum Troubleshooting
故障排错:
yum 和 dnf 失败最主要原因 | 解决方法 |
---|---|
yum的配置文件格式或路径错误 | 检查/etc/yum.repos.d/*.repo文件格式 |
yum cache | yum clean all |
网络不通 | 网卡配置 |
Ubuntu 软件管理
Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译 软件。包文件包括特定功能或软件所必需的文件、元数据和指令
-
dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可 以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
-
apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基 于客户/服务器架构(c/s)
rhel 系列与 debian系列包管理对比
操作系统 | 包文件后缀 | 本地包管理器 | 网络包管理器 | 网络包管理工作模式 | 配置文件 |
---|---|---|---|---|---|
rhel | rpm | rpm | yum/dnf | C/S | /etc/yum.repos.d/*.repo |
debian | deb | dpkg | apt | C/S | /etc/apt/sources.list |
APT 工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header)信 息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦 APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。
客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载 到客户端以便安装。当客户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压 缩文件后,会将其解压置放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的 时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装 或是可以升级的。
dpkg 包管理器
dpkg [<option> ...] <command>
#常用选项
-i|--install package.deb #安装包
--unpack package.deb #解包
-r|--remove packageName #删除包,不建议,不自动卸载依赖于它的包
-P|--purge packageName #删除包(包括配置文件)
-V|--verify packageName #检查包是否安装
--get-selections pattern #根据正则筛选包,并打出列表
--set-selections #从标准输入里读出要选择的软件。
--clear-selections #取消选中所有不必要的软件包。
--update-avail packageFile #替换现有可安装的软件包信息。
--merge-avail packageFile #把文件中的信息合并到系统中。
--clear-avail #清除现有的软件包信息。
--forget-old-unavail #忘却已被卸载的不可安装的软件包。
-s|--status packageName #显示指定软件包的详细状态,类似于 rpm -qi
-p|--print-avail packageName #显示当前机器上所有可安装的包
-L|--listfiles packageName #列出属于指定软件包的文件,类似于 rpm -ql
-l|--list [pattern] #列出当前己安装的包,类似于rpm -qa
-S|--search pattern #根据文件查询是来自于哪个包,类似于 rpm -qf
-C|--audit [pattern] #检查是否有软件包残损
--yet-to-unpack #列出标记为待解压的软件包
--predep-package #列出待解压的预依赖
--compare-vesions v1 - b #比较版本号
--force-help #显示本强制选项的帮助信息
-Dh|--debug=help #显示有关出错调试的帮助信息
--info packageFile #列出包相关信息
-c packageFile #列出包内文件,类似于 rpm -qpl
apt 命令用法
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 [options] command
#options
-h|--help #显示帮助
-v|--version #显示版本
-y|--yes #自动回答yes
-q|--quiet #安静模式
#command
list #根据名称列出软件包
search #搜索软件包描述
show|info #显示软件包细节
install #安装软件包
remove #移除软件包
autoremove #卸载所有自动安装且不再使用的软件包
update #更新可用软件包列表,只更新索引文件,不具体更新软件
upgrade #通过 安装/升级 软件来更新系统
full-upgrade #通过 卸载/安装/升级 来更新系统
edit-sources #编辑软件源信息文件
编辑源
root@ubuntu22:~# apt edit-sources
root@ubuntu22:~# vim /etc/apt/sources.list
配置文件格式说明
deb URL section1 section2
#字段说明
deb #固定开头,表示是二进制包的仓库,如果deb-src开头,表示是源码库
URL #库所在的地址,可以是网络地址,也可以是本地镜像地址
section1 #Ubuntu版本的代号,可用 lsb_release -sc 命令查看,也可以用 cat
/etc/os-release
section2 #软件分类,main完全自由软件 restricted不完全自由的软件,universe社区支持的软件,multiverse非自由软件
section1 #主仓
section1-backports #后备仓,该仓中的软件当前版本不一定支持
section1-security #修复仓,主要用来打补丁,有重大漏洞,需要在当前版本中修复时,会放此仓
section1-updates #非安全性更新仓,不影响系统安全的小版本迭代放此仓
section1-proposed #预更新仓,可理解为新版软件的测试放在此仓,测试一段时间后会移动到 updates仓或security仓,非专业人士勿用
在ubuntu库中,有两个重要目录,分别是dists和 pool
dists 目录中存放的是该源仓库中的元数据,包括软件包的名称,适用的架构平台,版本号,依赖关系等
pool 目录中存放的是具体包文件