查看portage的手冊命令user $
man emerge
一般在gentoo中提及的包都是安裝程序,他們的信息一般都在 /usr/portage 目錄下
root #
emerge --sync 更新portage的庫,
root #
emerge-webrsync 防止防火牆阻攔portage聯系鏡像庫
user $
emerge --search pdf 搜索名稱中含有pdf的軟件
user $
emerge --searchdesc pdf 描述搜索
root #
emerge --ask app-office/gnumeric 可安裝對應的程序
root #
emerge --pretend gnumeric 可以查看安裝的程序的依賴
下載一個程序的時候,系統會自動下載一些必要的包並且自動解壓縮安裝。如果你不想這樣做只想解壓縮,那么
root #
emerge --fetchonly gnumeric
1、portage的使用
/usr/portage/profiles/use.desc 存放了全局的USE flag說明,/usr/portage/profiles/use.local.desc 存放了本地的USE flag說明。
系統級的profile符號鏈接到/etc/portage/make.profile。有很多profile,最后輸出的結果是他們的並集,最底層的profile在/usr/portage/profiles/base
root #
emerge --info | grep ^USE 查看現在已啟用的USE flag /etc/portage/make.conf 存放全局的USE flag,如果取消某個支持,在支持前面加上-
修改/etc/portage/package.use的USE flag可以針對某個單獨的程序,它可能是一個文件,也可能是一個文件夾。具體的詳情請輸入man portage查看。
dev-db/mysql berkdb
root #
USE="-java" emerge seamonkey 可以臨時定義取消java支持在seamonkey安裝期間。
USE flag定義采用的優先級(從低到高排)
- 默認USE 設置定義在make.defaults 文件 作為你的 profile 的一部分
- 用戶自定義 USE 設置 在 /etc/portage/make.conf
- 用戶自定義 USE 設置 在 /etc/portage/package.use
- 用戶自定義 USE 設置 在環境變量中 (上面例子)
emerge --info 可以查看相關的USE信息
修改USE flag后需要進行如下設置
root #
emerge --update --deep --newuse @world 更新USE flag完成后應該讓它在系統中生效
root #
emerge --depclean 移除孤立的包,如果不想包被卸載,使用-p
root #
emerge -p --depclean
root #
revdep-rebuild 重新編譯動態鏈接庫 它依賴 app-portage/gentoolkit ,不要忘了先emerge它
root #
emerge --pretend --verbose seamonkey檢查包的依賴項 在app-portage/gentoolkit中有專門實現該功能的命令,舉例,查詢gnumeric包的依賴
root #
emerge --ask app-portage/gentoolkit(安裝)
user $
equery --nocolor uses =gnumeric-1.6.3 -a(查詢依賴)
還有一種REQUIRED_USE表達式,來表明一組必須或者禁止的支持
REQUIRED_USE="foo? ( bar )" 如果foo被設置了, bar必須被設置 REQUIRED_USE="foo? ( !bar )" 如果foo被設置了, bar必須沒被設置. REQUIRED_USE="foo? ( || ( bar baz ) )" 如果foo被設置了, bar 或 baz 必須沒被設置. REQUIRED_USE="^^ ( foo bar baz )" foo bar 或 baz恰好有一個必須被設置。 REQUIRED_USE="|| ( foo bar baz )" foo bar 或 baz 至少有一個被設置 REQUIRED_USE="?? ( foo bar baz )" 不超過一個foo bar 或 baz 可能被設置。
2文檔
USE flag中添加doc可以支持安裝時安裝軟件的文檔。emerge -vp category/package 可查看文檔安裝情況
文檔默認安裝在/usr/share/doc/目錄下,有可以用app-portage/gentoolkit軟件下的equery工具查看 user $
ls -l /usr/share/doc/alsa-lib-1.0.14_rc1
user $
equery files alsa-lib | less
3移除軟件
emerge --unmerge 可以移除軟件,如果用戶修改的配置文件那么配置文件是不會移除的。這是為了再次安裝這個軟件的時候不需要再次配置。被刪除的時候Portage是不會檢查是否有軟件依賴的,因此需要小心謹慎 root #
emerge --unmerge gnumeric,移除的軟件安裝的依賴如果需要刪除,可使用emerge的
--depclean方法。(上面介紹的)
4更新系統
root #
emerge --update --ask @world 更新系統已安裝的應用程序包,它會比較已安裝程序的版本號,已安裝的程序信息在/var/lib/portage/world中,但是它並沒有徹底的更新它們的依賴的包,如果想要更新依賴的包,那么可使用命令
root #
emerge --update --deep @world。但是這仍然不意味着所有的都被更新了,很多包在系統中是在編譯和構建的過程中需要的,但是包一旦安裝了,這些包就不再需要了。Portage稱這些包為build dependencies如果需要這些包也在更新范圍內,則使用
root #
emerge --update --deep --with-bdeps=y @world 如果USE被更新了,建議使用
root #
emerge --update --deep --with-bdeps=y --newuse @world Portage會檢測或重編譯他們。
有的程序安裝時會安裝一系列的包,如 kde-apps/kde-meta會安裝整個完整的KDE環境的依賴包。如果確保沒用可以用emerge --unmerge來移除他們。Portage有方法來去除孤立的依賴包,但是由於軟件的可用性是依賴於動態來評判的,首先完全的更新整個系統是很重要的。emerge --depclean可實現,執行完成后或許應該重新編譯下,防止依賴移除的包。但是現在不需要了,這些功能已經添加到Portage里的。可以用下面的三句命令實現
root #
emerge --update --deep --newuse @world
root #
emerge --depclean
root #
revdep-rebuild
revdep-rebuild 依賴包 app-portage/gentoolkit,不要忘了對它emerge root #
emerge --ask app-portage/gentoolkit
查看包的協議 emerge --search package/category
我們可以配置允許下載的協議在配置文件中
ACCEPT_LICENSE="* -@EULA"
包在安裝期間如果需要進行互動(關聯)的包含有EULA協議就不會被安裝。包如果不含有EULA協議的就可以被安裝。也可以指定某個包的交互的包需要的協議 /etc/portage/package.license,例如為包www-client/google-chrome准許google-chrome協議,把下面添加到/etc/portage/package.license:
www-client/google-chrome google-chrome
tips:許可協議在目錄 /usr/portage/licenses/下,授權組在目錄/usr/portage/profiles/license_groups下,軟件許可的第一行大寫字母是授權組,后面的每行是單獨的許可協議。
授權組定義在ACCEPT_LICENSE 變量中以@符號作為標記,普遍的要求設置只允許安裝免費軟件和文檔。為了達成這個,移除所有的軟件協議並只允許免費的組3
ACCEPT_LICENSE="-* @FREE"
4.Blocked packages
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)
!!! 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它的依賴,一個是 build dependencies,定義在DEPEND 變量中,另一個是run-time dependencies,一般定義在RDEPEND變量中。
解決沖突要么不去安裝,要么去刪除沖突的包。
5.Masked packages
!!! all ebuilds that could satisfy "bootsplash" have been masked.
!!! 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) - net-im/skype-2.1.0.81 (masked by: skype-eula license(s))
當用戶安裝一個gentoo上不是可用的包的時候,就會出現。建議用戶等包變為可用的時候再進行安裝,下面是各種提示以及錯誤
Reason for mask | Description |
~arch keyword | The application is not tested sufficiently to be put in the stable branch. Wait a few days or weeks and try again. |
-arch keyword or -* keyword | The application does not work on your architecture. If you believe the package does work file a bug at our Bugzilla website. |
missing keyword | The application has not been tested on your architecture yet. Ask the architecture porting team to test the package or test it for them and report the findings on our Bugzilla website. |
package.mask | The package has been found corrupt, unstable or worse and has been deliberately marked as do-not-use. |
profile | The package has been found not suitable for the current profile. The application might break the system if it is installed or is just not compatible with the profile currently in use. |
license | The package's license is not compatible with the ACCEPT_LICENSE value. Permit its license or the right license group by setting it in/etc/portage/make.conf or in /etc/portage/package.license |
6.必要的USE flag改變
The following USE changes are necessary to proceed: #required by app-text/happypackage-2.0, required by happypackage (argument) >=app-text/feelings-1.0.0 test
如果 --autounmask沒有設置,那么錯誤的信息也可能如下
emerge: there are no ebuilds built with USE flags to satisfy "app-text/feelings[test]". !!! One of the following packages is required to complete your request: - app-text/feelings-1.0.0 (Change USE: +test) (dependency required by "app-text/happypackage-2.0" [ebuild]) (dependency required by "happypackage" [argument])
報警或錯誤有時候並不一定是依賴的包的問題,也可能是必要的USEflag沒有。如上面的例子就是表明,需要設置USE="test",但是系統中並沒有設置。為了解決這個問題,在/etc/portage/make.conf中,或者具體到某個包的配置/etc/portage/package.use中,進行設置。
7.Missing dependencies
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.
安裝的應用的依賴的包不是可用的時候就會出現。
8.模棱兩可的ebuild名字
[ Results for search key : listen ] [ Applications found : 2 ] * dev-tinyos/listen [ Masked ] Latest version available: 1.1.15 Latest version installed: [ Not Installed ] Size of files: 10,032 kB Homepage: http://www.tinyos.net/ Description: Raw listen for TinyOS License: BSD * media-sound/listen [ Masked ] Latest version available: 0.6.3 Latest version installed: [ Not Installed ] Size of files: 859 kB Homepage: http://www.listen-project.org Description: A Music player and management for GNOME License: GPL-2 !!! The short ebuild name "listen" is ambiguous. Please specify !!! one of the above fully-qualified ebuild names instead.
選擇的包的名稱有多個相似的包,這個時候提供類別名稱是個好的選擇。
9.循環依賴
!!! Error: circular dependencies: ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1 ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2
兩個包互相依賴~
10.匹配失敗
!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing... (...) !!! Some fetch errors were encountered. Please see above for details.
匹配失敗,可能由於ebuild指向不正確或mirror沒有同步。
11.系統配置保護
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage' !!! This could be damaging to your system.
用戶刪除的包是系統核心組成的一部分。不能被移除。
12摘要驗證失敗
>>> checking ebuild checksums
!!! Digest verification failed:
軟件的簽名和gentoo repository里的不匹配。通常,這是由於開發者提交包到tree里的時候犯了錯誤。通常解決辦法就是等一兩個小時,tree穩定下來,然后再次嘗試。
13 USE flags是什么
USE flags背后的思想是什么?
由於各個環境的不同(生活,辦公,開發),所以需要的特性也不同。如果不用openGL,那么為什么軟件要加上對他的支持,編譯安裝的時候需要對它進行支持。它可以幫助用戶決定哪些需要和哪些不需要,用戶可以選擇一個特定的環境以及配置簡化流程。
定義一個USE flags
例如,當你USE flags里沒有kde的話,那么安裝軟件時,kde將無法作為一個支持或者一個依賴就行安裝,通過正確地定義關鍵字該系統將專門針對用戶的需求定制。
USE flags 存在什么
有兩種類型的USE flags:一種是global,一種是local。global全局的可使用USE flags在 main site中,在 /usr/portage/profiles/use.desc中找到。local本地的可使用USE flags在 main site中,可以在/usr/portage/profiles/use.local.desc中找到。
14 使用USE flags
定義USE flags
root #
emerge --info | grep ^USE
USE="-kde -qt4 ldap"
安裝或移除相應的USE flags(global)
dev-db/mysql berkdb
增加USE flags berkdb的支持對於mysql而言。(local) 移除用-
定義臨時使用的USE flags
有時候我們需要在很短的時間里用到USE flags,這就需要我們設置 /etc/portage/make.conf 文件兩次(添加和移除),此命令只在命令行里生效。
下面是僅在seamonkey安裝過程中移除對java的支持
root #
USE="-java" emerge seamonkey
優先級
下面最開始的擁有最低的優先級。
-
- 默認的USE設置定義在 make.defaults 文件中,作為你的profile的一部分
- 用戶自定義的 USE 設置在 /etc/portage/make.conf
- 用戶自定義的 USE 設置在 /etc/portage/package.use
- 用戶自定義的 USE 設置 被當做環境變量
為了查看最終的Portage USE設置,執行emerge --info命令,它會列出所有相關的變量(包括USE變量)關於他們當前自定義的Portage相關變量。
新定義的USE flags 讓它在整個系統中生效
改變過USE flags之后,整個系統應該更新,以便映射到新的USE flags
root #
emerge --update --deep --newuse @world
然后我們需要移除一些以前過時的依賴
root #
emerge -p --depclean (做這個應該小心,需要確保被移除的依賴在其他的應用中沒有使用到)、
然后運行revdep-rebuild 來重新編譯那些動態依賴庫的程序,它依賴app-portage/gentoolkit,
root #
revdep-rebuild 現在系統已經在使用新的USE flags了
包指定USE flags
讓我們以seamonkey為例,來看看它監聽了哪些USE flags
root #
emerge --pretend --verbose seamonkey
These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild R ] www-client/seamonkey-1.0.7 USE="crypt gnome java -debug -ipv6 -ldap -mozcalendar -mozdevelop -moznocompose -moznoirc -moznomail -moznopango -moznoroaming -postgres -xinerama -xprint" 0 kB
app-portage/gentoolkit 有個專門用來實現這個功能的工具
root #
emerge --ask app-portage/gentoolkit
一些包,必須或者禁止某些USE flags,這些都是通過變量REQUIRED_USE表達式來實現的。
Example | Description |
---|---|
REQUIRED_USE="foo? ( bar )" |
If foo is set, bar must be set. |
REQUIRED_USE="foo? ( !bar )" |
If foo is set, bar must not be set. |
REQUIRED_USE="foo? ( || ( bar baz ) )" |
If foo is set, bar or baz must be set. |
REQUIRED_USE="^^ ( foo bar baz )" |
Exactly one of foo bar or baz must be set. |
REQUIRED_USE="|| ( foo bar baz )" |
At least one of foo bar or baz must be set. |
REQUIRED_USE="?? ( foo bar baz )" |
No more than one of foo bar or baz may be set. |
15.Portage 的特性
portage有許多特寫讓gentoo變得更加的好,許多特性都依賴於某個具體軟件去提升它的性能,可靠性和安全性。
啟用關閉某個portage特性,編輯/etc/portage/make.conf。更新或設置 FEATURES變量,它已經有了許多特性關鍵詞,被空格分割。在許多場景中,特性依賴的附加工具被安裝是很有必要的。
為了有個完整的瀏覽,請查閱:
user $
man make.conf
為了找出FEATURES的默認設置,運行 emerge --info ,匹配FEATURES
user $
emerge --info | grep ^FEATURES=
16.分布式編譯
使用distcc
distcc是通過在服務器上分布式編譯的一個項目。它能將源代碼分片進行編譯。更多的內容可以訪問 Distcc
安裝distcc
這個工具會自動安裝,如果設置成USE=gnome
或 USE=gtk
root #
emerge --ask sys-devel/distcc
激活Portage distcc的支持
再/etc/portage/make.conf中添加distcc到FEATURES 中。然后修改MAKEOPTS 變量,增加系統允許的並行運行任務的數量,一個已知的方案是填充-jN,N是執行cpu運行的數量(包括當前主機)+ 1,但這僅僅是個指導方案。接着運行 distcc-config,輸入可用的distcc服務列表,一個簡單的例子就是假定可用的DISTCC服務為192.168.1.102(當前主機),192.168.1.103 和192.168.1.104(兩個“遠程”主機)。
root #
distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"
別忘了運行distcc守護進程
root #
rc-update add distccd default
root #
/etc/init.d/distccd start
17.緩存編譯對象
關於ccache
ccache 是一個快速的編譯緩存器,無論何時一個項目被編譯了,它會緩存編譯期間的結果,無論何時相同的項目再次被編譯時,編譯時間大大減少。第一次ccache運行的時候,它會比正常的編譯慢很多,后來重復編譯的時候速度會快很多。ccache 對於一個項目需要被重復編譯很多次具有幫助性(或同一應用程序的升級是經常發生的),因此對於軟件開發人員來講是很有用的。
注意:ccache會導致大量的編譯失敗。有時ccache代碼保留過期代碼對象或損壞的文件,從而導致包無法被emerged,如果發生了(錯誤如:File not recognized: File truncated出現在build log中),再報告錯誤之前,請禁用ccache再編譯一次 (FEATURES="-ccache" 在
/etc/portage/make.conf)
安裝ccache
root #
emerge --ask dev-util/ccache
激活Portage ccache的支持
打開/etc/portage/make.conf,添加ccache
到任意一個FEATURES 變量中,如果不存在就創建,然后添加一個新的變量叫CCACHE_SIZE ,設置成2G。
FEATURES="ccache" CCACHE_SIZE="2G"
我們下面一步要設置緩存目錄,
root #
CCACHE_DIR="/var/tmp/ccache" ccache -s 也可以在文件 /etc/portage/make.conf 中設置CCACHE_DIR 變量來改變它
單獨運行ccache 的時候,它會使用${HOME}/.ccache/的目錄來作為緩存目錄,所以我們要像上面做的設置它的CCACHE_DIR
不存在Portage情況下使用ccache
PATH="/usr/lib/ccache/bin:/opt/bin:${PATH}"
18.二進制包支持
創建預構建包
Portage支持安裝預構建的包,盡管gentoo本身並不提供預構建的包而且Portage本身可以制作成預構建的包。如果包已經被安裝到系統上了,為了創建一個預構建的包,可以使用quickpkg 命令,或者emerge 帶上 --buildpkg
或--buildpkgonly
為了擁有portage創建的每個已安裝的包的預構建包,在FEATURES 變量中添加buildpkg
。更多的擴展支持為了創建預構建包的設置可以在catalyst中獲得。
安裝預構建的包
盡管gentoo自身並不提供,但是可以創建一個中央存儲庫,存儲預先構建的包。為了使用這個庫,有必要讓Portage意識到它,通過修改PORTAGE_BINHOST 變量來指向它。
例如,如果預構建包在 ftp://buildhost/gentoo 中,那么:
PORTAGE_BINHOST="ftp://buildhost/gentoo"
為了安裝預構建包,emerge 命令中在--usepkg選項旁邊增加--getbinpkg選項,這種格式告訴emerge從上面定義的服務中去下載預構建包,而usepkg告訴emerge獲取來源並編譯它之前首先試着先下載預構建包。
例如,我們用預構建包安裝gnumeric
root #
emerge --usepkg --getbinpkg gnumeric
更多的信息可以查閱 user $
man emerge
分發預先構建的包給別人
如果預構建包需要分發給他人,首先確定這否被允許,這需要檢查上游的包。例如,一個包的源在GNU GPL協議下,那么源必須是可用的二進制文件
如果構建的二進制文件是不能被分發的,那么安裝程序可以在變量RESTRICT 中定義bindist
,有時這個限制條件在一個或多個USE flags.
默認情況下,因為有這些限制,portage不會隱藏任何包,這可以通過在/etc/portage/make.conf中設置ACCEPT_RESTRICT 變量進行全局的改變。
例如,為了隱藏一個有bindist限制的包,添加下面的行到make.
ACCEPT_RESTRICT="* -bindist"
也可以通過在emerge 命令行中傳遞--accept-restrict選項重寫ACCEPT_RESTRICT變量。例如,--accept-restrict=-bindist可以臨時的掩蓋有bindist
限制的包。
分發包的時候還得考慮ACCEPT_LICENSE 變量的設置。
19.獲取文件
Userfetch
當portage使用的root運行,FEATURES="userfetch"將允許portage獲取包源的時候終止root權限,這是一個很小的安全性的改善。
驗證Gentoo庫快照
Administrators可以選擇更新本地的gentoo安裝程序tree(使用密碼快照驗證,鏈接到gentoo基礎服務),這將確保系統下載的包,不會有惡劣的rsync鏡子添加到不必要的代碼或包。
Gentoo發行媒體OpenPGP鑰匙現在可以作為二進制keyring,可通過 app-crypt/gentoo-keys 包安裝。GPG是一個加密軟件。
root #
emerge --ask app-crypt/gentoo-keys
這個將會將keyring安裝到/var/lib/gentoo/gkeys/keyrings/gentoo/release目錄
FEATURES="webrsync-gpg" PORTAGE_GPG_DIR="/var/lib/gentoo/gkeys/keyrings/gentoo/release"
[DEFAULT] main-repo = gentoo [gentoo] # Disable synchronization by clearing the values or setting auto-sync = no # Do not set value of the variables in this configuration file using quotes ('' or "")! # For portage-2.2.18 use 'websync' # For portage-2.2.19 and greater use 'webrsync' (websync was renamed to webrsync) sync-type = webrsync sync-uri = auto-sync = yes
確認 app-crypt/gnupg已經被安裝(確保USE flags里有latex)
root #
emerge --ask app-crypt/gnupg
使用gpg去驗證keys在keyring 中是正確的keys
root #
gpg --homedir /var/lib/gentoo/gkeys/keyrings/gentoo/release --with-fingerprint --list-keys
官方的點擊 those listed on the official Gentoo release engineering project page.
root #
gpg --homedir /var/lib/gentoo/gkeys/keyrings/gentoo/release --edit-key 0xDB6B8C1F96D8BF6D trust
gpg命令行變會出現,完全信任key,退出程序通過輸入以下:
gpg>
4
gpg>
quit
root #
emerge --sync
root #
emaint sync -a
root #
emaint sync --repo gentoo
root #
emerge-webrsync

