开发者学堂课程【Linux 软件包安装和 yum 仓库实战:yum 仓库实现 – 1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/590/detail/8337
yum 仓库实现 – 1
目录:
一、 包校验
二、rpm 数据库
三、yum
一、 包校验
提到了对数据包的检查校验,其中有一个 rpm -K checksig rpmfile 选项,是检查包的完整性和签名,当这个数据包被篡改、被破坏,内容发生了变化,和开发出来的时候原始包内容不一样了,这个选项是可以了解,看到这个变化的。
提示: tree-1.6.0-10.e17.x86 64 .rpm 目前是没有检查的,缺失 key,要想检查需要导入一个对应的密钥,密钥在光盘的根目录下: /mi sc/ cd RPM-GPG-KEY-C entos-7
是一个普通文本文件,但里面内容都是 key 的信息。
public key 即公钥,公钥的信息需要导入到当前系统中,才能查询,用到 --import选项,导入后相当于带有选项的功能了。此时检查结果是正确的。
当内容被故意破坏时,当前包,只是追加了回车换行,变化后结果就是不正确的。
只要有一点变化,包与初始状态就不同了。此时可以避免安装被串改、危险的包。前提需要人为导入密钥。但是不同的开发者对应的密钥是不一样的。
公钥加密:对称加密:加密、解密使用同一密钥。非对称加密:密钥是成对儿的。
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 --import/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7CentOS 7
发行版光盘提供:
RPM-GPG-KEY-CentOS-7rpm -qa “gpg-pubkey*”
二、 rpm 数据库
这是一个存放 rpm 对应的数据的数据库,这个目录如果破坏了,可以用这些命令来重建,但是重建并不会把丢失的 rpm 的原有数据库内容找回,只是把数据库重新建立起来。
数据库重建:
/var/lib/rpm
rpm (--initdb|--rebuilddb)
initdb:初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
如果人为删除目录,会自动生成初始数据,但是数据是空的,不能重新使用。
rpm 术语:
-l 安装查询 -e卸载查询
-qi 查询信息
-qa 列出所有的包
-q package 包是否安装上.0表示没安装,1表示已安装。
-ql 列出当前包里包括的文件列表
-qc 查配置文件
-qd 查配置文档
-qf /path/file 查询此文件来自哪个包
-qp /path/rpm file name 配合 rpm 文件名,跟的是 rpm 文件名。
-qi 查磁盘上的包对应的信息
-ql 查磁盘上的包对应的文件列表
-nodeps --force 强制安装
-root= 指定有哪个参考点之下的目录进行安装,默认是从根开始安装的,每个 rpm boot 包括的文件都很多,列出的文件分门别类,分布在根目录下,如果不是在根目录下,也可以指定根目录下一级一级的目录进行安装。
-q –-scripts 查看脚本,可以查询脚本,但并不是所有的包里都带有脚本
命令来自哪个包查询方法:
rpm 是个外部命令,内部命令在 bash,很好查询:rpm -ql /bin/bash
。
在掌握其路径后,进行查询:rpm -qf /usr/bin rpm
实验:删除 /lib64/libc.so.6,恢复之
卸载 rpm 包,发现它具有依赖性,无法卸载。
删除命令:[ root@centos7 ~]#rpm2cpio /misc/cd/Packages/rpm-4.11.3-32.e17.x86_ 64.rpm Icpio -id
强制卸载命令:[ root@centos7 ~]
#rpm -erpm – nodeps
由于rpm被卸载,以下工具不能使用:
rootacentos7 ~ #which rpm2cp1o
/usr/bi n rpm2cpi 0
lroot@centos7 ~]#rpm -qf /usr/bi n/ rpm2cpiorpm-4.11.3-32.e17.x86_ 64
[root@centos7 ~]#rpm -qf /usr/bin/ rpm2cpiorpm-4.11.3-32.e17 .x86_ 64
[ root@centos7 ~ ]#_
修复它实际上可以使用光盘里的救援模式功能进行修复。
Boot menu
1.Renovable Devices.
2.Hard Drive
3.CD-ROM Dr ive
4.Netuork boot from Intel E1909
5.Netuork boot from Intel E1000 u2
选择第三项光盘,Rescue nstalled syste 救援模式。不止适用于一个命令,其他命令被删除也可以使用这个命令修复。对系统来讲,只是一个程序来进行修复,程序丢失可以找回,但是时间成本太高,生产机会会减少。
救援模式启动后,进行修复。运用光盘来运行,挂载
bash-4.1m ls -1 mntsys imgebinvrpa-FLr-XT-X. 1 root root 28392 2818- 86-19 15:56 ntUsys imageb in/rpm
实验:删除 rpm 包,恢复之第二种命令:
先删除:切根,search root 就是把原来的根作为制定的根,但是一切根,rpm 命令就不能用了,表面上用的是光盘的命令,但是 rpm 实际上是用硬盘的命令,所以此时 rpm 救援命令就失效了。退出后又回到原来状态。再使用之前的方法重新安装:
bash-4.1# rpm -fvh /mnt/cdrom/Packages/rpm-4.8.8-59.e16.×86 64.rpm —-rootsamt/sysimage
warning:/mnt/cdrom/Packages/rpm-4.8.8-59.e16.x86_64.rpm:Header U3 RSA/SHA1 Signature, key ID c185b9de:NOKEY
package rpm-4.8.8-59.e16.x86 64 is alreadu installed
bash-4.1# rpm -ivh /mnt/cdrom/Packages/rpm-4.8.8-59.c16.x86_64.rpm --root=/mnt/susimage/ --force
warning:/nt/cdrom/Packages/rpm-4.8.8-59.e16.x86_64.rpm:Header U3 RSA/SHA1 Signature, key ID c185b
rpm 命令可以用了,此时的 rpm 是切过根的,可以使用的。重新启动第三项就可以了。
<Enter Setup>
root@centos7~j#rpm-a/usr/bin/rpm2cp1o
rpm-4.11.3-32.e17.x86_64
root@centos7 #rpm-af/usr/bin/rpm2cpio
rpm-4.11.3-32.e17.x86_64
root@centos7
root@centos7
root@centos7
[root@centos7
[root@centos7
Lroot@centos7心#rom -ivh
/misc/cd/packaaes/svstem-confia-kickstart-2.9.7-1.el7.noarch.romwarning:/misc/cd/Packages/system-config-kickstart-2.9.7-1.e17.noarch.
rpm:Header V3 RSA/SHA256Sianature.key
IDf4a80eb5:NOKEY
error:Faileddependencies:
system-config-dateisneeded bysystem-config-kickstart-2.9.7-1.e17.noarch
system-config-keyboard >= 1.3.1 is needed by system-config-kickstart-2.9.7-1.e17.noarch
system-confia-languageisneeded by system-config-kickstart-2.9.7-1.e17.noarch[root@centos7 ~]#
rpm-ivh /misc/cd/Packages/system-config-date-
system-config-date-1.10.6-2.e17.centos.noarch.rpm
svstem-confia-date-docs-1.0.11-4.e17.noarch.rpm
[root@centos7 ~]#rpm-ivh
/misc/cd/packages/system-config-date-1.10.6-2.e17.centos.noarch.rp
warning:/misc/cd/Packages/system-config-date-1.10.6-2.e17.centos.noarch
安装、卸载、查询基本没有问题了,但是 rpm 包仍有较大的缺陷,即依赖性的问题。
安装的软件包:
root@centos7~l#rpm -ivh/misc/cd/Packages/system-confiq-kickstart-2.9.7-1.e17.noarch.rpm
警告:/misc/cd/Packages/system-config-kickstart-2.9.7-1.e17.noarch.rpm:Header V3 RSA/SH/256Signature,key IDf4a80eb5:NOKEY
失败原因:依赖于这些包:
system-config-date Is needed by
system-confia-kickstart-2.9.7-1.el7.noarch
system-config-keyboard >= 1.3.1 is needed by
system-config-kickstart-2.9.7-1.e17.noarch
system-config-language is needed by
system-config-kickstart-2.9.7-1.e17.noarch
安装这些包:
root@centos7~j#rpm-1vh/misc/cd/Packages/system-conf1g-date-1.10.6-2.el7.centos.noarch.rp
警告:
/misc/cd/Packages/system-config-date-1.10.6-2.e17.centos.noarch.rpm:Header V3 RSA/SHA256 Signature, key IDf4a80eb5:NOKEY
失败原因:缺少包
gnome-python2-canvas is needed by
system-config-date-1.10.6-2.e17.centos.noarchsystem-config-date-docsis needed by
system-config-date-1.10.6-2.e17.centos.noarch
依赖性并不能告诉我们所有的包,依赖的包并不一定真的都在光盘里,有可能来自于其他的互联网上的 rpm 包的源,互联网上有很多 rpm 包的路径都存了许多 rpm包源相关的内容,如 epl 源,在互联网上有,在光盘里带的是光盘里自己的 rpm 包。
当我们安装某个包时,它可能会依赖于光盘里的包,也可能会依赖别的包,所以这种依赖性导致安装过于繁琐。解决这个问题就是一个一个找,拷下来,放在一个目录里。
三、 yum
这是一种新的解决方案,可以轻松解决包的依赖性,这是 yum 存在的最重要的一个原因。当然这只是其中一种解决方案,在新版本也有新的解决技术:
dnf。他的性能比 yum 更快,dnf 这种方式我们了解即可。
1. CenteOS:
yum、dnf
2. YUM 介绍
全称:Yellowdog Update Modifier,rpm 的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date 的替代工具
3.yum 和 rpm 的区别:
rpm 是拿一个文件直接安装就行,不需要事先配置任何内容,它是孤立的独立的文件。
yum 安装是基于 cs 结构的,后面很多应用都是基于这种结构的。这种结构叫服务器端与客户端。
C 是 client,即客户端,s 是 server,即服务器端。客户端有专门的客户端电脑,假设有一个 yum 客户端,用 yum 安装,就需要实现搭建一个 yum 服务器,服务器与客户端之间是要进行网络连接的。也可以在同一台电脑上,既是客户端又是服务器。但不可能每个电脑都客户端又是服务器。
4.yum repository
yum repo,存储了众多 rpm 包,以及包的相关的元数据文件(放置于特定目录repodata 下)
yum server 包括:yum repo
第一个是需要安装的 rpm 包,也就是各种各样的 rpm 包。这个包是很多的,此外还有一个很重要的内容:存的是要安装的包,即元数据 Meta,元数据存的就是 rpm包相互的依赖性,都放在了仓库的元数据,将来会表现为一个文件夹 repodata,本身在光盘中就有。这个包存了很多的数据:依赖性、属性信息、分组信息。
yum 的客户端想利用 yum 安装,就需要实现在 yum 客户端上加以配置,配置文件要指向仓库的路径,需要事先配置,不然无法安装软件,配置文件后缀要求是: repo,而且需要固定的放在目录里,必须放在:/ etc/yum/repos.d/ 中。这个文件记录了仓库的服务器路径。
既然要有服务器又有客户端,就必须知道服务器的位置,很多客户端要想访问某个服务器,必须指定服务器的路径。
yum 客户端配置完后,通过查询服务器文件,就能知道其服务器的路径。
安装软件只需要运行一个命令即可:yum install 后面加上一个文件即可,或者跟上一个包名 package 注意:是包名不是文件名。
当写上文件后,会自动去查服务器的路径,就会自动通过网络连接到服务器上,如果现在要安装 tree 包,就去查 Meta 里面,Meta 里面放的是元数据,放的就是仓库里的包列表,有 tree 包,知道其有依赖性,是否依赖于其他包,都会把信息返回其客户端,放回到专门的文件夹中。Meta 会下载,此时本机就会缓存信息。
yum 客户端默认行为:虽然全都下载下来了,也放到目录里,安装完后会自动删除,缓存中不会留有 Meta 包,但是元数据会缓存。
这个机制带来一个效果:再安装了一个别的包,如 yum install httpd 包 ,第一次跑到服务器中去寻找元数据,这次就不需要了,本机仓库已经有了元数据的缓存。再去仓库里把 p1p2p3 下载下来自动安装,本机不保存。缓存默认存的是元数据。
好处是:利用缓存,本地有缓存,不需要再去服务器了,提高速度
缺点是: 如果服务器的路径,这边仓库发生了变化,比如新增加了新包,仓库也更新了,这里就没有更新。有可能一查新的包,仓库未更新,就安装不上了。不一定是实时的,完全一样的了。
所谓的解决方案是:把仓库的缓存删除,清空缓存之后,被迫链接服务器,再去下载服务器缓存,此时获取了最新的缓存,由此解决了 yum 的安装问题。只需要把服务器搭好,安装起来。这就是 yum 的工作原理。配置只需配置一次即可,不需要关心路径,安装起来非常方便。
yum 在实现之后,需要将服务器和客户端都组合起来,才能实现。
服务器通常来讲,如果网络中有很多台都需要安装 yum 软件,会单独装一台 yum服务器。如果只需要单台主机搭建 yum 服务器,换句话说,就是自己单独使用,别人不用也可以,就是建立单主机服务器,建立仓库独立使用。但是在生产中大部分情况都是为网络中的用户提供服务的。
所以在 cent OS 分别建立两个版本:centos7 和 centos6
相当于有两个仓库,第一个仓库视为 centos7 提供服务的。
第二个是为 centos6 提供服务的
所谓的 yum 服务器无非是把 rpm 包和 Meta 元数据准备好就行,这两个在光盘上已经有了。
光盘就是一个仓库,需要在此加以指定,登录后用的是默认配置,
to:
<LOOPBACK , UP ,LOWER_UP> mtu65536gdisc noqueue state UNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scope host 1o
inet6::1/128scope host
:eth0: valid lft forever preferred_lft forever1500 gdiscpfifo_fast state UP qlen
<BROADCAST ,MULTICAST ,UP, LOWER_UP> mtu
link/ether00:0c:29:e1:f7:aa brd ff:ff:ff:ff:ff:ff
inet192.168.34.102/24 brd192.168.34.255 scopeglobal etho
inet6fe80::20c:29ff:fee1:f7aa/64 scope Tink
valid_1ft forever preferred_1ft forever
4.文件服务器:
http://
https://一种特殊的格式,是加密的
ftp://
file://
先来做一个本机的仓库,本机路径:做一个 yum 的配置文件,按照规定的格式写配置文件,只要是 repo 后缀就可以,把光盘作为 base 源。大小写无所谓。
entos-Base.repo Centos-fasttrack.repo Centos-vault.repo
entos-Debuginfo.repo CentoS-Media.repo
root@centos6yum.repos.d]# mkdir bak
root@centos6yum.repos.d]#mv *.repo bak/
root@centos6 yum.repos.d]# 1s
ak
root@centos6yum.repos.d]# pwd
etc/yum.repos.d
root@centos6 yum.repos.d]#
关键内容:
//第一行中括号,给仓库起个名字,仓库的名字没有要求,不要有空格,就像定义变量一样,与众不同即可。
仓库的路径,跟上四种路径:
http://
https://
ftp://
file://
baseurl=file:///misc/cd/
每安装一个包,系统会自动校验包的选择,相当于自动检查这个包是否是合法的、安全的包,如果不去做检查,就不会被认成安全的、合法的包。
要想识别一个包,需要导入路径:[ root@centos7 ~]#rpm --import /mi sc/ cd/ RPM-GPG-KEY-Centos-7
如果想不被识别和检查这个包:#gpgcheck=0
如果不写也行,就需要人为的导入。
此时配置文件已经写好:
base
baseurl=file:///misc/cd/
#gpgcheck=0
现在可以利用 yum 轻松的安装包了。
先确认仓库是否已经搭建好:
"base. repo" [New] 3L, 43C written
[ root@centos6 yum. repos.d]#
[ root@centos6 yum. repos.d]# cd
[ root@centos6]#
[ root@centos6]#yum repolist
如果没有配名字就会有提示:
base' is missing name in configuration,using id
name应当单独加个代码,如:name=cdrom repo或者可以用id做名字。
经过校验,该文件有6706个包,但是实际上只有3000个包。这里列的包并不是实际的 rpm 包的数量,它是根目录里的,它是两张盘合理来为6706个,其实一张盘里包的数量为3000左右,它是包含单张盘的。
如果装的是第一个盘,正常安装即可,如果是装的第二张盘,就需要把所有的盘拷到一个目录里。
此时可以安装了。
解决依赖性问题:
使用 yum
[root@centos6 ~]# yum install system-config-kickstart
由于其依赖性,一共需要安装26个包。瞬间安装完成。此时可以看出yum的便捷性。
y 可以事先写在目录里,加一个选项,写在脚本里,变换成非交换性程序。
root@centos6~#yum instal1system-config-kickstart -y
Loadedplugins: fastestmirror, refresh-packagekit, security
settingup Install Process
Loadingmirrorspeedsfromcached hostfile
Packagesystem-config-kickstart-2.8.6.6-1.e16.noarch already installed and latest version Nothingto do
[root@centos6~]#
这个仓库只能给本机使用,此外还有一个密钥问题,刚才人为的写成0,但事实上把密钥写为零是危险的,为了安全可以考虑将其更改,可以把它换成一或注释删掉。
此时默认为要检查,它是要检查每一个包的签名的,再安装就会被阻止,基于这个包的公钥没有安装,没有确认合法性,就不安装了。
把刚才的包写为 gpgkey=,就会自动导入。
Is this ok [y/N]:y
DownToadingPackages:
varning: rpmts_HdrFromFdno:Header V3 RSA/SHA1 Signature, key ID c105b9de:NOKEYRetrievingkey from file:///misc/cd/RPM-GPG-KEY-CentOS-6
[mporting GPG key0xC105B9DE:
Userid: “Centos-6 Key(CentoS6 official Signing Key) <centos-6-key@centos.org>"From:/misc/cd/RPM-GPG-KEY-CentoS-6
Is thisok Ly/NJ:y
Running rpm_check_debug
RunningTransaction Test
Transaction Test Succeeded
RunningTransaction
Installing vsftpd-2.2.2-24.el6.x86 64
Verifying :vsftpd-2.2.2-24.e16.x86_64
[nstalled:
vsftpd.x86_64 0:2.2.2-24.e16
导入之后就可以验证其合法性了,
这就是 yum 配置文件的写法,最终代码:
name=cdrom repo
baseurl=file:///misc/cd/
#gpgcheck=0
gpgkey=file:///misc/cd/RPM-GPG-KEY-Cent0S-6
"/etc/yum.repos.d/base.repo"5L,104C written
[root@centos6 ~]#yum install vsftpd
卸载包的代码:
Removed :
system-config-kickstart. noarch 0:2.8.6.6-1.el6
从结果中发现包并没有被卸载干净,这就是因为 yum 具有依赖性,它只能卸载自己而无法卸载其他的软件。