Program package Management 程序包管理
单片机
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择
接口
- API:Application Program Interface
- ABI:Application Binary Interface
--
系统文件格式
- Unix-like文件内容格式:ELF
- Windows:exe, msi
库级别的虚拟化
- Linux: WinE
- Windows: Cywin
系统级开发
- C/C++:httpd, vsftpd, nginx
- Go
应用级开发
- Java: hadoop, hbase (依赖于jvm)
- Python:openstack, (依赖于pvm)
- Perl: (依赖于perl解释器)
- Ruby: (依赖于rvm)
- PHP: (依赖于php解释器)
C/C++程序格式
- 源代码:文本格式的程序代码;
- 编译开发环境:编译器、头文件、开发库
- 二进制格式:文本格式的程序代码 -> 编译器 -> 二进制格式(binary、lib、etc、man)
- 二进制程序文件、库文件、配置文件、帮助文件
--
Java/Python程序格式
- 源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
- 开发环境:编译器、开发库
- 二进制
项目构建工具
- C/C++: make
- Java: maven
- Web: gulp, grunt, webpack, rollup
程序包管理器
- 源代码 -> 目标二进制格式(bin,lib,etc,man->组织成为一个或有限几个“包”文件;
- 安装、升级、卸载、查询、校验
程序包管理器种类
- debian: dpt, dpkg, .deb
- redhat: redhat package manager, rpm, .rpm(rpm is package manager)
- S.u.S.E: rpm, .rpm
- Gentoo: ports
- ArchLinux: pacman
源代码:
name-VERSION.tar.gz
VERSION:major.minor.release
主版本号: 架构
次版本号: 功能
发行号: 修复
rpm包命名格式:name-VERSION-release.os.arch.rpm
VERSION: major.minor.release(程序发行号)
release: rpm包的发行号
os: 操作系统
archetecture: 系统架构;i386, x64(amd64), ppc, noarch
noarch: 有些程序基于java,python虚拟机上编写的
VERSION-2.el7.i386.rpm
- redis-3.0.2.targz --> redis-3.0.2-1.centos7.x64.rpm
拆包:主包和支包
- 主包:name-VERSION-release.arch.rpm
- 支包:name-function-VERSION-release.arch.rpm
- function:devel, utils, libs, ...
依赖关系
- X, Y, Z
- X --> Y,Z
- Y --> A, B, C
- C --> Y
- Y --> A, B, C
前端工具:自动解决依赖关系
- yum: rhel系列系统上rpm包管理器的前端工具
- apt-get(apt-cache): deb包管理器的前端工具
- zypper: suse的rpm管理器前端工具
- dnf: Fedora 22+系统上rpm包管理器的前端工具
程序包管理器详解
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作
程序包的组成清单(每个程序包都单独实现)
- 文件清单
- 安装或卸载时运行的脚本
数据库(公共)
程序包的名称和版本
依赖关系
功能说明
安装生成的各文件的文件路径及校验码信息
rpm数据库文件路径:
# ls /var/lib/rpm/
获取程序包的途径
- 系统发行版的光盘或官方的文件服务器(或镜像站点)
项目的官方站点
第三方组织
- 自动动手,丰衣足食
- 建议:检查其合法性-依赖于签名密钥
- 来源合法性
- 程序包的完整性
CentOS系统上rpm命令管理程序包
安装、升级、卸载、查询、校验、数据库维护
rpm命令
rpm [OPTIONS] [PACAGE_FILE]
安装:-i, --install
升级:-U,--update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, -verify
数据库维护:--builddb, --initdb
安装:-i, --install
rpm {-i|--install} {install-options} PACKAGE_FILE
rpm -ivh PACKAGE_FILE
GENERAL OPTIONS:
-v:verbose
-vv:更详细
[install-options]:
-h, --hash:输出进度条;每个#表示2%的进度
--test:测试安装,检查并报告依赖关系及冲突消息等
--nodeps:忽略依赖关系强制安装
--replacepkgs:重新安装(配置文件删除之后之后重新安装)
--noscript:不执行校验脚本(任何脚本)
--nosignature:不检查包签名信息,不检查来源合法性
--nodigest:不检查包完整性信息;md5信息
- 注意:rpm自带脚本, --noscript(都不执行一下脚本)
preinstall:安装过程开始之前运行的脚本,%pre,--nopre
postinstall:安装过程完成之后运行的脚本,%post,--nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun,--nopreun
postuninstall:卸载过程完整之后运行的脚本:%postun,--nopostun
升级:-U,--update, -F,--freshen
rpm {-U|--upgrade} {options} PACKAGE_FILE...
rpm {-F|--freshen} {options} PACKAGE_FILE...
-U:升级或安装
-F:升级
rpm -Uvh PACKAGE_FILE...
rpm -Fvh PACKAGE_FILE...
--oldpackage: 降级为较老版本
--force: 强制升级
--nodeps
--noscript
--test
- 注意
- 不要对内核升级操作;Linux支持多内核版本并存,直接安装新版本内核;
- 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
卸载:-e,--erase
rpm {-e|--erase} {options} PACKAGE_NAME...
--allmatches: 卸载所有匹配指定名称的程序包的各版本;
--nodeps: 忽略依赖关系
--test: 测试卸载,dry run模式
查询:-q, --query
rpm {-q|--query} {select-options} {query-options} PACKAGE_NAME
- {select-options}
PACKAGE_NAME: 查询指定的程序包是否已经安装及其版本
-a,--all: 查询所有已经安装过的包
-f, --file FILE:查询指定的文件由哪个包生成
-p,--package PACKAGE_FILE:未安装的程序包执行查询操作
rpm -qpl zsh-5.0.2-7.el7_1.2.x86_64.rpm`
rpm -qpi zsh-5.0.2-7.el7_1.2.x86_64.rpm`
rpm -qpc zsh-5.0.2-7.el7_1.2.x86_64.rpm`
rpm -qpd zsh-5.0.2-7.el7_1.2.x86_64.rpm`
rpm -q --scripts zsh-5.0.2-7.el7_1.2.x86_64.rpm`
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
- [query-options]
--changelog:rpm包的changelog,版本迭代信息
-l, --list:程序包安装生成的所有文件列表
-i,--info:查询程序包信息,版本号、大小、所属的包组等
-c,--configfiles:查询指定程序包提供的配置文件
-d, --docfile:查询指定的程序包的帮助文档
--provides:列出指定的程序包提供的CAPABILITY
- 项目依赖
rpm -q --whatprovides bash`
rpm -q --whatprovides 'config(bash)'`
-R,--requires:查询指定程序包所依赖关系,依赖关系先解决
--script:查询程序包的脚本代码
Relocations: 重新定位到新的路径下安装
- 已安装包查询操作
-qi PCK
-qf FILE
-qc PCK
-ql PCK
-qd PCK
- 未安装的包查询操作
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE
-qpc PACKAGE_FILE
-qpd PACKAGE_FILE
-qpR PACKAGE_FILE
校验:-V, --Verify
--nodeps
--nodigest: 校验信息
--nofiles
--noscripts
--nosignature 完整性
--nofiledigest(--nomd5) 校验码
--nolinkto
--nosize
--nouser
--nogroup
rpm -V zsh
修改包的某个文件只有 # rpm -V zsh
校验结果
- S: file Size differs
- M: mode differs
- D: Device major/minor number mismatch 主次设备号不匹配
- L: readLink(2) path mismatch
- 5: digest(formerly MD5 sum) differs
- T: mTime differs
- U:User ownership differ
- P: Capabilities differ
包来源合法性验证和完整性验证
来源合法性验证
- 生成一对密钥
- 包的后面添加(私钥)数字签名(digital signature)
- 公钥提供给所有人
- 包的制作者使用单向加密计算出程序包的特征码定长输出
- 然后在用自己的私钥加密这个特征码(数字签名),并且把加密后的特征码附加在包的后面
- 包使用者使用公钥解密附加在包后面的数字签名,取出特征码(来源合法性得到验证),并使用单向加密技术对包计算出特征码,在与其上特征码进行比较是否相等(包完整性得到验证)。
获取并导入信任的包作者的公钥
- 对于CentOS发行版
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
- RPM-GPG-KEY-CentOS-7(在光盘里有RPM公钥)
rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-7
验证
- 安装此组织签名的程序时,会自动执行验证
- 手动验证:
# rpm -K zsh-2.0.1.el7.rpm
来源合法性验证方法
rsa sha1(md5)
pgp md5
RSA: 公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制
GPG: (Pretty Good Privacy,更好地保护隐私),是一个基于RSA公钥加密体系的邮件加密软件。
数字签名:使用私钥加密对应数据单向加密的特征码
数据库重建:--builddb, --initdb
rpm管理器数据库路径:/var/lib/rpm/
查询操作:通过此处的数据库进行
#### 获取帮助
- CentOS 6:
# man rpm
- CentOS 7:
# man rpmdb
数据库损坏解决方案
rpm {--initdb | --rebuilddb}
--initdb:初始化数据库,当前无任何数据库可初始化创建一个新的;当前有时不执行任何操作
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建
--dbpath/tmp/rpm:指明新的路径下初始化数据库
# mkdir /tmp/rpm
# rpm --initdb --dbpath=/tmp/rpm
# ls /tmp/rpm/
# rpm --rebuilddb --dbpath=/tmp/rpm
yun 管理器
C/S 架构
- Server
- 支持 ftp 和 http, createrepo 创建仓库
- Client
- yum 命令读取配置文件远程访问 yum 源
- 读取 Server 的依赖关系的数据缓存到本地当中
- 根据依赖关系从远程下载依赖关系的程序包并安装程序包
- 删除 cache 源数据依赖关系,保留程序包
- Server
远程下载的源数据跟本地的源数据文件校验码进行比较,如果不相等就再次下载源数据文件
YUM: yellow dog update modifier
yum repository: yum repo 存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)
仓库文件服务器
- ftp://
- http://
- nfs://
- file:///
yum 客户端
配置文件:
# rpm -qc yum
/etc/yum.conf
: 主配置文件(为所有仓库提供公共配置)/etc/yum.repo.d/*.repo
: 为仓库的指向提供配置
/etc/yum.conf
cachedir=/var/cache/yum/$basearch/$releasever 缓存目录
keepcache=0 是否本地保留缓存
debuglevel=2 调试级别
logfile=/var/log/yum.log 安装日志文件
exactarch=1 精确严格平台匹配
obsoletes=1 过时的
gpgcheck=1 来源合法性和包完整性
plugins=1 插件机制
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpgk=centos-release 发行版号
# whatis yum.conf
# man 5 yum.conf
仓库指向的定义
[repositoryID]
name=Some name for this repository
baseurl=url://server1/path/to/repository/
url://server1/path/to/repository/
url://server1/path/to/repository/
enable={1|0}
gpgcheck={1|0}
repo_gpgcheck={1|0} 元数据文件数字签名验证
gpgkey=URL gpg的密钥文件
enablegroups={1|0} 是否使用组管理程序包
failovermethod= {roundrobin or priority} 轮循(随机) 优先级
roundrobin 默认
username
password
cost 开销,默认1000
mirrorlist 必须支持plugin
创建 YUM
[base]
name=Base Repo on 192.168.1.100
baseurl=http://IP/path/to/ repodata所在目录
enable=1
gpgcheck=0
[epel]
name=Fedora EPEL for El6
base=http:/IP/path/to/
gpgcheck=0
yum 命令
# yum [opitons] [command] [package ...]
# yum help [command]
显示仓库列表
# yum repolist [all | enabled | disabled]
显示程序包
# yum list [all | glob_exp] [glob_exp2]
# yum list installed [glob_exp1] [...] yum安装的包
# yum list available [glob_exp1] [...] 可安装的包
# yum list updates [glob_exp1] [...] 可升级的包
# yum list extras [glob_exp1] [...] 额外的
# yum list obsoletes [glob_exp1] [...] 废弃的
- @anaconda... 操作系统安装的包
- installed
- avalible
安装程序包
# yum -y install package[-version] ...
重新安装
# yum reinstall package
查看指定包所依赖胡capabilities:
# yum deplist package
### 降级程序包
# yum downgrade package
升级程序包:
# yum update package ...
# yum update-to package ...
检查可用升级
# yum check-update
卸载程序包:
# yum remove | erase package1...
查看程序包信息:
# yum info package1...
查看指定的特性(可以是某文件)是由哪个程序包所提供:
# yum provides | whatprovides feature1 ...
- 相似-qf
清理本地缓存
# yum clean [ package | metadata | expire-cache | rpmdb | plugins | all]
构建缓存:
取各各仓库获取元数据到本地
# yum makecache
搜索:模糊匹配
以指定的关键字搜索程序包名及summary信息
# yum search package_name
yum事务历史(安装、升级、卸载)
# yum history [list | info | stats]
安装及升级本地程序包(自动解决依赖关系包)
# yum localinstall rpmfile
# yum localupdate rpmfile
### 包组相关命令
# yum grouplist
# yum -y groupinstall "group_package_name"
# yum groupupdate "group_package_name"
# yum groupremove "group_package_name"
# yum groupinfo "group_package_name"
如何使用光盘当作本地yun仓库
- 挂载光盘至某目录,例如/media/cdrom
# mount -r -t iso9660 /dev/cdrom /media/cdrom`
- 创建配置文件
[CentOS7-CDROM]
name=cdrom repository
baseurl=file:///media/cdrom
gpgcheck=0
enabled=0
yum的命令行选项:
--nogpgcheck:禁止进行gpg check
-y:自动回答为yes
-q:静默模式
--disablerepo=repoidglob:临时禁用对此处指定的repo
--enablerepo=repoidglob:临时启用此处指定的repo
--noplugins:禁用所有插件
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号
$arch: 平台
$basearch: 基础平台, i386,x86_64 都认为 i386
$YUM0-$YUM9
http://mirrors.lingyima.com/centos/$releasever/$basearch/os http://mirrors.lingyima.com/centos/6/i386/os http://mirrors.lingyima.com/centos/6/x86_64/os http://mirrors.lingyima.com/centos/7/x86_64/os
创建yum仓库
1. 安装createrepo包
# yum -y install createrepo
2. ftp里连接发送rpm文件
# !mkdir -p /yum/repo
# lcd /yum/repo
# mget *.rpm
3. 创建yum仓库
# cd /yum/repo
# createrepo ./
[xen4entos]
name=Xen 4 CentOS
baseurl=file:///yum/repo
gpgcheck=0
enabled=1
程序包编译安装
- testapp-VERSION-release.src.rpm
- 源代码 -> 预处理 -> 编译(gcc) -> 汇编 -> 连接 -> 执行
- 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
源代码组织格式
- 多文件:文件中的代码之间,很可能存在跨文件依赖关系
### 项目管理工具
- 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 源代码
- 前提:提供开发工具及开发环境
- 开发工具:make, gcc等
- 开发环境:开发库,头文件
- glibc:标准库
1.通过包组提供开发组件 CentOS 6
# yum -y groupinstall "Development Tools"
# yum -y groupinstall "Server Platform Development"
2. configure 脚本
选项:指定安装位置、指定启用的特性
# ./configure --help
:获取其支持的使用的选项- 安装路径设定:
--prefix=/PATH/TO/SOMEWHERE`:指定默认安装位置;默认为/usr/local/APPNAME
--sysconfdir=/PATH/TO/SOMEWHERE`:配置文件安装路径`
- System types:交叉编译使用这里的选项
--build=BUILD
--host=HOST
--target=TARGET
- Optional Features: 可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
- Optional Packages:依赖的可选程序包
--with-PACKAGE[=ARG]
--without-PACKAGE
3. make && make install
4. 安装后的配置
1.导出二进制程序目录至PATH环境变量中
- 编辑文件 /etc/procile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
2.导出库文件路径
- 编辑 /etc/ld.so.conf.d/NAME.conf
- 添加新的库文件所在目录至此文件中:/usr/local/apache2/lib
- 让系统重新生成缓存:
# ldconfig [-v]
3.导出头文件
基于链接的方式实现:
# ln -sv /usr/local/apache2/include/ /usr/include/apache
4.导出帮助手册
- 编辑/etc/man.config文件
- MANPATH /usr/local/apache2/man`
Setup httpd-2.2.29
# ./configure --prefix=/usr/local/apache2
# apachectl [ start | stop | restart ] 脚本文件
练习
yum的配置和使用:包括yum repository的创建
编译安装apche 2.2;启动此服务
博客:程序包管理器、rpm、yum、编译
桌面环境:Windows7, OpenSUSE 13.2, Kubuntu(KDE)