APT_FAQ of CLE(gaga)
目錄:
Q1: 當我一執行 apt-get update,出現以下的警告訊息時,我該怎麼辦?
WARNING: 'xxxxxx' has 2 packages with same version
but different dependencies. That usually means a packaging
bug.
Q2: openssl (/lib/libcrypto.so.*、/lib/libssl.so.*) 版本的問題。
若在安裝、移除或升級時出現類似底下的訊息時,我該怎麼辦?
libcrypto.so.3 is needed by xxxxxx
libssl.so.3 is needed by xxxxxx
Q3: 我該如何升級 kernel?升級 kernel 時遇到如下錯誤訊息我該怎麼辦?
error: failed dependencies:
xxxxxx < x.xx conflicts with kernel-x.y.z
xxx < x.x.x conflicts with kernel-x.y.z
Q4: 怎麼升級 X Window 的相關套件,升級 XFree86 時遇到問題該如何解決?
Q5: libpng-1.2.x (libpng.so.3) 和 libpng-1.0.x (libpng.so.2) 的問題。
當我在升級時,遇到類似 "xxx: Depends: libpng.so.3" 的錯誤訊息時,我
該怎麼辦?
Q6: 當我在升級時遇到類似 "error: execution of % post scriptlet from xxxxxx
failed, exit status 1" 的錯誤訊息時,我該怎麼辦?
Q7: 如何利用 apt 來定期自動更新?
以下為我把 cle.linux.org.tw 主機由原本的 gaga-pre1 升級至最新版本 gaga
的實際操作狀況,並順手把一些在用 APT 升級過程中可能會遇到的問題及解決的
方法以 Q and A 的方式說明如下:
Q1: 當我一執行 apt-get update,出現以下的警告訊息時,我該怎麼辦?
WARNING: 'xxxxxx' has 2 packages with same version
but different dependencies. That usually means a packaging
bug.
A1: 當出現如(圖1-1)所示之警告訊息時,解決方法為:
請至 ftp://cle.linux.org.tw/pub/CLE/i386/RedHat/RPMS/
(或是距離您較近的 Mirror 站台)手動下載回有問題的套件。
(圖1-1)

如(圖1-2)範例所示則是下載回
xscreensaver-3.33-4.i386.rpm
elm-2.5.6-2.i386.rpm
stunnel-3.22-1.i386.rpm
然後再以 "rpm -Uvh --force" 來強制重裝。
(圖1-2)

Q2: openssl (/lib/libcrypto.so.*、/lib/libssl.so.*) 版本的問題。
若在安裝、移除或升級時出現類似底下的訊息時,我該怎麼辦?
libcrypto.so.3 is needed by xxxxxx
libssl.so.3 is needed by xxxxxx
A2: 請先檢查您目前系統上 openssl 的版本,執行 "rpm -qa|grep openssl"
如(圖1-2)所示,若您的系統上用的版本是 openssl-0.9.6c 的話,就很有
可能會發生上述的問題。
解決方法,同樣的請先手動下載回相關的 openssl 套件,參考(圖1-2)系統
目前已安裝的 openssl 版本,因此下載回
openssl-0.9.6b-18.i686.rpm
openssl-devel-0.9.6b-18.i386.rpm
openssl095a-11.i386.rpm
openssl096-0.9.6-6.i386.rpm
openssl-perl-0.9.6b-18.i386.rpm
當我們執行 "rpm -Uvh --force" 來進行強制升級時如(圖2-1)所示,
又發生 mutt 套件 dependencies 的問題,因此,我們再度下載回
mutt-1.2.5.1-5.i386.rpm
若您的畫面還有出現其他套件也有相關的 dependencies 問題時,也請
手動將那些套件一併下載回來。
好了,這次連同 openssl 相關套件,我們再用 "rpm -Uvh --force"
強制升級一次,如(圖2-1)所示,這次成功的升級了。
(圖2-1)

因為我們系統目前用的版本已是 openssl-0.9.6b 了,因此,若您系統上
還有安裝 openssl096b-0.9.6b 這個套件的話,現在就可以用 "rpm -e"
將其移除掉,如(圖2-2)所示。
(圖2-2)

