星期六, 7月 30, 2005

轉貼 使用 yum 升級你的系統 (redhat9 升級到 CentOS 3.3) from SA

原文出處
http://phorum.study-area.org/viewtopic.php?t=28648
找個時間來Lab一下

由於 RedHat 9 已經沒有更新了, Fedora 雖然有個遺產計畫在更新, 但是好像沒什麼動靜, 上頭的異動速度又不快. 所以機房內的幾台安裝 RedHat 9 的主機, 也很久沒有更新了.

所以想利用今天開始的過年假期, 把這幾台機器升級到別的版本上頭.

我們選擇的是使用 CentOS 3, 因為這是一套與 RHEL 3 相容的版本, 而 RHEL 3 是基於 RedHat 9 發展的. 這樣子我們升級的異動會比較少一點.

升級主要參考 http://www.owlriver.com/tips/centos-31-ex-rhl-9/ 這一篇文章.

1. 到 http://linux.duke.edu/projects/yum/download.ptml 抓 yum 2.0.7 回來安裝.

2. 把 CentOS 3.3 的光碟中的 RPMS 目錄複製到主機中. 如 /centos/os/RPMS 下頭. 共有三片光碟.

3. 如果可能, 也把 CentOS 網站上頭的 updates 下頭的 rpm 也抓一份回來, 放到 /centos/updates/RPMS 下頭.

4. 建立兩個目錄 /centos/os/headers 與 /centos/updates/headers, 然後在 /centos/os 與 /centos/updates 下頭執行這個指令:
代碼:
cd /centos/os
yum-arch .
cd /centos/updates
yum-arch .

以便於建立 yum 的資料庫.

5. 匯入 CentOS 的 PGP Key.
代碼:
rpm --import http://mirror.caosity.org/centos-3/RPM-GPG-KEY-CentOS-3

上頭那個檔案在光碟內也有, 也可以直接匯入光碟內的 key.

6. 使用 rpm -e 指令, 移除非必要的 -devel 套件. (非必要)

7. 建立 /etc/yum-upgrade.conf 如下:
代碼:
#
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
installonlypkgs=kernel kernel-smp kernel-hugemem kernel-enterprise kernel-debug kernel-unsupported kernel-smp-unsupported kernel-hugemem-unsupported
tolerant=1
exactarch=1

[upgrade]
name=Centos upgrade
baseurl=file://localhost/centos/os/

[update]
name=CentOS-$releasever - Updates
baseurl=file://localhost/centos/updates/

如果沒有事先抓下這些 rpm, 也可以設成
代碼:
#
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
installonlypkgs=kernel kernel-smp kernel-hugemem kernel-enterprise kernel-debug kernel-unsupported kernel-smp-unsupported kernel-hugemem-unsupported
tolerant=1
exactarch=1

[upgrade]
name=Centos upgrade
baseurl=http://mirror.centos.org/centos/3.3/os/$basearch/

