第十二章、软件包管理
本章内容
?软件运行环境
?软件包基础
?rpm包管理
?yum管理
?定制yum仓库
?编译安装
软件运行和编译
ABI:Application Binary Interface
Windows与Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
库级别的虚拟化:
Linux: WINE
Windows: Cywin
API:Application Programming Interface
POSIX:Portable OS
(遵循POSIX标准使用的库兼容,可以移植。但ABI不同就不能移植,不能跨平台运行。ABI太接近底层,程序员调用的是API。)
程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
静态编译:.a
动态编译:.so
ldd /bin/cat:查看文件调用的动态库
C程序编译过程
静态和动态链接
?链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接
?静态链接
?把程序对应的依赖库复制一份到包
?libxxx.a
?嵌入程序包
?升级难,需重新编译
?占用较多空间,迁移容易
?动态链接
?只把依赖加做一个动态链接
?libxxx.so
?“连接指向”
?占用较少空间,升级方便
C程序静态链接
JAVA程序运行
开发语言
? 系统级开发
C
C++
? 应用级开发
java
delphi
Python
go
perl
ruby
包管理器
? 二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
(小软件不需要配置文件,直接加参数就行,例如ls -a。大型软件不能加太多的参数,就把这些东西写到配置文件中)
? 程序包管理器:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager(RPM是个打包文件类似于tar)
包命名
源代码:name-VERSION.tar.gz|bz2|xz
VERSION: major.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
包命名和工具
? 包:分类和拆包
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 加载库文件
ldconfig -v:显示目前加载的所有库文件
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
以后自己开发的so软件有些库需要共享,在/etc/ld.so.conf.d/*.conf
建一个conf结尾的文件,可以参考别conf文件怎么建的,把存放so文件的路径写进去就行。
缓存文件:/etc/ld.so.cache
包管理器
? 程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
? 包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
? 数据库(公共):/var/lib/rpm
通过rpm安装的包记录在数据库中包括:
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
程序包的来源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 项目官方站点
? (3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
(光盘放不下,额外的包)
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
? (4) 自己制作
? 注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性
rpm包管理
? CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose 详细的安装信息
-vv: 打印大量的调试信息
-h: 以#显示程序包管理执行进度
rpm -ivh PACKAGE_FILE ...
rpm包安装
[install-options]
--test:测试安装,但不真正执行安装,即dry run模式
]#rpm -ivh sl-5.02-1.el7.x86_64.rpm --test
--nodeps:忽略依赖关系
--replacepkgs | replacefiles:替换,重装包
其中replacefiles是安装目录下有相同的文件,那么现在的这个文件直接覆盖原来的。
(详解附录3)
--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.rpmnew)后保留(只能保留最新的一次,如果还想用原来的配置文件直接把这个文件重命名为原来的文件使用即可。另外,保留的文件只是针对配置文件,因为别的文件没有保留的价值)
包查询
? rpm {-q|--query} [select-options] [query-options]
? [select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成使用是:-qf
rpm -qf /bin/ls 查看ls是有那个包提供
-p rpmfile:针对尚未安装的程序包文件做查询操作,看包下面有什么文件一般使用是:-qpl
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
?rpm2cpio 包文件|cpio –itv 预览包内文件
?rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
? [query-options]
下面选项和-q配合使用
--changelog:查询rpm包的changelog
rpm -q --changelog bash 查看bash的发展过程
-c: 查询程序的配置文件
rpm -c bash:查看配置文件
-d: 查询程序的文档
-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 -e soft --allmatches 把匹配的软件全部卸载,像两个内核。
包校验
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命令是无法检查包的来源和合法性,需要导入公钥才行
这个公钥在光盘里面或者硬盘里面
其中光盘在/misc/cd/RPM-GPG-KEY-CENTOS-7
md5sum /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 /misc/cd/RPM-GPG-KEY-CENTOS-7测试相同,即内容一样
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入之后,rpm就具有了检查包的能力
CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”
(详见附录6)
rpm数据库
? 数据库重建:
/var/lib/rpm(下面的文件不能丢失,不然rpm就不能随便使用了
因为里面存在着装包和卸载包的信息)
? rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
可以重建但是,原来的安装信息丢失了,rpm的工具用法不能用了。
yum
? CentOS: yum, dnf
? YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
文件服务器:
http://
https://
ftp://
file://
其中repodata的数据在第一次执行yum install xxx 时自动缓存到客户端,
缓存地址在/etc/yum.conf的配置文件cachedir的目录,下次下载的时候直接从当中读取信息即可。其中的安装包安装完就删除了,但是元数据的缓存是一直存在的。
注意:有时候baseurl改变,但是元数据的内容没变,导致找不到正确的地址,安装失败,解决办法:清除缓存。
学习yum两点:
1、会写配置文件,即/etc/yum.repos.d/*.repo文件
2、会清缓存,当然配置文件改变再清缓存
yum配置文件
? yum客户端配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:
[repositoryID]:写的时候不要带有空格
name=Some name for this repository
baseurl=url://path/to/repository/
baseurl写的目录是repodata的上级目录,可以配多个,base和base2可以合并
enabled={1|0} (启用是1,禁用是0,不写默认是启用)
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0} (一般不加,默认支持)
failovermethod={roundrobin|priority}
roundrobin:意为随机挑选,默认值
priority:按顺序访问
(寻找base的顺序)
cost= 默认为1000(优先级大,差)
(详见附录10)
yum仓库
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源
? 阿里云repo文件:
http://mirrors.aliyun.com/repo/
? CentOS系统的yum源
? 阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
? 教学环境:
http://172.16.0.1/cobbler/ks_mirror/$releasever/
? EPEL的yum源:
? 阿里云:
https://mirrors.aliyun.com/epel/$releasever/x86_64
? 教学环境:
http://172.16.0.1/fedora-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源客户端配置文件
? yum-config-manager --disable “仓库名"(就是name) 禁用仓库
? 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 update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降级)
检查可用升级:
yum check-update
卸载程序包:
yum remove | erase package1 [package2] [...]
查看程序包information:
yum info [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
yum provides ls:查看谁提供了ls能力
清理本地缓存:
清除/var/cache/yum/$basearch/$releasever缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
(清除客户端旧的缓存)
构建缓存:
yum makecache
(一般不用自己构建缓存,yum repolist就会自动构建缓存了)
搜索:yum search string1 [string2] [...]
yum search apache
以指定的关键字搜索程序包名及summary信息
?查看指定包所依赖的capabilities:
yum deplist package1 [package2] [...]
yum deplist httpd:看看httpd依赖的能力
?查看yum事务历史:
yum history [info|list|packages-list|packages-info|
summary|addon-info|redo|undo|
rollback|new|sync|stats]
yum history
yum history info 6
查看第6步安装了哪些包
yum history undo 6
撤销第6步的操作,你安装了多少包我就卸载多少(卸载包和依赖包办法)
yum history redo:重做第几步
(查看安装历史)
卸载的时候只卸载一个包,不卸载安装的依赖包。yum history可以看到安装过程中安装多少的相关依赖包。
?日志 :/var/log/yum.log
?安装及升级本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...]
(用install替代,找到本地的rpm包,同时解决的本地包的依赖性问题,用rpm安装可能遇到依赖性问题)
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>
(详见附录9)
程序包编译
? 程序包编译安装:
? Application-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
? 源代码-->预处理-->编译-->汇编-->链接-->执行
? 源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C、C++:make 项目管理器
configure脚本 --> Makefile.in --> Makefile
java: maven
yum问题:
1、配置文件出问题,其中redhat5的repodata在/misc/cd/Server
2、有缓存没找到或没清理,yum clean all。
编译安装
? C语言源代码编译安装三步骤:
1、./configure
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成Makefile
(2) 检查依赖到的外部环境,如依赖的软件包
2、make 根据Makefile文件,构建应用程序
3、make install 复制文件到相应路径
? 开发工具:
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: 获取其支持使用的选项
./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
第四种安装:二进制安装。
不用编译安装,已经提供二进制文件,但是没有做成安装包,已经做了make和configure,从网上下载的是二进制包,按照它的规定复制到指定的目录里。需要去做一些目录的生成和配置文件的修改。
附录:
1、系统崩溃
系统丢失动态链接库导致系统崩溃解决办法:
(1)开机按esc键进入光盘模式,选第三项救援模式
(2)选第二项rescue a centos system然后选1continue
(3)回车,进入光盘的根,df命令查看分区和挂载情况
(4)然后在进入系统的根(cd /mnt/systimage),将丢失的动态链接库移回去。
(5)exit退出,然后重启。
2、统计内核C语言行数
find -name “*.c” |xargs cat | wc -l
3、原软件丢失组件重新安装
[[email protected]_senven /app]#rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz
[[email protected]_senven /app]#rm -f /usr/bin/tree
[[email protected]_senven /app]#tree
-bash: /usr/bin/tree: No such file or directory
[[email protected]_senven /app]#rpm -ivh tree-1.6.0-10.el7.x86_64.rpm --replacepkgs
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
软件安装后会产生一系列文件,有什么文件丢失导致软件不能使用,但重新安装又不能安装上,使用--replacepkgs命令即可重新安装。但是会导致原来安装产生的文件被覆盖,导致丢失信息,使用rpm2cpio解决。
[[email protected]_senven /app]#rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -tv
-rwxr-xr-x 1 root root 62768 Jun 10 2014 ./usr/bin/tree
drwxr-xr-x 2 root root 0 Jun 10 2014 ./usr/share/doc/tree-1.6.0
-rw-r--r-- 1 root root 18009 Aug 13 2004 ./usr/share/doc/tree-1.6.0/LICENSE
-rw-r--r-- 1 root root 4628 Jun 24 2011 ./usr/share/doc/tree-1.6.0/README
-rw-r--r-- 1 root root 4100 Jun 24 2011 ./usr/share/man/man1/tree.1.gz
177 blocks
[[email protected]_senven /app]#rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -id ./usr/bin/tree
177 blocks
上面的意思是只解开其中的./usr/bin/tree
[[email protected]_senven /app]#ls
usr x02 x05
tree-1.6.0-10.el7.x86_64.rpm x01 x04
[[email protected]_senven /app]#tree usr/
usr/
└── bin
└── tree
1 directory, 1 file
把需要的usr/bin/tree 复制过去就行了,缺点是文件过去了但是属性不知道是不是和原来的相同。
4、查看安装的内核
[[email protected]_senven ~]#cd /boot
[[email protected]_senven /boot]#ll
total 155720
drwx------. 2 root root 16384 Nov 7 17:13 lost+found
-rw-r--r--. 1 root root 252612 Nov 20 2015 symvers-3.10.0-327.el7.x86_64.gz
-rw-r--r--. 1 root root 293027 Aug 23 05:24 symvers-3.10.0-693.el7.x86_64.gz
-rw-------. 1 root root 2963044 Nov 20 2015 System.map-3.10.0-327.el7.x86_64
-rw-------. 1 root root 3228420 Aug 23 05:21 System.map-3.10.0-693.el7.x86_64
-rwxr-xr-x. 1 root root 5877760 Nov 7 17:40 vmlinuz-0-rescue-efd69f40ccf94189b66612b01830b250
-rwxr-xr-x. 1 root root 5156528 Nov 20 2015 vmlinuz-3.10.0-327.el7.x86_64
-rwxr-xr-x. 1 root root 5877760 Aug 23 05:21 vmlinuz-3.10.0-693.el7.x86_64
可以看到系统上安装了两个内核,主版本号是相同都为3.10.0,但是编译次数不同,639的为比较新
[[email protected]_senven ~]#uname -r
3.10.0-327.el7.x86_64
[[email protected]_senven ~]#rpm -e kernel
error: "kernel" specifies multiple packages:
kernel-3.10.0-693.el7.x86_64
kernel-3.10.0-327.el7.x86_64
[[email protected]_senven ~]#rpm -e kernel-3.10.0-327.el7.x86_64
[[email protected]_senven ~]#cd /boot
[[email protected]_senven /boot]#ll
total 120160
vmlinuz-0-rescue-efd69f40ccf94189b66612b01830b250
-rwxr-xr-x. 1 root root 5877760 Aug 23 05:21 vmlinuz-3.10.0-693.el7.x86_64
可以看到linux将正在使用的内核给卸载了,linux系统可以自杀的,即使卸载了也能使用,因为已经加载到内存了,重启就不会使用了。
5、查看文件属于哪个包
[[email protected]_senven /misc]#rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz
[[email protected]_senven /misc]#rpm -qf /usr/bin/tree
tree-1.6.0-10.el7.x86_64
[[email protected]_senven /misc]#rm -f /usr/bin/tree
[[email protected]_senven /misc]#rpm -qf /usr/bin/tree
tree-1.6.0-10.el7.x86_64
有时候知道文件不知道属于哪个包就是用 rpm -qf filename,当然这个文件删除也没事,因为安装文件的时候已经写到数据库了。
6、包校验
[[email protected]_senven ~]#rpm -ql centos-release
/etc/centos-release
/etc/centos-release-upstream
/etc/issue
/etc/issue.net
/etc/os-release
/etc/pki/rpm-gpg
查看安装centos-release产生的文件
[[email protected]_senven ~]#echo >>/etc/centos-release
[[email protected]_senven ~]#rpm -V centos-release
S.5....T. /etc/centos-release
向/etc/centos-release中追加内容,检测到大小、哈希值、时间改变了。只要是数据不变,哈希值就不会变化
[[email protected]_senven ~]#md5sum /etc/centos-release
f450a3e2f41a131307055835c9c62574 /etc/centos-release
查看文件的哈希值
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入之后,rpm就具有了检查包的能力
[[email protected]_senven /etc/pki/rpm-gpg]#rpm -qa "gpg-pubkey*"
gpg-pubkey-f4a80eb5-53a7ff4b
导入完包以后生成的包的名字是gpg-pubkey-f4a80eb5-53a7ff4b
[[email protected]_senven /etc/pki/rpm-gpg]#rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name : gpg-pubkey
Version : f4a80eb5
Release : 53a7ff4b
Architecture: (none)
Install Date: Sun 26 Nov 2017 07:17:16 PM CST
Group : Public Keys
Size : 0
查看公钥的内容
[[email protected]_senven /etc/pki/rpm-gpg]#cat /misc/cd/RPM-GPG-KEY-CENTOS-7
看到的内容是一样的,但信息不够详细
[[email protected]_senven /etc/pki/rpm-gpg]#rpm -e gpg-pubkey-f4a80eb5-53a7ff4b
[[email protected]_senven /etc/pki/rpm-gpg]#cd /app
[[email protected]_senven /app]#rpm -K tree-1.6.0-10.el7.x86_64.rpm
tree-1.6.0-10.el7.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#f4a80eb5)
删除导入的公钥后看到不能验证tree的包的完整性了。
[[email protected]_senven /app]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[[email protected]_senven /app]#rpm -K tree-1.6.0-10.el7.x86_64.rpm
tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
重新导入后就可以验证包的完整性和签名了
7、删除唯一的内核
[[email protected]_senven /app]#rpm -e kernel --nodeps
删除内核,但是不重启的情况下,并不能再重新安装上kernel。
上图为解决办法。
8、yum缓存的元数据的位置
[[email protected]_senven /var/cache/yum/x86_64/7]#cd /
[[email protected]_senven /]#cd /var/cache/yum/x86_64/7
[[email protected]_senven /var/cache/yum/x86_64/7]#ll
total 20
drwxr-xr-x. 4 root root 4096 Nov 30 18:49 base
drwxr-xr-x. 4 root root 4096 Nov 30 18:49 extras
-rw-r--r--. 1 root root 440 Nov 30 18:49 timedhosts
-rw-r--r--. 1 root root 482 Nov 30 10:16 timedhosts.txt
drwxr-xr-x. 4 root root 4096 Nov 30 18:49 updates
cachedir=/var/cache/yum/$basearch/$releasever其中的$basearch代表架构,$releaseserver代表系统版本
[[email protected]_senven /var/cache/yum/x86_64/7]#cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever 元数据的缓存地址
keepcache=0 是否保留这些安装包,0不保留,1保留
debuglevel=2
logfile=/var/log/yum.log yum的日志
exactarch=1
obsoletes=1
gpgcheck=1检查数据包签名的完整性,需要导入公钥,不然yum检测不到
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d yum仓库配置文件客户端
上面是yum的配置信息
9、配置光盘yum源
1光盘配置repo和epel源
[base]
name=centos7.4
baseurl=file:///misc/cd
gpgcheck=0 不验证包的签名完整性
gpgkey=file:///misc/cd/ RPM-GPG-KEY-CentOS-7 告诉路径让系统自己导入公钥
[email protected]_senven /var/cache/yum]#vim /etc/yum.repos.d/base.repo
[epel]
name=epel
baseurl=http://172.18.0.1/epel/7/x86_64/
gpgcheck=0
"/etc/yum.repos.d/base.repo" 9L, 170C written
[[email protected]_senven /var/cache/yum]#yum repolist
Loaded plugins: fastestmirror, langpacks
base | 3.6 kB 00:00:00
epel | 4.4 kB 00:00:00
(1/2): epel/group_gz | 250 kB 00:00:01
(2/2): epel/primary_db | 3.3 MB 00:00:04
(1/2): epel/updateinfo | 34 kB 00:00:00
(2/2): epel/pkgtags | 1.2 MB 00:00:02
Loading mirror speeds from cached hostfile
repo id repo name status
base centos7.4 9,591
epel epel 5,919
装软件的时候会自动搜索合适的源,关于epel源需要连接网络,以后的实验需要断掉网络,所以在不使用epel源时禁用掉,enabled=0即可,0表示禁用,1表示启用,默认是启用。
[[email protected]_senven /var/cache/yum]#yum list nginx
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Available Packages
nginx.x86_64 1:1.6.1-2.el7 epel
搜索以后用的nginx,看到在epel源中
2弹出原来的光盘,插入新的光盘不显示图标,且还是原来的光盘
一、卸载原来光盘的挂载点
二、断开连接重新连
3、清理仓库缓存
[[email protected]_senven /var/cache/yum]#yum clean all
[[email protected]_senven /var/cache/yum]#ll -hd /var/cache/yum/
drwxr-xr-x. 3 root root 4.0K Nov 7 18:03 /var/cache/yum/
清理缓存目录变小了
4、搭建属于自己的yum源,http和ftp都可以共享。
[[email protected]_senven /]#rpm -ql httpd
/var/www/html此目录是http的共享目录
http共享文件
[[email protected]_senven /]#rpm -ql vsftpd
/var/ftp/pub ftp的共享目录
ftp共享文件
4.1、用centos7为6提供yum源服务器,将6的光盘挂载到7上,复制6的光盘的包到指定目录下,参考阿里云,其中7对应的是7.4,6对应的是6.9
[[email protected]_senven /]#cd /var/ftp/pub/
[[email protected]_senven /var/ftp/pub]#mkdir centos/6/os/x86_64/ -pv
mkdir: created directory ‘centos’
mkdir: created directory ‘centos/6’
mkdir: created directory ‘centos/6/os’
mkdir: created directory ‘centos/6/os/x86_64/
为一类源放到指定的目录,6放到6下面,7放到7下面,到时候制成专门的yum源服务器。
[[email protected]_senven /var/ftp/pub]#mount /dev/sr0 centos/6/os/x86_64/
mount: /dev/sr0 is write-protected, mounting read-only
复制太慢直接将光盘挂载在目录下
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#systemctl start vsftpd
启动ftp服务,在浏览器中输入地址ftp://172.18.14.66进入目录,如果进不去,查看防火墙。
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
查看防火墙,可以看到我的防火墙是关闭的
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#systemctl stop firewalld.service
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#systemctl disable firewalld.service
上面是centos7关闭防火墙方法并且设置开机不启动
[[email protected] ~]#service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[[email protected] ~]#chkconfig iptables off
关闭centos6的防火墙和开机自启动
注意:我虽然关掉了防火墙,但是没有关掉selinux,因此看到ftp://172.18.14.66/pub/centos/6/os/下面什么都没有。
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#vim /etc/selinux/config
SELINUX=disabled
# SELINUXTYPE= can take one of three two v
配置文件下关掉selinux
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#setenforce 0
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#getenforce
Permissive
命令行下关掉selinux,并确认selinux的状态。
4.2、至此服务器端的已经配置好,接下来是centos6中的客户端配置
[[email protected] /etc/yum.repos.d]#vim base.repo
[base]
name=centos6
baseurl=ftp://172.18.14.66/pub/centos/$releasever/os/$basearch/
gpgcheck=0
之所以用变量设地址是因为以后这个地址可以直接粘到7上,都是变量直接替换即可,节省了很多。
[[email protected] /etc/yum.repos.d]#yum repolist
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
base | 4.0 kB 00:00
base/primary_db | 4.7 MB 00:00
repo id repo name status
base centos6 6,706
repolist: 6,706
可以看到yum配置成功。
4.3、在7上配置7的yum源服务器,再添加一张7的光盘
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#blkid
/dev/sr0: UUID="2017-03-28-13-24-36-00" LABEL="CentOS_6.9_Final" TYPE="iso9660" PTTYPE="dos"
/dev/sda1: UUID="908d7358-be55-4e86-b813-509ae8afec2f" TYPE="ext4"
/dev/sda2: UUID="d9e46638-bc38-499e-9390-673e7c49b471" TYPE="ext4"
/dev/sda3: UUID="7e3a345d-8cff-4e48-abd6-8cfda0a6556a" TYPE="ext4"
/dev/sda5: UUID="b8fab337-7010-4ee3-a25c-b945d2bb0696" TYPE="swap"
添加了一张ISO镜像光盘没识别,添加硬件不识别。
[[email protected]_senven /var/ftp/pub/centos/6/os/x86_64]#echo ‘- - -‘ > /sys/class/scsi_host/host2/scan
扫描识别光盘,但是在我的系统中不起效,只能重启系统,没找到解决办法。
[[email protected]_senven /var/ftp/pub]#mkdir -p centos/7/os/x86_64
创建目录
mount /dev/sr1 /var/ftp/pub/centos/7/os/x86_64
挂载光盘
[base2]
name=ftp centos7.4
baseurl=ftp://172.18.14.66/pub/centos/$releasever/os/$basearch/
gpgcheck=0
改配置文件
Loaded plugins: fastestmirror, langpacks
base2 | 3.6 kB 00:00:00
(1/2): base2/7/x86_64/group_gz | 156 kB 00:00:00
(2/2): base2/7/x86_64/primary_db | 5.7 MB 00:00:00
Loading mirror speeds from cached hostfile
repo id repo name status
base2/7/x86_64 ftp centos7.4 9,591
repolist: 9,591
配置成功
注意:我重启系统后发现ftp地址进不去了,查询发现,ftp服务没有开启
systemctl start vsftpd
systemctl enable vsftpd
开启服务,开机自启动。
5、没有光盘,自己组织rpm包形成yum源
[[email protected]_senven /var/ftp/pub]#mkdir app
制作另外一个目录
[[email protected]_senven /var/ftp/pub/app]#cp /var/ftp/pub//centos/6/os/x86_64/Packages/tree-1.5.3-3.el6.x86_64.rpm /var/ftp/pub/app/
从别的地方复制一个rpm包当成我们制作的
[[email protected]_senven /var/ftp/pub/app]#createrepo .
Spawning worker 0 with 1 pkgs
Spawning worker 1 with 0 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
在当前目录下使用命令创建我们的repodata
[[email protected]_senven /var/ftp/pub/app]#ll
total 44
drwxr-xr-x 2 root root 4096 Nov 30 22:37 repodata
创建成功
[[email protected]_senven /var/ftp/pub/app]#vim /etc/yum.repos.d/base.repo
[app]
name=app
baseurl=ftp://172.18.14.66/pub/app
gpgcheck=0
配置yum客户端
[[email protected]_senven /var/ftp/pub/app]#yum repolist
Loaded plugins: fastestmirror, langpacks
app | 2.9 kB 00:00:00
app/primary_db | 1.8 kB 00:00:00
Loading mirror speeds from cached hostfile
repo id repo name status
app app 1
repolist: 1
配置成功
注意:现在目录下面只有一个rpm包,如果再添加rpm包,就需要删除原来的repodata重新使用createrepo命令生成。同时客户端缓存的元数据也要清除,不然信息还是以前的没有改变,客户端清除缓存yum clean all,在使用yum repolist成功。
10、原来的base配置
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
他是把base路径写到文件中,通过文件去寻找路径。
[[email protected]_senven /etc/yum.repos.d]#yum reinstall tree
tree路径缺少组件,重新安装。
讲解:centos6.9的repolist是两张光盘,但实际仓库中只有一张盘的rpm包,办法就是把两张盘的rpm包合成一张盘,手工合并也可以,元数据在第一张盘
[[email protected]_senven /etc/yum.repos.d]#yum list httpd
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
httpd.x86_64 2.4.6-67.el7.centos @base
@base证明已经装上了
注意:在生产中安装都是最小化安装,最后缺什么安装什么。
11、编译安装httpd
[[email protected] httpd-2.4.29]# ./configure --prefix=/app/httpd2.4.29指定安装目录
安装httpd
configure:
checking for APR... no
configure: error: APR not found. Please read the documentation.
发现缺少包
[[email protected] httpd-2.4.29]# yum install apr-devel.x86_64
缺什么包在名字后面加devel
checking for APR-util... no
configure: error: APR-util not found. Please read the documentation.
[[email protected] httpd-2.4.29]# yum install apr-util-devel.x86_64
发现还是缺少包继续安装
checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
[[email protected] httpd-2.4.29]# yum install pcre-devel.x86_64
还是缺少包,当然不是pcre-config-devel而是pcre- devel活学活用
[[email protected] httpd-2.4.29]# yum install openssl-devel
继续安装包
[[email protected] httpd-2.4.29]# make
编译
[[email protected] httpd-2.4.29]# make install
安装
[[email protected] app]# vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24/bin:$PATH
修改环境变量
[[email protected] app]# . /etc/profile.d/httpd24.sh
[[email protected] app]# echo $PATH
/app/httpd24/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
使环境变量生效
[[email protected] app]# apachectl
[[email protected] app]# ss -ntl
State Recv-Q Send-Q Local Address:Port
LISTEN 0 128 :::80 :::*
LISTEN 0 128 ::1:631 :::*
启动Apache服务
[[email protected] app]# systemctl stop firewalld.service
[[email protected] app]# systemctl disable firewalld.service
[[email protected] app]# vim /etc/selinux/config
SELINUX=disabled
关掉防火墙,关掉selinux
浏览器输入地址显示成功
[[email protected] app]# cd /app/httpd24/htdocs/
[[email protected] htdocs]# ll
total 4
-rw-r--r--. 1 root root 45 Jun 12 2007 index.html
网页文件放置地址,修改index.html文件可改变网页
注意:
[[email protected] htdocs]# man httpd
man帮助找不到路径怎么办
[[email protected] man]# pwd
/app/httpd24/man
[[email protected] man]# vim /etc/man_db.conf
直接将man帮助的路径写到配置文件中,centos6和7不同
[[email protected] man]# make uninstall
卸载软件,有的软件可以,但是这个不行
[[email protected] man]# cat install.sh|bash
新的脚本执行办法,不需要加执行权限,或直接bash
centos6.9安装和7.4不同,httpd是2.2