Q3: 我該如何升級 kernel?升級 kernel 時遇到如下錯誤訊息我該怎麼辦?
error: failed dependencies:
xxxxxx < x.xx conflicts with kernel-x.y.z
xxx < x.x.x conflicts with kernel-x.y.z
A3: 如(圖3-1)所示,先執行 "rpm -qa|grep kernel" 指令查出目前系統上的
kernel 版本及已安裝的 kernel 相關套件。接著請先自行下載回相關的
套件,如(圖3-1)所示則是下載回
kernel-source-2.4.18-5.i386.rpm
glibc-kernheaders-2.4-7.16.i386.rpm
kernel-smp-2.4.18-5.i686.rpm
這裡要特別注意的是,之前的 "kernel-headers" 套件,目前 Red Hat 已
經改名為 "glibc-kernheaders" 了。
接著請先以 "rpm -Uvh" 來升級 kernel-source 和 glibc-kernheaders
這兩個比較沒有 dependencies 問題的套件,若您原本就沒有安裝這幾個
套件,則此步驟可以省略。
再來就是用 "rpm -ivh" 來升級問題比較多的 kernel 或是 kernel-smp
套件,這裡另一個要特別注意的地方是為什麼要用 "rpm -ivh" 而不是用
"rpm -Uvh",因為用 "rpm -ivh" 來安裝新版本的 kernel,即使安裝失敗
我們仍然可以使用舊版本的 kernel 來開機並救援,但若是用 "rpm -Uvh"
來升級的話,舊版本的 kernel 就會被新版本的 kernel 取代掉,這樣,要
是我們升級 kernel 失敗的話,就無法利用舊版本的 kernel 來閞機救援
。我們可以等到新版本的 kernel 升級完畢並重新開機測試成功後,再用
"rpm -e" 來把舊版本的 kernel 移除,我想,這樣是比較保險的作法。
如(圖3-1)中間所示,我們使用 "rpm -ivh" 來安裝新版本的 kernel 時,
出現了 initscripts、dev 等套件相依性的問題,這時,請再手動下載回
相關的套件,如(圖3-1)所示則是下載回
initscripts-6.67-1.i386.rpm
dev-3.3-4.i386.rpm
接著先用 "rpm -Uvh" 把 initscripts、dev 等套件先升級完畢,然後再
用 "rpm -ivh" 來升級新版本的 kernel,(圖3-1)下方所示。
這裡有個地方要注意的,我們可以看到在(圖3-1)中間有一段是
warning: /etc/sysctl.conf created as /etc/sysctl.conf.rpmnew
遇到這種狀況,請檢視並比較 /etc/sysctl.conf 和 /etc/sysctl.conf.rpmnew
兩個檔案內容的差異並做適當的調整,若您什麼都不知道,且之前也沒有做
過任何修改,您也可以忽略不用去管它。
在升級完 kernel 後,請檢查您的 lilo.conf 或是 grub.conf,並做適當
的修改,接著就是 reboot 測試新安裝的 kernel 是否正常運作,若一切
順利,那恭喜您了。
(圖3-1)

解決了上述那些難纏的套件後,接下來我們就可以利用 apt 來進行升級的工作。
若您是大幅度的進行升級動作(如從 RH7.0、RH7.1、RH7.2、gaga-pre1、gaga-pre2
及 CLE 更早之前的版本來進行升級),那麼即使是使用 apt 來升級,相信也會是
問題一堆的。底下我就實際來操作大幅度的升級動作,並提供一些相關的經驗及技巧。
先執行 "apt-get update" 後再執行 "apt-get upgrade",會出現類似(圖4-1)、
(圖4-2)的畫面。總共有300多個套件要升級。這時您若按 "y" 來進行升級,我猜大部
分的狀況會是花了一段時間下載回套件檔案後,開始執行安裝沒多久就會出現一大堆
問題了。另外一種情形,要是您當初預留的磁碟空間不夠大,那可能還沒下載完這 300
多MB的檔案之前,就已經先把你的硬碟給灌爆了,更別說還要解壓縮等一些有的沒的暫
存空間,且多安裝軟體也會多佔用硬碟的空間。因此,我的建議是用 apt 分批來升級。
這樣一來,硬碟不會爆掉,也更能隨時掌握升級的狀況。
好了,既然要分批來升級,那麼應該從何開始著手呢?
我的建議是先解決比較容易出問題的套件,至於哪些套件比較容易出問題,底下我會慢
慢提到,另外,如(圖4-1)所示,我們看到主要有分成兩區,一個是:
"The following packages have been kept back"
另一區則是:
"The following packages will be upgraded"
有時候您或許還會看到其他幾區如:
"The following extra packages will be installed:
"The following packages will be REPLACED:"
"The following packages will be REMOVED:"
"The following NEW packages will be installed:"
基本上這些都是 apt 系統根據 dependencies 狀況所做的調整,等到底下遇到時我再
來做說明。
我的建議是,先把 "The following packages have been kept back" 那區的套件給
解決掉,往後會遇到的問題會少很多。
若您有安裝 X Window,那我也建議先把 XFree86 等相關套件升級完成後再去升級其他
的套件,這樣問題也會少一些。
(圖4-1)

(圖4-2)