[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.centos.org/centos/3.3/updates/$basearch/

這樣子 yum 會在更新時上網抓檔案. 因為我們要更新好幾台, 所以先抓回來, 以免每次更新都再抓一次.
update 的部份也可以不設, 等升級到 CentOS 3.3 後, 再使用 yum update 去更新也可以.

8. 先更新 kernel 與 rpm.
代碼:
rpm -vv --rebuilddb
yum -y -t -c /etc/yum-upgrade.conf upgrade rpm kernel
rpm -vv --rebuilddb
yum -y -t -c /etc/yum-upgrade.conf upgrade rpm kernel

原本的文件說這兒要重開機, 不過似乎不用, 可以直接往下做.

9. 再更新整個系統
代碼:
yum -y -t -c /etc/yum-upgrade.conf upgrade

等 yum 跑完後, 你的 RedHat 9 就變成 CentOS 3.3 了, 再重開機使用新的 kernel.

如果檔案都抓回來, 在 local 的主機或網路上頭時, 整個更新的動作應該可以在 30 分到 1 小時之內完成.

我們的主機上頭有 mysql, postgresql, httpd, php, openldap-server, 整個更新完成後, 系統運作都很正常.

更新後, 跑了一天, 目前看起來只有一個問題, 就是有些機器在 su 到 root 的時候, 會發生 segment fault 的錯誤 (裝的東西都類似, 但有些機器會, 有些不會).

如果你有發生類似的情形, 可以在使用 su 指令前, 先 export LD_ASSUME_KERNEL=2.4.4 再執行, 就不會有問題了.
如果 2.4.4 不行.... 自己換個版本再試試.

同樣的升級方式, 應該適用於同樣是使用 rpm 格式的 linux 版本. 也就是不管是 redhat 8 -> 9, 9 -> fc1 .... 都應該可以適用.



這個星期週末, 順便把公司內的主機由 CentOS 3.4 換到 4.0 上頭了. 也是使用 yum 來處理.

之前在 CentOS 4 剛出來時, 找了一台機器試過, 會有些衝突 (kernel 與 udev), 前幾天在 CentOS 的討論區看到似乎有人成功轉換. 所以... 也跟著試看看.

結果... 發現... 那篇文章似乎有點問題, 連 yum 都先升級... 結果 yum 就不能用了...

我參考該說明, 修正一下, 步驟約如下 (x86-64 檔名有些不同):

1. rpm --import RPM-GPG-KEY-centos4
2. rpm -Uvh --force centos-release-4-0.1.i386.rpm
3. rpm -Uvh --force centos-yumconf-4-2.noarch.rpm
4. 安裝新的 kernel
rpm -ivh --force --nodeps kernel-2.6.9-5.0.3.EL.i686.rpm
5. 安裝 udev
rpm -ivh --force --nodeps udev-039-10.8.EL4.i386.rpm
6. rpm --rebuilddb
7. 設定好 yum-upgrade.conf, 然後執行
yum -c /etc/yum-upgrade.conf upgrade
8. 如果沒問題, 再安裝一次 kernel
rpm -ivh --force --nodeps kernel-2.6.9-5.0.3.EL.i686.rpm
9. rpm --rebuilddb
10. yum update 看看有沒有其他的要更新.
11. 更改 /boot/grub/menu.lst 指定用新的 kernel 開機
12. 重開機看看. (可能會移除一些舊的 driver, 加上一些新的 driver)

大致上是這樣處理.

其中可能有問題的是在 upgrade 那一個步驟, 可能會說有那些軟體是有衝突的. 就想辦法一個個先安裝或先移除, 等升級後再安裝.
我們碰到的有:

MySQL, 這個由 3.x 升到 4.1.x. 如果有裝 mysql-server, 會有問題.
我們的處理方式是先強迫安裝
rpm -Uvh --force --nodeps mysql-4.1.7-4.RHEL4.1.i386.rpm mysql-server-4.1.7-4.RHEL4.1.i386.rpm mysqlclient10-3.23.58-4.RHEL4.1.i386.rpm
然後在 yum-upgrade.conf 的 [main] 中加上
exclude=mysql-server mysql
後就可以避開這個問題. 至於原本的 mysql 資料庫, 原則上檔案可以相容, 並不用 dump 出來再 restore. 不過.... 如果你怕有問題... 就自己 dump 吧.

PostgreSQL, 這個由 7.3.x 升到 7.4.x 似乎不能直接使用原本的檔案. 所以我們只好先用 pg_dumpall 把資料複製下來, 等升級後再放回去. 因為要做這個動作, 所以就順便到 postgresql 網站抓了 8.0.1 的版本回來, 直接升到 8.0.1 上頭去.
在 upgrade 先備份
pg_dumpall > dbxxx.out
備份後執行 upgrade, 等 upgrade 後
移除 postgresql
rpm -e postgresql-libs postgresql perl-DBD-Pg php-pgsql
安裝 8.0.1 版本
rpm -ivh postgresql-8.0.1-2PGDG.i686.rpm postgresql-server-8.0.1-2PGDG.i686.rpm postgresql-libs-8.0.1-2PGDG.i686.rpm postgresql-contrib-8.0.1-2PGDG.i686.rpm postgresql-pl-8.0.1-2PGDG.i686.rpm postgresql-python-8.0.1-2PGDG.i686.rpm
把資料庫放回去
psql -f dbxxx.out template1

postfix, 在 upgrade 過程不會有問題, 但是 upgrade 後, aliases, aliases.db 會被改名, 要改回來才能啟動.

subversion, 先強迫升級
rpm -Uvh --force --nodeps subversion-1.1.1-2.1.i386.rpm subversion-perl-1.1.1-2.1.i386.rpm subversion-devel-1.1.1-2.1.i386.rpm

openldap, 升到 2.2.x 版, 由於新版的設定比較嚴格, 原本的 schema 可能要修改才會符合. 且 ACL 的語法不太一樣, 也要重設.


除此之外, 並沒有發現有其它的問題.

沒有留言: