The big emerge
(Note: quite a few people in the forums recommend against building the world due to potential breakage).
At this point, you should update the system using the following:
emerge -uv world
If you get this error:
[blocks B ] sys-apps/pam-login (is blocking sys-apps/shadow-4.0.18.1)...!!! Error: The above package list contains packages which cannot be installed!!! at the same time on the same system.
Then you will need to resolve this using:
FEATURES=-collision-protect emerge --nodeps shadow && emerge --unmerge pam-login
and then repeat the world emerge.
=========================================
原文網址:
http://www.gentoo.org/doc/zh_cn/handbook/handbook-x86.xml?part=2&chap=1
1. Portage入門 內容: 歡迎使用Portage Portage樹 軟體包維護 當Portage抱怨的時候...
1.a. 歡迎使用Portage
Portage可能是Gentoo在軟體包管理方面最矚目的創新。它所具有的高度靈活性以及其他大量的特性,使其經常被認為是Linux中最好用的軟體包管理工具。
Portage完全用Python和Bash寫成。由於它們均為指令碼語言,所以Portage對於使用者而言也就是完全可見的。
絕大部分使用者將通過emerge工具來使用Portage。本章節的目的不是在重複emerge的man page裡已經提供的內容,如果要完整的瞭解emerge工具提供的選項,請參考其man page裡給出的相應說明。
代碼 1.1: 擷取emerge的協助資訊 |
$ man emerge |
1.b. Portage樹
Ebuilds
當我們談到(軟體)包的時候,我們通常指的是Portage樹為Gentoo使用者提供的包的名稱。Portage樹是ebuilds檔案的集合,這些檔案包含了Portage管理工具維護軟體(安裝,搜尋,查詢, ...)時所需要的所有資訊,並被預設的放置在/usr/portage目錄中。
每當您要求Portage對系統中的軟體包執行一些操作的時候,它會以系統中的ebuilds檔案作為基礎。因此您最好定期更新系統Portage樹中的ebuild檔案,這樣Portage才知道新加入了哪些軟體,哪些軟體發布了安全更新,等等。
更新Portage樹
通常我們使用rsync命令來更新Portage樹,它是一個快速的增量性的檔案傳輸工具。另外emerge命令為rsync命令提供了一個相當簡單的前端。
代碼 2.1: 更新Portage樹 |
# emerge --sync |
如果由於防火牆的限制,您無法進行rsync操作,您仍然可以通過下載我們每天匯總的Portage樹快照來更新本地的Portage樹。emerge-webrsync命令會自動將最新的Portage快照下載並安裝到您的系統中。
代碼 2.2: 運行emerge-webrsync |
# emerge-webrsync |
1.c. 軟體包維護
軟體的查詢
要在Portage樹中尋找指的的軟體,您可以使用emerge命令裡內建的尋找功能。預設情況下,emerge --search會返回那些名字與您指定(無論完整或部分)的名字匹配的軟體包。
例如,要尋找那些名字中包含“pdf”字樣的軟體:
代碼 3.1: 尋找名字包含pdf的軟體包 |
$ emerge --search pdf |
而如果要通過軟體的描述來尋找相應的軟體,您可以使用--searchdesc (或者簡寫為 -S) 開關:
代碼 3.2: 尋找與pdf相關的軟體包 |
$ emerge --searchdesc pdf |
當您觀察輸出結果的時候,會注意到它提供了大量資訊。因為相關的地區已經進行了明確的標註,我們就不再進一步介紹各個部分的含義:
代碼 3.3: 'emerge --search'返回結果的例子 |
* net-print/cups-pdf Latest version available: 1.5.2 Latest version installed: [ Not Installed ] Size of downloaded files: 15 kB Homepage: http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/ Description: Provides a virtual printer for CUPS to produce PDF files. License: GPL-2 |
軟體的安裝
每當您找到一個感興趣的軟體,您可以輕鬆地用emerge命令安裝它。例如,要安裝gnumeric:
代碼 3.4: 安裝gnumeric |
# emerge gnumeric |
因為許多應用程式互相依賴,試圖安裝其中任何一個,可能將會要求同時安裝其所依賴的其他相關軟體。無需擔心,Portage可以很好地處理軟體包間的依賴問題。當您安裝某個軟體的時候,您可以加上--pretend開關,以便觀察Portage將會同時安裝哪些軟體。例如:
代碼 3.5: 假裝安裝gnumeric |
# emerge --pretend gnumeric |
當您要求Portage安裝一個軟體的時候,必要時它會自動從internet下載相應的原始碼包並預設將其儲存在/usr/portage/distfiles目錄中,然後將原始碼包解壓縮,編譯並安裝軟體。如果您僅僅希望Portage將原始碼包下載到本地而不安裝它們,在emerge命令後加上--fetchonly的選項:
代碼 3.6: 下載gnumeric的原始碼包 |
# emerge --fetchonly gnumeric |
尋找已安裝軟體的文檔
許多軟體包中包含有自己的文檔,有些時候doc的USE標記決定了軟體包中的內建文檔是否會被安裝到本地。您可以通過emerge -vp <軟體包名稱>命令來檢查是否存在doc USE標記。
代碼 3.7: 檢查是否存在doc的USE標記 |
(當然alsa-lib只是一個例子。)# emerge -vp alsa-lib[ebuild N ] media-libs/alsa-lib-1.0.14_rc1 -debug +doc 698 kB |
最好的啟用doc的方式是在/etc/portage/package.use裡對想要啟用的包單獨啟用,這樣你就能只獲得你想要的軟體文檔。全域啟用此標記已知會導致循環相依性。欲瞭解更多資訊請看USE標誌一章。
當一個軟體包安裝結束後,它的文檔通常會存放在/usr/share/doc目錄下以軟體包名命名的子目錄中。您也可以通過equery工具來列出此軟體安裝後產生的所有檔案,這個工具來自於app-portage/gentoolkit 包。
代碼 3.8: 定位包的文檔 |
# ls -l /usr/share/doc/alsa-lib-1.0.14_rc1total 28-rw-r--r-- 1 root root 669 May 17 21:54 ChangeLog.gz-rw-r--r-- 1 root root 9373 May 17 21:54 COPYING.gzdrwxr-xr-x 2 root root 8560 May 17 21:54 html-rw-r--r-- 1 root root 196 May 17 21:54 TODO.gz(或者使用equery來定位您感興趣的檔案:)# equery files alsa-lib | lessmedia-libs/alsa-lib-1.0.14_rc1* Contents of media-libs/alsa-lib-1.0.14_rc1:/usr/usr/bin/usr/bin/alsalisp(部分輸出內容) |
軟體的移除
當您想把一個軟體包從系統中移除的時候,使用emerge --unmerge命令。命令執行完成後,除了那些在安裝軟體包後您修改過的設定檔,Portage將會移除此軟體包安裝到您系統中的所有檔案。保留這些修改過的設定檔是為了便於您今後再次使用同一個軟體包。
不過,您需要特別注意的是:Portage將不會檢查您要刪除的包是否仍被其他的包依賴。但是當您要刪除一個可能破壞您系統的重要的軟體包時,它還是會給予警告。
代碼 3.9: 從系統中刪除gnumeric |
# emerge --unmerge gnumeric |
當您從系統中移除一個軟體包時,之前那些為了滿足其依賴關係而自動被一併安裝的軟體包將會被保留。如果想讓Portage找出那些現在可以移除的相關軟體包,可以使用emerge的--depclean功能。稍後我們將談到這點。
更新您的系統
要保持您系統在最佳狀態(更不用說安裝那些最新的安全更新),您需要週期性更新您的系統。由於Portage只能檢查本地Portage樹中已有的ebuilds檔案,因此您首先應該更新您的Portage樹。當您的Portage樹更新後,您可以用emerge --update world命令來更新系統。在下一個例子裡,我們還會使用--ask開關來控制Portage顯示它要更新的軟體包列表,並讓您決定是否繼續更新。
代碼 3.10: 更新您的系統 |
# emerge --update --ask world |
Portage接下來會尋找您已經安裝的軟體包是否有更新版本,但它只會核對那些您已經明確地安裝過的軟體包(也就是在/var/lib/portage/world檔案中列出的包),並不會完整去的檢查與這些軟體產生依賴關係的包是否也需要更新。如果您想更新系統中的每個軟體包,那就加上--deep參數:
代碼 3.11: 更新整個系統 |
# emerge --update --deep world |
因為有時開發人員會為那些您沒有明確要求安裝(但被其他軟體包依賴而裝入系統中)的包推出安全更新,我們也推薦偶爾運行一下這個命令。
每當您改變了系統中任何的USE標記後,您可能需要加入--newuse選項。這樣Portage將會檢查這個USE標記的變動是否導致需要安裝新的軟體包或者將現有的包重新編譯。
代碼 3.12: 執行完整更新 |
# emerge --update --deep --newuse world |
Meta軟體包
Portage樹中的一些軟體包並沒有包含任何實際的內容,而只是用來安裝一系列軟體包的集合。例如,kde包就是一個包含了一系列與KDE相關的互相依賴的軟體包的集合,您可以通過安裝它來在系統中搭建起一個完整的KDE環境。
如果您試圖從系統中移除一個這樣的軟體包的集合體,只是單純地使用emerge --unmerge命令並不能完成您的要求,原因在於這些包的依賴關係仍然保留在系統中。
不用擔心,Portage也提供了移除孤立依賴的軟體包的功能,但由於軟體包間的依賴關係是動態,您首先需要充分地更新您的整個系統,包括更改USE標記設定而導致的變化。在這之後您可以運行emerge --depclean來移除那些完全沒有被其他包依賴的軟體包(“orphaned dependencies”)。移除之後你需要重新編譯那些曾經與剛剛移除的這些包動態串連過的應用程式,因為實際上這些程式不需要那些包。
所有這些可以用以下三個命令來實現:
代碼 3.13: 移除孤立依賴的軟體包 |
# emerge --update --deep --newuse world# emerge --depclean# revdep-rebuild |
revdep-rebuild工具由gentoolkit包提供;使用前別忘了首先emerge它:
代碼 3.14: 安裝gentoolkit包 |
# emerge gentoolkit |
1.d. 當Portage抱怨的時候...
有關SLOT,Virtual,分支,體繫結構和Profile
正如我們之前指出的那樣,Portage是一個非常強大並支援許多特性的軟體包管理工具,而這是其他類似工具所欠缺的。為了理解這一點,我們為您粗略地解釋一些Portage的面貌。
通過使用Portage,一個軟體的不同版本可以共存於一個系統中。其他發行版傾向於直接在軟體包名字中包含版本號碼(例如freetype 和 freetype2),Gentoo的Portage使用一種我們稱之為SLOT的技術來實現這種並存。一個ebuild為它自身的版本聲明了一個確切的SLOT。具有不同SLOT的同一軟體的Ebuild可以共存於同一個系統中。例如,上例中那個freetype包就擁有不同的ebuilds,裡面分別有SLOT="1"和SLOT="2"的標誌。
有一些不同的軟體包提供了類似的功能。比如metalogd,sysklogd和syslog-ng都是系統日誌記錄工具。那些依賴於“系統日誌記錄工具”的程式並不能隨便的依賴於其中之一,比如metalogd,因為其他的系統日誌工具可能也是很好的選擇。好在Portage允許使用虛擬包:每一個系統日誌記錄工具都可以提供virtual/syslog包,因此應用程式們可以設定成僅僅依賴於virtual/syslog即可。
Portage樹中的軟體可以存在於不同的分支中。您的系統預設只會接受那些Gentoo認為穩定的軟體包。絕大多數新提交的軟體會被添加到測試分支裡。這意味著在此軟體被標示為穩定版前需要進行更多的測試。儘管您可以看到那些軟體的ebuilds已經加入Portage樹,在它們未被加入穩定分支前Portage將不會安裝它們。
有些軟體只在某幾個體繫結構上可用。或者在其他體繫結構中還不能運行,或者仍需要對其進行更多的測試,或者將軟體提交到Portage樹中的開發人員還不能確定這個軟體能否運行於其他體繫結構。
每一個Gentoo安裝都依附於一個確定的profile,此檔案裡除了其他資訊外還包含了一個正常工作的系統需要的軟體包的列表。
被阻擋的包
代碼 4.1: Portage關於被阻擋的包的警告(使用 --pretend參數) |
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1) |
代碼 4.2: Portage關於被阻擋的包的警告(不使用 --pretend參數) |
!!! Error: the mail-mta/postfix package conflicts with another package.!!! both can't be installed on the same system together.!!! Please use 'emerge --pretend' to determine blockers. |
Ebuilds檔案中包含了特定的欄位,裡面為Portage提供了此軟體的各種依賴關係的資訊。總計有兩種可能的依賴關係:一種是編譯依賴,在DEPEND地區進行聲明;另一種是“運行時”依賴,在RDEPEND地區中進行聲明。如果上述兩種依賴關係中任何一個明確指明某個實體或者虛擬包(譯註:可能已安裝和正要安裝)與要安裝的包不相容的時候,就會阻擋軟體的安裝。
為了使安裝得以繼續進行,您可以選擇不安裝這個軟體包,或者先將發生衝突的包卸載。例如,在我們給出的這個例子中,您可以選擇不安裝postfix,或者先卸載ssmtp。
你也可能會遇到某些特定版本的包被屏蔽的情況,比如<media-video/mplayer-bin-1.0_rc1-r2。在這種情況下,升級到一個更新的版本就能解決問題。
也有可能兩個需要安裝的包互相阻擋。這種少見的情況下,您應該明確自己為什麼需要同時安裝它們。絕大多數時候您只需要安裝它們之中的一個就可以了。如果不是這樣,請您到Gentoo的bug跟蹤系統中提交一個bug,以便我們找出解決方案。
被屏蔽的包
代碼 4.3: Portage關於被屏蔽的包的警告 |
!!! all ebuilds that could satisfy "bootsplash" have been masked. |
代碼 4.4: Portage關於被屏蔽的包的警告——原因 |
!!! possible candidates are:- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)- dev-util/cvsd-1.0.2 (masked by: missing keyword)- games-fps/unreal-tournament-451 (masked by: package.mask)- sys-libs/glibc-2.3.2-r11 (masked by: profile) |
當您想安裝一個對於您系統停用軟體包。您會收到類似這樣的屏蔽錯誤提示。您應該試著安裝那些對於您系統可用的程式或者等待那些停用包被置為可用的。通常一個軟體包被屏蔽的原因在於: ~arch keyword 意味著這個軟體沒有經過充分的測試,不能進入穩定分支,請等待一段時間後在嘗試使用它。 -arch keyword或-* keyword 意味著這個軟體不能工作在您機器的體繫結構中。如果您確信它能工作那麼請到我們的bugzilla網站提交一個bug報告。 missing keyword 意味著這個軟體還沒有在您機器的體繫結構中進行過測試。您可以諮詢相應體繫結構移植小組是否能對它進行測試,或者您自己為他們進行這樣的測試並將您得到的結論提交到我們的bugzilla網站。 package.mask 意味著這個軟體被認為是損壞的,不穩定的或者有更嚴重的問題,它被故意標識為“不應使用”。 profile 意味著這個軟體不適用於您的profile。安裝這樣的應用軟體可能會破壞您的系統,或者只是不能與您使用的profile相相容。
依賴缺失
代碼 4.5: Portage關於依賴缺失的警告 |
emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".!!! Problem with ebuild sys-devel/gcc-3.4.2-r2!!! Possibly a DEPEND/*DEPEND problem. |
這表示您正嘗試安裝的應用程式依賴於您的系統停用另外一些軟體包。請到bugzilla查看是否有此問題的記錄,如果沒有尋找到相關資訊的話請提交一個報告。除非您的系統混用了不同分支,否則這類問題不應該發生,若發生了那就是一個bug。
意指不明的Ebuild名稱
代碼 4.6: Portage對於意指不明的Ebuild名稱的警告 |
!!! The short ebuild name "aterm" is ambiguous. Please specify!!! one of the following fully-qualified ebuild names instead: dev-libs/aterm x11-terms/aterm |
您要安裝的應用程式對應有多個同名的包。您需要同時指定類別的名稱。Portage會列出所有可供選擇的名稱匹配的包。
循環相依性
代碼 4.7: Portage關於循環相依性問題的警告 |
!!! Error: circular dependencies: ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2 |
兩個(或多個)您想安裝的包由於循環相依性而不能安裝。這很可能源於Portage樹中的bug。請等一段時間後重新sync再嘗試安裝。您也可以去bugzilla看看是否已經有此問題的報告,或者提交一個關於它的報告。
下載失敗
代碼 4.8: Portage關於下載失敗的警告 |
!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...(...)!!! Some fetch errors were encountered. Please see above for details. |
當Portage下載指定軟體的原始碼失敗時,它會嘗試繼續安裝其它(若適用)的應用程式。原始碼下載失敗可能源於鏡像伺服器沒有正確同步,也可能因為ebuild檔案給出了錯誤的下載地址。那些儲存原始碼的伺服器也可能因為某些原因當機。
一小時後重試一次看看問題是否仍然存在。
系統Profile保護
代碼 4.9: Portage關於profile中保護的包的警告 |
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'!!! This could be damaging to your system. |
您要求移除系統核心軟體包中的一個。它是您的profile中所列出的必需的軟體,因此不能從系統中移除。
Digest驗證失敗
有時當您試圖emerge一個軟體包時,它會失敗並給出以下資訊:
代碼 4.10: Digest驗證失敗 |
>>> checking ebuild checksums!!! Digest verification failed: |
這是Portage樹中出現了錯誤的跡象,通常這是由於開發人員在向Portage樹提交一個軟體包時出錯造成的。
當digest校正失敗的時候,請不要嘗試自己去為此軟體包重新產生digest。使用ebuild foo manifest並不能修複問題,反而幾乎肯定會使問題變得更糟。
取而代之的應該是等待一至兩個小時以便讓開發人員來修複Portage樹。一般來說錯誤很有可能馬上就會被開發人員注意到,但Portage樹的修複也需要一點點時間。當您等待的時候,到Bugzilla看看是否已經有人報告了這個問題。如果沒有,那就為那個損壞的包提交一個bug報告吧。
一旦在Bugzilla上看到此問題已經修複,您只需要重新sync就可以下載下來那些修複後的digest。
重要: 但值得注意的是:這並不意為著您可以短時間內多次重複sync您的portage樹(對於同一個rsync伺服器)。正如(當您運行emerge --sync時)rsync策略所指出的那樣,那些短時間內過於頻繁進行多次sync的使用者將會被補救伺服器禁止訪問(一般是將你的IP添加到禁止名單並保留一段指定的時間後才解除)。實際上,最好等到您的下次計劃更新的日子再sync,因為這樣您不會使rsync伺服器過載而影響其他使用者的正常使用。 |