1 si::sysinit:/sbin/rc sysinit
這行告訴init,它必須運行/sbin/rc sysinit 去初始化系統,/sbin/rc腳本負責初始化。也許有人會說,init做得並不多,它委托初始化系統的任務到另一個進程中。其次init執行所有符號鏈接到/etc/runlevels/boot/的腳本,這在下面定義。

1 rc::bootwait:/sbin/rc boot
rc腳本執行必要的任務,注意給的boot選項和/etc/runlevels/目錄下使用的是相同的名稱。
現在,init檢查它的配置文件去看看它改運行什么runlevel,它會讀取/etc/inittab里的下面一行去決定:

1 id:3:initdefault:
在這種情況下(Gentoo的大多數用戶將使用),runlevel id 為 3,利用這些信息,init檢查必須要運行的runlevel為3的:

1 l0:0:wait:/sbin/rc shutdown 2 l1:S1:wait:/sbin/rc single 3 l2:2:wait:/sbin/rc nonetwork 4 l3:3:wait:/sbin/rc default 5 l4:4:wait:/sbin/rc default 6 l5:5:wait:/sbin/rc default 7 l6:6:wait:/sbin/rc reboot
定義級別3的那行,使用 rc腳本去開始運行服務,后面的參數也跟 /etc/runlevels/的子文件夾同名。
當rc運行結束,init決定應該激活的虛擬控制台和在每個控制台需要運行什么命令:

