在 Linux 中,我们经常安装各个开源网站编写的代码、软件,在安装的时候各个软件之间有各种依赖关系,还可能出现版本问题,比如 Centos7 支持的软件, Centos6 就未必支持。如果是 Java 开发应该知道我们可以使用 pom.xml
文件来解决这些依赖,以及快速的升级某些软件。在 Linux 中也有类似的软件可以解决这些问题,那便是本章节的主角 yum
。
Yellowdog Updater Modified,是一个专门为了解决包的依赖关系而存在的软件包管理器,很好的解决了 RPM 所面临的软件包依赖问题。可以快速的安装、删除、更新各个软件包,并调节他们之间的依赖关系。
在 Centos7 中,默认安装了 yum
,我们可以直接输入命令来查看:
yum # 运行 yum,无参数情况下会打印使用手册
man yum # 使用 man 来查看手册
可以看到,上面有详细的各个子命令的使用方式,一般分为两类
一类为 command
命令,进行某项任务的运行:
yum [options] [command] | |
---|---|
command | 描述 |
clean | 清除yum缓存 |
installl | 安装一个包 |
repolist | 显示软件仓库位置 |
resintall | 重新安装一个包 |
search | 根据关键字或者名字来搜索一个包 |
upgrade | 升级所有包,并自动解决依赖关系 |
remove | 删除一个包 |
check | 检查 RPM 数据库是否有问题 |
check-update | 检查是否有可用的软件包更新 |
history | 显示使用yum的历史命令 |
list [name] | 列出所有安装的软件包,如果带有name,则会过滤name |
info [name] | 列出所有安装的软件包的信息,如果带有name,则会过滤name |
deplist [name] | 列出所有安装的软件包的依赖关系,如果带有name,则会过滤name |
makecache | 创建元数据缓存 |
shell | 开启一个 yum shell 进行交互 |
一类为 options
参数,指定运行过程中的一些参数:
yum [options] [command] | |
---|---|
options | 描述 |
-t | –tolerant;完全忽略所有错误,不报错 |
-c [file] | –config=[file];使用一个配置文件进行运行 |
-q | –quiet;静默执行 |
-v | –verbose;尽量打印所有日志 |
-y | –assumeyes;所有需要判断的地方全部回答 yes |
–installroot=[path] | 设置安装包的根路径 |
–enablerepo=[repo] | 启用软件源,repo支持通配符* |
–disablerepo=[repo] | 停止软件园,repo支持通配符* |
–obsoletes | 更新软件时,处理软件包的取代关系 |
–downloadonly | 仅仅下载但不安装或更新,一般用于在具有公网条件的服务器上下载rpm包,以便于集群内部的离线安装 |
–downloaddir=[path] | 指定某个文件夹用于保存如果有的安装包,一般结合–downloadonly使用 |
更加详细的其他命令,可以查看:http://yum.baseurl.org/
jq 是一个 json 解析器,是一个在 shell 中快速解析 json 和 json 格式化相关的命令。这里我们并不关心 jq
命令实际能有什么用,更加关心 yum
怎么安装 jq
。
首先要进行搜索是否 repo源
含有 jq
,我们可以使用 yum list
来搜索是否含有:
yum list jq
可以看到搜索到了适用于当前服务器的软件包有一个 jq.x86_64
,版本为 1.6-2.e17
。那么我们直接安装该软件包:
yum install jq
# 如果需要解析关系,或者因为需要依赖而安装其他包,会跳出进行二次确认
# 这个时候可以输入 y 进行确认。
安装完毕后,会打印安装的信息,并且就已经可以使用 jq
命令了:
jq
当弹出该信息的时候,说明另外一个进程正在使用 yum
命令,当前进程未能获取到 /var/run/yum.pid
写权限。因为 yum
不能多线进行操作,只能一个一个操作,这里使用轮循的方式去尝试获取 yum.pid
的写权限。
在服务器环境中,大多数服务器是不具有公网环境,且与外网相隔的。此时我们需要自己进行 yum源
的搭建。
上面我们安装了 jq
这个软件包,但软件包是会统一进行管理的,是谁在维护呢?yum
的解决思路是使用配置文件来解决(与 maven
中的 setting.xml
一样)。在 /etc/yum.repos.d/
目录下,有多个 *.repo
文件,这些 .repo
文件都是 yum
的配置文件:
ls -ltr /etc/yum.repos.d/
默认情况下至少有 CentOS-Base.repo
这个文件,而这个文件也是默认生效的 repo
文件。查看该文件内容:
cat /etc/yum.repos.d/CentOS-Base.repo
可以看到每个小节都是 [xxx]
开头代表容器名称;每个小节都含有 name
,mirrirlist
,failovermethod
,baseurl
,gpgcheck
,gpgkey
和 enabled
。
当我们在安装 jq
的时候,就会先去 baseurl
中对应的仓库进行寻找适合当前服务器架构的包,找到后返回提供的 jq
安装包以及信息,就可以开始安装了。
像阿里云提供的源:
https://developer.aliyun.com/mirror/centos
所以我们也可以搭建类似于阿里云这样的一个镜像服务器,来提供 yum
镜像的服务;而其他内网服务器,则可以直接配置该服务器,当做 yum客户端
进行访问。
这里所说的前提条件是当前内网环境:
我们选择 maggot111128.huangyichun.com
作为仓库服务器(192.168.111.128
),其他服务器可以连接并获取包。并且将 RPM
包存放在 /opt/yum/yum_packages
中,在这里我们会放入一些 rpm
包(如果当前没有,后续我们会快速提供一些)。
mkdir -p /opt/yum/yum_packages
需要安装 createrepo
,可以快速帮助我们构建本地仓库服务器:
yum -y install createrepo
开始本地镜像服务器构建:
cd /opt/yum/yum_packages
createrepo ./ # 请确保在 /opt/yum/yum_packages 目录下运行
# 当前目录下已经存在一个rpm包: httpd-2.4.6-97.el7.centos.5.x86_64.rpm
# 如果需要测试,可以使用 yum install --downloadonly --downloaddir=/opt/yum/yum_packages [repo] 进行下载
常用的操作是使用 apache
直接关联 yum仓库
,如果所在环境暂时没有 ApacheServer
或者只是临时使用 yum服务
,可以使用 python
临时启动一个端口服务,如下,启动了一个 10086
端口的 http 服务:
python -m SimpleHTTPServer 10086 # 注意运行位置在 /opt/yum/yum_packages
此时已经可以通过 http
方式访问到资源,说明搭建成功:
当我们自己的 yum源
已经搭建完毕后,客户端只需要需要进行仓库配置才能正确访问到仓库,配置文件统一存放在/etc/yum.repos.d/下,现在我们在一台客户机添加上文建立的 clickhouse 仓库:
vim /etc/yum.repos.d/my.repo # 新增一个repo名为 my.repo
# 写入内容
[myRepo]
name=myRepo-Test
baseurl=http://192.168.111.128:10086/
gpgcheck=0
enabled=1
接下来在新配置好的仓库我们可以查到我们放入的相关的包了:
yum list |grep httpd | grep myRepo