第3节. yum工作原理


在已经安装了autofs后,rpm -ql autofs,看下该包里的关键文件

以后看到

表示/usr/lib/systemd/system下面的都是服务。
基于光盘的yum源

autofs开启后就可以实现自动挂载光盘路径了,号称神奇目录:直接访问/misc下面不存在的文件夹就可以自动挂载。

为什么一定要这个目录呢,因为要当yum源必须有一个repodata文件夹。

当yum源的前提:路径下有repodata
只要看到repodata文件夹,那么其所在的文件夹就是yum源的目录。不要看packages那些。

yum repolist的本质

下载到哪里呢?通过yum.conf可见该目录
[root@centos7 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
... 省略...
[root@centos7 ~]# cd /var/cache/yum/
[root@centos7 yum]# ll
total 0
[root@centos7 yum]# l.
.  ..
[root@centos7 yum]# yum repolist   👈本质上就是把元数据的down到本地
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.cn99.com
 * extras: ftp.sjtu.edu.cn
 * updates: ftp.sjtu.edu.cn
base                                                                                   | 3.6 kB  00:00:00
extras                                                                                 | 2.9 kB  00:00:00
updates                                                                                | 2.9 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                                          | 153 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                                      | 243 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                                                     |  13 MB  00:00:00
(4/4): base/7/x86_64/primary_db                                                        | 6.1 MB  00:00:00
repo id                                            repo name                                            status
base/7/x86_64                                      CentOS-7 - Base                                      10,072
extras/7/x86_64                                    CentOS-7 - Extras                                       500
updates/7/x86_64                                   CentOS-7 - Updates                                    3,411
repolist: 13,983
[root@centos7 yum]# ll
total 0
drwxr-xr-x. 3 root root 15 Feb 14 12:06 x86_64
[root@centos7 yum]#
[root@centos7 yum]# ll -R x86_64/
x86_64/:
total 0
drwxr-xr-x. 5 root root 87 Feb 14 12:06 7
x86_64/7:
total 8
drwxr-xr-x. 4 root root 278 Feb 14 12:06 base
drwxr-xr-x. 4 root root 183 Feb 14 12:06 extras
-rw-r--r--. 1 root root  84 Feb 14 12:06 timedhosts
-rw-r--r--. 1 root root 473 Feb 14 12:06 timedhosts.txt
drwxr-xr-x. 4 root root 183 Feb 14 12:06 updates
x86_64/7/base:
total 6376
-rw-r--r--. 1 root root 6351994 Oct 30  2020 6d0c3a488c282fe537794b5946b01e28c7f44db79097bb06826e1c0c88bad5ef-primary.sqlite.bz2
-rw-r--r--. 1 root root  156763 Oct 30  2020 a4e2b46586aa556c3b6f814dad5b16db5a669984d66b68e873586cd7c7253301-c7-x86_64-comps.xml.gz
-rw-r--r--. 1 root root       0 Feb 14 12:06 cachecookie
drwxr-xr-x. 2 root root      31 Feb 14 12:06 gen
-rw-r--r--. 1 root root     546 Feb 14 12:06 mirrorlist.txt
drwxr-xr-x. 2 root root       6 Feb 14 12:06 packages
-rw-r--r--. 1 root root    3736 Oct 30  2020 repomd.xml
x86_64/7/base/gen:
total 30876
-rw-r--r--. 1 root root 31614976 Oct 30  2020 primary_db.sqlite
x86_64/7/base/packages:
total 0
x86_64/7/extras:
total 256
-rw-r--r--. 1 root root      0 Feb 14 12:06 cachecookie
-rw-r--r--. 1 root root 248733 Sep  3 23:22 db1c88508275ffebdc6cd8686da08745d2552e5b219b2e6f4cbde7b8afd3b1a3-primary.sqlite.bz2
drwxr-xr-x. 2 root root     31 Feb 14 12:06 gen
-rw-r--r--. 1 root root    589 Feb 14 12:06 mirrorlist.txt
drwxr-xr-x. 2 root root      6 Feb 14 12:06 packages
-rw-r--r--. 1 root root   2998 Sep  3 23:22 repomd.xml
x86_64/7/extras/gen:
total 1296
-rw-r--r--. 1 root root 1326080 Sep  3 23:22 primary_db.sqlite
x86_64/7/extras/packages:
total 0
x86_64/7/updates:
total 13736
-rw-r--r--. 1 root root 14049533 Feb  9 04:02 c96f20635c7f289398519818a077b294f1855722181378b5105f5ef49f0cf57a-primary.sqlite.bz2
-rw-r--r--. 1 root root        0 Feb 14 12:06 cachecookie
drwxr-xr-x. 2 root root       31 Feb 14 12:06 gen
-rw-r--r--. 1 root root      589 Feb 14 12:06 mirrorlist.txt
drwxr-xr-x. 2 root root        6 Feb 14 12:06 packages
-rw-r--r--. 1 root root     3011 Feb  9 04:02 repomd.xml
x86_64/7/updates/gen:
total 75048
-rw-r--r--. 1 root root 76846080 Feb  9 04:02 primary_db.sqlite
x86_64/7/updates/packages:
total 0
[root@centos7 yum]# yum clean all    👈这下理解到位了,清的哪里,就是这里
Loaded plugins: fastestmirror
Cleaning repos: base extras updates
Cleaning up list of fastest mirrors
[root@centos7 yum]# ls -R x86_64/
x86_64/:
7
x86_64/7:
base  extras  timedhosts  updates
x86_64/7/base:
gen  packages
x86_64/7/base/gen:
x86_64/7/base/packages:
x86_64/7/extras:
gen  packages
x86_64/7/extras/gen:
x86_64/7/extras/packages:
x86_64/7/updates:
gen  packages
x86_64/7/updates/gen:
x86_64/7/updates/packages:
也可以用du -sh /var/cache/yum验证可见大小为0
yum clean all,如果你修改yun源后不清理,就是照着就得yum源那会的yum repolist下载下来的元数据缓存去找rpm包的。所以要清一下的。
yum的问题主要就2个,①路径写错了②缓存没清。你别跟我讲rpm数据库删了。③/etc/yum.repos.d/下面只要有一个repo文件不能用就会影响所有的repo源。
下面是将base源和epel源合在一起讲的:


上图👆是epel的alias 快速启用和禁用。主要是考虑安装rpm包的时候,不让他再去找epel,因为base是再本地的,而epel在网上,所以即使你安装base也会去epel找一遍,浪费时间的。不过yum 本地仓库其实是将base和epel都拉下来的,所以实际工作中base和epel都是内网本地的仓库。也无需禁用epel。

👆上图是将base源和epel合在一个.repo文件里的,也可以分开来,将epel单独做一个epel.repo文件。
这两个应该是从上往下,能走哪里走哪个。
下图是key的写法

key启用后的第一次安装rpm包,会问你是否导入key,👇下图,

然后后面再安装其他rpm包就不会问你了。


YUM出问题就两个:①配置文件以及路径问题,②缓存清一下


比如要安装sl这个小火车,就要删除yum仓库,清除缓存,安装yum源,epel源,比如centos8
https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.23961b11BCsMUT
yum cleall all
yum makcache
yum updata
https://developer.aliyun.com/mirror/epel
安装会自动给你安装依赖,那么卸载是否会自动卸载依赖包呢
默认不会自动卸载依赖包的,因为可能别的包也会依赖这些依赖包。
yum list可以看到安装历史

实际上yum安装的时候也有自己的log,👇

Centos8就是dnf.log
yum history

info 11可见当时做的事情,比如command line install mariadb-server。

把这个事件撤销
undo就是卸载掉


这样就卸掉了,然后看下yum事件,卸掉了10个包Altered

如果你又不想卸了,还可以yum事件回去
redo就是重装一遍。


baseurl还有一个mirroslist(这个后面讲)
baseurl可以写多个,如下👇图:
 
 
写多个baseurl,都生效,

上图是光盘禁用后,走的网络yum安装的。但是这多个baseurl,优先用谁呢?答案还是在上面的PPT里:failovermethod={roundrobin|priority},cost的值越大优先级越低。
然后是yum的baseurl的4种路径:

yum仓库的内置变量



自己写脚本,里面的yum源可以使用多行重定向来写,👇▲脚本惯用手法-cat多行重定向写文件内容。


别忘了别名、vim、history格式、PS1、yum源。

 
yum list就列出了这1w多个包,一共就是1w多行:

yum 看到已安装的包是@打头

anaconda是操作系统安装向导的时候安装的程序,所以yum list不仅看到哪些已安装,还知道从哪装的,①比如anaconda②还有base仓库③epel等其他仓库。

这两个包是base仓库创建后,利用yum安装上去的。
比如,下图👇其实查看已经安装的可以yum list installed更快,必进grep要CPU计算的。




也可以用yum search http

上图,说的是搜索的包名,前提你的知道包名,
包名不知道咋办?以httpd为例,先卸载掉👇

整体卸掉包含之前yum install的所有东西,就需要查案yum history info NUMBER,见到httpd就行。

然后undo就行


上图提示的是依赖的文件名,而不是包名
找到依赖的文件来自哪个包

-qf必须已经安装了的文件名;-pqf后面必须跟包名,package;不对,换方法:


这里注意 yum search 和 yum provides 的差异,provides更胜一筹啊看来~

查找文件由哪个包提供。这种方法一般也就是用在没有yum源的情况下,自己把依赖准备好,放一起,走哪都yum -y install *rpm就行了。

list查所有的、已经装好的,可用的available-就是未安装的。
yum list 默认就是yum list all
 
 
yum repolist是将仓库的元数据down下来,同时给你list列出来,不过是针对启用的仓库,加上all就是关掉的也会列出来:

yum provides 后面可以是某个文件的,也可以是依赖包。相当于既有了-qf的跟文件能力,也有了-qpi的跟包能力。

👆上图就是展示了怎么rpm查询/bin/tree来自于哪个包。

yum的reinstall和rpm --replaces和--force一样咯。显然不一样,yum的reinstall还带依赖的。

红色框框里的常用,其他不怎么用了,使用yum
yum info 类似于rpm -qi


rpm包也是yum安装的。需要依赖也会自动给你安装的。

尽量还是不要升级包。
还有centos6不会升级到7,而是重装成7
注意update和upgrade的区别就是没区别
https://cloud.tencent.com/developer/article/1375013?from=article.detail.1604418
 
 
 update If run without any packages, update will update every currently installed
              package.   If  one  or  more packages or package globs are specified, Yum
              will only update the listed packages.  While updating packages, yum  will
              ensure that all dependencies are satisfied. (See Specifying package names
              for more information) If the packages or globs specified match  to  pack‐
              ages which are not currently installed then update will not install them.
              update operates on groups, files, provides and filelists  just  like  the
              "install" command.

makecahe一般不需要用
因为,第一次使用过yum,就自动makecahe了

这样一下yum的缓存也就有了。
总结:


这是查这个包依赖哪些文件,然后这些文件又是由哪些包提供的--这就需要再次yum deplist xxx了,比如上面的bash
 
 