1 c1:12345:respawn:/sbin/agetty 38400 tty1 linux 2 c2:12345:respawn:/sbin/agetty 38400 tty2 linux 3 c3:12345:respawn:/sbin/agetty 38400 tty3 linux 4 c4:12345:respawn:/sbin/agetty 38400 tty4 linux 5 c5:12345:respawn:/sbin/agetty 38400 tty5 linux 6 c6:12345:respawn:/sbin/agetty 38400 tty6 linux
可用的runlevels
runlevel是系統運行的狀態,包含一組腳本(runlevel或initscripts)進入或離開時,必須執行一個runlevel。
Gentoo中,有七個runlevels:三個內部runlevels,4個用戶定義的runlevels。
內部的runlevels為sysinit,shutdown和reboot,執行着他們名稱的含義,初始化系統,供電系統和重新啟動系統。
用戶自定義的runlevels在/etc/runlevels/文件夾下。分別為boot, default, nonetwork 和 single 。boot的runlevel 執行了其他runleves也使用的所有系統必備的服務。剩下的三個runlevels開始的服務是不同的,default用於日常的操作,nonetwork使用時不需要網絡連接,single 系統需要被修復的時候使用。
使用initscripts
rc一開始處理的腳本叫做init scripts ,/etc/init.d/里的每個腳本都能帶start
, stop
, restart
, zap
, status
, ineed
, iuse
,needsme
, usesme
, 或 broken參數執行。
開始、停止或重新啟動一個服務(和所有依賴的服務),start
, stop
, 和 restart
參數應該被帶上:
root #
/etc/init.d/postfix start
注意:如有A服務依賴此停止的服務B(但是對於A來說,B不是必須的,而僅僅是使用到的)則不會影響A的運行
停止一個服務,但不停止依賴它的服務,可以加上--nodeps參數
root #
/etc/init.d/postfix --nodeps stop
下面可查詢服務的狀態
root #
/etc/init.d/postfix status
如果顯示的狀態和實際的運行狀態不符,下面命令可以更新狀態
root #
/etc/init.d/postfix zap
如果要查看服務的依賴,使用iuse或者ineed,ineed可以看到服務的正確運行所必需的服務,
iuse可以查看該服務使用的服務,但他們對於確保正確運行來說不是必要的。
root #
/etc/init.d/postfix ineed
同樣的,它也可以根據該服務去查找什么服務依賴於自己,needsme(確保運行必須的)usesme(使用到的,但不是必須的)
root #
/etc/init.d/postfix needsme
最后,可以查看該服務沒有安裝但是需要依賴的服務
root #
/etc/init.d/postfix broken
更新runlevels
rc-update
Gentoo的init系統使用依賴列表去決定什么服務優先啟動,這是一項枯燥的工作,gentoo官方不希望我們手動去做,他們創建了一個工具去減少runlevels和init腳本的管理。
使用rc-update可以congrunlevel中增加或移除init腳本, rc-update工具也會自動的通知depscan.sh去重編譯依賴列表。
增加或移除服務
在先前的指令里,init腳本已經被添加到 default runlevel里了。 rc-update需要添加參數add
, del
, 或 show。如:
root #
rc-update del postfix default
rc-update -v show命令顯示所有可用的init scripts,列出他們的運行級別
root #
rc-update -v show 也可以 rc-update show僅僅顯示可用的init scripts和他們的運行級別
配置服務
為什么需要額外的配置
Init腳本可能相當復雜,因此不需要用戶直接編輯init腳本,因為這將使它更容易出錯.然而重要的是能夠配置這樣的服務。例如,用戶可能想給服務本身更多的選項。
還有個原因是用戶可以撤銷它的配置,風險小
conf.d目錄
Gentoo提供一個簡單的方法去配置這樣一個服務:每個可以配置的腳本都有/etc/conf.d/這樣一個腳本。例如,apache2 initscript (叫做/etc/init.d/apache2)有個配置文件叫做/etc/conf.d/apache2.Apache 2服務啟動時,它可以包含選項給Apache 2服務:

