软件包管理rpm、yum及编译安装
库文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件
ldconfig 加载库文件
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件
名及文件路径映射关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache
rpm(RedHat Package Manager)
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
数据库(公共):/var/lib/rpm
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
rpm {-i|--install} [install-options] PACKAGE_FILE...
-v: verbose
-vv:更加详细的过程(用于排错)
-e:卸载
直接接basename即可
如:rpm -e tree
-h:以#显示程序包管理执行进度
-q:查询
-ql:包的文件列表
解压是要完整的路径,而查询和卸载只需要名字,因为是根据数据库查的;
rpm -ivh PACKAGE_FILE ...
rpm包安装
[install-options]
--test: 测试安装,但不真正执行安装,即dry run模式
可以用v来看到完整的过程,但是不是真的安装
--nodeps(忽略依赖关系):
使用时机:
当发生依赖关系无法安装时;
危险性:
强制操作可能会造成软件无法正常使用;
--replacepkgs
面向全局:
用于在解压开来后的文件缺失或者误改,少的补,多的用原来的覆盖,所以他会带来一个问题就是如果你加了很多自己的配置文件,运行此选项也会被覆盖;
面向局部:
rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -id ./usr/bin/tree,把rpm转成cpio然后再来对某一个文件解开,在复制过去就好了,但这样也会带来一个问题是文件的属性可能会有不同,而上面的直接用rpm覆盖安装是不会存在这样的问题的;
--replacefiles
对于A,B两个包解压出来同名的文件进行覆盖,但一般都是版本的原因才会出现这样的情况。如果有添加版本号的,那么2者可以共存,如果都是以名字命名的那么会覆盖;
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
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: 强制安装
注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核即可
(2) 如果原程序包的配置文件安装后曾被修改,升级或者卸载时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把老版本的文件重命名(FILENAME.rpmnsave)后保留
1.rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
Preparing... ################################# [100%]
package vsftpd-3.0.2-22.el7.x86_64 is already installed
2.rpm -ql vsftpd
选择一个配置文件/etc/vsftpd/vsftpd.conf
3.ll /etc/vsftpd/vsftpd.conf并添加一行
-rw-------. 1 root root 5030 Aug 3 2017 /etc/vsftpd/vsftpd.conf
[root@centos7 ~]# echo >> /etc/vsftpd/vsftpd.conf
[root@centos7 ~]# ll /etc/vsftpd/vsftpd.conf
-rw-------. 1 root root 5031 Jul 6 15:49 /etc/vsftpd/vsftpd.conf
4.删除文件时,会提示你有修改过的文件,并将其命名为以.rpmsave结尾的文件,其他均被删除,
后期如果需要用到可以直接覆盖使用;
[root@centos7 ~]# rpm -e vsftpd
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave
5.重新安装一次
[root@centos7 vsftpd]# ll
total 28
-rw-------. 1 root root 125 Aug 3 2017 ftpusers
-rw-------. 1 root root 361 Aug 3 2017 user_list
-rw-------. 1 root root 5030 Aug 3 2017 vsftpd.conf
-rwxr--r--. 1 root root 338 Aug 3 2017 vsftpd_conf_migrate.sh
-rw-------. 1 root root 5031 Jul 6 15:49 vsftpd.conf.rpmsave
rpm查询包
rpm {-q|--query} [select-options] [query-options]
[select-options]
-q:仅查询
-a: 所有包
-l:列出该软件所以的文件与目录所在的完整的文件名;
-f: 查看指定的文件由哪个程序包安装生成
ql与qf是相反的,一个是解开是哪些,一个是这属于哪个包
其实文件本删除了也可以查询,因为他查询的是数据库;
-p :针对尚未安装的程序包文件做查询操作
也可以用cpio -itv来预览
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
CAPABILITY相当于关键字bash、tree等,这个tree或者bash是由哪个包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
哪些包会用到(依赖)这个CAPABILITY
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
1.查询/usr/bin/java来自哪个rpm?
[query-options]
--changelog:查询rpm包的changelog
更改日志
-c: 查询程序的配置文件
-d: 查询程序的文档
cd为l的部分文件
-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 {-V|--verify} [select-options] [verify-options]
-V:接软件名,如果文件被更改过,才会列出来;
-Va:列出目前系统上面所以可能被更改过的文件;
-Vp:接文件名,列出该软件内可能背更改的文件;
-Vf:列出系统上的某个文件是否被更动过;
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
c:配置文件(config file)
d:文件数据文件(documentation)
g:鬼文件~通常是该文件不被某个软件所包含,较少发生(ghost file)
l:授权文件(license file)
r:读我文件(read me)
包来源合法性验正及完整性验正
完整性验正: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:重建已安装的包头的数据库索引目录
yum(Yellowdog Update Modifier):
rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
文件服务器:
http://
https://
ftp://
file://
学习yum无非这2点:
1:会写配置文件(路径)
2:会清缓存,因为可能因为路径修改之后,与本地的源数据有所变化(因为yum都是从仓库上下载下来放到自己的本机上的),所以需要清缓存
这是本地的文件
cd /var/cache/yum/x86_64/7/base/
[root@centos7 base]# ll
total 6052
*-rw-r--r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
*-rw-r--r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
-rw-r--r--. 1 root root 0 Jul 6 20:14 cachecookie
drwxr-xr-x. 2 root root 48 Jul 6 20:14 gen
drwxr-xr-x. 2 root root 6 Jul 4 22:11 packages
-rw-r--r--. 1 root root 3735 Sep 6 2017 repomd.xml
这是yum仓库上的文件(这里暂时为光盘)
[root@centos7 base]# ll /run/media/root/CentOS\ 7\ x86_64/repodata/
total 27222
*-rw-rw-r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
-rw-rw-r--. 1 root root 751786 Sep 6 2017 38b60f66d52704cffb8696750b2b6552438c1ace283bc2cf22408b0ba0e4cbfa-c7-x86_64-comps.xml
-rw-rw-r--. 1 root root 7019993 Sep 6 2017 6cd606547d4f569538d4090e9accdc3c69964de1116b9ab1e0a7864bb1f3ec98-filelists.sqlite.bz2
*-rw-rw-r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
以上可以看出yum仓库上的文件会下载到本地;
yum配置文件:
yum客户端配置文件: /etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
必须在这个文件下,而且扩展名为.repo
仓库指向的定义:
[repositoryID]
软件库的名字可以随意取,但不能重名;
name=Some name for this repository
说明下软件库的意义,重要性不大,但是不写,系统每次都有一句提示Repository 'base' is missing name
baseurl=url://path/to/repository/ enabled={1|0}
需要是热破data的父目录;
enable
软件库是否启动;
gpgcheck={1|0}
是否需要查阅RPM文件内的数码签章;
gpgkey=URL
数码签章的公钥所在位置,使用默认值即可;
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000
搭建本地仓库(用光盘来作为源):
1.写一个后缀为.repo的文件,名字不重要,取base.repo;
2.编辑这个文件,vim base.repo
3.[base]
baseurl=file:///run/media/root/CentOS\ 7\ x86_64/ (baseurl需要是repodata的父目录)
4.写了这两行之后yum repolist就会有一个名字为base的源;
5.继续编写base.repo
[base]
name=centos7.4 cdrom
baseurl=file:///run/media/root/CentOS\ 7\ x86_64/(需要写repodata的父目录)
gpgkey=file:///run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
不想装钥匙第4句改为gpgcheck=0
enabled=0(不使用时,临时禁用)
yum clean all:删除所有数据库数据
packages:将已下载的软件文件删除
headers:将下载的软件文件开始删除
yum repolist查看仓库列表
yum install ** 安装
-y:不交互,默认yes
-q:静默安装;
--installroot=/some/path:该软件安装在/some/path下而不是用默认路径;
yum remove ** 卸载
search :搜寻某个软件名称或者是描述(description)的重要关键字
list:列出目前yum所管理的所有软件名称与版本,类似rpm -qa
info:类似 rpm -qai
provides:从文件去搜寻软件,类似于rpm -qf
update:后面接要升级的文件!如要整个系统都升级,就直接update;
*把自己搭建为搭建yum仓库服务器:
准备工作
关闭SElinux
enforcing改为permissive
setenforce 0
关闭iptables
centos7
systemctl stop firewalld 关闭当前防火墙
systemctl disable firewalld 关闭开机自启动
centos6
chkconfig iptables off关闭开机自启动
service iptables stop 关闭当前防火墙
systemctl start vsftpd 现在启动
systemctl enable vsftpd 开机启动
共享服务:httpd、ftp
/var/www/html
/var/ftp/pub
当你完成一个项目的时候已经做出了rpm包了,但是要在共享服务上显示,还需要rpm包元数据
createrepo /some/to/file 一个命令就可以制作rmp包元数据
上面的操作可以把磁盘内容拷过到这2个文件里,也可以直接把光盘挂载到其下面。
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号
$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命令的用法:
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-config-manager
yum-config-manager --add-repo=url
yum-config-manager --disable “仓库名" 禁用仓库
yum-config-manager --enable “仓库名” 启用仓库
升级程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降级)
检查可用升级:
yum check-update
卸载程序包:
yum remove | erase package1 [package2] [...]
查看程序包information:
yum info [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
清理本地缓存:
清除/var/cache/yum/$basearch/$releasever缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
yum makecache(yum repolist 的时候会自动构建)
搜索:yum search 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
yum history info 6
yum history undo 6(撤销第6步)
redo 6(重做第6步)
用于删除某个文件,而且确定他的所以依赖文件都不需要的时候使用,因为默认yum remove **只会删除后面接的文件;
日志 :/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:禁用所有插件
程序包的编译安装:
Application-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
源代码-->预处理-->编译-->汇编-->链接-->执行
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C、C++:make 项目管理器
configure脚本 --> Makefile.in --> Makefile
java: maven
C语言源代码编译安装三步骤:
1、./configure
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成Makefile
(2) 检查依赖到的外部环境,如依赖的软件包
2、make 根据Makefile文件,构建应用程序
3、make install 复制文件到相应路径
开发工具:
autoconf:生成configure脚本
automake:生成Makefile.in
注意:安装前查看INSTALL,README
编译安装:
编译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 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|man_db.conf文件
添加一个MANPATH
编译安装httpd(网上下载一个最新的版本)
1.yum groupinstall "Development Tools"
2.cat README
cat INSTALL
参考格式:
$ ./configure --prefix=PREFIX
$ make
$ make install
$ PREFIX/bin/apachectl start
3.进入到httpd那个目录(./configure --help)
./configure --prefix=/app/httpd24 --sysconfdir=/etc/httpd24/ --enable-ssl
--enable-proxy-fcgi
报错:
checking for APR... no
configure: error: APR not found. Please read the documentation.
缺啥补啥:
yum install apr-devel(缺什么后面跟-devel补上就行)
再次报错:
checking for APR-util... no
configure: error: APR-util not found. Please read the documentation.
继续补:
yum install apr-util-utildevel
再次报错:
checking for pcre-config... false
继续补:
yum install pcre-devel
再次报错:
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
继续补:
yum install openssl-devel
成功之后会生成Makefile文件;
4.make -j 2 (-j指定cpu个数,多线程)
5.make install
45可以合成一句:
make;make install && echo -e "\a"
6.配置运行环境
1.修改PATH
vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24:$PATH
. /etc/profile.d/httpd24.sh
7.apachectl 启动apache服务;