过去,许多 Linux 程序以源代码的形式发行,用户把源代码构建为所需的程序或程序集;源代码还附带必需的手册页、配置文件等等。现在,大多数 Linux 发行商使用称为包 的预构建的程序或程序集,包便于在发行版上安装。
ABI :应用程序要在某程序上 运行,应用程序必须满足此操作系统的接口,这个接口就是ABI接口。Win和Linux不兼容。
API 应用程序开发接口,调用库文件
POSIX:(Portable Operating System Interface of UNIX)IEEE在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称
###1.3程序编译
程序源代码→预处理→编译→汇编→链接
预处理:将源代码简单处理,例如宏定义、#include文件包含、条件编译、特殊符号
编译:由编译器将c源代码转变成汇编代码
汇编:由汇编器将汇编代码转变成目标代码
链接:由链接器将代码在执行过程用到的其他目标代码和库文件链接成为一个可执行程序也就是目标程序。
链接处理分类
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接
静态链接
1、把程序对应的依赖库复制一份到包
2、libxxx.a
3、嵌入程序包
4、升级难,需重新编译
5、占用较多空间,迁移容易
动态链接
1、只把依赖加做一个动态链接
2、libxxx.so
3、连接指向,包只记录依赖对象的名字及少量登记信息
4、占用较少空间,升级方便
原名Redhat Package Manager ,推广后改名为 RPM Package Manager
包管理器功能
将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
包文件组成(每个包独有)
数据库(公共):/var/lib/rpm
初始数据库,每个包解压后的初始状态如属性、大小、权限等,以后可以比较初始安装与目前状态的比较,做安全检查。
管理程序包的方式:
使用包管理器:rpm,前提是要有rpm包,安装卸载等
使用前端工具:yum,dnf
程序包的来源
源代码命名
name-VERSION.tar.gz|bz2|xz
例如:linux-4.18.5.tar.xz
rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
包分类
包依赖性
CentOS系统上使用rpm命令管理程序包,这里将其选项大致分三组:
这里重点学习前两组命令选项
软件包安装时往往还需要各种依赖包,rpm命令安装某个软件时,它是知道需要依赖哪些包的,只是并不会帮助我们解决依赖问题,需要我们自己来一个个获取依赖包,知道满足安装条件。这个问题后续的yum工具可以解决,这里先来了解rpm的用法。
格式
rpm {-ivh} [install-options] PACKAGE_FILE…
选项
-i:–install安装
-v:查看更详细的安装信息
-vv:比v更详细的信息
-h:以#显示程序包管理执行进度
[install-options]
–test:测试安装,但不真正执行安装,即dry run模式
–nodeps:忽略依赖关系,强行安装,但是不能用
–replacepkgs:适用于原来的文件遭到破坏,重新安装覆盖
–force:与–replacepkgs作用相同
–replacefiles:例如安装同一个程序2个版本时,会有2个man文件,系统会认为重复,导致程序不能安装,这时候加- -replacefiles可以覆盖文件,而不覆盖程序安装
–nosignature:不检查来源合法性
–nodigest:不检查包完整性
–noscripts:不执行程序包所有脚本
–nopre:安装前脚本 %pre
–nopost:安装后脚本 %post
–nopreun:卸载前脚本 %preun
–nopostun:卸载后脚本 %postun
示例 :删除tree命令,然后重新安装
'删除tree命令'
[root@V9centos7]$rm /usr/bin/tree
'再次安装'
[root@V9centos7]$rpm -ivh /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm
'会出现以下提示,该程序已安装'
package tree-1.6.0-10.el7.x86_64 (which is newer than tree-1.5.3-3.el6.x86_64) is already installed
'强制安装--force'
[root@V9centos7] $rpm -ivh /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm --force
####2.1.1恢复
软件卸载后,重新安装时除–force与–replacepkgs选项外,还可以使用命令cpio来恢复,有可能带来权限属性的不同。
例如:$rm -f /usr/bin/tree <==删除tree命令
$rpm2cpio /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm |cpio -id ./usr/bin/tree
132 blocks <==将rpm包转换成cpio格式,输出到管道查看文件解压出单个需要的文件
$cp ./usr/bin/tree /usr/bin/ <==将文件拷贝到删除目录下,修复成功
###2.2 包卸载
格式:
rpm{-e|- -erase}[- -allmatches] [- -nodeps][- -noscript s][- -notriggers][- -test]PACKAGE_NAME...
选项:
-e: 卸载。长选项为--erase
--allmatches:忽略版本,匹配到的都删除
--nodeps: 忽略依赖性
--noscripts: 忽略脚本,卸载不执行卸载后脚本
--test: 仅测试,不真的卸载
###2.3 包升级降级
inux支持多版本并存,如果升级内核建议使用-i,可以保留旧版本
如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名
格式:
rpm{-UFvh}[installoptions]PACKAGE_FILE...
选项:
-U --upgrade:安装有旧版程序包,则升级如果不存在旧版程序包,则安装
-F --freshen:安装有旧版程序包,则升级如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force:强制安装,作用同--replacepkgs
###2.4 查询
格式:
rpm {-q|--query}[select-options][query-options]
[select-options]:
-q:查询已经安装的包,只有-q,需要完整的文件名,不然查不到
-a:所有包。配合q,然后取出大概程序名,匹配符合的结果
-f:查看指定的文件由那个程序包安装生成,查的是rpm的数据库,删除命令仍然可以查到所属。
例如:$rm -f /usr/bin/tree <==删除
$rpm -qf /usr/bin/tree <==仍然可以查询
tree-1.5.3-3.el6.x86_64 <==结果
-p:针对尚未安装的程序包文件做查询操作,跟的是包名
-qi:(information)查看程序的信息
--whatprovides CAPABILITY:查询指定的能力(CAPABILITY)由那个包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被那个包所依赖
[query-options]
--scripts:程序包自带的脚本
-- provides:列出指定程序包CAPABILITY(库文件,对应的二进制文件等)
--changelog:查询rpm包的更新日志
例如:$rpm -q --changelog tree
-i:information
-d:查询程序的文档,比如man帮助文档
-l:查看指定的程序包安装后生产的所有文件
-R:查询指定的程序包所依赖的CAPABILITY
-c:查询程序的配置文件程序的配置文件
例如:$rpm -qc bash
例:查询远程仓库软件包,包含那些文件
$rpm -qpl http://.../*.rpm
###2.5 包校验
####2.5.1 RPM包文件完整性
软件制作者会为软件提供一个数字化的签名,并将签名的公钥(public key)放出,CentOS使用的数字签名系统为GUN计划的GunPG(GUN Privacy Guard,GPG),可以通过哈希运算,得出专属密钥系统或者数字签名系统。所以,首先需要安装GPG数字签名的公钥文件
####2.5.2 检验安装的包
利用var/lib/rpm里面的数据库信息来比对目前Linux系统的环境下所有软件文件,来了解这段时间修改了哪些文件数据了。
格式:rpm {-V|--verigy}[select -options]
选项:-V: 后面跟软件名,若所包含的文件被改动过,才会列出
-Va: 列出系统上被改动的所有文件
-Vp: 后面跟软件名,列出可能被改动过的文件
-Vf: 列出某个文件是否被改动过
例:$rpm -V cenos-release
SM5....T. c /etc/issue <==SM5 T为报警内容
.......T. c /etc/issue.net
报警内容如下
符号 | 解释 |
---|---|
S | file Size differs文件大小相异 |
M | Mode differs 文件模式相异,包括权限和类型 |
5 | digest (formerly MD5 sum )differs指纹码相异 |
D | Device major/minor number mismatch主次代码相异 |
L | redLink(2) path mismatch路径相异 |
U | User ownership differs文件所属人相异 |
G | Group ownership differs文件所属群相异 |
T | mTime differs文件建立时间相异 |
P | capabilities differ功能相异 |
c | 配置文件(config file) |
d | 文件数据文件(documentation) |
g | ghost file |
l | 许可证文件 |
r | 自述文件 |
###2.6 数据库重建
数据库目录所在 /var/lib/rpm
yum repolist
/etc/yum.conf:为所有仓库提供公共配置
[main] <==/etc/yum.conf
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0 保留缓存吗 0不保留1保留
debuglevel=2 调试模式
logfile=/var/log/yum.log 日志
exactarch=1 是否检查CPU架构,1检查0不检查
obsoletes=1 过期包
gpgcheck=1 检查完整性1检查,0不检查,需要先导入key
plugins=1 是否支持插件
installonly_limit=5 是否进行并行链接,同时安装包
bugtracker_url=http://bugs.centos.org/set_project.phpproject_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release发型版本信息
###3.2 yum客户端个人配置文件
个人仓库的配置文件放在/etc/yum.repos.d下,自定义后缀为.repo的文件,后缀不对会失效。
[CDrom]
baseurl=file:///misc/cd
enabled=1
gpgcheck=0
yum-config-manager 自动创建仓库配置
yum-config-manager --add-rep=http://172.16.0.1/cobbler/ks_mirror/7/
选项 | 释义 |
---|---|
[repositoryID] | 必须要有的,仓库名称,不要加空格 |
baseurl=url | 必须要有的,仓库路径,本地或者网络,可写多个 |
mirrorlist= | 指向的一个文件,文件中是一个个url路径,baseurl会根据设置选取一个为baseurl |
name= | 描述信息 |
enabled={1|0} | 仓库禁用0启用1 |
gpgcheck={1|0} | 0为不检查密钥,不写默认为1检查,如果检查需要导入密钥路径 |
gpgkey=URL | 指定密钥路径 |
enablegroups={1|0} | 默认启用就好 |
failovermethod={roundrobin|priority} | 多路径访问顺序,roundrobin随机(默认值),priority顺序访问 |
cost= | 默认为1000,访问优先级,越大越靠后 |
###3.3 配置远程yum仓库
yum -y install httpd
rpm -ql httpd
包含的文件,找到.service文件systemctl start httpd.service
启动服务,此时就可以通过浏览器输入本地IP地址访问了wget
[仓库地址]ceaterepo .
,生成一个repodata目录,就可以利用生成的repodata所在目录作为源。###3.5 yum常见用法
yum的命令行选项:
--nogpgcheck:禁止进行gpg check
-y:自动回答为‘yes’
-q:静默模式 不能与别的选项连起来写,要单独写
--disablerepo=repoidglob:临时禁用此处指定的repo
--enablerepo=repoidglob:临时启用此处指定的repo
--noplugins:禁用所有插件
####3.5.1安装
新安装
yum install package1 [package2] [...]
重新安装,不会因为残留安装不了
yum reinstall package1 [package2] [...]
####3.2.2 升级降级
####3.2.3卸载程序包
卸载文件,只卸载当前程序,依赖性的程序不会删除,可以通过查看历史yum history,再info,然后undo
yum remove | erase package1 [package2] [...]
####3.5.4查询功能
列出软件名称与版本等信息比list详细,可以指定某个软件,类似于rpm -qai
格式:yum info [...]
查看指定的特性(可用是某文件)是由那个程序包所提供,类似于rpm -qf
格式:yum provides | whatprovides feature1 [feature2] [...]
列出当前仓库的所有软件名称和版本,类似rpm -qa
所列信息带@表示之前安装好的;不带@的表示目前没装上的。
anaconda通过光盘安装的;base通过仓库安装的
格式:yum list [选项] [glob_exp2] <==支持正则表达式
选项: all : 列出所有软件
available:列出未安装的
installed:列出所有安装的
updates: 列出可供升级的软件和版本
以指定的关键字搜索程序包名及summary信息
格式:yum search string1 [string2][...]
查看指定包所依赖的capabilities:
格式:yum deplist package1 [package2][...]
例如:$yum deplist bash
package: bash.x86_64 4.2.46-30.el7 <==包程序
dependency: libc.so.6(GLIBC_2.15)(64bit) <==依赖包
provider: glibc.x86_64 2.17-222.el7 <==提供者
仓库工具yum-utils里的repoquery
功能:查询未安装包中包括的文件列表
格式:repoquery –ql package
####3.5.5 历史记录功能
查看yum历史
日志所在目录:/var/log/yum.log
命令:yum history
ID | Login user | Date and time | Action(s) | Altered
4 | root | 2018-08-09 17:33 | D, E | 8
3 | root | 2018-08-09 17:01 | Install | 5
2 | root | 2018-08-09 16:37 | I, U | 8 <
1 | System | 2018-07-28 10:07 | Install | 1362 >
#ID:历史记录号码
#Altered:更改数量
命令:yum history info #:输入#(ID号)查询对应的历史详情,承上
$yum history info 3 <==查看ID为3的历史记录
... <==中间是记录相关信息,这里省略
Command Line : install httpd <==当时执行的操作
Packages Altered: <==yum history中Altered栏更改的项目
命令:yum history undo #:查看历史详情后,可以根据需要彻底卸载yum的依赖包
$yum history undo 3
命令:yun history redo #:卸载后悔了。。。还可以重新安装
$yum history redo3
####3.5.6 包组管理的相关命令
可以将相关的包一次安装,比如虚拟化相关的包组,开发相关的包组
查看系统默认的包组,支持正则表达式查找
$yum grouplist [groupwildcard] […]
安装包组,包组大小写不敏感,包大小写敏感
$yum groupinstall group1 [group2] [...]
升级包组
$yum groupupdate group1 [group2] [...]
移除包组
$yum groupremove group1 [group2] [...]
查看包组信息
$yum groupinfo group1 [...] 可以查看包组的信息
不是随着包组装的没有符号
跟随包租一块安装好的前面为=号
没有安装,会随着包组一块安装为+号
没有安装,不会随着包组一块安装为-号
###4.程序包编译
根据源码包中 Makefile.in 文件的指示,configure 脚本检查当前的系统环境和配置选项,在当前目录中生成 Makefile 文件(还有其它的文件),然后 make 程序就按照当前目录中的 Makefile 文件的指示将源代码编译为二进制文件,最后将这些二进制文件移动(即安装)到指定的地方(仍然按照 Makefile 文件的指示
####4.1程序包编译简介
编译的好处:编译过程可以定制功能,路径指定
编译管理器:
C、C++: make项目管理器
java: maven
C语言源代码编译安装的三步骤
./configure
脚本将>预处理- ->编译- ->汇编- ->链接打包借助模板makefile.in生成Makefile文件开发工具:很复杂,暂时了解就好
autoconf:生成confugure脚本
automake:生成Makefile.in
查看一些文档,程序源代码解压后,生成许多文件,其中一些说明文件可以帮助我们了解这个程序。
获取其支持使用的选项
进到源代码解压文件目录执行以下命令
$./configure --help:
安装路径设定:
Optional Features:可选特性
- -disable-FEATURE
- -enable-FEATURE[=ARG]
Optional Packages:可选包
- -with-PACKAGE[=ARG],依赖包
- -without-PACKAGE,禁用依赖关系
注意:通常被编译操作依赖的程序包,需要安装此程序包的开发组件,其包名一般类似于name-devel-VERSION
####4.2 编译步骤
执行./configure 然后指定安装路径- -preffix,指定配置文件安装路径- -syscongdir 开启加密功能- -enable装的时候,会要求依赖文件,缺什么装什么,后面补上-devel
1 、$yum groupinstall 'development tools' <==制作前把开发工具包组安装上
2 、$./configure --prefix=/data/httpd1 --sysconfdir=/etc/httpd2 --enable-ssl
...
checking for APR... no <==提示缺这个包
3 、$yum install apr-devel <==安装之,包名后补上-devel
4 、$./configure --prefix=/data/httpd1 --sysconfdir=/etc/httpd2 --enable-ssl <==再次执行./configure
...checking for APR-util... no <==提示还缺这个包
5 、$yum install apr-util-devel <==再安装之补-devel
6 、$...... <==再次执行./configure
checking for pcre-config... false <==提示还缺这个包
7 、$yum install pcre-devel <==安装补-devel
8 、$...... <==再次执行./configure
configure: WARNING: OpenSSL version is too old <==提示这个包有问题
9 、$yum install openssl-devel <==安装补-devel
10、$./configure --prefix=/data/httpd1 --sysconfdir=/etc/httpd2 --enable-ssl <==再次执行./configure
... <==省略前面部分信息
Server Version: 2.4.25
Install prefix: /data/httpd1
C compiler: gcc -std=gnu99
CFLAGS: -pthread
LDFLAGS:
LIBS:
CPPFLAGS: -DLINUX -D_REENTRANT -D_GNU_SOURCE
C preprocessor: gcc -E
# 到这里就生成了makefile文件
make 生成可以执行的二进制文件
$make -j 8 进行编译 <== -j 为参数 8代表几个cpu多线程编译
make install
编译完成后,进入文件目录PREFIX/bin/ ,启动apachectl
$cd /data/httpd1 <==可以看到我们预定义安装的目录这时还没有
-bash: cd: /data/httpd1: No such file or directory
$make install <==安装,会自动生成目录
$cd /data/httpd1;ls <==完成后,跳转到目录
bin build cgi-bin error htdocs icons include logs man manual modules
INSTALL安装
$cat INSTALL 查看安装说明文件
...
PREFIX/bin/apachectl start <==怎么启动
$ls /data/httpd1/bin/
apachectl ... <==就是这个
####4.3安装后的配置
二进制程序目录导入至PATH环境变量中
$echo 'PATH=/data/httpd1/bin:$PATH' >/etc/profile.d/httpd.sh
导入库文件路径
编辑/etc/ld.so.conf.d/NAME.conf
添加新的库文件所在目录至此文件中
让系统重新生成缓存
ldconfig [-v]
导入头文件
基于链接的方式实现
ln –sv
导入帮助手册
编辑/etc/man.config|man_db.conf文件
添加一个MANPATH
卸载,源码安装就是将安装路径那两个文件删除。