APACHE2_OPTS="-D PHP5"
這樣一個文件里只包含變量,使它很容易配置服務。
編寫啟動腳本(initscripts)
這真的必要嗎
不,編寫一個init腳本通常是沒有必要,Gentoo提供現成的init腳本。然而,一些用戶可能不使用Portage安裝服務,在這種情況下,他們將最有可能需要創建一個init腳本。
如果服務不是明確的顯示為gentoo而寫的,請不要使用此服務提供的init script,gentoo的init script跟其他的linux分支不兼容,除非服務使用了 OpenRC!
布局
一個init腳本的基本布局如下所示

#!/sbin/openrc-run
depend() {
(Dependency information)
}
start() {
(Commands necessary to start the service)
}
stop() {
(Commands necessary to stop the service)
}
每個init script都需要使用start()方法去定義,其他部分都是可選。
依賴
有兩個dependency-alike設置可以影響init scripts的啟動與排序:use和need。還有兩個影響順序的方法叫做before和after。最后兩個沒有依賴--如果選擇的服務沒有計划執行(或失敗),他們不會使原始的init script執行失敗。
1、use設置通知init system,腳本使用的方法由被選擇的腳本提供,但是並不直接依賴與它。一個好的示例應該使用use logger或 use dns。如果這些服務是可用的,他們會很好的使用。但是如果服務沒有logger或dns服務,服務仍然會工作,但是如果服務存在,他們會在開始前執行並使用它。
2、need設置依賴比較強,該服務啟動之前需要另一個服務啟動成功。如果另一個服務重啟了,該服務也會重啟。
3、當使用before,如果指定的腳本時init level的一部分的時候,給定的腳本會在指定的腳本之前運行
4、after跟上面類似,不過是之后運行。
一個virtual dependency是由一個服務提供的依賴,但不僅僅是由一個服務提供,一個init script可以依賴一個system logger,但是由很多system logger是可用的(metalogd, syslog-ng, sysklogd, ..),不可能need他們所有,所以我們只依賴一個virtual dependency
比如:

