1. CentOS: yum, dnf

1. CentOS: yum, dnf

  • YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
  • yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据
    文件(放置于特定目录repodata下)
    文件服务器共享支持:
http:// https:// ftp:// file://

1.1. 详细介绍和注意点

  1. yum实现功能需要服务器端和客户端架构,需要先搭建一个yum服务器端,其主要内容就是yum的仓库。
  2. yum仓库主要分两大部分,一个是rpm包,一个是rpm包的元数据metadata(包含了rpm包之间的依赖性关系,版本等等各种信息,还可以对rpm包进行分组)
  3. 当需要yum服务的时候需要把当前机器配置为客户端。客户端可以与服务器端在同一主机上,也可不在同一主机上。不在同一主机则需要网络共享服务跨网络实现。就是上面写的那三种共享协议方式,本地路径的话就是file://.
  4. repodata文件夹就是存放着rpm包的元数据的位置。如果当前文件夹有repodata文件夹,则可知当前文件夹的路径就是yum仓库的路径。
  5. 不论是网络,还是本地,需要yum服务的话,都需要在客户端进行配置,指定yum服务器的仓库路径(仓库路径就是包含着repodata文件夹的它的这个所在目录的路径,注意centos的版本别弄错了)。
  6. 配置好之后使用yum安装时只需要记住包的名字即可,它会读取配置文件,自动按照所写路径搜索repodata元数据信息,查询要安装的的包信息,仓库是否拥有这个包,它的依赖性等等。
    • 注意,这个查询的过程yum会先把服务器端的repodata元数据(文件夹)信息全部下载到本地缓存中并保留下来。
    • 这个yum仓库的元数据信息会下载到本机的/var/cache/yum/$basearch/$releasever路径下,这个是默认的设置,可以在配置文件/etc/yum.conf中修改
  7. 如果找到这个包,以及它的依赖性的所有包,它就会去yum仓库下载所有所需的rpm包到本地缓存,然后进行安装。安装完之后会把这些rpm安装包再自动删除
    • 注意,rpm安装包安装后会删除,但是已经下载到本机的元数据缓存文件(夹)并不会删除,仍然会保留在本地存储上,等下次再进行安装其他软件时,查询软件各种信息和依赖关系的时候,就直接搜索本地保存的这个元数据信息即可,然后去yum仓库下载rpm包进行安装。
    • 由此可见如果yum仓库更新了,这个本地的元数据缓存信息也是需要更新一下的

