從 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
這些版本之間 RPM 的神奇數量是否發生了變化?我該如何解決這個問題?
編輯(澄清):
我不是要升級現有的機器。我正在嘗試使用 yum –installroot=/mnt groupinstall 核心創建新安裝。為了獲得一個工作配置,第一步是安裝包含 yum repo 配置的發布 rpm。
問題
問題如下:
- 來自 RHEL6 的 rpm 文件使用不同的幻數
- RHEL5 python2.4 無法辨識用於在 CentOS 6 中校驗和下載的 sha256
- 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 仍然有幾年的支持,這也很好。