7、软件包管理
概述
日常工作中遇到最多的应该就是软件的安装卸载,升级等操作。常见的软件包安装分为两类:
源码安装:
源码包安装软件的好处在于可以更改源码,改为适合你的环境,另一个源码包安装的好处是,源码包相比于现有的编译的二进制更新包,功能更多。一般在生产环境,特别是功能类服务器用的多。但编译过程较为负责需要解决环境的问题,要求较高。
二进制包安装:
软件的发布厂商都是将编译好的软件放到平台上,提供下载,这样的好处就是用户得到软件之后可以直接安装,不需要对软件源码进行编译。
本文涉及的是linux的二进制包的安装方法。
linux分为多个发行版本,不同的发行版对软件包的管理命令或者管理方式是不同的,但都是管理二进制的软件包。
linux所有发行版本中最流行的三个:
rhel,centos,redora:二进制包是以rpm结尾 yum(dnf)
opensuse,sels:二进制包是以rpm结尾 zypper
Debian,ubuntu:二进制包是以deb结尾 dpkg apt
rhel可以安装以deb结尾的二进制包吗?
本质上只要软件包的架构和cpu的架构匹配就可以安装,而且都是二进制包,唯一不一样的就是可能需要安装对应的软件包管理工具,本文的内容就是通过rpm命令管理软件包
学会看rpm包
当第一眼看见rpm包的时候就应该能了解一些基本信息
系统安装光盘就能看到rpm包
通过rpm包名字了解,版本号之前的是包名
xfsprogs
-4.19.0-2.el8.i686.rpm
xfsprogs
-4.19.0-2.el8.x86_64.rpm
xfsprogs-devel
-4.19.0-2.el8.i686.rpm
xfsprogs-devel
-4.19.0-2.el8.x86_64.rpm
一般来说xfsprogs是rpm的主包,xfsprogs-devel就是rpm的辅包(辅助包),一定要安装主包,像是xfsprogs-devel就是rpm的辅包,辅助包要不要安装取决于主包是否依赖于辅助包,如果主包依赖补助包的内容,那么像安装主包,就一定要安装辅助包,如果一个主包有n个辅助包,那么如果安装主包,对于主包没有依赖的辅助包,就可以选择安装
xfsprogs-4.19.0-2
.el8.i686.rpm
版本号后边的数字表示该软件的发型次数
xfsprogs-4.19.0-2.el8
.i686.rpm
发行次数后边的.el8表示该rpm包适用于哪个操作系统平台(但并不绝对)
xfsprogs-4.19.0-2.el8.i686
.rpm
i686或者i386或者x86_64就表示该软件包的位数
i686或者i386表示是32位的软件
x86_64表示的是64位的软件
如果只有x86,没有带64,指的就是32位
64位的操作系统可以安装32位和64位的软件
32位的操作系统只能安装32位的软件
yum-4.0.9.2-5.el8.noarch
.rpm
noarch适用于任何cpu的架构,基本上其他的linux发行版也可以装上
noarch就表示适用于任何架构
rpm包的安装
rpm包的安装
/dev/cdrom
是个链接地址
ls -l /dev/cdrom
创建一个/iso目录,用来挂载
mkdir /iso
挂载光盘到/iso文件
mount /dev/sr0 /iso
可以使用光盘自带的rpm包进行学习
/iso/BaseOS/Packages
光盘自带rpm包所在路径
rpm -ivh xz-5.2.4-3.el8.x86_64.rpm
i
表示installv
表示显示显示详细信息h
表示显示进度
rpm包的卸载
rpm -evh xz
e
表示卸载v
表示详细信息h
表示进度
rpm包是有依赖性的
安装的依赖性:
树状依赖:
A依赖B,B依赖C
从最低层开始安装,先装c,再装b,再装a
环装依赖:
A依赖B,B依赖C,C依赖A
一起安装
模块依赖:
装A软件,需要B软件里的某个函数或者模块,或者函数库
卸载的依赖:
树状依赖:
安装时A依赖B,B依赖C,卸载时,直接卸载C不能卸载
依赖性问题是rpm包管理最恶心的问题,所以为了解决这个问题,我们又自动化解决包管理工具yum(centos 或者rhel)yellow dog updater manager
rpm包的信息查看(远远比安装和卸载重要)
rpm的包名和包全名
包全名:xz-5.2.4-3.el8.x86_64.rpm
包名:xz
当rpm包没被安装前,rpm命令操作的都是包全名
当rpm被安装后,rpm操作的都是包名
查看已安装的软件包的信息
rpm -qi 包名
查看未安装的软件包的信息
rpm -qpi 全包名
q
表示queryi
表示informationp
表示packagel
表示rpm安装后的安装路径f
表示根据文件的名字反推出安装包-force
强制安装
rpm -qa
列出所有安装在系统中的rpm包
rpm -qa | grep name
筛选系统中是否有你想查看的软件包
rpm -ql
包名
rpm -qpl
包全名
查看net-tools里面都有哪些命令
rpm -ql net-tools | grep bin
查看rm命令是哪个安装包安装的
rpm -qf /bin/rm
yum管理rpm包
yellow dog updater manager
yum是一个工具,可以理解为一个数据库客户端工具
yum的底层仍然是rpm,如果没有rpm功能,那么yum也是个废物,无法使用
yum诞生的目的就是能自动解决rpm的依赖性关系
库的概念(repository)
如何提高库的查找效率
所谓软件仓库,包含两部分,第一部分就是左右软件包(rpm),第二部分指的就是所有软件包的元数据,元数据相当于所有软件包的名字和依赖关系,元数据文件的大小远远小于整个仓库文件的大小
yum就是访问软件仓库的元数据,进而根据元数据里面的记录自动解决软件包的依赖关系
yum仓库的搭建
yum并没有从0创建一个仓库的能力,仓库的本质是rpm包+repodata元数据
必须 有rpm包和repodata元数据,yum才能所谓的“搭建”一个软件仓库
条件1:rpm包
条件2:repodata
光盘自带了rpm包和repodata,所以我们可以通过光盘搭建软件仓库,所谓搭建软件仓库,就是将rpm包和repodata放到一个位置,然后yum指定repodata的路径
yum的配置文件/etc/yum.conf
yum的仓库文件所在目录是/etc/yum.reops.d/
该目录是存放仓库文件的,仓库文件就是指向repodata所在路径的文件,仓库文件必须以.repo结尾
多个仓库可以放到同一个repo文件中,也可分别放置到不同的repo文件中
仓库文件的语法
创建本地仓库
cd /etc/yum.reps.d
rm -rf *
vi iso.repo
[ergou]
name = ergou’s repo
#默认是yes
enable = yes
#生产环境要打开
gpgcheck = 0
#baseurl is a repodata location
#baseurl is not a repodata path
baseurl= file:///iso/BaseOS/
[goudan]
name = goudan’s repo
#默认是yes
enable = yes
#生产环境要打开
gpgcheck = 0
#baseurl is a repodata location
#baseurl is not a repodata path
baseurl= file:///iso/AppStream/
vi iso.repo
[ergou]
name = ergou’s repo
enable = yes
gpgcheck = 0
baseurl = file:///iso/BaseOS
查看仓库
yum repolist
查看仓库信息
yum list
可以查看仓库中所有的软件,并创建cache(缓存)
有了cache之后,安装软件就可以补全
yum clean all
清空缓存
yum makecache
加载缓存
yum search core
搜索带有core关键字的rpm
yum 不指定仓库的情况下,默认搜索所有仓库
yum provides rm
查看rm命令所在的包,前提是你的仓库足够完善,你才能搜索到想要的东西
yum install pkg-name
安装包
yum delete pkg-name
yum remove pkg-name
卸载包
使用internet上的软件仓库
先安装yum工具包才能使用yum-config-manager
yum -y intstall yum-utils
创建一个repo文件
yum-config-manager --add-repo=[https://mirrors.tuna.tsinghua.edu.cn/centos/8/cloud](https://mirrors.tuna.tsinghua.edu.cn/centos/8/cloud)/x86_64/openstack-train/
yum-config-manager -h
帮助
rhel 系统虽然能连接internet上的软件仓库,但是安装会有问题
rhel正解还是使用订阅命令去连接到RHN,访问红帽的官方软件仓库
subscription-manager -h
自己玩可以用epel进行,比较全面
epel(extra pacakages for enterprise linux)fedora 的源
局域网软件仓库搭建的必要性
同步internet上的软件仓库
1、搭建一个internet上的软件仓库
[train]
name=train
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/cloud/x86_64/openstack-train/
enabled=1
gpgcheck=0
mkdir /openstack-train/
reposync 将互联网的仓库同步到本地
reposync --repo train -p /openstack-train/
-repo
表示repo的名字p
表示同步的路径
找到所有以rpm结尾的文件,并移动到当前目录下
find ./ -name *.rpm -exec mv {} . \;
自己根据rpm创建repodata
yum -y install createrepo
该目录下要有rpm包才可以
createrepo -v /openstack-train/
通过一个网络服务将repo共享出去
通过httpd搭建web服务将其共享出去
#yum安装本地的rpm包(rpm包不在软件仓库中)
[root@ssh-client ~]# yum install teamviewer.x86_64.rpm
[root@ssh-client ~]# yum history
[root@ssh-client ~]# yum history info 11
[root@ssh-client yum.repos.d]# yum history undo historyid
[root@ssh-client ~]# yum -y reinstall coreutils
[root@ssh-client ~]# yum update
[root@ssh-client ~]# yum group list
yum只能单线程安装软件
如果当前yum在安装软件(处于未完成状态),你就不能在另⼀个终端继续使⽤yum
因为linux是⼀个多⽤户的操作系统,你在yum操作,别⼈也可能也在yum操作。
就有可能出现软件包安装冲突问题
A⽤户要安装AA软件-
B⽤户要安装BB软件-
在早期的rhel版本,我们使⽤的yum命令是真正的yum操作
在rhel8版本,我们使⽤的所谓的yum命令,实际上是dnf命令
[root@ssh-client ~]# ls -l /bin/yum
lrwxrwxrwx. 1 root root 5 Feb 14 2019 /bin/yum -> dnf-3
[root@ssh-client ~]# ls -l /bin/dnf
lrwxrwxrwx. 1 root root 5 Feb 14 2019 /bin/dnf -> dnf-3
yum -y install-> dnf-3 -y install
装⼀些软件
安装teamviewer
即使rpm包不在仓库里面,我们也可以通过yum安装,而且yum可以使用仓库中线与rpm包解决不在库中的rpm包的依赖性
vncserver
[root@ssh-client ~]# yum -y install tigervnc-server
[root@ssh-client ~]# rpm -ql tigervnc-server
[root@ssh-client ~]# systemctl stop firewalld
[root@ssh-client ~]# setenforce 0
[root@ssh-client ~]# vncserver :10
[root@ssh-client ~]# netstat -tunlp | grep 59
httpd->web 默认80端⼝ tcp
3P(python perl php)
lamp->linux + apache + mysql + php
Lnmp->linux + nginx + mysql + php
[root@ssh-client ~]# yum -y install httpd
修改配置⽂件
[root@ssh-client ~]# cd /var/www/html/
[root@ssh-client ~]# netstat -tunlp | grep 59
tcp 0 0 0.0.0.0:5910 0.0.0.0:*
LISTEN 43497/Xvnc
tcp6 0 0 :::5910 ::: *
LISTEN 43497/Xvnc
[root@ssh-client ~]# yum -y install httpd
修改配置⽂件
[root@ssh-client ~]# cd /var/www/html/
[root@ssh-client html]# echo test >> index.html
[root@ssh-client html]# systemctl restart httpd
[root@ssh-client html]# systemctl enable httpd
#为什么是index.html
httpd的主配置⽂件是/etc/httpd/conf/httpd.conf
DirectoryIndex index.html
将上⾯的部分改成下⾯的内容,就可以让默认⽹⻚⽂件变成goudan.html
DirectoryIndex goudan.html
[root@ssh-client html]# systemctl restart httpd
当我们访问web服务器的根的时候
会默认检索web服务器根下⾯的默认⽹⻚⽂件,由于我们将默认⽹⻚⽂件更改成了goudan.html,所以如果web服务器的根下没有goudan.html就不会显示默认⽹⻚内容.
配置⽂件中
DocumentRoot “/var/www/html”
上⾯参数指定的就是web服务器的根⽬录
如果你想让你的web服务器提供⼀个下载⽂件的功能
vsftpd->ftp 默认21端⼝,20端⼝ tcp
[root@ssh-client ~]# yum -y install vsftpd
[root@ssh-client ~]# systemctl restart vsftpd
配置⽂件所在位置
/etc/vsftpd/vsftpd.conf
开启匿名⽤户连接
anonymous_enable=YES
tftp 69 udp
⽣产环境中tftp是必备服务,tftp+dhcp+ftp/http/nfs
pxe+kickstart批量⾃动部署服务器操作系统
[root@ssh-client html]# yum -y install tftp-server
[root@ssh-client html]# rpm -ql tftp-server
[root@ssh-server ~]# systemctl start tftp
[root@ssh-server ~]# netstat -tunlp | grep 69
安装tftp客户端
[root@ssh-client ~]# yum -y install tftp
tftp不是⽤来传⼤⽂件的
[root@ssh-client ~]# tftp 192.168.199.144
tftp> get 123
tftp> quit
dhcpd->dhcp
[root@ssh-server ~]# yum -y install dhcp-server
配置⽂件
/etc/dhcp/dhcpd.conf
找到配置⽂件模板
[root@ssh-server ~]# rpm -ql dhcp-server | grep example
/usr/share/doc/dhcp-server/dhcpd.conf.example
/usr/share/doc/dhcp-server/dhcpd6.conf.example
[root@ssh-server ~]# ip a a 1.1.1.1/24 dev ens224
[root@ssh-server ~]# ip a show ens224
[root@ssh-server ~]# cat /etc/dhcp/dhcpd.conf
[root@ssh-server ~]# netstat -tunlp | grep 67
dhcp客户端的操作
yum update 将所有安装的软件更新到本仓库最新版本
yum upgrade 更新操作系统