从 CentOS5 盒子安装 CentOS6?

Bit*_*nce 5 virtualization rpm centos5 centos6

我正在尝试从我的 CentOS 5 主机构建一个新的 CentOS 6 VM,但这些版本之间似乎发生了一些根本性的变化:

$ rpm -ivh --nodeps --nodigest --ignorearch --ignoreos --force --root=/mnt centos-release-6-0.el6.centos.5.i686.rpm
warning: centos-release-6-0.el6.centos.5.i686.rpm: Header V3 RSA/SHA256 signature: NOKEY, key ID c105b9de
Preparing...                ########################################### [100%]
   1:centos-release         ########################################### [100%]
error: unpacking of archive failed: cpio: Bad magic

$ rpm --version
RPM version 4.4.2.3
Run Code Online (Sandbox Code Playgroud)

这些版本之间 RPM 的神奇数字是否发生了变化?我该如何解决这个问题?

编辑(澄清):

不是要升级现有机器。我正在尝试使用 yum --installroot=/mnt groupinstall core 创建新安装。为了获得有效的配置,第一步是安装包含 yum repo 配置的发行版 rpm。

Ali*_*orm 5

不能那样做,AFAIK:RPM 中的坏魔法是最少的问题。

简而言之:没有推荐的RHEL5->RHEL6升级路径,因此没有Centos5->6。我在那个方向上尝试了一些诡计(我自己有大量的 C5 服务器)但决定反对它。

考虑到 5->6 转换相当于 Fedora 核心 6->12 转换但没有 yum 中的预升级支持。所以你可以想象弹出一张 FC7 DVD,用

selinux=0 upgradeany

冲洗,并以 CentOS6 结尾的 FC8...FC11 重复。祝你好运 - 说到我自己的机器,我会很惊讶地发现在工作顺序中比 bash 更复杂的东西 - 这是在尝试这个时髦的壮举花了几天之后。

我估计我可能会在更短的时间内重建一台(工作)机器。考虑到 RHEL5 仍然有几年的支持,这也是一样的。


Bit*_*nce 3

问题

问题如下:

  1. RHEL6 中的 rpm 文件使用不同的幻数
  2. RHEL5 python2.4 无法识别 CentOS 6 中用于校验下载的 sha256
  3. yum 在 RHEL6 中使用不同的数据库格式,因此 RHEL5 yum 构建的 chroot 环境将无法被 RHEL6 中的 yum 理解

解决方案

警告:以下问题 1 的解决方案是危险的。如果 RPM 升级失败,您的系统很可能会崩溃。问题 2 的解决方案可能会导致安装损坏的软件包!

问题 1 可以通过从源 RPM 向后移植 RPM 4.6 来规避。请参阅http://orcorc.blogspot.com/2009/03/oh-my-goodness.html

构建源 RPM 的依赖关系:

$ yum install redhat-rpm-config elfutils-devel elfutils-libelf-devel readline-devel zlib-devel nss-devel gettext-devel libselinux-devel ncurses-devel bzip2-devel python-devel lua-devel xz-devel xz
Run Code Online (Sandbox Code Playgroud)

我的 CentOS 分区中没有合适的 lua。从 rpmsearch 获取:

$ rpm -i lua-5.1.2-1.el5.x86_64.rpm lua-devel-5.1.2-1.el5.x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

安装并构建源 RPM。当然可能需要额外的软件包,例如 gcc:

$ rpm -i rpm-4.6.0-4.0.notting.1.el5.src.rpm
$ rpmbuild -ba /usr/src/redhat/SPECS/rpm.spec
Run Code Online (Sandbox Code Playgroud)

在实际安装替换 RPM 之前进行测试:

$ rpm -U --test /usr/src/redhat/RPMS/i386/rpm-4.6.0-4.0.notting.1.i386.rpm /usr/src/redhat/RPMS/i386/rpm-libs-4.6.0-4.0.notting.1.i386.rpm /usr/src/redhat/RPMS/i386/rpm-python-4.6.0-4.0.notting.1.i386.rpm /usr/src/redhat/RPMS/i386/rpm-build-4.6.0-4.0.notting.1.i386.rpm
Run Code Online (Sandbox Code Playgroud)

我们现在可以安装基线:

$ rpm -i --root=/mnt centos-release-6-0.el6.centos.5.i686.rpm
Run Code Online (Sandbox Code Playgroud)

问题 2 可以通过手动编辑 /usr/lib/python2.4/site-packages/yum 文件来解决(可以使用 PYTHONPATH 魔法来减少这种黑客行为)。差异如下所示:

--- yum-python/__init__.py      2011-10-05 11:03:00.000000000 +0200
+++ /usr/lib/python2.4/site-packages/yum/__init__.py    2011-10-05 11:14:24.000000000 +0200
@@ -1215,7 +1215,7 @@
             if ylp.pkgtup != po.pkgtup:
                 failed = True

-
+        failed = False
         if failed:            
             # if the file is wrong AND it is >= what we expected then it
             # can't be redeemed. If we can, kill it and start over fresh
diff -ru yum-python/yumRepo.py /usr/lib/python2.4/site-packages/yum/yumRepo.py
--- yum-python/yumRepo.py       2011-10-05 11:03:00.000000000 +0200
+++ /usr/lib/python2.4/site-packages/yum/yumRepo.py     2011-10-05 11:12:51.000000000 +0200
@@ -1461,6 +1461,7 @@
         else:
             file = fn

+        return 1
         try:
             l_csum = self._checksum(r_ctype, file) # get the local checksum
         except Errors.RepoError, e:
Run Code Online (Sandbox Code Playgroud)

我们现在准备执行 yum groupinstall:

$ yum groupinstall --nogpgcheck --installroot=/mnt core
Run Code Online (Sandbox Code Playgroud)

请注意,由于我们已禁用大多数软件包验证,因此在此步骤中软件包可能会安装失败。密切关注输出:

Failed:
  python.i686 0:2.6.5-3.el6_0.2         redhat-logos.noarch 0:60.0.14-10.el6        

$ yum install --nogpgcheck --installroot=/mnt python redhat-logos
Run Code Online (Sandbox Code Playgroud)

冲洗并重复。

由于核心不会执行任何系统设置,因此您可能需要在下一步之前执行许多操作。我需要提供/mnt/etc/resolv.conf。

我们现在有了一个可以针对问题 3 进行 chroot 的环境:

$ SHELL=/bin/bash chroot /mnt
$ yum install zsh
error: cannot open Packages index using db3 - No such file or directory (2)
error: cannot open Packages database in /var/lib/rpm
Run Code Online (Sandbox Code Playgroud)

幸运的是,这很容易修复:只需重建 /var/lib/rpm:

$ mv /var/lib/rpm/ /var/lib/old.rpm
$ rpm --initdb
Run Code Online (Sandbox Code Playgroud)

此时我遇到了经典的 $releasever 问题,因此我必须编辑 /etc/yum.repos.d/* 以将 $releasever 替换为 6。例如:

sed -re 's/\$releasever/6/g' -i /etc/yum.repos.d/CentOS-Base.repo
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来做到这一点,但我还没有找到。

$ yum install zsh
Loaded plugins: fastestmirror
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. $releasever is not a valid release or hasnt been released yet/
removing mirrorlist with no valid mirrors: /var/cache/yum/i386/$releasever/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
Run Code Online (Sandbox Code Playgroud)

进行此编辑后,yum 按预期工作,并且我有一个从 CentOS 5 构建的工作 CentOS 6。 CentOS 6 的任何 chroot 环境/VM 来宾设置指令应该能够让您进入一个成熟的系统。