Q4: 怎麼升級 X Window 的相關套件,升級 XFree86 時遇到問題該如何解決?
A4: 如(圖4-3)所示,我們利用 "apt-get install" 來升級 XFree86 及之前提到的
"The following packages have been kept back" 那區的前兩行。
結果執行後出現了 "XFree86: Depends: Glide3" 等錯誤的訊息。
這是因為之前 Red Hat 用的 "Mesa" 等支援 3D 的套件,現在改由 "Glide3"
來取代。因此,如(圖4-3)下方所示,這次我們把 "apt-get install" 指令最後
再多加上 "Glide3" 這個套件。
(圖4-3)

執行後如(圖4-4)所示,基本上除了 "The following packages will be REMOVED:"
這區要比較特別注意外,其他幾區則看過即可,確認沒問題後即可按下 'y' 鍵繼續。
(圖4-4)

執行後如(圖4-5)所示,仍然還有錯誤產生,主要是發生在移除套件時,也就是之前提
到要特別注意的 "The following packages will be REMOVED:" 這區,apt 似乎還
是有點笨,不過沒關係,我們手動用 "rpm -e" 來把 "SDL-devel" 這個相依套件先
移除掉,以後要用到時再裝即可,接著再執行一次之前的 "apt-get install" 指令,
如(圖4-5)下方所示。
(圖4-5)

執行後如(圖4-6)所示,這次是 "XFree86-font-utils" 和 "freetype" 這兩個套件
相衝突的問題,因此,我們再重新執行一次 "apt-get install" 指令,並把 freetype
也加進去,如(圖4-6)下方所示。
(圖4-6)

這次換成 "XFree86-base-fonts" 跟 "XFree86-100dpi-fonts"、"XFree86-75dpi-fonts"
這兩個套件相衝突,同樣的,如(圖4-7)下方所示,再把 "XFree86-100dpi-fonts"、
"XFree86-75dpi-fonts" 這兩個套件也加到 "apt-get install" 指令後面。
(圖4-7)

費盡了千辛萬苦,現在終於執行成功,順利的把 "XFree86" 等相關套件給更新完成了。
如(圖4-8)所示。
另外在(圖4-8)的中間有出現幾行 "warning:" 的字樣,照之前提到的,你可以自行比
對一下 "/etc/X11/XF86Config" 和 "/etc/X11/XF86Config.rpmnew" 的內容以及
"/etc/X11/XftConfig" 和 "/etc/X11/XftConfig.rpmnew" 的內容並做適當的調整。
或者建議您乾脆再執行一次 "Xconfigurator" 指令,重新設定一次您的 X Window。
這裡面問題最多、最麻煩、最難搞定的就是 XFree86 這部份了,現在這部份搞定後,
接下來的升級動作就簡單多了。
(圖4-8)

Q5: libpng-1.2.x (libpng.so.3) 和 libpng-1.0.x (libpng.so.2) 的問題。
當我在升級時,遇到類似 "xxx: Depends: libpng.so.3" 的錯誤訊息時,我
該怎麼辦?
A5: 如(圖5-1)所示,先用 "rpm -qa|grep libpng" 指令查詢一下目前系統上 libpng
的版本。若系統上的版本是 libpng-1.0.xx ,則在升級成 libpng-1.2.x 時,若
有發生 dependencies 的問題時,記得順便也把 "libpng10" 套件給裝上,以相容
其他使用 libpng-1.0.xx 版本的套件。
如(圖5-1)所示,執行 "apt-get install" 指令把 "libpng" 及 "libpng10" 同時
升級。
(圖5-1)

執行後若發生如(圖5-2)中間 "The following packages will be REMOVED:" 那區
有一堆套件要移除的狀況時,請先按 'n' 鍵取消。
重新再執行 "apt-get install" 指令,並把剛剛準備要 "REMOVED" 的套件也加到
指令後面,如(圖5-3)所示。至於 "linuxconf" 和 "ntop" 等套件,因為不包含在
distribution 中,所以在這裡無法用 apt 來升級,往後若有需要的話,再自行去下
載回來安裝即可。
(圖5-2)

(圖5-3)

執行後若發生如(圖5-3)下方所示之 "gd: Depends: libpng.so.3"、
"gd-progs: Depends: libpng.so.3" 的錯誤訊息時,請先用 "rpm -qa|grep gd"
指令來檢查您目前系統上 "gd" 相關套件的版本,如(圖5-4)所示。
這不是 libpng 套件的問題,而是 gd 套件本身的問題,因為之前 gaga-pre1 等
版本中的 gd 套件,是採用 Red Hat rawhide 中的版本,如(圖5-4)所示,版本為
"gd-1.8.4-5" ,而在 Red Hat-7.3/GAGA 最新版中的 gd 版本卻是 "gd-1.8.4-4"
因此,請自行手動下載回下列幾個套件,並用 "rpm -Uvh --force" 指令先強制升
級,如(圖5-4)中間所示:
gd-1.8.4-4.i386.rpm
gd-devel-1.8.4-4.i386.rpm
gd-progs-1.8.4-4.i386.rpm
執行好後,再重新執行 "apt-get install" 指令來升級 libpng 等套件即可,如
(圖5-4)下方所示。
(圖5-4)