depend() {
need net
use logger dns
provide mta
}
可以看到:
需要net(virtual)依賴(哪種提供具體的依賴,比如:/etc/init.d/net.eth0)
使用logger(virtual)依賴(哪種提供具體的依賴,比如:/etc/init.d/syslog-ng)
使用dns (virtual)依賴(哪種提供具體的依賴,比如:/etc/init.d/named)
提供mta (virtual)依賴(這是常見的所有郵件服務器)
控制順序
可以控制init system腳本的順序,由dependency 設置的use 和need進行決定,也通過 before 和 after設置順序,下面是portmap 的示例:

depend() {
need net
before inetd
before xinetd
}
也可以用*來捕獲到同一個runlevel里的所有服務,盡管這是不可取的。

depend() { before * }
如果服務必須寫入本地磁盤,它應該需要localmount。如果把所有的東西放到/var/run/里當成一個pidfile,之后它會在bootmisc之后開始

depend() {
need localmount
after bootmisc
}
標准函數
在depend()函數旁,也很有必要定義start()函數,它包含了所有初始化服務的必要命令,使用
ebegin和
eend去告訴用戶發生了什么是一個很明智的做法。、

start() { if [ "${RC_CMD}" = "restart" ]; then # Do something in case a restart requires more than stop, start fi ebegin "Starting my_service" start-stop-daemon --start --exec /path/to/my_service \ --pidfile /path/to/my_pidfile eend $? }
--exec和--pidfile兩個都應該使用在start和stop函數中,如果一個服務不創建pidfile,如果可能的話就使用--make-pidfile。也可以添加--quiet作為start-stop-daemon的參數,但是這是不被推薦的,除非該服務很冗長。如果服務失敗開始調試使用--quiet可能會阻礙它的進行。
在上面的例子中使用的另一個顯著的設置是檢查RC_CMD變量的內容,不像上面的init script 系統,新的openrc系統不支持指定腳本的重啟功能。相應的,腳本需要檢查RC_CMD 變量的內容,去檢查方法(start()
或 stop()
)否作為restart的一部分。
note:確保--exec實際調用一個服務,而不僅僅是一個shell腳本,這就是init script 應該做的。
更多的示例可以參考/etc/init.d/
另外一個可以定義的(非必須)是stop(),如果start-stop-daemon正在使用,init system足夠的智能的填充這個函數。

stop() { ebegin "Stopping my_service" start-stop-daemon --stop --exec /path/to/my_service \ --pidfile /path/to/my_pidfile eend $? }
如果該服務運行其他的腳本(如bash,python或perl),然后這個腳本之后更改了它的名稱(如原來是foo.py改成了foo),所以添加--name到start-stop-daemon中便很有必要了。

start() { ebegin "Starting my_script" start-stop-daemon --start --exec /path/to/my_script \ --pidfile /path/to/my_pidfile --name foo eend $? }
如果想要查閱更多,start-stop-daemon 有一個優秀的可用的man page可供查詢。
user $
man start-stop-daemon
Gentoo的init script的語法以POSIX Shell 為基礎,由此用戶可以免費的在他們的init scripts里使用sh-compatible的設計。確保其他的設計,如bash-specific,在 init scripts之外去確保這些腳本能夠正常的在gentoo的init scripts執行。
添加自定義選項
如果initscript需要支持比我們已經遇到的更多的選擇,就增加參數到extra_commands 變量中,然后創建跟此選項一樣名稱的函數,例如,支持restartdelay函數:

extra_commands="restartdelay" restartdelay() { stop sleep 3 # Wait 3 seconds before starting again start }
restart()不能被覆蓋
服務配置變量
為了支持/etc/conf.d/的配置文件,沒有具體需要實現:當init腳本執行,以下文件是自動的.
/etc/conf.d/YOUR_INIT_SCRIPT
/etc/conf.d/basic
/etc/rc.conf
同樣,如果init腳本提供了一個虛擬的依賴(如網絡),與該文件依賴的關聯(如/etc/conf.d/net)將被使用。
改變runlevel 的行為
誰可能從中受益
許多筆記本電腦用戶知道的情況:在家,他們需要使用net.eth0,在路上的時候他們不想要使用net.eth0(因為沒有可用的network),Gentoo的runlevel 的行為可以隨便改變這些。
例如:第二個“default”runlevel 可以被創建,這些是在引導的的時候分配給它的其他的init script。在引導的時候,用戶可以選擇什么樣的default runlevel需要被使用。
使用softlevel
首先,先要創建第二個“默認”的runlevel,下面是我們創建的一個offline的runlevel
root #
mkdir /etc/runlevels/offline
為新建的offline的runlevel創建相應的init scripts,例如,有一個復制當前的default runlevel但是沒有net.eth0:
1 root #cd /etc/runlevels/default 2 root #for service in *; do rc-update add $service offline; done 3 root #rc-update del net.eth0 offline 4 root #rc-update show offline 5 (Partial sample Output) 6 acpid | offline 7 domainname | offline 8 local | offline 9 net.eth0 |
即使 net.eth0從offline的runlevel里移除了,udev可能想嘗試啟動任何設備檢測並會運行適當的服務,有一個功能叫做hotplugging,默認情況下,gentoo不會啟用hotplugging。
為了啟用hotplugging,但只有一組選定的腳本啟用,在/etc/rc.conf里使用 rc_hotplug 變量。

rc_hotplug="net.wlan !net.*"
設備啟動服務的更多信息,請查閱/etc/rc.conf
編輯bootloader配置,為offline增加一個新的入口,在這個入口中,增加softlevel=offline
作為boot的參數。
使用bootlevel
使用bootlevel 完全類似於softlevel,他們的區別僅僅是定義的第二個“boot”runlevel代替了第二個“default”runlevel。
環境變量
介紹
一個環境變量是一個命名的包含由一個或多個應用程序使用的信息對象,許多用戶(特別是新接觸linux的)覺得這有點奇怪或難以管理,不管如何,通過使用環境變量可以很容易地更改一個或多個程序的配置這是一個錯誤的觀念。
重要的例子
下面是linux系統的一系列的變量,也解釋了他們的用處:
Variable | Description |
PATH | This variable contains a colon-separated list of directories in which the system looks for executable files. If a name is entered of an executable (such as ls, rc-update, or emerge) but this executable is not located in a listed directory, then the system will not execute it (unless the full path is entered as the command, such as /bin/ls). |
ROOTPATH | This variable has the same function as PATH, but this one only lists the directories that should be checked when the root-user enters a command. |
LDPATH | This variable contains a colon-separated list of directories in which the dynamical linker searches through to find a library. |
MANPATH | This variable contains a colon-separated list of directories in which the man command searches for the man pages. |
INFODIR | This variable contains a colon-separated list of directories in which the info command searches for the info pages. |
PAGER | This variable contains the path to the program used to list the contents of files through (such as less or more). |
EDITOR | This variable contains the path to the program used to change the contents of files with (such as nano or vi). |
KDEDIRS | This variable contains a colon-separated list of directories which contain KDE-specific material. |
CONFIG_PROTECT | This variable contains a space-delimited list of directories which should be protected by Portage during updates. |
CONFIG_PROTECT_MASK | This variable contains a space-delimited list of directories which should not be protected by Portage during updates. |
下面是例子中所有這些變量的定義:

PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin" ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3" MANPATH="/usr/share/man:/usr/local/share/man" INFODIR="/usr/share/info:/usr/local/share/info" PAGER="/usr/bin/less" EDITOR="/usr/bin/vim" KDEDIRS="/usr" CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \ /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \ /usr/share/texmf/tex/platex/config/ /usr/share/config" CONFIG_PROTECT_MASK="/etc/gconf"
定義全局變量
env.d目錄
Gentoo介紹了/etc/env.d/目錄,為了集中的定義這些變量 。在這個文件夾中,大量的文件是可用的,如00basic,05gcc等。這些都是上面提到的名字的應用程序所需要的。
例如,當gcc 被安裝了,05gcc 文件被ebuild 創建,它包含了以下定義的變量:

PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man" INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info" CC="gcc" CXX="g++" LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
其他發行版可能會告訴他們的用戶更改或添加環境變量定義在/etc/profile或其他目錄中,Gentoo另一方面方便了用戶(也方便了portage)去維護管理環境變量,不用去注意眾多的包含環境變量的文件。
例如:當gcc 被更新完畢,/etc/env.d/05gcc文件也會被更新,不需要請求任何用戶交互。
這不僅有利於Portage,也有利於用戶,有時用戶可能被要求設置一個環境變量的系統。例如我們使用http_proxy變量。作為代替了混亂的/etc/profile,用戶只需要添加一個文件(如/etc/env.d/99local),然后進去定義他:

http_proxy="proxy.server.com:8080"
通過使用相同的文件,定義所有關於自身管理的變量,用戶可以快速閱覽他們定義的變量。
env-update
許多在 /etc/env.d/里的文件都定義了PATH 變量,這不是一個錯誤:當 env-update命令執行的時候,在更新環境變量之前,它會添加一些定義的變量。從而方便包(或用戶)來添加自己的環境變量設置,而不會干擾現有值。
env-update腳本將會按照這些文件(/etc/env.d/ 里的)的字母順序增加這些變量,這些文件名必須以兩個數字開頭。

00basic 99kde-env 99local +-------------+----------------+-------------+ PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
變量的重復並不總是發生,除了這幾個變量:ADA_INCLUDE_PATH, ADA_OBJECTS_PATH, CLASSPATH, KDEDIRS, PATH, LDPATH, MANPATH,INFODIR, INFOPATH, ROOTPATH, CONFIG_PROTECT, CONFIG_PROTECT_MASK, PRELINK_PATH, PRELINK_PATH_MASK, PKG_CONFIG_PATH, 和PYTHONPATH。對於其他的變量,最后定義的變量是有效的(文件順序)。
如果可能的話,通過添加COLON_SEPARATED 或SPACE_SEPARATED 的變量名,添加更多的變量到concatenate-variables 列表中(也定義在/etc/env.d/文件中)。
當執行env-update命令,該腳本會創建所有的環境變量,並把他們放在/etc/profile.env(由 /etc/profile所使用的)。它還會從LDPATH 變量中提取信息然后使用這些信息創建 /etc/ld.so.conf。在這之后,它會運行ldconfig 去再次創建動態鏈接器(dynamical linker)使用的/etc/ld.so.cache文件。
為了運行env-update后立刻有影響,運行下面的命令去更新環境。自己安裝gentoo的用戶可能從安裝指令中記得:
root #
env-update && source /etc/profile
上面的命令只在當前的終端、新的終端,他們的子終端進行更新。因此如果用戶工作在X11,他需要在每個新打開的終端輸入source /etc/profile或者重啟X,這樣所有終端就可以引用新的變量了。如果使用的是登錄管理器,那么必須成為root用戶並且重啟 /etc/init.d/xdm服務。
note:當定義了其他變量的時候,不會用 shell變量。這意味着像FOO="$BAR"的($BAR是其他變量)的東西是被禁止的。
定義局部變量
用戶指定
它可能沒有必要定義一個全局環境變量,比如,一個可能需要增加/home/my_user/bin和當前的工作目錄(用戶所在的目錄)添加到PATH 變量,但是不想其他用戶擁有此PATH變量。為了定義一個本地的變量,使用~/.bashrc或~/.bash_profile:

# A colon followed by no directory is treated as the current working directory PATH="${PATH}:/home/my_user/bin:"
在登錄/登出后,PATH變量會被更新。
指定會話
有時嚴格的定義是需要的。比如,一個用戶可能需要有權限從一個臨時的目錄中去使用二進制創建而不使用path或想要去短時間內編輯~/.bashrc 。
在這樣的例子里,在當前會話中使用export 命令定義PATH變量,只要用戶不退出會話,該PATH變量就會一直被臨時的使用。
root #
export PATH="${PATH}:/home/my_user/tmp/usr/bin"