Virtualization

從 CentOS5 盒子安裝 CentOS6?

  • April 10, 2013

我正在嘗試從我的 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

這些版本之間 RPM 的神奇數量是否發生了變化?我該如何解決這個問題?

編輯(澄清):

不是要升級現有的機器。我正在嘗試使用 yum –installroot=/mnt groupinstall 核心創建新安裝。為了獲得一個工作配置,第一步是安裝包含 yum repo 配置的發布 rpm。

問題

問題如下:

  1. 來自 RHEL6 的 rpm 文件使用不同的幻數
  2. RHEL5 python2.4 無法辨識用於在 CentOS 6 中校驗和下載的 sha256
  3. yum 在 RHEL6 中使用不同的數據庫格式,因此 RHEL5 yum 建構的 chroot 環境對於 RHEL6 中的 yum 將無法理解

解決方案

警告:以下問題 1 的解決方案是危險的。如果 RPM 升級中斷,您很可能會導致系統損壞。解決問題 2 可能會導致安裝損壞的軟體包!

可以通過從源 RPM 反向移植 RPM 4.6 來規避問題 1。請參閱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

我的 CentOS dist 中沒有合適的 lua。從 rpmsearch 獲得:

$ rpm -i lua-5.1.2-1.el5.x86_64.rpm lua-devel-5.1.2-1.el5.x86_64.rpm

安裝並建構源 RPM。當然可能需要額外的包,比如 gcc:

$ rpm -i rpm-4.6.0-4.0.notting.1.el5.src.rpm
$ rpmbuild -ba /usr/src/redhat/SPECS/rpm.spec

在實際安裝替換 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

我們現在可以安裝基線:

$ rpm -i --root=/mnt centos-release-6-0.el6.centos.5.i686.rpm

問題 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:

我們現在準備執行 yum groupinstall:

$ yum groupinstall --nogpgcheck --installroot=/mnt core

請注意,由於我們禁用了大多數軟體包驗證,因此在此步驟中軟體包可能會安裝失敗。密切關注輸出:

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

沖洗並重複。

由於核心不會進行任何系統設置,因此您可能需要在下一步之前做很多事情。我需要提供/mnt/etc/resolv.conf。

我們現在有一個可以 chroot 到問題 3 的環境:

$ 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

幸運的是,這很容易解決:只需重建 /var/lib/rpm:

$ mv /var/lib/rpm/ /var/lib/old.rpm
$ rpm --initdb

此時我遇到了經典 $ releasever issue, so I had to edit /etc/yum.repos.d/* to replace $ releasever 與 6. 類似的東西:

sed -re 's/\$releasever/6/g' -i /etc/yum.repos.d/CentOS-Base.repo

可能有更好的方法來做到這一點,但我還沒有找到。

$ 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

在這個編輯之後,yum 可以正常工作,並且我有一個從 CentOS 5 建構的工作 CentOS 6。任何 CentOS 6 的 chroot 環境/VM 來賓設置指令都應該能夠讓你進入一個成熟的系統。

不能那樣做,AFAIK:RPM 中的壞魔法是最少的問題。

簡而言之:沒有推薦的 RHEL5->RHEL6 升級路徑,因此沒有 Centos5->6。我在這個方向上嘗試了一些 skulduggery(我自己有大量的 C5 伺服器),但決定不這樣做。

考慮到 5->6 轉換相當於 Fedora 核心 6->12 轉換,但 yum 中沒有預升級支持。所以你可以想像出一張 FC7 DVD,用

selinux=0 升級任何

沖洗乾淨,然後以 FC8…FC11 重複,以 CentOS6 結尾。祝你好運 - 談到我自己的機器,我會很驚訝最終得到比 bash 更複雜的工作順序 - 這是在花了幾天時間嘗試這個時髦的壯舉之後。

我估計我可能會在更短的時間內重建(工作)機器。考慮到 RHEL5 仍然有幾年的支持,這也很好。

引用自:https://serverfault.com/questions/318398