執行後如(圖5-5)所示,發生了 "ghostscript" 和 "gimp" 兩個套件相衝突的問題。
因此,我們重新執行 "apt-get install" 指令,把 "gimp" 套件也加進去,如(圖5-6)
所示。
(圖5-5)

(圖5-6)

接下來如(圖5-7)、(圖5-8)所示,順利的完成升級動作。要注意的是,在其中有許多
地方有出現 "warning:" 的字樣,在此再提醒您一次,請記得比對一下那些 xxx
和 xxx.rpmnew 或 xxx.rpmsave 等新、舊設定檔的內容,並做適當的修改。
(圖5-7)

(圖5-8)

接下來請執行 "apt-get upgrade" 指令,如(圖6-1)、(圖6-2)所示,之後的升級
動作,我們就都以(圖6-1)、(圖6-2)為範本來做升級。因此,請您先開一個 rxvt
視窗來執行 "apt-get upgrade" 指令,然後按 'n' 鍵先取消,接著再開另一個
rxvt 視窗,用這個後開的視窗專門來執行 "apt-get install" 指令,並從先從的
rxvt 視窗中剪貼套件過來升級,一次升級個兩行或三行,隨你高興,按照之前的原
則,以(圖6-1)中的 "The following packages have been kept back" 那區的優
先處理,然後再來處理 "The following packages will be upgraded" 這區。
(圖6-1)

(圖6-2)

一連串的升級動作如(圖6-3)至(圖6-12),這中間應該都會很順利。唯一出現問題
的只有兩個地方。
Q6: 當我在升級時遇到類似 "error: execution of % post scriptlet from xxxxxx
failed, exit status 1" 的錯誤訊息時,我該怎麼辦?
A6: 如(圖6-9)及(圖6-11)所示,在升級 "sh-utils" 和 "textutils" 這兩個套件時,
最容易發生此類的錯誤訊息。解決方法如(圖6-10)及(圖6-11)下方所示,請先執
行 "rpm -q sh-utils" 和 "rpm -q textutils" 指令,然後您會發現,系統上竟
然同時存在兩個版本的 ""sh-utils" 和 "textutils" 套件,因此,接下來,我們
只要手動用 "rpm -e" 指令來把較舊的那個版本給移除掉即可。
(圖6-3)

(圖6-4)

(圖6-5)

(圖6-6)

(圖6-7)

(圖6-8)

(圖6-9)

(圖6-10)

(圖6-11)

(圖6-12)

所有的套件都升級完成後,再執行一次 "apt-get upgrade" 指令,出現如(圖6-13)
的畫面,那就表示您目前的系統已經是最新的了。
最後再執行一下 "apt-get clean" 指令來把暫存區中的套件給刪除掉。
到此,就大功告成了。
(圖6-13)

Q7: 如何利用 apt 來定期自動更新?
A7: 首先,請確定您的 /etc/apt/sources.list 檔案裡的內容沒問題。
接著請用 root 的身份執行 "crontab -e" 的指令,然後在最後面加上底下這行:
(請注意,底下那兩行實際上是連在一起為一行的)
0 1 * * 6 apt-get update>/dev/null 2>&1 && apt-get -y -f install>/dev/null 2>&1
&& apt-get -y upgrade>/dev/null 2>&1 && apt-get clean
如上述那行為例,則是每個星期六的凌晨一點整自動執行 apt 相關的指令來自動下載相關
的套件並執行升級的動作,最後再把 cache 中的暫存檔案刪除,您也可以根據您的需求來
自行調整更新的週期。
在本文件版權聲明完整保存並且未被更改的條件下,本文件允許個人使用者
以任何形式複製及流傳,無論是包含整份文件或是一部份、無論是利用電子
媒體或是任何實質的物理媒介來複製及流傳。
非經同意,不允許任何商業行為的重製及仿製,亦不得於商業網站收錄及提
供下載。
如何取得這份文件的最新版本﹖
http://cle.linux.org.tw/~candyz/APT_FAQ/
http://www.linux.org.tw/~candyz/APT_FAQ/
http://mail.thu.edu.tw/~candyz/APT_FAQ/
http://info.sayya.org/~candyz/APT_FAQ/
By Chung-Yen Chang (candyz at linux.org.tw), 2002/07/28