软件运行环境
软件包基础
rpm包管理
yum管理
定制yum仓库
编译安装
软件运行和编译
- ABI:Application Binary Interface
- Windows与Linux不兼容,应用程序
- 二进制接口
- ELF(Executable and Linkable Format)
- PE(Portable Executable)
- 库级别的虚拟化:
- Linux: WINE
- Windows: Cygwin
- 二进制接口
- API:Application ProgrammingInterface
- POSIX:Portable OS
- 程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接
- 静态编译:.a
- 动态编译:.so
C程序编译过程
静态和动态链接
- 链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接
- 静态链接
- 把程序对应的依赖库复制一份到包
- libxxx.a
- 嵌入程序包
- 升级难,需重新编译
- 占用较多空间,迁移容易
- 动态链接
- 只把依赖加做一个动态链接
- libxxx.so
- 连接指向
- 占用较少空间,升级方便
C程序静态链接
Java程序运行
开发语言
- 系统级开发
- C
- C++
- 应用级开发
- java
- Python
- go
- php
- perl
- delphi
- ruby
包管理器
- 二进制应用程序的组成部分:
- 二进制文件、库文件、配置文件、帮助文件
- 程序包管理器:
- debian: deb文件, dpkg包管理器
- redhat: rpm文件, rpm包管理器
- rpm: Redhat Package Manager
- RPM Package Manager
包命名
- 源代码:name-VERSION.tar.gz|bz2|xz
- VERSION:minor.release
- rpm包命名方式:
- name-VERSION-release.arch.rpm
- 例:bash-4.2.46-19.el7.x86_64.rpm
- VERSION: major.minor.release
- release:release.OS
- 常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64 powerpc: ppc
- 跟平台无关:noarch
- name-VERSION-release.arch.rpm
包命名和工具
- 包:分类和拆包
- Application-VERSION-ARCH.rpm: 主包
- Application-devel-VERSION-ARCH.rpm 开发子包
- Application-utils-VERSION-ARHC.rpm 其它子包
- Application-libs-VERSION-ARHC.rpm 其它子包
- 包之间:可能存在依赖关系,甚至循环依赖
- 解决依赖包管理工具:
- yum:rpm包管理器的前端工具
- apt-get:deb包管理器前端工具
- zypper: suse上的rpm前端管理工具
- dnf: Fedora 18+ rpm包管理器前端管理工具
库文件
- 查看二进制程序所依赖的库文件
- ldd/PATH/TO/BINARY_FILE
- 管理及查看本机装载的库文件
- ldconfig 加载库文件
- /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路
- 径映射关系
- 配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
- 缓存文件:/etc/ld.so.cache
包管理器
- 程序包管理器:
- 功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
- 包文件组成 (每个包独有)
- RPM包内的文件
- RPM的元数据,如名称,版本,依赖性,描述等
- 安装或卸载时运行的脚本
- 数据库(公共):/var/lib/rpm
- 程序包名称及版本
- 依赖关系
- 功能说明
- 包安装后生成的各文件路径及校验码信息
程序包的来源
- 管理程序包的方式:
- 使用包管理器:rpm
- 使用前端工具:yum, dnf
- 获取程序包的途径:
- (1) 系统发版的光盘或官方的服务器
- CentOS镜像:
- (2) 项目官方站点
- (3) 第三方组织:
- Fedora-EPEL:
- Extra Packages for Enterprise Linux
- Rpmforge:RHEL推荐,包很全
- 搜索引擎:
- http://pkgs.org
- http://rpmfind.net
- http://rpm.pbone.net
- https://sourceforge.net/
- Fedora-EPEL:
- (4) 自己制作
- 注意:第三方包建议要检查其合法性来源合法性,程序包的完整性
rpm包管理
- CentOS系统上使用rpm命令管理程序包:
- 安装、卸载、升级、查询、校验、数据库维护
- 安装:
- rpm {-i|–install} [install-options] PACKAGE_FILE…
- -v: verbose
- -vv:
- -h: 以#显示程序包管理执行进度
- rpm -ivh PACKAGE_FILE …
- rpm {-i|–install} [install-options] PACKAGE_FILE…
rpm包安装
- [install-options]
- –test: 测试安装,但不真正执行安装,即dry run模式
- –nodeps:忽略依赖关系,安装后无法用;
- –replacepkgs | replacefiles,覆盖原包重装
- –nosignature: 不检查来源合法性
- –nodigest:不检查包完整性
- –noscripts:不执行程序包脚本
- %pre: 安装前脚本 –nopre
- %post: 安装后脚本 –nopost
- %preun: 卸载前脚本 –nopreun
- %postun: 卸载后脚本 –nopostun
- 实验:删除/usr/bin/rpm,并恢复之;救援模式重装
rpm包升级
- 升级:
- rpm {-U|–upgrade} [install-options]PACKAGE_FILE…
- rpm {-F|–freshen} [install-options] PACKAGE_FILE…
- upgrade:
- 安装有旧版程序包,则“升级”
- 如果不存在旧版程序包,则“安装”
- freshen:
- 安装有旧版程序包,则“升级”
- 如果不存在旧版程序包,则不执行升级操作
- rpm -Uvh PACKAGE_FILE …
- rpm -Fvh PACKAGE_FILE …
- –oldpackage:降级
- –force: 强制安装
- upgrade:
升级注意事项
- 注意:
- (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
- (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
包查询
- rpm {-q|–query} [select-options][query-options]
- [select-options]
- -a: 所有包
- -f: 查看指定的文件由哪个程序包安装生成
- –p rpmfile:针对尚未安装的程序包文件做查询操作,后面跟路径
- –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
- –whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
- rpm2cpio 包文件|cpio–itv 预览包内文件,使用后文件可能属性要更改
- rpm2cpio包文件|cpio –id “*.conf” 释放包内文件
- [query-options]
- –changelog:查询rpm包的changelog
- -c: 查询程序的配置文件
- -d: 查询程序的文档
- -i: information
- -l: 查看指定的程序包安装后生成的所有文件
- –scripts:程序包自带的脚本
- –provides: 列出指定程序包所提供的CAPABILITY
- -R: 查询指定的程序包所依赖的CAPABILITY
- 常用查询用法:
- -qi PACKAGE, -qf FILE,-ql PACKAG,-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qa PACKAGE_FILE
- 包卸载:
- 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 -K|checksig rpmfile 检查包的完整性和签名
- rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
- CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
- rpm -qa “gpg-pubkey*”
- rpm数据库重建:
- /var/lib/rpm
- rpm{–initdb|–rebuilddb}
- initdb: 初始化
- 如果事先不存在数据库,则新建之
- 否 则 , 不 执 行 任 何 操 作
- rebuilddb:重建已安装的包头的数据库索引目录
- initdb: 初始化
- RPM缺点:不能有效解决包依赖性问题
yum
- CentOS: yum,dnf
- YUM:Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
- yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
- 文件服务器:
- http://
- https://
- ftp://
- file://
yum配置文件
- yum客户端配置文件:
- /etc/yum.conf:为所有仓库提供公共配置
- /etc/yum.repos.d/*.repo:为仓库的指向提供配置
- 仓库指向的定义:
- [repositoryID]—–>无空格
- name=Some name for this repository
- baseurl=url://path/to/repository/
- enabled={1|0}—->默认启用,1-启用,0-禁用
- gpgcheck={1|0}
- gpgkey=URL
- enablegroups={1|0}
- failovermethod={roundrobin|priority}
- roundrobin:意为随机挑选,默认值
- priority:按顺序访问
- cost= 默认为1000
yum仓库
- yum的repo配置文件中可用的变量:
- $releasever: 当前OS的发行版的主版本号,6/7….
- $arch: 平台,i386,i486,i586,x86_64等
- $basearch:基础平台;i386, x86_64
- $YUM0-$YUM9:自定义变量
- 实例:
- http://server/centos/$releasever/$basearch/
- http://server/centos/7/x86_64
- http://server/centos/6/i384
yum源
- 阿里云repo文件:
- CentOS系统的yum源
- 阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
- 清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
- EPEL的yum源:
- 阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
yum-config-manager
- 生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
- yum-config-manager –add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
- yum-config-manager–disable “仓库名” 禁用仓库
- yum-config-manager–enable “仓库名” 启用仓库
yum命令
- yum命令的用法:
- yum [options] [command] [package …]
- 显示仓库列表:
- yum repolist [all|enabled|disabled]
- 显示程序包:
- yum list
- yum list [all | glob_exp1] [glob_exp2] […]
- yum list {available|installed|updates} [glob_exp1] […]
- 安装程序包:
- yum install package1 [package2] […]
- yum reinstall package1 [package2] […] (重新安装)
- yum install -y -q 包;静默安装;
- 升级程序包:
- yum update [package1] [package2] […]
- yum downgrade package1 [package2] […] (降级)
- 检查可用升级:
- yum check-update
- 卸载程序包:
- yum remove | erase package1 [package2] […]
- 卸载虚拟网卡:yum remove libvirt-demon
- 查看程序包information: yum info[…]
- 查看指定的特性(可以是某文件)是由哪个程序包所提供: yum provides | whatprovides feature1 [feature2] […]
- 清理本地缓存:仓库发生变化时使用
- 清除/var/cache/yum/$basearch/$releasever缓存
- yum clean [ packages | metadata | expire-cache | rpmdb | plugins |all ]
- 构建缓存:
- yum makecache
- 搜索:yumsearch string1 [string2] […]
- 以指定的关键字搜索程序包名及summary信息
- 查看指定包所依赖的capabilities:
- yum deplist package1 [package2] […]
- 查看yum事务历史:
- yum history [info|list|packages-list|packages-info| summary|addon-info|redo|undo| rollback|new|sync|stats]
- yum history info 6
- yum history undo 6
- yum history redo 6
- 日志 :/var/log/yum.log
- 安装及升级本地程序包:
- yum localinstall rpmfile1 [rpmfile2] […] (用install替代)
- yum localupdate rpmfile1 [rpmfile2] […] (用update替代)
- 包组管理的相关命令:
- yum groupinstall group1 [group2] […]
- yum groupupdate group1 [group2] […]
- yum grouplist [hidden] [groupwildcard] […]
- yum groupremove group1 [group2] […]
- yum groupinfo group1 […]
- yum的命令行选项:
- –nogpgcheck:禁止进行gpg check
- -y: 自动回答为“yes”
- -q:静默模式
- –disablerepo=repoidglob:临时禁用此处指定的repo
- –enablerepo=repoidglob:临时启用此处指定的repo
- –noplugins:禁用所有插件
系统光盘yum仓库
- 系统安装光盘作为本地yum仓库:
- (1)挂载光盘至某目录,例如/mnt/cdrom mount /dev/cdrom /mnt/cdrom
- (2)创建配置文件
- [CentOS7]
- name=
- baseurl=
- gpgcheck=
- enabled=
- 创建yum仓库:
- createrepo [options] <directory>
- 实验:建立基于HTTP的yum仓库
程序包编译
- 程序包编译安装:
- Application-VERSION-release.src.rpm–> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
- 源代码–>预处理–>编译–>汇编–>链接–>执行
- 源代码组织格式:
- 多文件:文件中的代码之间,很可能存在跨文件依赖关系
- C、C++:make 项目管理器
- configure脚本 –> Makefile.in –> Makefile java: maven
- C语言源代码编译安装三步骤:
- 1、./configure
- (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及in文件生成Makefile
- (2) 检查依赖到的外部环境,如依赖的软件包
- 2、make 根据Makefile文件,构建应用程序
- 3、makeinstall 复制文件到相应路径
- 1、./configure
- 开发工具:
- autoconf: 生成configure脚本
- automake:生成Makefile.in
- 注意:安装前查看INSTALL,README
编译安装
- 开源程序源代码的获取:
- 官方自建站点:
- apache.org (ASF:Apache Software Foundation)
- mariadb.org
- …
- 代 码 托 管 :
- SourceForge.net
- Github.com
- code.google.com
- 官方自建站点:
- c/c++编译器: gcc(GNU C Complier)
- 编译C源代码:
- 准备:提供开发工具及开发环境
- 开发工具:make, gcc等开发环境:开发库,头文件
- glibc:标准库
- 实现:通过“包组”提供开发组件
- Development Tools
- Server Platform Development
- 准备:提供开发工具及开发环境
- 第一步:configure脚本
- 选项:指定安装位置、指定启用的特性
- –help: 获取其支持使用的选项
- 选项分类:
- 安装路径设定:
- –prefix=/PATH: 指定默认安装位置,默认为/usr/local/
- –sysconfdir=/PATH:配置文件安装位置System types:支持交叉编译
- 安装路径设定:
- Optional Features: 可选特性
- –disable-FEATURE
- –enable-FEATURE[=ARG]
- Optional Packages: 可选包
- –with-PACKAGE[=ARG],依赖包
- –without-PACKAGE,禁用依赖关系
- 注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名 一般类似于name-devel-VERSION
- 第二步:make;如:make -j 8,8个cpu
- 第三步:makeinstall
- 安装后的配置:
- (1)二进制程序目录导入至PATH环境变量中
- 编辑文件/etc/profile.d/NAME.sh
- export PATH=/PATH/TO/BIN:$PATH
- 编辑文件/etc/profile.d/NAME.sh
- (2)导入库文件路径
- 编辑/etc/ld.so.conf.d/NAME.conf
- 添加新的库文件所在目录至此文件中让系统重新生成缓存:
- ldconfig [-v]
- (1)二进制程序目录导入至PATH环境变量中
- (3)导入头文件
- 基于链接的方式实现: ln -sv
- (4)导入帮助手册
- 编辑/etc/man.config|man_db.conf文件
- 添加一个MANPATH
练习
- 1、查询命令java来自于哪个rpm包
- 2、yum的配置和使用,包括yum仓库的创建
- 3、编写系统初始化脚本sh,包括别名,提示符颜色,yum仓库配置文件, 安装tree,ftp,lftp,telnet等包
- 4、用脚本在CentOS7上编译安装和卸载apache4源码包,并启动此服务