目录
前言
1.yum架构介绍
2.使用光盘搭建yum源
3.创建私有仓库
4.yum客户端的配置
使用rpm安装包时经常会遇到一个问题就是包依赖,如下所示
[root@RHEL813 ~]# rpm -ivh /mnt/AppStream/Packages/httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64.rpm
警告:/mnt/AppStream/Packages/httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
错误:依赖检测失败:
httpd-filesystem 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
httpd-filesystem = 2.4.37-41.module+el8.5.0+11772+c8e0c271 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
httpd-tools = 2.4.37-41.module+el8.5.0+11772+c8e0c271 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
libapr-1.so.0()(64bit) 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
libaprutil-1.so.0()(64bit) 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
mod_http2 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
system-logos(httpd-logo-ng) 被 httpd-2.4.37-41.module+el8.5.0+11772+c8e0c271.x86_64 需要
[root@RHEL813 ~]#
这里
的意思是按【Tab】键。
所谓包依赖,就是在安装A时必须先把B和C安装上去。如果用rpm一个个安装是非常困难的,这里可以使用dnf或yum命令来解决。yum命令其实是软链接到dnf命令上的,所以输入yum或dnf都可以,后文都使用yum命令介绍。
为了便于理解,先看图24-1所示的例子。
可能我们经常会使用360软件管家管理软件包,在360服务器上有各种软件,在PC上的360软件管家中搜索想要安装的软件,然后单击【安装】按钮,这样就可以把软件自动安装到本地了,很方便。
yum的架构也是类似的,如图24-2所示。
在服务器上存在某个目录中存储了大量的软件包,然后通过ftp或http把此目录共享出去,使得客户端可以通过ftp或http能访问到此目录。
在服务器端所存储的这些软件包中,服务器是知道哪些包之间有依赖关系的,例如,A、B、C三者之间存在依赖关系,所以当客户端发布一个请求说要安装A时,如图24-3所示。
此时发现A和B、C有依赖关系,所以客户端会把A、B、C三者都从服务器下载到本机的缓存,然后再把这三个包一起给安装上去。
如果假设A和B、C、X有依赖关系,但是X这个包并没有出现在现在的这个源中,那么当客户端要安装A时,因为缺少了X,所以安装是失败的。此时我们就需要在客户端上指定多个源,保证所有的这些源中包含了所有需要的包,如图24-4所示。
因为客户端指定了两个源,所以当客户端发布一个请求说要安装A时,此时从第一个源中检测到了需要的依赖包B、C,然后从第二个源中找到了X,客户端就会把这四个包一起下载到本地缓存中并进行安装
实验拓扑图如图24-5所示。
因为光盘中包括了最常用的软件包,所以现在就把光盘的内容作为源,用vsftpd将光盘的内容共享出去。在rpm博客已经将 vsftpd安装上去了,如果没有安装请按前面博客讲过的内容自行安装好
注意下面的操作都是在server上做的。
修改/etc/vsftpd/vsftpd.conf中的anonymous enable选项,如下所示。由anonymous_enable=NO修改为anonymous_enable=YES,并添加如下命令。
pasv_min_port=10010
pasv_max_port=10020
命令如下图所示。
保存退出并启动vsftpd,命令如下。
[root@RHEL813 ~]# systemctl enable vsftpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@RHEL813 ~]#
如果已经启动过了,则通过systemctl restart vsftpd重启一下,使刚做的配置生效。
修改防火墙,命令如下。
[root@RHEL813 ~]# firewall-cmd --add-port=20-21/tcp --permanent
success
[root@RHEL813 ~]# firewall-cmd --add-port=10010-10020/tcp --permanent
success
[root@RHEL813 ~]# firewall-cmd --reload
success
[root@RHEL813 ~]#
设置 SELinux相关的布尔值,命令如下。
[root@RHEL813 ~]# setsebool -P ftpd_full_access 1
[root@RHEL813 ~]#
记住,这个布尔值一定要设置,否则客户端会出现图24-6所示的错误。
创建目录/var/ftp/dvd,然后把光盘挂载到此目录上,命令如下
[root@RHEL813 ~]# mkdir /var/ftp/dvd
[root@RHEL813 ~]# mount /dev/cdrom /var/ftp/dvd/
mount: /var/ftp/dvd: WARNING: device write-protected, mounted read-only.
[root@RHEL813 ~]#
这样其他机器通过ftp访问/var/ftp/dvd时,访问的就是光盘中的内容了。设置开机自动挂载,修改/etc/fstab,内容如下
[root@RHEL813 ~]# grep ftp /etc/fstab
/dev/cdrom /var/ftp/dvd defaults iso9660 0 0
[root@RHEL813 ~]#
至此,服务器上的yum 源就已经配置好了,/var/ftp/dvd中的内容如下图所示。
[root@RHEL813 ~]# ls /var/ftp/dvd
AppStream EFI extra_files.json images media.repo RPM-GPG-KEY-redhat-release
BaseOS EULA GPL isolinux RPM-GPG-KEY-redhat-beta TRANS.TBL
[root@RHEL813 ~]#
此时客户端不能直接把此目录作为源来使用,服务器是知道每个包和其他包之间的依赖关系的,因为系统会把某个目录(包括子目录)中的rpm包的元数据信息放在repodata目录中。
但是在/var/ftp/dvd中并没有repodata目录(不能单纯地用mkdir命令把此目录创建出来,创建出来里面没有元数据是没用的),所以 /var/ftp/dvd并不能直接作为源来使用。先来看AppStream目录的内容,命令如下
[root@RHEL813 ~]# ls /var/ftp/dvd/AppStream/
Packages repodata
[root@RHEL813 ~]#
这里repodata是 AppStream下的目录,记录了AppStream目录下所有的rpm信息,此处AppStream中所有的rpm都存储在Packages目录下了。repodata中的内容大概是这样的,如下所示。
[root@RHEL813 ~]# ls /var/ftp/dvd/AppStream/repodata/
167822ee59a5cbd329d31b2ff030cb2146b0fd624e390ffe3ac98fb641fb62f4-comps-AppStream.x86_64.xml.gz
2adf8b14deae5cde9dd015b563abdfba1d2a4c96659bf8386ff182f9400b023b-comps-AppStream.x86_64.xml
689bd45a22fedbffbc3e3b9d82109a2c6ed02ee8b2962136d63a3026f24d6ef0-filelists.xml.gz
99f06c9bf207d0b64dfecfeb768d255367de7e22522ae4669c2bf8361a2df4ef-other.xml.gz
b591d9fa12e0ba5c6d75b84b605f44c1daefd514068152a3fd8ba53fdb5975eb-primary.xml.gz
d12f84e558ef647914eb6d20f034920765390d579888595800f915a133457a22-modules.yaml.gz
ee6f2ed466e70c8ee4dd48d8aa3897707349e31e3f546a82e121cc53cc82d8a8-productid.gz
productid
repomd.xml
TRANS.TBL
[root@RHEL813 ~]#
再来看BaseOS目录的内容,命令如下。
[root@RHEL813 ~]# ls /var/ftp/dvd/BaseOS/
Packages repodata
[root@RHEL813 ~]#
这里repodata是 BaseOS下的目录,记录了BaseOS目录下所有的rpm信息,此处BaseOS中所有的rpm都存储在Packages目录下了。
总结:repodata目录中记录了repodata所在目录下所有的rpm信息,例如BaseOS下的repodata 记录了BaseOS目录下所有的rpm信息
所以,当前server上有两个源,分别是/var/ftp/dvd/AppStream和/var/ftp/dvd/BaseOS。客户端要访问这两个源,分别通过ftp://192.168.103.17/dvd/AppStream和 ftp://192.168.103.17/dvd/BaseOS 即可。
在server上利用光盘对外提供了两个源分别是/var/ftp/dvd/ AppStream和/var/ftp/dvd/BaseOS,这两个源是光盘中自带的。下面练习如何创建一个自定义的源。
先配置server使用光盘作为源,在server (192.168.103.17这台机器)中把光盘挂载到/mnt 上,并在/etc/fstab中设置开机自动挂载
[root@RHEL813 ~]# vim /etc/fstab
[root@RHEL813 ~]# tail -1 /etc/fstab
/dev/cdrom /mnt defaults iso9660 0 0
[root@RHEL813 ~]#
这样访问/mnt时访问的就是光盘了。创建/etc/yum.repos.d/aa.repo的内容如下。
[root@RHEL813 ~]# cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
[bb]
name=bb
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[root@RHEL813 ~]#
需要注意的是,这里file:后面是3个/,file:是类似于http;//、ftp:;这样的写法,第三个/表示的是绝对路径
通过yum install安装createrepo工具包,命令如下。
[root@RHEL813 ~]# yum -y install createrepo
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:16:49 前,执行于 2023年12月11日 星期一 22时00分03秒。
依赖关系解决。
然后创建一个目录/var/ftp/myrepo,命令如下。
[root@RHEL813 ~]# mkdir /var/ftp/myrepo
[root@RHEL813 ~]#
从光盘中拷贝一个测试用的安装包,这里就选择vsftpd的安装包。拷贝 vsftpd到/var/ftp/myrepo中,命令如下。
[root@RHEL813 ~]# cp /mnt/AppStream/Packages/vsftpd-3.0.3-34.el8.x86_64.rpm /var/ftp/myrepo/
[root@RHEL813 ~]#
通过createrepo工具包对/var/ftp/myrepo进行操作,命令如下。
/var/ftp/myrepo目录中的内容如下。
[root@RHEL813 ~]# ls /var/ftp/myrepo/
repodata vsftpd-3.0.3-34.el8.x86_64.rpm
[root@RHEL813 ~]#
这里生成了repodata,里面包含了/var/ftp/myrepo中所有的rpm包(这里就一个vsftpd)的信息,那么/var/ftp/myrepo也可以作为一个源来使用了
客户端要安装软件包必须指定使用哪些源,在客户端上指定源的方法是在目录/etc/yum.repos.d中创建后缀是repo的文件。文件名是什么无所谓,但后缀必须是repo,格式如下
[名称] ‐‐‐‐用于标注不同的源
name= ‐‐‐‐注释信息
baseurl= ‐‐‐‐指定源的URL地址
enabled= ‐‐‐用于指定是否启用这个源,值有0和1
0‐‐‐不使用这个源
1‐‐‐使用这个源
enabled也可以写成enable
gpgcheck= ‐‐‐‐用于指定安装的软件包是否要进行数字签名的验证,值有0和1
0‐‐不对每个安装包进行数字签名验证
1‐‐对每个包做数字签名的验证
gpgkey=/path/如果上面 gpgcheck的值设置为1,需要使用此选项指定公钥;如果上面gpgcheck的值设置为0,这个选项可以不写。
在服务器端已经配置了两个源,下面配置客户端让其能使用这两个源,在/etc/yum.repos.d中创建aa.repo,内容如下
[root@RHEL8 ~]# cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=ftp://192.168.103.17/dvd/AppStream
enabled=1
gpgcheck=0
[bb]
name=bb
baseurl=ftp://192.168.103.17/dvd/BaseOS
enabled=1
gpgcheck=0
[root@RHEL8 ~]#
这里在aa.repo中配置了两个源,分别标记为aa和 bb。可以把多个源写在同一个repo文件中,也可以把多个源写在不同的repo文件中
当通过ftp://192.168.103.17来访问服务器时,访问的是服务器的/var/ftp目录,千万不要写成ftp://192.168.103.14/var/ftp了,否则对应的就是服务器的/var/ftp/var/tp目录了。
ftp://192.168.8.11/dvd对应的是服务器的/var/ftp/dvd目录,但是这个不能作为源,因为/var/ftp/dvd下没有对应的repodata目录记录/var/ftp/dvd中的 rpm信息
因为rpm包都是存储在Packages中的,所以有人可能说我怕系统找不到软件包,所以写 成baseurl=ftp:/192.168.103.17/dvd/BaseOS/Packages行不行?答案是不行的,你不用担心系统找不到rpm在哪里。写baseurl=ftp://192.168.103.17/dvd/BaseOS,会通过读取它的子目录repodata中的数据从而知道rpm在哪个目录中。
此时/etc/yum.repos.d中的文件如下。
[root@RHEL8 ~]# ls /etc/yum.repos.d/
aa.repo redhat.repo
[root@RHEL8 ~]#