第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