第十二章软件包管理

sunan sunan     2022-10-13     424

关键词:

第十二章、软件包管理

本章内容

?软件运行环境

?软件包基础

?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

php

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

构造之法第十十二章

第十一章软件设计与实现图形建模和分析方法1表达实体和实体之间的关系(思维导图)2实体关系图3UseCaseDiagram表达数据的流动(1)和管理机构相关的数据流(2)和读者相关的数据流 (3)和新书入库相关的数据流(4)和时... 查看详情

testlink1.9.17使用方法(第十二章总结)

第十二章总结QQ交流群:585499566TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,我们可以将测试过程从:测试需求、测试设计、到测试执行。完整的管理起来,同时,它还提供了好多种测试结果的统计和分析,使... 查看详情

第十二章动态内存与智能指针

动态内存与智能指针【智能指针】头文件#include<memory>shared_ptr:允许多个指针指向同一个对象unique_ptr:"独占"所指向的对象weak_ptr:伴随类,它是一种弱引用,指向shared_ptr所管理的对象。  查看详情

第十二章与spring集成——《跟我学shiro》

    转发:https://www.iteye.com/blog/jinnianshilongnian-2029717目录贴: 跟我学Shiro目录贴 Shiro的组件都是JavaBean/POJO式的组件,所以非常容易使用Spring进行组件管理,可以非常方便的从ini配置迁移到Spring进行管理,且... 查看详情

第十二章课下测试补交博客

第十二章课下测试补交博客 查看详情

第十二章lnmp架构(下)

12.17Nginx负载均衡12.18ssl原理12.19生成ssl密钥对12.20Nginx配置ssl12.21php-fpm的pool12.22php-fpm慢执行日志12.23open_basedir12.24php-fpm进程管理12.25扩展  12.17Nginx负载均衡编辑配置虚拟主机文件?vim/usr/local/nginx/conf/vhost/load.c 查看详情

高数(a)下第十二章

 12.112.2 12.3  查看详情

cprimerplus读书笔记第十二章

C的强大功能之一在于它允许我们控制程序的细节。C的内存管理系统正是这种控制能力的例子。它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制。 1.存储类及其说明符  主要的... 查看详情

第十二章----数组

importjava.util.Arrays;publicclassTest{publicstaticvoidmain(String[]args){//数组的定义//int[]a=newint[5];//inta1[]=newint[3];//int[]a2={2,4,6};int[]a=newint[4];boolean[]b=newboolean[4];char[]c=newchar[4];S 查看详情

第十二章

一、变量的作用域(有效的使用范围)1、变量有2种             1.1成员变量(属性)声明在类的里面,方法的外面            &n 查看详情

“全栈2019”java第十二章:变量

...开发环境JDKv11IntelliJIDEAv2018.3文章原文链接“全栈2019”Java第十二章:变量下一章“全栈2019”Java第十三章:基本数据类型学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私信“Java学习小组”。方式二:... 查看详情

第十二章:类的无参方法

第十二章:类的无参方法类定义类的方法类的方法必须包括:1.方法名称                             查看详情

第十二章随笔

  第十二章,Android下综合项目介绍之一随着社会电子信息化的不断发展,人们在居家中实验的电器越来越多,由此带来的安全隐患也越来越多,为了减少电器的不合理使用带来的异常情况,由此带来的安全隐患也有了明... 查看详情

java第十二章继承笔记

Java第十二章 继承笔记一、使用继承:   1)方便修改代码   2)减少代码量二、super继承object类:super访问父类的无参构造;super指的是object的无参构造。   例:子类调用父类:super.属性/super.... 查看详情

javascriptdom编程艺术-学习笔记(第十二章)

第十二章1.本章是综合前面章节的所有东西的,一个综合实例2.流程:①项目简介:a.获取原始资料(包括文本、图片、音视频等)                    b.站点... 查看详情

第十二章存储之secret

1、Secret存在意义Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者PodSpec中。Secret可以以Volume或者环境变量的方式使用2、Secret有三种类型① ServiceAccount:用来访问KubernetesAPI,由Kuberne... 查看详情

第十二章springboot+mongodb(复杂查询)

简单查询:使用自定义的XxxRepository接口即可。(见 第十一章springboot+mongodb(简单查询))复杂查询:使用MongoTemplate以及一些查询条件构建类(BasicDBList、BasicDBObject、Criteria等)1、application.properties1#mongodbnote:mongo3.xwillnotusehost... 查看详情

第十二章笔记

                   类的无参方法学习本章用到的单词document:文档,文件display:展览method:方法vesrion:版本orient:东方,使适应parameter:参数since:自从,既然,因为 类的方法概述类是有一组具有相... 查看详情