在本文中,學(xué)習(xí) Filesystem Hierarchy Standard (FHS) 相關(guān)內(nèi)容。學(xué)習(xí):
本文幫助您準(zhǔn)備 Linux Professional Institute's Junior Level Administration (LPIC-1) 考試 101 中主題 104 下的目標(biāo) 104.7。該目標(biāo)的權(quán)值為 2。
為了最有效地利用本系列中的文章,您應(yīng)該具有基本的 Linux 知識(shí),并需要準(zhǔn)備一個(gè) Linux系統(tǒng),用于練習(xí)本文介紹的命令。有時(shí)候不同版本的程序輸出格式不同,因此您所得到的結(jié)果未必總是與這里所示的清單和圖相同。特別是,許多輸出高度依賴于系統(tǒng)上已經(jīng)安裝的包。您自己的輸出可能很不一樣,但是應(yīng)該能夠看出重要的共同點(diǎn)。
Filesystem Hierarchy Standard 是在 Linux 或其他 UNIX®類系統(tǒng)上指定目錄公共布局的一個(gè)文檔。通過(guò)將文件跨 Linux 發(fā)行版放置在同一個(gè)地方,F(xiàn)HS 簡(jiǎn)化了獨(dú)立于發(fā)行版的軟件開發(fā)。FHS 在Linux Standard Base 中也有用到(參見 參考資料)。FHS 允許用戶和軟件預(yù)測(cè)所安裝文件和目錄的位置。一個(gè)遵從 FHS 的文件系統(tǒng)假定操作系統(tǒng)支持大多數(shù) UNIX 文件系統(tǒng)中找到的基本安全特性。
FHS 的核心是文件的兩個(gè)獨(dú)立特征:
這些特征可使帶不同特征集的文件存儲(chǔ)在不同的文件系統(tǒng)上。表 1 是一個(gè) FHS 文檔示例,顯示遵循 FHS 的一個(gè)布局。
Shareable | Unshareable | |
---|---|---|
靜態(tài) | /usr /opt | /etc /boot |
變量 | /var/mail /var/spool/news | /var/run /var/lock |
Linux 系統(tǒng)常包含成千上萬(wàn)個(gè)文件。我最近安裝的一個(gè) 64-bit Fedora13 系統(tǒng)僅在 /usr 目錄下就有 75,000 多個(gè)文件。我的大部分其他安裝目錄下有 100,000 多個(gè)文件,甚至 200,000 或更多文件。接下來(lái) 4 個(gè)部分將探討可在海量數(shù)據(jù)中幫助您查找文件、特別是程序的工具。
如果您使用過(guò)多種 Linux 系統(tǒng),可能會(huì)發(fā)現(xiàn),如果以根用戶身份登錄,就能執(zhí)行 fdisk
之類的命令,如果您是一名用戶,就不能執(zhí)行這些命令。如果您在命令行運(yùn)行程序,bash(或其他)shell就通過(guò)一個(gè)目錄列表搜索您請(qǐng)求的程序。目錄列表是在您的 PATH 環(huán)境變量中指定的,且根用戶路徑可能包括 /sbin,而非根用戶路徑?jīng)]有。清單 1顯示來(lái)自兩個(gè)不同發(fā)行版的用戶路徑示例,以及一個(gè)根路徑示例。
|
如您所見,PATH 變量?jī)H是一個(gè)用冒號(hào)分隔的目錄名列表。由于 fdisk
命令實(shí)際上位于 /sbin/fdisk 中,這三個(gè)路徑中只有第一個(gè)和最后一個(gè)路徑允許用戶輸入 fdisk
命令來(lái)運(yùn)行,而無(wú)需提供一個(gè)完全限定名稱(/sbin/fdisk)。
通常,您的路徑是在 .bash_profile或 .bashrc 等初始化文件中設(shè)置的。您可以指定一個(gè)新路徑將其更改為當(dāng)前 bash 進(jìn)程。如果您希望新值可用于從該進(jìn)程開始的其它進(jìn)程,記住一定要導(dǎo)出 PATH 變量。如清單 2 所示。
|
在上一節(jié)中,您了解了為什么在試圖運(yùn)行 fdisk
命令時(shí)該命令不可用。不過(guò),還有幾個(gè)其他有用的命令可以幫助您查出,在輸入一個(gè)命令名之后真正運(yùn)行的命令是哪一個(gè)。
您可以使用 which
命令搜索您的路徑,并查明在您輸入一個(gè)命令時(shí)會(huì)執(zhí)行哪個(gè)命令(如果有的話)。清單 3 顯示了查找 fdisk
命令的一個(gè)示例。
|
which
命令在您的路徑中顯示命令的第一個(gè)搜索項(xiàng)。如果您希望知道是否有多個(gè)搜索項(xiàng),可以添加 -a
選項(xiàng),如清單 4 所示。
|
這里我們?cè)谌齻€(gè)地方找到了 awk
命令:/usr/bin(系統(tǒng)上命令的主目錄)、/bin(包含由系統(tǒng)管理員和用戶同時(shí)使用的命令,但只在沒有其他文件系統(tǒng)安裝時(shí)需要用到),以及 /usr/bin/X11(包含 X window 系統(tǒng)的二進(jìn)制文件)中。
本系列的另一篇文章 “學(xué)習(xí) Linux,101:創(chuàng)建和更改硬鏈接和符號(hào)鏈接”,向您展示了如何確保這三個(gè)不同的文件最終都表示同一個(gè)底層 gawk
命令,如清單 5 所示。
|
有一些命令是 which
命令找不到的,比如 shell 內(nèi)鍵指令。type
命令是一個(gè)內(nèi)鍵指令,告訴您如何評(píng)估一個(gè)給定命令從而執(zhí)行該命令。清單 6 使用 which
和 type
表示,type
命令不是一個(gè)可在路徑上找到的可執(zhí)行命令,而是一個(gè) shell 內(nèi)鍵指令。
|
如果您需要程序位置以外的更多信息,那么可以使用 whereis
命令。例如,您可以查找手冊(cè)頁(yè)或其他信息,如清單 7 所示。
|
注意,使用 whereis
不能在 /sbin 中找到 awk
的副本。whereis
使用的命令是固定的,因此命令不可能總會(huì)找到您要找的東西。whereis
命令也可以搜索源文件,指定備用搜索路徑,并搜索特殊條目。查詢手冊(cè)頁(yè),了解如何替代該行為或更改 whereis
使用的固定路徑。
在本系列的早期文章 “學(xué)習(xí) Linux,101:文件和目錄管理” 中,您了解了如何基于名稱(包括通配符)、路徑、大小或時(shí)間戳查找文件。在本系列的另一篇早期文章 “學(xué)習(xí) Linux,101:創(chuàng)建和更改硬鏈接和符號(hào)鏈接” 中,您了解了如何查找到特定文件或索引節(jié)點(diǎn)的鏈接。
find
命令是 Linux 系統(tǒng)上文件搜索工具的 “瑞士軍刀”。另兩個(gè)您可能發(fā)現(xiàn)會(huì)有用的功能是,基于用戶或組名查找文件的能力和基于權(quán)限查找文件的能力。
假定您希望在 /tmp 層級(jí)目錄下查看用戶含有的文件,清單 8 顯示了根用戶如何在 /tmp 中查找用戶 ian 的所有文件。
|
您可以使用-group
測(cè)試按組查找文件。而且您可以使用 -nouser
和 -nogroup
選項(xiàng)查找不屬于任何用戶或組的文件。與其他測(cè)試一樣,您可以使用 !
對(duì)測(cè)試求反。我通常將我的用戶代號(hào)設(shè)置為 1000,因?yàn)檫@是一些系統(tǒng)上的默認(rèn)設(shè)置。我還創(chuàng)建了一個(gè)名為 ian 的組,將組號(hào)設(shè)置為1000。其他系統(tǒng)仍然從 500 開始,或默認(rèn)將新用戶放到 ‘users’ 組中。我存檔在 Red Hat 6.2系統(tǒng)上的一些早期研究材料仍然有用戶 500。清單 9展示了如何查找不屬于我的當(dāng)前用戶組的一些目錄。research/rh62/involution 屬于用戶 500 和組4,兩者都不在我當(dāng)前的系統(tǒng)上。要根據(jù)數(shù)值型用戶 id 查找文件或目錄,使用 -uid
或-gid
測(cè)試。
|
要根據(jù)權(quán)限查找文件,您可以使用 -perm
測(cè)試以及符號(hào)表達(dá)式,類似于 chmod
或 umask
命令使用的那些。您可以搜索確切的權(quán)限,但是對(duì)權(quán)限表達(dá)式加一個(gè)連字符前綴通常會(huì)更有用,因?yàn)檫@樣可以表明您需要帶這些權(quán)限集的文件,但不關(guān)心其他權(quán)限。清單 10 展示了如何查找可由用戶、組和每個(gè)人執(zhí)行的文件,以及查找其他人不可讀取的文件的兩種方法。
|
我們介紹了可使用 find
命令實(shí)現(xiàn)的幾個(gè)主要搜索類型。為了進(jìn)一步縮小輸出范圍,您可以結(jié)合多個(gè)表達(dá)式,且可以添加正則表達(dá)式。要更多地了解這個(gè)多功能命令,使用手冊(cè)頁(yè),更甚者,如果您安裝了信息系統(tǒng),可以使用 info find
命令。
清單 11 顯示了一個(gè)使用 find
的最終搜索示例。該例向 /usr/include 執(zhí)行一個(gè)cd
命令來(lái)維護(hù)清單長(zhǎng)度的可管理性,然后查找路徑名中包含 packet
的所有文件(忽略大小寫)。第二個(gè)示例進(jìn)一步將該輸出限制為不屬于目錄、且大小至少為 1500 字節(jié)的文件。根據(jù)所安裝的包,系統(tǒng)上的真實(shí)輸出可能會(huì)有所不同。
|
注意,正則表達(dá)式必須匹配find
返回的完整路徑,且要記住正則表達(dá)式和通配符之間的區(qū)別。
每次運(yùn)行 find
命令時(shí),它搜索您指定的所有目錄。為加快進(jìn)度,您可以使用另一個(gè)命令 locate
,該命令使用一個(gè)存儲(chǔ)路徑信息的數(shù)據(jù)庫(kù),而不用每次都搜索文件系統(tǒng)。
locate
命令搜索一個(gè)數(shù)據(jù)庫(kù)中的匹配文件,該數(shù)據(jù)庫(kù)一般通過(guò)一個(gè)定時(shí)任務(wù)按日更新。
locate
命令對(duì)路徑名的任意部分進(jìn)行匹配,而不僅僅針對(duì)文件名。將文件名放在一個(gè)引用中并 包含至少一個(gè)文件替換字符,可以實(shí)現(xiàn)更精確的匹配。清單 12 顯示了如何查找包含 bin/ls
字符串的路徑,且展示了兩個(gè)使用文件替換字符來(lái)限制輸出的示例。
|
locate
使用的默認(rèn)數(shù)據(jù)庫(kù)存儲(chǔ)在 /var 文件系統(tǒng)中,在一個(gè)類似 /var/lib/locatedb 的位置中。這在使用 slocate 或 mlocate 包提供附加安全性或速度的系統(tǒng)上可能不同。您可以使用 locate -S
查找有關(guān) locate 數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息,如清單 13 所示。
|
數(shù)據(jù)庫(kù)是使用 updatedb
命令予以創(chuàng)建和更新的。這一般作為一個(gè)定時(shí)任務(wù)按日運(yùn)行。/etc/updatedb.conf 文件,或者有時(shí)是 /etc/sysconfig/locate,是 updatedb
的配置文件。為實(shí)現(xiàn)每日更新,根用戶需要編輯 /etc/updatedb.conf 并設(shè)置 DAILY_UPDATE=yes。為立即創(chuàng)建數(shù)據(jù)庫(kù),以根用戶身份運(yùn)行 updatedb
命令。
使用 locate
的其它注意事項(xiàng)包括安全事項(xiàng)和 updatedb
用于數(shù)據(jù)庫(kù)日常構(gòu)建的網(wǎng)絡(luò)文件 I/O 事項(xiàng)。查看手冊(cè)頁(yè)和 updatedb
配置文件,了解更多內(nèi)容。
FHS 目標(biāo)是要盡量使根文件系統(tǒng)足夠小。不過(guò),它必須包含啟動(dòng)、還原、恢復(fù)或修復(fù)系統(tǒng)所需的所有文件,包括一個(gè)有經(jīng)驗(yàn)的管理員執(zhí)行這些任務(wù)所需的實(shí)用工具。注意,啟動(dòng)一個(gè)系統(tǒng)需要在根文件系統(tǒng)上有足夠的空間,從而可以安裝其他文件系統(tǒng)。
表 2 顯示了 FHS 在根(或 /)文件系統(tǒng)下需要的目錄的用途。目錄或符號(hào)鏈接都是必需的,除了標(biāo)記為可選的那些之外,這些可選項(xiàng)僅在相應(yīng)的子系統(tǒng)存在時(shí)才需要。
目錄 | 用途 |
---|---|
bin | 必需的命令二進(jìn)制文件 |
boot | 啟動(dòng)加載程序的靜態(tài)文件 |
dev | 設(shè)備文件 |
etc | 特定于主機(jī)的系統(tǒng)配置 |
lib | 必需的共享庫(kù)和內(nèi)核模塊 |
media | 可移動(dòng)媒體的裝入點(diǎn) |
mnt | 臨時(shí)安裝文件系統(tǒng)的裝入點(diǎn) |
opt | 附加應(yīng)用程序軟件包 |
sbin | 必需的系統(tǒng)二進(jìn)制文件 |
srv | 本系統(tǒng)提供的服務(wù)用數(shù)據(jù) |
tmp | 臨時(shí)文件 |
usr | 二級(jí)層次結(jié)構(gòu) |
var | 變量數(shù)據(jù) |
home | 用戶主目錄(可選) |
lib<qual> | 備用格式必需的共享庫(kù)(可選) |
root | 根用戶的主目錄(可選) |
/usr 和 /var 層次結(jié)構(gòu)非常復(fù)雜,以至于有專門的、完整的 FHS 部分。/usr 文件系統(tǒng)是文件系統(tǒng)的第二個(gè)主要部分,包含可共享的只讀數(shù)據(jù)。它可以在不同系統(tǒng)之間被共享,不過(guò)目前很少這么做。
/var 文件系統(tǒng)包含變量數(shù)據(jù)文件,包括后臺(tái)打印目錄和文件,管理和日志數(shù)據(jù),以及臨時(shí)文件。/var的某些部分不可在不同的系統(tǒng)之間共享,但 /var/mail、/var/cache/man、/var/cache/fonts 和/var/spool/news 等可以共享。
要完全理解標(biāo)準(zhǔn),閱讀 FHS 文檔(參見 參考資料)。
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
IanShields 參與 developerWorks Linux 專區(qū)的許多 Linux 項(xiàng)目。他是 IBM 北卡羅來(lái)納州 ResearchTriangle Park 的一名高級(jí)程序員。他于 1973 年作為一名系統(tǒng)工程師加入 IBM位于澳大利亞堪培拉的子公司。此后,在加拿大蒙特利爾和北卡羅來(lái)納州 RTP 從事通信系統(tǒng)和普適計(jì)算。他擁有多項(xiàng)專利并發(fā)表了許多論文。他畢業(yè)于Australian NationalUniversity,取得純數(shù)學(xué)和哲學(xué)學(xué)位。他擁有北卡羅來(lái)納州州立大學(xué)的計(jì)算機(jī)碩士和博士學(xué)位。更多信息參見 My developerWorks 上 Ian 的個(gè)人信息。
聯(lián)系客服