2. yum配置文件—{/etc/yum.conf, /etc/yum.repos.d/*.repo, /var/log/yum.log}

2.1. yum客户端配置文件:

/etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo:为仓库的指向提供配置

2.2. 仓库指向的定义:

[repositoryID] name=Some name for this repository baseurl=url://path/to/repository/ enabled={1|0} gpgcheck={1|0} gpgkey=URL enablegroups={1|0} failovermethod={roundrobin|priority} roundrobin:意为随机挑选,默认值 priority:优先级,需要安装额外的包 cost= 默认为1000 ,费用越低,优先级越高

3. yum仓库

3.1. yum的repo配置文件中可用的变量:

$releasever: 当前OS的发行版的主版本号 $arch: 平台,i386,i486,i586,x86_64等 $basearch:基础平台;i386, x86_64 $YUM0-$YUM9:自定义变量

3.1.1. 示例:

http://server/centos/$releasever/$basearch/ http://server/centos/7/x86_64 http://server/centos/6/i386

4. yum源

阿里云repo文件 http://mirrors.aliyun.com/repo/ CentOS系统的yum源 阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/ 清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/ EPEL的yum源 阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64 阿里巴巴开源软件 https://opsx.alibaba.com/
  • /etc/yum.conf 里面的各行解释(注意路径信息并不在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 :是否需要检查数字签名,1检查,0不检查,如果不导入key,所有的安装都通不过检查导致安装会失败:要么导入key,要么设置为0 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 exclude=kernel* centos-release* :升级软件包的时候不升级内核相关避免出现BUG,这里注意只能添加一行exclude的行,不能添加多行,添加多行的话后面的exclude的行会把前面的给覆盖掉 中间内容省略... # PUT YOUR REPOS HERE OR IN separate files named file.repo # in /etc/yum.repos.d
  • 最关键的路径信息在上面的最后一行的/etc/yum.repos.d文件夹里,用.repo结尾
  • centos初始安装的时候已经配置过部分.repo文件,指向yum仓库了,不过大多在美洲速度较慢,最好自己配置。(可新建一个文件夹,将初始的这些repo文件备份进去以备以后使用)
  • 必须配置的内容的每一行解释:
[aliyunbase] :仓库ID(不是数字),可以写自己准备的名字,用以区分各个仓库,比如base name=aliyun yum repertory baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/ : $releasever 代表版本号 比如7 ,$basearch代表操作系统架构 比如x86_64 ,这两个变量可以在这里使用,以便可以配置多台机器 gpgcheck=1 : 签名检查,1检查0不检查 ,可以用rpm导入key,或者不检查;更方便的方法是下一行写上对应yum库的网络路径 gpgkey=https://mirrors.aliyun.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 :同上可以用那两个变量,这里为了方便对比不用了(如果上一行不检查的话则这一行可以不用) enabled=1 :默认值就为1,不写这一行就是启用此yum源仓库,0禁用此仓库

priority=1 :设置yum仓库优先级,数字越小优先级越高,需要提前安装包 yum-plugin-priorities

  • 可以配置多个yum仓库,可以在同一个repo文件里继续按照上面相同的格式来写,也可以再重新配置一个repo文件,比如再配置一个功能包更多的epel yum库:
[aliyunepelbase] name=aliyun epel yum repertory baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 enabled=1 priority=1
  • 配置完毕第一次安装的时候会导入key,以后再安装就不会再提示导入key了.
  • 注意配置yum源在企业中最好使用自己配置的内网服务器,不然网络带宽会浪费,并且网络状况会影响它
  • 个人电脑配置yum源可以网络,但虚拟机最好还是需要有一个自己光盘配置的yum源,注意光盘yum源的路径中要加上双引号不然中间的空格会影响:
[rombase] name=cdrom yum repertory baseurl=file:///run/media/root/CentOS\ 7\ x86_64/ :注意中间有空格,两边需加上引号 #baseurl=file:///misc/cd gpgcheck=1 gpgkey=file:///run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7 #gpgkey=file:///misc/cd/RPM-GPG-KEY-CentOS-7 enabled=1
  • 注意:修改了yum源之后,因为第一次使用安装时会下载yum仓库元数据信息到缓存空间中并且会一直保留,(就是/etc/yum.conf第一行的文件夹内),**因此修改yum配置之后最好用yum clean all命令(也可以用rm命令清空这个文件夹)清除一下缓存,下次让它重新再次下载缓存更新。**可以直接再用yum repolist命令,然后它就会自动下载可以使用的yum源的元数据信息并缓存进去。

5. yum命令

  1. yum命令的用法: yum [options] [command] [package ...]

  2. 显示仓库列表(即所有配置好的yum库的源,只显示不被禁用目前可使用的): yum repolist [all|enabled|disabled]

  3. 显示程序包:

yum list yum list [all \| glob\_exp1] [glob\_exp2] [...] yum list {available\|installed\|updates} [glob\_exp1] [...]
  • yum list |less :可以看装好的和未装的包,@开头表示已装的包,anaconda表示装机光盘装的包
  1. 安装程序包:
yum install package1 [package2] [...]
  • 安装时可以后面跟上-y ,不需要每次交互式输入了
yum reinstall package1 [package2] [...] (重新安装)
  1. 升级程序包:
yum update [package1] [package2] [...] yum downgrade package1 [package2] [...] (降级)
  1. 检查可用升级:
yum check-update
  1. 卸载程序包:
yum remove | erase package1 [package2] [...]
  1. 查看程序包information:
yum info [...]
  • 这个命令类似于rpm -qirpm -qpi 的合体,不管装没装都可以用这个命令来查看,因为yum命令利用的是yum库的缓存文件来查询的,所以不管软件包是否安装
  1. 查看包里的文件
先安装yum-utils包: yum -y install yum-utils 然后通过 repoquery -ql <package_name> 查看
  1. 查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
  1. 清理本地缓存:
    清除/var/cache/yum/basearch/basearch/releasever缓存
yum clean [ packages \| metadata \| expire-cache \| rpmdb \| plugins \|all ]
  1. 构建缓存:
yum makecache
  • 这个命令基本不用,清除缓存之后,可以直接用yum repolist即可便可自动构建缓存
  1. 搜索:
yum search string1 [string2] [...] 以指定的关键字搜索程序包名及summary信息
  1. 查看指定包所依赖的capabilities:
yum deplist package1 [package2] [...]
  1. 查看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 6:重做
  • 日志 :/var/log/yum.log
  1. 安装及升级本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...] (用install替代) yum localupdate rpmfile1 [rpmfile2] [...] (用update替代)
  1. 包组管理的相关命令:
yum groupinstall group1 [group2] [...] yum groupupdate group1 [group2] [...] yum grouplist [hidden] [groupwildcard] [...] yum groupremove group1 [group2] [...] yum groupinfo group1 [...]
  1. yum的命令行选项:
--nogpgcheck:禁止进行gpg check -y: 自动回答为“yes” -q:静默模式 --disablerepo=repoidglob:临时禁用此处指定的repo --enablerepo=repoidglob:临时启用此处指定的repo --noplugins:禁用所有插件

5.1. 配置系统光盘作为yum仓库

  • 系统安装光盘作为本地yum仓库: (1) 挂载光盘至某目录,例如/mnt/cdrom
    mount /dev/cdrom /mnt/cdrom
    (2) 创建配置文件
[CentOS7] name= baseurl= gpgcheck= enabled=

5.2. 创建yum仓库:

  1. 先安装一个包 :
    yum install createrepo
  2. 然后把自己编译好的或者自己cp的rpm包放入自己的文件夹内,比如
    /data/own_repos/Packages文件夹内
  3. 然后利用命令创建yum仓库
    createrepo [options] <directory>
    此时也就是:
    createrepo /data/own_repos
    • 注意:direcroty即为保存着许多rpm包的目录文件夹的根目录,可以在内部创建一个Package文件夹,把rpm包放进去
  4. 如果有新的rpm包放入了Package文件夹内,则需要更新yum库的metedata,此时用命令 createrepo --update /data/own_repos
    然后别忘记了使用yum clean all清理一下yum库的缓存,并重新下载新的缓存。
    • repos.d中的文件自己书写即可

5.3. 更多注意点:

  1. 一些可零碎知识点再次总结 :

    • yum install autofs ,然后启动功能 systemctl enable autufs , 然后立即启动此功能 systemctl start autofs (systemctl disable 和systemctl stop 也是另外对应的命令,(注意只有centos7上才有这些命令,6上面没有)
  2. 企业中不可能总是用网络上的yum源,因此要配置自己内网的yum源。对此需要用ftp,http或者https共享协议服务来进行设置。先在这里简单介绍如何配置一个httpd的共享yum源。

    • 首先需要安装httpd包(提前配置一个本地光盘yum源或者网络yum源然后对它进行安装,注意阿里云的centos网络yum源其实就是官方的光盘,和cd里面的内容一模一样)yum install httpd -y
    • 然后用rpm -qi httpd rpm -ql httpd 查看一下包内信息(养成装包必看的习惯,还有rpm -qc,rpm -qd甚至可以装包之前就用rpm -qip 包的绝对路径rpm -qpl 包的绝对路径来查看先),或者直接用 yum info 包 来查看(注意yum只是rpm的前端处理,仍然需要利用rpm来进行安装,如果rpm被删除或者破坏,yum则无法使用
    • 如果一个软件包是一个服务包,centos7里需要注意找两个主要文件,一个主要配置文件在/etc/httpd(包名)/conf/httpd(包名).conf ,有一个服务文件在/usr/lib/systemd/system/httpd(包名).service
    • 然后启动对应的服务文件,systemctl (enable 和 start) httpd.service ,可以用 systemctl status httpd.service来查看服务状态(再次说明这些启动命令是centos7上独有的,6上没有),启动之后便可以输入当前IP地址访问了
    • 因为没有任何配置,浏览器上会显示错误,因此要在文件夹/var/www/html(这个文件夹就相当于建好的符合http协议的当前主机IP地址根目录,它是yum安装的httpd服务的默认根目录位置)下面创建文件index.html,则里面的内容就会显示在输入的IP地址(当前主机地址)上了
    • 同时在里面创建目录,然后把yum源库拷贝进去即可访问了。如果不想拷贝,可以直接把光盘挂载到此目录上:mount /dev/sr0 /var/www/html/yumrepertory(自己创建的文件夹名字),当然这种挂载机器重启会丢失,因此需要写入文件。
    • 其中自己创建的文件夹的名字可以模仿官方镜像的,比如在/var/wwww/html目录中创建文件夹mkdir -pv centos/{6,7}/os/x86_64,然后把自己的光盘拷贝进去或者挂载到相对应的文件夹即可。
  3. 目前可能有部分默认安全设置会影响这些服务,比如防火墙firewalld.serviceselinux, 我们可以简单一点直接关闭它:

  • 关闭防火墙:
**centos7:** systemctl disable firewalld(.service) systemctl stop firewalld(.service) **centos6(和7相互对应):** chkconfig iptables off service iptables stop
  • 关闭selinux:
vim /etc/selinux/config SELINUX=enforcing 改为disabled 或者 sed -r -i "s/^(SELINUX=).*/\1disabled/" /etc/selinux/config 注意**之后必须重新启动reboot** ,才能关掉selinux,getenforce可以查看selinux是否真的关闭 也可不重新启动关闭
  1. 复习命令,增加硬件(光盘或者硬盘)之后,无需重启检测的方法(在这里用于挂载centos6的http网络共享yum源):
echo '- - -' > /sys/class/scsi_host/host0/scan echo '- - -' > /sys/class/scsi_host/host1/scan echo '- - -' > /sys/class/scsi_host/host2/scan
  1. 搭建好之后,本机路径可以写 file:///var/www/html/等等,无需走网络路径。同时还有其他写法,如例子中的两行对齐等号的写法,或者把路径写在文件里,然后用引用文件的方式写入路径。
[cdrombase] name=cdrom yum repertory baseurl="file:///run/media/root/CentOS 7 x86_64/" "file:///misc/cd" "file:///var/www/html/yumrepertory/" "http://192.168.36.102/yumrepertory" ## 这里的意思就是同一个yum仓库,可以有多个不同的yum源地址,比如上面4个地址,每个地址都可以用来当做这个yum仓库的源地址 ## 同时这里也可以不用baseurl,使用mirrorlist后面加文件的方式也可以,下面有解释 gpgcheck=1 gpgkey="file:///run/media/root/CentOS 7 x86_64/RPM-GPG-KEY-CentOS-7" enabled=1 -------------------------------------------- 或者用文件的方式,不用baseurl: mirrorlist=file:///data/yumlist.txt 其中yumlist.txt中每一行写的都是yum源的路径,也就是baseurl=后面的内容
  1. 注意,yum remove 包名 ,这个命令不会卸载包名所依赖的其他包,即使装它的时候顺便装的依赖性的包也不会卸载。因此用 yum history命令查看历史,然后用 yum history undo #(编号) 来取消编号对应的操作,这样就会全部卸载掉包和它所依赖的包。当然也可以用yum history redo # 重做yum历史中命令编号#, 这些历史默认存在/var/log/yum.log中,可以用cat /etc/yum.conf查看日志信息的存储地方。查看历史中做了什么操作,用yum history info #的命令来查看对应编号进行过什么操作。
  2. 一些相关命令
    • iptables -vnL 查看防火墙策略
    • yum remove libvirt-daemon 卸载虚拟网络服务的包,这样会让ipconfig中的vir开头的虚拟化网卡卸载掉。
  3. yum的安装有依赖性,卸载也有依赖性。卸载不能卸载掉被卸载的包所依赖的包,但是会卸载掉依赖于被卸载的包的其他包.
  4. yum源可以有多个,一个源失败了可以再用其它的源。
  5. yum执行的时候不能多个用户同时使用,因此必须等待其他的用户停用yum之后才可。yum repolist all 可以查看启用的和非启用的所有源,如果不加all只显示启用的。
  6. yum list 后面可以跟模糊搜索通配符,和rpm -qa 类似,但yum的好处是所有装好的未装的都会显示。它利用的是yum的元数据缓存文件来查询所有的yum包的各种信息的,所以不管包是否安装都可查询;
    • 同样 yum list 命令,可以用Tab按键补全命令,从而缩小显示的包的范围,比如其可以显示出装好的或者未装的等等选项。
    • 同时,如果不加任何额外命令,直接输入yum list执行命令,则列出所有repo源内的包,而且已经装上的包会带有一个@的图标
    • @后面的是安装的repo源,比如从base源中装的就会显示@base;不过有个特殊的就是装机的时候装上的包会利用@anaconda程序装,因此是这样显示的。
  7. yum search 或者 yum provides 后面可以跟包名,也可以跟文件,它会列出相关的信息(可以用来rpm -ivh安装的时候查询依赖性文件,或者用search命令查询包)
  8. 注意,yum安装失败的主要两个原因:
    • yum源配置的路径无法连通
    • yum源配置环境信息更改后没有yum clean all命令清除缓存(元数据等信息)
  9. yum的升级,目录源也可以配置用来升级,但最好不要升级,直接重新安装即可。(阿里源里就有yum升级包)。同时yum源里面还有个extra源,虽然不多,但是有些功能需要它,因此最好也给配置上这个yum源(阿里源上就有)
    • 这个额外源里面有个包,包名叫做 epel-release ,可以用来自动配置epel源,装上它就会自动创建一个epel.repo文件,不过路径是国外的。
  10. 注意yum功能是rpm的前端,依赖于rpm功能, 如果用 rpm -e rpm --nodeps命令卸载掉rpm(–force只能安装时用),则yum也无法使用了。
    • 假如真的卸载掉了rpm功能,则用光盘模式,重新装上rpm功能
    • 不过装的时候注意路径的问题,因为rpm包的路径默认会装到根目录下,但救援模式下根并不是真正的系统根,因此命令后面要指定根路径命令。下面列出了如何装包
rpm -ivh /run/install/repo/Packages/rpm-4###.rpm --root=/mnt/sysimage/ - 注意前面的rpm包的路径如果不知道在哪,可用df命令先查看光盘在救援模式下挂载哪里了,后面的就是原先真正系统的根。 - 注意不能用chroot /mnt/sysimage 命令,因为切换根就相当于切换到原先系统内,它仍然没有rpm命令。(退出chroot命令用exit)
  1. yum grouplist :可用环境组和可用普通包组,可以选择安装。
    yum groupinfo 包组名:查看包组详细信息,注意包组名要加双引号,避免有空格问题(包组名大小写不敏感,但是包名大小写敏感,需要注意区分)。当用这个命令查看包组时,里面的包前面的符号:
    • 如果什么都没有,表明包虽然已经装上了,但并不是随着包组安装的时候装上的,而是自己装的或者随着系统安装的时候装的
    • =等号表示这个包是随着包组安装的时候装上的
    • +加号和-减号表示包没有装,加号表示包虽然没有装,但是包组升级的时候它会自动装上,减号表示就算包组升级,它也不会被安装,只能自己去刻意安装它。
  2. yum grouplist 或者yum groupinstall 后面用tab键补全,会看到更多的包的信息。
  3. 如果只有rpm包,没有yum源的元数据,则可以用 createrepo 后面跟存放包的文件夹即可创建,不过这个命令需要安装一个包createrepo
  4. yum查看包里的文件需要安装yum-utils包,然后用repoquery -ql <package_name> 查看
  5. yum仓库的优先级设置,需要安装yum-plugin-priorities包,然后再仓库中设置priority=1,其中数字越小,优先级越高
    • 注意在yum的主配置文件/etc/yum.conf中,plugins=1必须开启
  6. yum的主配置文件要添加一个exclude的行(多个包用空格分开),以免update的repo库和升级包的时候吧内核给升级了从而出问题
exclude=kernel* centos-release* 升级软件的时候不要升级内核,以免系统出现bug 这里注意只能添加一行exclude的行,不能添加多行,添加多行的话后面的exclude的行会把前面的给覆盖掉
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。