马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、现场:装完 centos-release-scl,yum 就废了
在 CentOS 7 上想装 devtoolset(比如 yum install centos-release-scl 之后装 devtoolset-11 拿到更新的 GCC),装完 source 包之后,再跑任何 yum 命令都会报错。典型输出如下:
[root@localhost ~]# sudo yum install devtoolset-11
Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-rh
error was 14: curl#7 - "Failed to connect to ... : 网络不可达"
One of the configured repositories failed (未知), and yum doesn't have enough cached data to continue.
...
Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
注意关键两行:centos-sclo-rh 这个仓库拿不到有效 baseurl,以及 sclo 相关的机器解析不到。这跟网络通不通其实两码事——机器能上网,只是那个域名已经不存在了。
二、先搞懂 SCL 是干什么的
SCL(Software Collections)是 RHEL/CentOS 官方推出的"并行安装多版本软件"机制。它的设计目标是:不覆盖系统自带的老版本,而是在同一台机器上同时装多个版本的运行时,互不干扰。
比如系统自带 Python 2.7,SCL 可以额外给你一个 Python 3.3/3.8,通过 scl enable 临时切换环境。常见的软件选集包括:
- Ruby 1.9.3(ruby193)
- Python 2.7 / 3.3(python27 / python33)
- PHP 5.4(php54)
- Perl 5.16.3(perl516)
- Node.js 0.10(nodejs010)
- MariaDB 5.5(mariadb55)、MySQL 5.5(mysql55)、PostgreSQL 9.2(postgresql92)
安装方式很简单,CentOS 7 是小写包名:
yum install centos-release-scl
CentOS 6 的包名首字母是大写 centos-release-SCL,大小写不同,别搞混,装错了会提示找不到包。
三、问题根源
装上 centos-release-scl 之后,/etc/yum.repos.d 下多出两个文件:
CentOS-SCLo-scl.repo
CentOS-SCLo-scl-rh.repo
问题就出在这里:这两个文件里写的是 mirrorlist= 指向官方 mirrorlist 服务,而这套服务已经停了。你之前手工配好的 CentOS-Base.repo(哪怕是阿里云源)只解决了 base 仓库,sclo 这两个新仓库依然是坏掉的,yum 一跑就会被它们绊倒。
四、解法:把 sclo 两个仓库的 baseurl 指向 vault
先看一眼目录里到底有啥:
cd /etc/yum.repos.d
ls
然后对 CentOS-SCLo-scl-rh.repo 改:
vi CentOS-SCLo-scl-rh.repo
# 改成下面这样
[centos-sclo-rh]
name=CentOS-7-SCLo rh
baseurl=http://vault.centos.org/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
改完如果还是不行,把 CentOS-SCLo-scl.repo 也一并改:注意原文件里的方括号和仓库名容易写错,正确的段名是 centos-sclo-sclo(不是 centos-sclo-rh):
vi CentOS-SCLo-scl.repo
# 改成下面这样
[centos-sclo-sclo]
name=CentOS-7-SCLo sclo
baseurl=http://vault.centos.org/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
两个都改完,清缓存重建索引:
yum clean all
yum makecache
此时再跑 yum install devtoolset-11,就能正常装了。
五、临时方案:绕开 sclo 仓库
如果只想尽快让 yum 恢复工作、暂时不想动 sclo,可以用 yum 自己给出的两条路:
yum-config-manager --disable centos-sclo-rh centos-sclo-sclo
或者让它在源不可用时不阻塞:
yum-config-manager --save --setopt=centos-sclo-rh.skip_if_unavailable=true
yum-config-manager --save --setopt=centos-sclo-sclo.skip_if_unavailable=true
第二条会持续生效,代价是每次 yum 都要先试着连一次失败的源,速度略慢。长期看还是把 baseurl 改到 vault 更干净。
六、验证与后续
装完 devtoolset 之后想用它自带的 GCC,需要临时启用环境:
scl enable devtoolset-11 bash
gcc --version
注意 scl enable 只对当前这次 shell 生效,新开一个终端就回到旧版本。要长期生效,把 enable 命令写进 ~/.bashrc。
七、小结
这套故障的规律其实很清楚:装 centos-release-scl 会往 repo 目录塞两个指向已下线 mirrorlist 的新文件,它们和你的 base 源互不相干,却能让整条 yum 停摆。解法只有两步——确认是 sclo 这两个仓库在报错,把它们的 baseurl 改成 vault 归档地址(顺手把段名 centos-sclo-sclo 改对),然后 clean + makecache。以后再做这类"装个扩展包把系统搞坏"的操作,第一件事永远是先 ls /etc/yum.repos.d 看看多了什么文件。
qidao123.com企服评测-应用市场 编辑提示 |