1、需求场景
近期再弄Oracle RAC 集群,打算用图形界面方式安装,所以就想给之前最小化安装的linux服务器上用自己做的本地yum源来安装Centos 图形桌面,结果报错了
然后就去可以通外网的本地yum服务器上去执行下发现没啥问题
2、追溯阶段
原制作本地yum的方式(论记录自己操作的重要性)
# 安装建库所需工具
yum install -y yum-utils device-mapper-persistent-data lvm2 createrepo wget
# 下载阿里云repo文件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
# centos 7
reposync -r base -p /alldev/yum
reposync -r epel -p /alldev/yum
reposync -r extras -p /alldev/yum
reposync -r updates -p /alldev/yum
# 创建 reopdata仓库,生成仓库信息
createrepo -v /alldev/yum/epel
createrepo -v /alldev/yum/base
createrepo -v /alldev/yum/extras
createrepo -v /alldev/yum/updates
3、排错阶段
经过一番折腾后发现:
- 原来能使用 yum group相关命令的前提是已经使用createrepo 创建软件组关联信息
官方文档:http://yum.baseurl.org/wiki/YumGroups.html
createrepo -g /path/to/mygroups.xml /srv/my/repo
- 如果用的国内镜像源做外部yum源来缓存至本地时,仍应该同步下载该yum源对应的comps.xml文件来用。
不过,这里文档说的也不是那么清楚,大概意思是说清楚这个组声明文件的语法格式,但在实际使用中仍以实际yum源的制作者编辑的comps.xml文件来用,而非自己自定义。(或者是我理解力太差??)
- 使用参数:-m 来下载前面提到的yum源的制作者编辑的comps.xml文件
下面这里用到的两个变量名分别指的是:
仓库名:REPO
本地仓库路径:DOWNLOAD_PATH
reposync -g -l -d -m --repoid=$REPO --newest-only --download-metadata --download_path=$DOWNLOAD_PATH
说到这里就涉及到这里就不得不提reposync 命令的参数了(谷歌翻译)
[root@lb1 yum.repos.d]# reposync --help
用法:
reposync 用于将远程 yum 存储库同步到本地
使用 yum 检索包的目录。
/usr/bin/reposync [选项]
选项:
-h, --help 显示此帮助信息并退出
-c 配置, --config=CONFIG
要使用的配置文件(默认为 /etc/yum.conf)
-a ARCH, --arch=ARCH 就像运行指定的拱门一样(默认:当前
arch,注意:不会覆盖 $releasever。 x86_64 是一个
i*86 的超集。)
--source 操作源码包
-r REPOID, --repoid=REPOID
指定要查询的repo id,可以指定多个
次(默认全部启用)
-e CACHEDIR, --cachedir=CACHEDIR
存储元数据的目录
-t, --tempcache 使用临时目录来存储/访问 yum-cache
-d, --delete 删除存储库中不再存在的本地包
-p DESTDIR, --download_path=DESTDIR
下载包的路径:默认为当前目录
--norepopath 不要将 reponame 添加到下载路径。只能
在同步单个存储库时使用(默认为
添加 reponame)
-g, --gpgcheck 删除后 GPG 签名检查失败的包
下载
-u, --urls 只列出要下载的网址,不要
下载
-n, --newest-only 只下载每个仓库的最新包
-q, --quiet 尽量少输出
-l, --plugins 启用 yum 插件支持
-m, --downloadcomps 也下载 comps.xml
--download-metadata 下载所有非默认元数据
--allow-path-traversal
允许存储在其 repo 目录之外的包
同步(不安全,谨慎使用!)
- 只有两个yum源有软件组,即:base、epel
也就是说只有这两个源需要单独执行 createrepo -g xxx
资料来源,官方文档目前还没找到说明,是通过几份网上博客总结的(国内外)
博客1:https://www.codenong.com/cs106570226/
博客2:忘记了…
4、解决方案
综合上面的几点,针对Centos 7的国内源的正确缓存至本地做本地yum源的方式应为(借鉴下国外小伙的定时同步外部源的脚本)
#!/bin/bash
##specify all local repositories in a single variable
LOCAL_REPOS="base extras updates epel centosplus"
##local yum path
DOWNLOAD_PATH=/alldev/yum/
##a loop to update repos one at a time
for REPO in ${LOCAL_REPOS}; do
reposync -g -l -d -m --repoid=$REPO --newest-only --download-metadata --download_path=$DOWNLOAD_PATH
if [[ $REPO = 'base' || $REPO = 'epel' ]]; then
createrepo -g $DOWNLOAD_PATH/$REPO/comps.xml $DOWNLOAD_PATH/$REPO/
else
createrepo $DOWNLOAD_PATH/$REPO/
fi
done
5、测试效果
可以看下正常拉取了阿里云的base 源对应的comps.xml后再做组信息自动配置后的效果
[root@lb1 yum.repos.d]# ll /alldev/yum/base/
total 1576
-rw-r--r-- 1 root root 156763 Aug 22 02:31 a4e2b46586aa556c3b6f814dad5b16db5a669984d66b68e873586cd7c7253301-c7-x86_64-comps.xml.gz
-rw-r--r-- 1 root root 744670 Aug 22 02:31 comps.xml
drwxr-xr-x 2 root root 561152 Aug 22 02:44 Packages
drwxr-xr-x 2 root root 4096 Aug 22 03:17 repodata
[root@lb1 yum.repos.d]# ll /alldev/yum/base/repodata/
total 28860
-rw-r--r-- 1 root root 2994847 Aug 22 02:48 2b479c0f3efa73f75b7fb76c82687744275fff78e4a138b5b3efba95f91e099e-primary.xml.gz
-rw-r--r-- 1 root root 7474108 Aug 22 02:48 5319616dde574d636861a6e632939f617466a371e59b555cf816cf1f52f3e873-filelists.xml.gz
-rw-r--r-- 1 root root 6351994 Aug 22 02:49 6d0c3a488c282fe537794b5946b01e28c7f44db79097bb06826e1c0c88bad5ef-primary.sqlite.bz2
-rw-r--r-- 1 root root 1623852 Aug 22 02:48 845e42288d3b73a069e781b4307caba890fc168327baba20ce2d78a7507eb2af-other.xml.gz
-rw-r--r-- 1 root root 156763 Aug 22 02:49 a4e2b46586aa556c3b6f814dad5b16db5a669984d66b68e873586cd7c7253301-comps.xml.gz
-rw-r--r-- 1 root root 744670 Aug 22 02:49 cca56f3cffa18f1e52302dbfcf2f0250a94c8a37acd8347ed6317cb52c8369dc-comps.xml
-rw-r--r-- 1 root root 7508416 Aug 22 02:48 d6d94c7d406fe7ad4902a97104b39a0d8299451832a97f31d71653ba982c955b-filelists.sqlite.bz2
-rw-r--r-- 1 root root 2676918 Aug 22 02:48 ecaab5cc3b9c10fefe6be2ecbf6f9fcb437231dac3e82cab8d9d2cf70e99644d-other.sqlite.bz2
-rw-r--r-- 1 root root 3716 Aug 22 02:49 repomd.xml
[root@lb1 yum.repos.d]#
然后再手动创建仓库索引信息
[root@lb1 base]# createrepo -g /alldev/yum/base/comps.xml /alldev/yum/base/
Spawning worker 0 with 1259 pkgs
Spawning worker 1 with 1259 pkgs
Spawning worker 2 with 1259 pkgs
Spawning worker 3 with 1259 pkgs
Spawning worker 4 with 1259 pkgs
Spawning worker 5 with 1259 pkgs
Spawning worker 6 with 1259 pkgs
Spawning worker 7 with 1259 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
最后在原来执行yum group异常的机器中挑一台,注释掉本地yum仓库客户端配置文件的其他部分,只用base 源来测试下效果
[root@demo ~]# vim /etc/yum.repos.d/own.repo
[root@demo ~]# cat /etc/yum.repos.d/own.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://10.0.1.216/base
enabled=1
gpgcheck=0
#[extras]
#name=CentOS-$releasever - Base-ex
#baseurl=http://10.0.1.216/extras
#enabled=1
#gpgcheck=0
#
#[updates]
#name=CentOS-$releasever - Base-updates
#baseurl=http://10.0.1.216/updates
#enabled=1
#gpgcheck=0
#
#[epel]
#name=epel
#baseurl=http://10.0.1.216/epel
#enabled=1
#gpgcheck=0
#
#[docker]
#name=docker-ce
#baseurl=http://10.0.1.216/docker-ce-stable
#enabled=1
#gpgcheck=0
#
#[k8s]
#name=kubernetes
#baseurl=http://10.0.1.216/kubernetes
#enabled=1
#gpgcheck=0
[root@demo ~]# yum clean all && yum makecache fast && yum repolist
Loaded plugins: fastestmirror, langpacks
Cleaning repos: base
Cleaning up list of fastest mirrors
Other repos take up 135 M of disk space (use --verbose for details)
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
base | 3.6 kB 00:00:00
(1/2): base/group_gz | 153 kB 00:00:00
(2/2): base/primary_db | 6.1 MB 00:00:00
Metadata Cache Created
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
base CentOS-7 - Base 10,072
repolist: 10,072
[root@demo ~]#
[root@demo ~]# yum grouplist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Environment Groups:
GNOME Desktop
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
Server with GUI
KDE Plasma Workspaces
Development and Creative Workstation
Available Groups:
Compatibility Libraries
Console Internet Tools
Development Tools
Graphical Administration Tools
Legacy UNIX Compatibility
Scientific Support
Security Tools
Smart Card Support
System Administration Tools
System Management
Done
可以看到现在正常了(截图证明下)
剩下部分就去给epel 源也做下就行了
[root@lb1 base]# createrepo -g /alldev/yum/epel/comps.xml /alldev/yum/epel/
Spawning worker 0 with 1705 pkgs
Spawning worker 1 with 1705 pkgs
Spawning worker 2 with 1705 pkgs
Spawning worker 3 with 1705 pkgs
Spawning worker 4 with 1705 pkgs
Spawning worker 5 with 1705 pkgs
Spawning worker 6 with 1704 pkgs
Spawning worker 7 with 1704 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
后面细节就写了,然后给本地yum仓库同步脚本改好,还有其他yum 客户端文件改回去即可。
最后用做好的本地yum再来装一次Centos 图形桌面
[root@demo yum.repos.d]# vim own.repo
[root@demo yum.repos.d]# cat own.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://10.0.1.216/base
enabled=1
gpgcheck=0
#[extras]
#name=CentOS-$releasever - Base-ex
#baseurl=http://10.0.1.216/extras
#enabled=1
#gpgcheck=0
#
#[updates]
#name=CentOS-$releasever - Base