Linux程序包管理
Linux程序包管理
-
API:Application Programming Interface
-
POSIX:Portable OS
程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
静态编译:
共享编译:.so
-
ABI:Application Binary Interface
Windows与Linux不兼容
- 库级别的虚拟化:
- Linux: WINE
- Windows: Cywin
-
系统级开发
+ C
+ C++ -
应用级开发
+ java
+ Python
+ php
+ perl
+ ruby -
二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
- 程序包管理器:
- debian:deb, dpt
- redhat: rpm, rpm
- rpm: Redhat Package Manager
- RPM is Package Manager
+ Gentoo
+ Archlinux
- 程序包管理器:
-
源代码:name-VERSION.tar.gz
VERSION: major.minor.release
-
rpm包命名方式:
name-VERSION-release.arch.rpm
-
VERSION: major.minor.release
-
release.arch:
- release:release.OS
-
zlib-1.2.7-13.el7.i686.rpm
-
常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关:noarch
-
testapp: 拆包
-
testapp-VERSION-ARCH.rpm: 主包
-
testapp-devel-VERSION-ARCH.rpm:支包
-
testapp-testing-VERSION-ARHC.rpm
-
包之间:存在依赖关系
X, Y, Zyum:rpm包管理器的前端工具;
apt-get:deb包管理器前端工具;
zypper: suse上的rpm前端管理工具;
dnf: Fedora 22+ rpm包管理器前端管理工具;
-
-
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
-
管理及查看本机装载的库文件:
ldconfig /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系; 配置文件为:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 缓存文件:/etc/ld.so.cache
-
程序包管理:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作;
- 1.成组成清单 (每个包独有)
- 文件清单
- 安装或卸载时运行的脚本
- 2.数据库(公共)
- 程序包名称及版本
- 依赖关系;
- 功能说明;
- 安装生成的各文件的文件路径及校验码信息;
- 1.成组成清单 (每个包独有)
-
管理程序包的方式:
- 使用包管理器:rpm
- 使用前端工具:yum, dnf
-
获取程序包的途径:
- 系统发版的光盘或官方的服务器;
- CentOS镜像:
http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com
- 项目官方站点
- 第三方组织:
- Fedora-EPEL
- 搜索引擎:
http://pkgs.org http://rpmfind.net http://rpm.pbone.net
- 自己制作
- 建议:
- 检查其合法性
- 来源合法性;
- 程序包的完整性;
- 系统发版的光盘或官方的服务器;
CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
-
安装:
- 语法:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v: verbose -vv: -h: 以#显示程序包管理执行进度;每个#表示2%的进度
- 常见用法:
rpm -ivh PACKAGE_FILE ...
[install-options] --test: 测试安装,但不真正执行安装过程;dry run模式; --nodeps:忽略依赖关系; --replacepkgs: 重新安装; --nosignature: 不检查来源合法性; --nodigest:不检查包完整性; --noscipts:不执行程序包脚本片断; %pre: 安装前脚本; --nopre %post: 安装后脚本; --nopost %preun: 卸载前脚本; --nopreun %postun: 卸载后脚本; --nopostun
- 语法:
-
升级:
- 语法:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
- 常见用法
upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”; freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作; rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降级; --force: 强行升级;
tips:
不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
-
查询:
rpm {-q|--query} [select-options] [query-options]
- 常见用法
[select-options] -a: 所有包 -f: 查看指定的文件由哪个程序包安装生成 -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作; --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供; --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖; [query-options] --changelog:查询rpm包的changlog -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information -l: 查看指定的程序包安装后生成的所有文件; --scripts:程序包自带的脚本片断 -R: 查询指定的程序包所依赖的CAPABILITY; --provides: 列出指定程序包所提供的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 {-V|--verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ
-
包来源合法性验正及完整性验正:
- 完整性验正:SHA256
- 来源合法性验正:RSA
- 公钥加密:
- 对称加密:加密、解密使用同一密钥;
- 非对称加密:密钥是成对儿的,
- public key: 公钥,公开所有人
- secret key: 私钥, 不能公开
- 导入所需要公钥:
rpm --import /PATH/FROM/GPG-PUBKEY-FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
-
数据库重建:
rpm {--initdb|--rebuilddb}
- initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作; - rebuilddb:重建
无论当前存在与否,直接重新创建数据库;
- initdb: 初始化
Linux程序包管理(2)
-
CentOS: yum, dnf
-
URL: ftp://172.16.0.1/pub/
-
YUM: yellow dog, Yellowdog Update Modifier
-
yum repository: yum repo
存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);
文件服务器:ftp:// http:// nfs:// file:///
-
yum客户端:
-
配置文件:
/etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo:为仓库的指向提供配置
-
仓库指向的定义:
[repositoryID] name=Some name for this repository baseurl=url://path/to/repository/ enabled={1|0} gpgcheck={1|0} gpgkey=URL enablegroups={1|0} failovermethod={roundrobin|priority} 默认为:roundrobin,意为随机挑选; Cost= 默认为1000
-
-
yum命令的用法:
yum [options] [command] [package ...]
List of Commands: check 检查 RPM 数据库问题 check-update 检查是否有可用的软件包更新 clean 删除缓存数据 deplist 列出软件包的依赖关系 distribution-synchronization 已同步软件包到最新可用版本 downgrade 降级软件包 erase 从系统中移除一个或多个软件包 fs Acts on the filesystem data of the host, mainly for removing docs/lanuages for minimal hosts. fssnapshot Creates filesystem snapshots, or lists/deletes current snapshots. groups 显示或使用、组信息 history 显示或使用事务历史 info 显示关于软件包或组的详细信息 install 向系统中安装一个或多个软件包 list 列出一个或一组软件包 load-transaction 从文件名中加载一个已存事务 makecache 创建元数据缓存 provides 查找提供指定内容的软件包 reinstall 覆盖安装软件包 repo-pkgs 将一个源当作一个软件包组,这样我们就可以一次性安装/移除全部软件包。 repolist 显示已配置的源 search 在软件包详细信息中搜索指定字符串 shell 运行交互式的 yum shell swap Simple way to swap packages, instead of using shell update 更新系统中的一个或多个软件包 update-minimal Works like upgrade, but goes to the 'newest' package match which fixes a problem that affects your system updateinfo Acts on repository update information upgrade 更新软件包同时考虑软件包取代关系 version 显示机器和/或可用的源版本。 Options: -h, --help 显示此帮助消息并退出 -t, --tolerant 忽略错误 -C, --cacheonly 完全从系统缓存运行,不升级缓存 -c [config file], --config=[config file] 配置文件路径 -R [minutes], --randomwait=[minutes] 命令最长等待时间 -d [debug level], --debuglevel=[debug level] 调试输出级别 --showduplicates 在 list/search 命令下,显示源里重复的条目 -e [error level], --errorlevel=[error level] 错误输出级别 --rpmverbosity=[debug level name] RPM 调试输出级别 -q, --quiet 静默执行 -v, --verbose 详尽的操作过程 -y, --assumeyes 回答全部问题为是 --assumeno 回答全部问题为否 --version 显示 Yum 版本然后退出 --installroot=[path] 设置安装根目录 --enablerepo=[repo] 启用一个或多个软件源(支持通配符) --disablerepo=[repo] 禁用一个或多个软件源(支持通配符) -x [package], --exclude=[package] 采用全名或通配符排除软件包 --disableexcludes=[repo] 禁止从主配置,从源或者从任何位置排除 --disableincludes=[repo] disable includepkgs for a repo or for everything --obsoletes 更新时处理软件包取代关系 --noplugins 禁用 Yum 插件 --nogpgcheck 禁用 GPG 签名检查 --disableplugin=[plugin] 禁用指定名称的插件 --enableplugin=[plugin] 启用指定名称的插件 --skip-broken 忽略存在依赖关系问题的软件包 --color=COLOR 配置是否使用颜色 --releasever=RELEASEVER 在 yum 配置和 repo 文件里设置 $releasever 的值 --downloadonly 仅下载而不更新 --downloaddir=DLDIR 指定一个其他文件夹用于保存软件包 --setopt=SETOPTS 设置任意配置和源选项 --bugfix Include bugfix relevant packages, in updates --security Include security relevant packages, in updates --advisory=ADVS, --advisories=ADVS Include packages needed to fix the given advisory, in updates --bzs=BZS Include packages needed to fix the given BZ, in updates --cves=CVES Include packages needed to fix the given CVE, in updates --sec-severity=SEVS, --secseverity=SEVS Include security relevant packages matching the severity, in updates
-
显示仓库列表:
repolist [all|enabled|disabled]
-
显示程序包:
list # yum list [all | glob_exp1] [glob_exp2] [...] # yum list {available|installed|updates} [glob_exp1] [...]
-
安装程序包:
install package1 [package2] [...] reinstall package1 [package2] [...] (重新安装)
-
升级程序包:
update [package1] [package2] [...] downgrade package1 [package2] [...] (降级)
-
检查可用升级:
check-update
-
卸载程序包:
remove | erase package1 [package2] [...]
-
查看程序包information:
info [...]
-
查看指定的特性(可以是某文件)是由哪个程序包所提供:
provides | whatprovides feature1 [feature2] [...]
-
清理本地缓存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
-
构建缓存:
makecache
-
搜索:
search string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息;
-
查看指定包所依赖的capabilities:
deplist package1 [package2] [...]
-
查看yum事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
-
安装及升级本地程序包:
* localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) * localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update)
-
包组管理的相关命令:
* groupinstall group1 [group2] [...] * groupupdate group1 [group2] [...] * grouplist [hidden] [groupwildcard] [...] * groupremove group1 [group2] [...] * groupinfo group1 [...]
-
如何使用光盘当作本地yum仓库:
(1) 挂载光盘至某目录,例如/media/cdrom # mount -r -t iso9660 /dev/cdrom /media/cdrom (2) 创建配置文件 [CentOS7] name= baseurl= gpgcheck= enabled=
-
yum的命令行选项:
--nogpgcheck:禁止进行gpg check; -y: 自动回答为“yes”; -q:静默模式; --disablerepo=repoidglob:临时禁用此处指定的repo; --enablerepo=repoidglob:临时启用此处指定的repo; --noplugins:禁用所有插件;
-
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号; $arch: 平台; $basearch:基础平台; $YUM0-$YUM9 http://mirrors.magedu.com/centos/$releasever/$basearch/os
-
创建yum仓库:
createrepo [options] <directory>
-
程序包编译安装:
testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;
源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行
- 源代码组织格式:
-
多文件:文件中的代码之间,很可能存在跨文件依赖关系;
-
C、C++: make (configure --> Makefile.in --> makefile)
java: maven
-
C代码编译安装三步骤:
- ./configure:
通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
检查依赖到的外部环境;
- make:
根据makefile文件,构建应用程序;
- make install
-
开发工具:
autoconf: 生成configure脚本 automake:生成Makefile.in
建议:安装前查看INSTALL,README
-
- 开源程序源代码的获取:
- 官方自建站点:
- apache.org (ASF)
- mariadb.org
- ...
- 官方自建站点:
- 代码托管:
- SourceForge
- Github.com
- code.google.com
- 编译C源代码:c/c++: gcc (GNU C Complier)
-
前提:提供开发工具及开发环境
- 开发工具:make, gcc等
- 开发环境:开发库,头文件
glibc:标准库
- 通过“包组”提供开发组件
CentOS 6: "Development Tools", "Server Platform Development",
-
第一步:configure脚本
选项:指定安装位置、指定启用的特性
--help: 获取其支持使用的选项
- 选项分类:
安装路径设定: --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/ --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置; System types: Optional Features: 可选特性 --disable-FEATURE --enable-FEATURE[=ARG] Optional Packages: 可选包 --with-PACKAGE[=ARG] --without-PACKAGE
-
第二步:make
-
第三步:make install
-
- 安装后的配置:
-
(1) 导出二进制程序目录至PATH环境变量中;
编辑文件
/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
-
(2) 导出库文件路径
编辑
/etc/ld.so.conf.d/NAME.conf
添加新的库文件所在目录至此文件中;
让系统重新生成缓存:
ldconfig [-v]
-
(3) 导出头文件
基于链接的方式实现:
ln -sv
-
(4) 导出帮助手册
编辑/etc/man.config文件
添加一个MANPATH
-