编辑
2021-07-12
故障处理
00
请注意,本文编写于 960 天前,最后修改于 389 天前,其中某些信息可能已经过时。

相信很多公司依旧在使用 Centos 7 作为主力服务器。不过由于 CentOS 7 的生命周期已近尾声,很多小 bug 并不会有官方来提供更新修复。

在 CentOS 7 使用 virt-install 通过网络安装 ubuntu 20.04 时,会抛出如下报错:

Bash
Error validating install location: Could not find an installable distribution at URL 'http://cn.archive.ubuntu.com/ubuntu/dists/focal/masin/installer-amd64/'

尝试将同样的命令在 opensuse-tw 上执行后,发现一切正常。看起来 Centos 7 中的 virt-install 出现了 bug?

在开启了 --debug 参数后执行安装会发现,virt-install 会尝试在 url 中寻找所需要的文件。而在若干次尝试后均没有找到启动文件,因此程序异常退出。

根据 debug 输出的信息,查看 virt-install 的代码后发现,virt-install 会根据 os-variant 参数中携带的字段来处理 url,当识别到 os-variant 中携带了 ubuntu 时,会执行下面的代码来获取 ubuntu 镜像源中的 MANIFEST 信息。

  • /usr/share/virt-manager/virtinst/urlfetcher.py
Python
def _is_regular_tree(self): # For regular trees if not self._check_manifest("current/images/MANIFEST"): return False self._url_prefix = "current/images"

而在 ubuntu 20.04 的镜像源中,MANIFEST 的文件位置由 current/images/MANIFEST 换成了 current/legacy-images/MANIFEST,因此 centos 7 这个几年前的 virt-install 自然没有办法找到启动文件。

既然问题找到了,解决起来就很容易了。把上面的代码做出如下替换:

Python
def _is_regular_tree(self): # For regular trees flag = self._check_manifest("current/images/MANIFEST") legacy_flag = self._check_manifest("current/legacy-images/MANIFEST") if not any([flag, legacy_flag]): return False else: if legacy_flag: self._url_prefix = "current/legacy-images" else: self._url_prefix = "current/images"

这样一来,当 virt-install 找不到 current/images/MANIFEST 时,会尝试寻找 current/legacy-images/MANIFEST

重新执行 virt-install 从网络安装 ubuntu 20.04,一切正常。

本文作者:XiaFan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!