星期六, 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 的語法不太一樣, 也要重設.


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

星期三, 7月 13, 2005

C's note

soft: Dev C++

凡介於/* */ 之間的文字會視為註解 //為開頭的也是註解
所有的C語言程式都是以main為開頭….Tourbo C會執行
左大括號{
和右大括號 }
之間的指令

舉個例子以下為hello.c的內容


/* 使用 #include file 將某個檔案包含在目前程式內*/
#include
#include
/*以下為程式的開始 */
main()
{

/* 請注意要以分號(;) 為結束一個指令字元 */
/*使用printf 列出字串 如果要換行使用 \n */
/*使用backslash 取消控制字元的使用 例如使用\" 來顯示雙引號 用\\ 來顯示\ */
printf("\"Hello world with double quote test \"\n ");
printf("Hello world\n");
printf("C:\\C\\Hello.c\n");

/* 使用system指令去執行 命令提示字元的指令pause ->可以暫停 */
system("pause");

/* 變數的使用是有限制的---使用大寫或是小寫字母或是底線(_) 為開頭*/
/* 變數的名稱則可為 1.大寫字母 2.小寫字母 3.底線 4.阿拉伯數字 */
/* 變數的宣告皆以分號(;) 作為結束 */
/* 如果變數於程式的起始位置就宣告了那則為整體(global)變數,對程式的任何部分中使用 */
/* 如果變數在函數程式內宣告.....則為區域變數(local variable) 只在宣告的函數中使用 */
/* 如果變數在函數參數位置宣告----則為用來接收呼叫程式所傳遞的值 */


int i;

// i的值為當時記憶體目前殘留的資料
printf("i=%d\n",i);
// 重新定義 i=0 所以列印出來會是零
i=0;
printf("i=%d\n",i);

// sizeof( ) 計算資料所佔的記憶體空間
printf("sizeof(i)=%d , sizeof(int)=%d\n",sizeof(i),sizeof(int));


// short int 值的範圍 -32768 ~ 32767 , 給超過範圍的值會變成其他的值
short si;
si=32767;
printf("si=%d\n",si);
si=32768;
printf("si=%d\n",si);
si=32769;
printf("si=%d\n",si);
si=32770;
printf("si=%d\n",si);
si=-32768;
printf("si=%d\n",si);
si=-32769;
printf("si=%d\n",si);
si=-32770;
printf("si=%d\n",si);


}

星期五, 7月 01, 2005

研討會結束 對postfix 的初體驗

實驗平台 Fedora core 3
Package: postfix-2.1.5-5

檢查是否有安裝rpm
#rpm -qa grep postfix
備份設定檔
#cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
修改postfix的設定檔
#vi /etc/postfix/main.cf
將原來只在localhost listen 標記起來並對所有界面服務
#inet_interfaces = localhost
inet_interfaces = all

設定信任的內網
mynetworks = 192.168.0.0/24, 127.0.0.0/8
#service postfix restart
#netstat -tupln grep :25
此時postfix就在 port 25 listen
可以使用下列指令觀看postfix設定
#postconf
以下指令為觀看預設值
#postconf -d

Client傳送信件給Server的程序為
HELO / EHLO 網域名稱
MAIL FROM: 寄件者e-mail
RCPT TO: 收件者e-mail
DATA 信件內容然後以 . 為結束
QUIT 寄信完離開

針對 Client進行設限.....
請注意參數的部分由於要接續前面設定
....故要用以空白為首來開始撰寫代表續接
#vi /etc/postfix/main.cf
#針對client的ip/domain設限
smtpd_client_restrictions =
#允許內網不必檢查
permit_mynetworks,
#反解失敗就拒絕
reject_unknown_client,
#根據access清單拒絕client
#請先建立/etc/postfix/access檔案
#內容為 dynamic.hinet.net REJECT
#拒絕動態ip的client
#使用 #postmap hash:/etc/postfix/access 來建立DB
check_client_access hash:/etc/postfix/access,
#使用正規表示式拒絕名稱中有dynamic的主機連線
# 請先建立 /etc/postfix/access_re
#內容為 /dynamic/ REJECT
check_client_access regexp:/etc/postfix/access_re
reject_rbl_client cbl.abuseat.org,
#使用DNS Block List 黑名單機制
#如果 #host 57.41.61.66.cbl.abuseat.org --> 會出現 127.0.0.2
#代表 66.61.41.57 (host的時候要倒過來寫)這個 ip是廣告信server黑名單中的ip
#如果是正常的ip那會出現not found
#故利用此機制block spam mail server
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client relays.ordb.org,
reject_rbl_client list.dsbl.org,
permit
#要求寄信前要提出helo的要求-------預設為no
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks,
#拒絕不正確/未知的helo domain
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_unknown_hostname,
#拒絕外界但是宣稱是自己domain的helo
#請先建立 /etc/postfix/fake_helo
#內容 example.com REJECT
#利用#postmap hash:/etc/postfix/fake_helo 建立DB
check_helo_access hash:/etc/postfix/fake_helo
permit
#馬上拒絕不delay
smtpd_delay_reject = no
#根據Mail from來限制
smtpd_sender_restrictions =
permit_mynetworks,
#拒收來自於外界卻宣稱發自內部的信件
#建立 /etc/postfix/fake_from
#內容 example.com REJECT --> example.com 為自己公司的domain
#使用 #postmap hash:/etc/postfix/fake_from
check_sender_access hash:/etc/postfix/fake_from,
#拒絕不正確和未知的domain
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
#只允許內網Relay
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination

#service postfix reload

Enjoy it ^^

P.S: 在Redhat 9.0中的postfix為postfix-1.1.12-1 有些許功能不支援