Linux 目錄結(jié)構(gòu)概覽
登錄 Linux 系統(tǒng)后,在當(dāng)前命令窗口下輸入執(zhí)行如下命令:
[vincent@localhost ~]$ cd /
[vincent@localhost /]$ ls
bin data etc lib lost+found mnt proc run srv tmp var
boot dev home lib64 media opt root sbin sys usr
對(duì)應(yīng)的目錄樹結(jié)構(gòu)如下:
FHS 標(biāo)準(zhǔn)
Linux中的目錄層級(jí)遵循 FHS( Filesystem Hierarchy Standard) 標(biāo)準(zhǔn)雳殊,該標(biāo)準(zhǔn)規(guī)定了 UNIX-like
操作系統(tǒng)中文件和目錄的布局規(guī)范,規(guī)定了每個(gè)特定的目錄下應(yīng)該要放置什么樣子的數(shù)據(jù)。FHS 一直在持續(xù)改版改览,目前已到 3.0 版本醋安。FHS 依據(jù)文件系統(tǒng)使用的頻繁與否假丧、以及是否允許使用者隨意更動(dòng), 而將目錄定義成四種形態(tài):
可分享的(
shareable
):可以分享給其他系統(tǒng)掛載使用的目錄县耽,所以包括執(zhí)行文件與用戶的郵件等數(shù)據(jù)句喷, 是能夠分享給網(wǎng)絡(luò)上其他主機(jī)掛載用的目錄;不可分享的(
unshareable
):自己機(jī)器上面運(yùn)作的設(shè)備文件或者是與程序有關(guān)的 socket 文件等兔毙, 由于僅與自身機(jī)器有關(guān)唾琼,所以當(dāng)然就不適合分享給其他主機(jī)了;靜態(tài)的(
static
):包括二進(jìn)制文件澎剥、庫锡溯、文檔文件和其他在沒有系統(tǒng)管理員干預(yù)的情況下不會(huì)更改的文件。例如函數(shù)庫哑姚、文件說明文件祭饭、系統(tǒng)管理員所管理的主機(jī)服務(wù)配置文件等等;可變動(dòng)的(
variable
):經(jīng)常改變的數(shù)據(jù)叙量,例如登錄文件倡蝙、一般用戶可自行收受的新聞組等。
事實(shí)上绞佩,F(xiàn)HS 針對(duì)目錄樹架構(gòu)僅定義出三個(gè)目錄底下應(yīng)該放置什么數(shù)據(jù)而已寺鸥,下面是這三個(gè)目錄的定義:
-
/ (root,根目錄)
:與啟動(dòng)系統(tǒng)有關(guān)品山; -
/usr (unix software resource)
:與軟件安裝/執(zhí)行有關(guān)析既; -
/var (variable)
:與系統(tǒng)運(yùn)行過程有關(guān)。
/
表示整個(gè)文件系統(tǒng)的根路徑谆奥。根目錄是整個(gè)系統(tǒng)最重要的一個(gè)目錄眼坏,因?yàn)椴坏械哪夸浂际怯筛夸浹苌鰜淼模瑫r(shí)根目錄也與啟動(dòng)、還原宰译、系統(tǒng)修復(fù)等操作有關(guān)檐蚜。由于系統(tǒng)開機(jī)時(shí)需要特定的啟動(dòng)軟件、內(nèi)核文件沿侈、啟動(dòng)所需程序闯第、函數(shù)庫等文件數(shù)據(jù),若系統(tǒng)出現(xiàn)錯(cuò)誤時(shí)缀拭,根目錄也必須要包含有能夠修復(fù)文件系統(tǒng)的程序才行咳短。FHS 標(biāo)準(zhǔn)建議:根目錄(/)所在分區(qū)在合理適當(dāng)?shù)那闆r下越小越好,且應(yīng)用程序不需要必須在根目錄下創(chuàng)建文件或依賴根目錄下的文件蛛淋,所以應(yīng)用程序最好不要與根目錄放在同一個(gè)分區(qū)內(nèi)咙好。保持根目錄越小越好,如此不但性能較好褐荷,根目錄所在的文件系統(tǒng)也較不容易發(fā)生問題勾效。因?yàn)樵酱蟮姆謪^(qū)你會(huì)放入越多的數(shù)據(jù),如此一來根目錄所在分區(qū)的頻繁讀寫就會(huì)增加出錯(cuò)的幾率叛甫。
關(guān)于 FHS 最新版文檔层宫,可以參考筆者翻譯的 FHS 3.0 文檔。
FHS 要求必須存在的目錄
FHS 定義出根目錄下要有下面這些子目錄存在其监,即使沒有對(duì)應(yīng)的物理目錄萌腿,至少也要有對(duì)應(yīng)目錄的符號(hào)鏈接。
/bin
bin
是 binary
的縮寫抖苦,這個(gè)目錄直接(沒有子目錄)存放著一些基本的(essential )二進(jìn)制命令或這些命令的符號(hào)鏈接哮奇,這些命令在單人維護(hù)模式仍然可以使用(系統(tǒng)管理員和非授權(quán)用戶都可以使用),通常包含 shell(如 bash
睛约、csh
等)和常用的命令(如 cp
、mv
哲身、rm
辩涝、cat
、ls
)等勘天。
/boot
除了啟動(dòng)時(shí)不需要的啟動(dòng)加載器配置文件(位于 /etc
目錄下)怔揩,以及映射安裝器以外,這里存放著啟動(dòng) Linux 時(shí)所需的所有文件脯丝,包括 Linux 內(nèi)核文件以及啟動(dòng)選項(xiàng)與啟動(dòng)所需配置文件等商膊,可能包含保存的主引導(dǎo)扇區(qū)和扇區(qū)映射文件。Linux 內(nèi)核常用的文件名為 vmlinux
或 vmlinuz
宠进,如果使用的是 grub2
這個(gè)開機(jī)管理程序晕拆, 則還會(huì)存在 /boot/grub2
這個(gè)目錄。為了使引導(dǎo)加載程序能夠引導(dǎo)文件材蹬,必須將必要的程序放置在 /sbin
中实幕。
/dev
dev
是 device(設(shè)備)的縮寫吝镣。在 Linux 系統(tǒng)上,任何設(shè)備與接口設(shè)備都是以文件的形式存在于這個(gè)目錄當(dāng)中的昆庇。你只要通過讀寫這個(gè)目錄下的某個(gè)文件末贾,就等于讀寫某個(gè)設(shè)備。比要重要的文件有 /dev/null
整吆,/dev/zero
拱撵,/dev/tty
,/dev/loop*
表蝙,/dev/sd*
等等拴测。
/etc
關(guān)于這個(gè)名稱目前有爭議。在貝爾實(shí)驗(yàn)室關(guān)于 UNIX 實(shí)現(xiàn)文檔的早期版本中勇哗,etc
被稱為 etcetera
昼扛,這是由于過去此目錄中存放所有不屬于別處的所有東西。自從早期文檔出版以來欲诺,該目錄名稱已被以各種方式重新稱呼抄谐。最近的解釋縮略語如:可編輯的文本配置
(英文 Editable Text Configuration
)或擴(kuò)展工具箱
(英文 Extended Tool Chest
)。該目錄現(xiàn)在用來存放系統(tǒng)級(jí)別(system-wide)的配置文件(靜態(tài)文件扰法,不能是二進(jìn)制程序)蛹含,用戶平時(shí)幾乎不用訪問。一般來說塞颁,這個(gè)目錄下的各文件屬性是可以讓一般使用者查閱的浦箱,但是只有 root 有權(quán)力修改。FHS 建議不要在該目錄中放置二進(jìn)制文件祠锣。如果更改了該目錄下的某個(gè)文件可能會(huì)導(dǎo)致系統(tǒng)或服務(wù)不能啟動(dòng)酷窥。下面說明其中的一些,其他的你應(yīng)該知道它們屬于哪個(gè)程序伴网,并閱讀該程序的 man
頁:
/etc/rc
或/etc/rc.d
或/etc/rc?.d
: 啟動(dòng)蓬推、或改變運(yùn)行級(jí)時(shí)運(yùn)行的腳本或腳本的目錄。/etc/passwd
:用戶數(shù)據(jù)庫澡腾,其中的域給出了用戶名沸伏、真實(shí)姓名、用戶起始目錄动分、加密口令和用戶的其他信息毅糟。詳細(xì)介紹參考用戶和用戶組管理相關(guān)部分的內(nèi)容。/etc/fdprm
: 軟盤參數(shù)表澜公,用以說明不同的軟盤格式姆另。可用setfdprm
進(jìn)行設(shè)置。更多的信息見setfdprm
的幫助頁蜕青。/etc/fstab
: 指定啟動(dòng)時(shí)需要自動(dòng)安裝的文件系統(tǒng)列表苟蹈。也包括用swapon -a
啟用的 swap 區(qū)的信息。/etc/group
: 類似/etc/passwd
右核,但說明的不是用戶信息而是組的信息慧脱。包括組的各種數(shù)據(jù)。 詳細(xì)介紹參考用戶和用戶組管理相關(guān)部分的內(nèi)容贺喝。/etc/inittab
:init
的配置文件菱鸥。/etc/issue
: 包括用戶在登錄提示符前的輸出信息。通常包括系統(tǒng)的一段短說明或歡迎信息躏鱼。具體內(nèi)容由系統(tǒng)管理員確定氮采。/etc/magic
: “file” 的配置文件。包含不同文件格式的說明染苛, “file” 基于它猜測文件類型鹊漠。/etc/motd
:motd
是 message of the day 的縮寫,用戶成功登錄后自動(dòng)輸出茶行。內(nèi)容由系統(tǒng)管理員確定躯概。常用于通告信息,如計(jì)劃關(guān)機(jī)時(shí)間的警告等畔师。/etc/mtab
: 當(dāng)前安裝的文件系統(tǒng)列表娶靡。由腳本初始化,并由 mount 命令自動(dòng)更新看锉。當(dāng)需要一個(gè)當(dāng)前安裝的文件系統(tǒng)的列表時(shí)使用 ( 例如df
命令 ) 姿锭。/etc/shadow
: 在安裝了影子 (shadow) 口令軟件的系統(tǒng)上的影子口令文件。影子口令文件將/etc/passwd
文件中的加密口令移動(dòng)到/etc/shadow
中伯铣,而后者只對(duì)超級(jí)用戶 (root) 可讀呻此。這使破譯口令更困難,以此增加系統(tǒng)的安全性腔寡。/etc/login.defs
:login
命令的配置文件焚鲜。/etc/printcap
: 類似/etc/termcap
,但針對(duì)打印機(jī)蹬蚁。語法不同。/etc/profile 郑兴、/etc/profile.d /etc/csh.login 犀斋、 /etc/csh.cshrc
: 登錄或啟動(dòng)時(shí)bourne
或cshells
執(zhí)行的文件。這允許系統(tǒng)管理員為所有用戶建立全局默認(rèn)環(huán)境情连。/etc/securetty
: 確認(rèn)安全終端叽粹,即哪個(gè)終端允許超級(jí)用戶(root)登錄。一般只列出虛擬控制臺(tái),這樣就不可能 ( 至少很困難 ) 通過調(diào)制解調(diào)器 (modem) 或網(wǎng)絡(luò)闖入系統(tǒng)并得到超級(jí)用戶特權(quán)虫几。/etc/shells
: 列出可以使用的 shell 锤灿。chsh
命令允許用戶在本文件指定范圍內(nèi)改變登錄的 shell 。提供一 臺(tái)機(jī)器ftp
服務(wù)的服務(wù)進(jìn)程ftpd
檢查用戶 shell 是否列在/etc/shells
文件中辆脸,如果不是但校,將不允許該用戶登錄。/etc/termcap
: 終端性能數(shù)據(jù)庫啡氢。說明不同的終端用什么 “ 轉(zhuǎn)義序列 ” 控制状囱。寫程序時(shí)不直接輸出轉(zhuǎn)義序列(這樣只能工作于特定品牌的終端) ,而是從/etc/termcap
中查找要做的工作的正確序列倘是。這樣亭枷,多數(shù)的程序可以在多數(shù)終端上運(yùn)行。
此外搀崭,F(xiàn)HS 還規(guī)定了以下幾個(gè)重要的目錄最好在 /etc
目錄中也要存在:
-
/etc/opt/
:放置第三方輔助軟件/opt
的相關(guān)配置文件(必要)叨粘。 -
/etc/X11/
:與 X Window 有關(guān)的各種配置文件都在這里,尤其是xorg.conf
這個(gè) X Server 的配置文件(可選)瘤睹。 -
/etc/sgml/
:SGML 的配置文件(可選)升敲。 -
/etc/xml/
:XML 的配置文件(可選)。
/lib
代表 libraries
(函數(shù)庫)默蚌,這個(gè)目錄里存放著系統(tǒng)啟動(dòng)時(shí)冻晤、以及 /bin
和 /sbin
下面的命令(binaries)會(huì)用到的函數(shù)庫。絕大多數(shù)應(yīng)用程序都需要用到這些共享庫绸吸。Linux 下的函數(shù)庫就是動(dòng)態(tài)連接(dynamically-linked)的共享庫(Linux 下的共享庫一般是 .so
文件鼻弧,即 shared objects
),其作用類似于 Windows 里的 dll
文件锦茁。僅用于 /usr
目錄中命令的共享庫( 比如 X Window 的函數(shù)庫)不會(huì)放在該目錄 /lib
中攘轩,僅 /bin
和 /sbin
目錄中的命令所需的函數(shù)庫會(huì)放在 /lib
中。
- FHS 要求該目錄下至少要存在以下兩種文件名模式中一種的文件或符號(hào)鏈接:
-
libc.so.*
:動(dòng)態(tài) C 語言函數(shù)庫(可選)码俩; -
ld*
:運(yùn)行時(shí)鏈接器/加載器(execution time linker/loader)(可選)度帮。
-
如果安裝了 C 語言預(yù)處理器(該函數(shù)庫通常放置在 /usr/bin/cpp
),出于歷史原因稿存, /lib/cpp
必須是對(duì)其的引用笨篷。FHS 建議該目錄下也應(yīng)該存在 /lib/modules/
目錄,這個(gè)目錄主要放置可抽換式的內(nèi)核相關(guān)模塊(即驅(qū)動(dòng)程序)瓣履。
/media
Linux系統(tǒng)會(huì)自動(dòng)識(shí)別一些可移除設(shè)備(removable media)率翅,例如 U 盤、光驅(qū)等等袖迎,Linux 會(huì)把識(shí)別出的設(shè)備掛載到這個(gè)目錄下的某個(gè)掛載點(diǎn)子目錄上冕臭,比如 floppy
( 軟盤驅(qū)動(dòng)器 ) 腺晾、cdrom
( CD-ROM 驅(qū)動(dòng)器)、cdrecorder
(CD 刻錄機(jī) )辜贵、zip
(zip 驅(qū)動(dòng)器) 悯蝉。常見的文件名有:/media/floppy
、/media/cdrom
等等托慨。如果掛載了多個(gè)同類型的設(shè)備鼻由,則會(huì)在目錄名稱后面添加從 0 開始的數(shù)字以區(qū)分它們,而原來不含數(shù)字的目錄名則是一個(gè)指向原來設(shè)備的符號(hào)鏈接榴芳。比如嗡靡,同時(shí)掛載了兩個(gè) CD-ROM 驅(qū)動(dòng)器,則它們的掛載點(diǎn)目錄為 /media/cdrom0
窟感、 /media/cdrom1
讨彼,而 /media/cdrom
是一個(gè)指向原來某個(gè) CD-ROM 的符號(hào)鏈接。
FSH 還要求底下的目錄必須要存在:
-
/lib/modules/
:這個(gè)目錄主要放置可抽換式的內(nèi)核相關(guān)模塊(驅(qū)動(dòng)程序)柿祈。
FSH 還提到:歷史上有許多其他不同的地方被用于掛載可移動(dòng)媒體哈误,例如 /cdrom
、/mnt
或 /mnt/cdrom
躏嚎。將所有可移動(dòng)媒體的掛載點(diǎn)直接放在根目錄中可能會(huì)導(dǎo)致在 /
目錄中出現(xiàn)大量額外目錄蜜自。盡管最近使用 /mnt
中的子目錄作為掛載點(diǎn)很常見,但它與直接使用 /mnt
作為臨時(shí)掛載點(diǎn)的古老傳統(tǒng)相沖突卢佣。
zip Drive(極碟)又稱為海量存儲(chǔ)器重荠,是美國埃美加(
Iomega
)公司所發(fā)明的一種高容量軟式磁盤機(jī),使用具有較堅(jiān)固外殼的特制高容量軟碟片虚茶,并利用部分硬盤中使用的技術(shù)戈鲁,制成的個(gè)人電腦儲(chǔ)存裝置。 由于 zip 驅(qū)動(dòng)器價(jià)格太高嘹叫,難以普及婆殿,隨著存儲(chǔ)設(shè)備的發(fā)展逐漸退出市場。
/mnt
該目錄是為了臨時(shí)掛載其他的文件系統(tǒng)的掛載點(diǎn)罩扇,還可以掛載遠(yuǎn)程目錄來當(dāng)作本地目錄婆芦。該目錄是臨時(shí)掛其他文件系統(tǒng)用的,不能用來安裝應(yīng)用程序喂饥。比如消约,可以將光驅(qū)掛載在 /mnt/
上,然后進(jìn)入該目錄就可以查看光驅(qū)里的內(nèi)容了员帮。在早些時(shí)候或粮,這個(gè)目錄的用途與 /media
相同。只是有了 /media
之后集侯,這個(gè)目錄就用作臨時(shí)掛載用了被啼。
/opt
該目錄是用來安裝可選的附加軟件程序包( optional add-on application software packages )的。舉例來說棠枉,KDE 這個(gè)桌面管理系統(tǒng)是 一個(gè)獨(dú)立的軟件浓体,它可以安裝到 Linux 系統(tǒng)中,因此 KDE 的軟件就建議放置到此目錄下了辈讶。另外命浴,如果你想要自行安裝額外的軟件(非原本的發(fā)行版提供的),那么也能夠?qū)⒛愕能浖惭b到這里來贱除。不過生闲,以前的 Linux 系統(tǒng)中,我們還是習(xí)慣放置在 /usr/local
目錄下月幌。
FHS 要求安裝在 /opt
中的包必須將其靜態(tài)文件放在單獨(dú)的 /opt/<package>
或 /opt/<provider>
目錄樹中碍讯,其中,<package>
是描述軟件包的名稱扯躺,<provider>
是軟件開發(fā)者的 LANANA
注冊(cè)名稱捉兴。
目錄 /opt/bin
、/opt/doc
录语、/opt/include
倍啥、/opt/info
、/opt/lib
和 /opt/man
是保留給本地系統(tǒng)管理員使用的澎埠。附件軟件程序包可以提供“前端”(front-end)文件虽缕,供本地系統(tǒng)管理員放置在(通過鏈接或復(fù)制)這些保留目錄中,但必須在沒有這些保留目錄的情況下正常運(yùn)行蒲稳。
用戶調(diào)用的程序必須位于 /opt/<package>/bin
目錄中氮趋,或者位于 /opt/<provider>
層次結(jié)構(gòu)下。如果包中包含 UNIX 手冊(cè)頁弟塞,那么它們必須位 于/opt/<package>/share/man
中凭峡,或者位于 /opt/<provider>
層次結(jié)構(gòu)下,并且必須使用與 /usr/share/man
相同的子結(jié)構(gòu)决记〈菁剑可變的包文件(在正常操作中更改)必須安裝在 /var/opt
。特定于主機(jī)的配置文件必須安裝在 /etc/opt
系宫。 除了那些必須駐留在文件系統(tǒng)樹中特定位置才能正常工作的包文件索昂,在 /opt
、/var/opt
和 /etc/opt
層次結(jié)構(gòu)之外不會(huì)存在其他包文件扩借。例如椒惨,設(shè)備鎖文件必須放在 /var/lock
中,設(shè)備必須放在 /dev
中潮罪。
發(fā)行版可以在 /opt
中適當(dāng)注冊(cè)的子目錄下安裝和以其他方式管理軟件康谆。并不是所有的 Linux 發(fā)行版都會(huì)使用該目錄领斥,有些發(fā)行版會(huì)使用 /usr/local
代替,所以 /opt
目錄并不是系統(tǒng)運(yùn)行所必需的目錄沃暗。
add-on(附加組件)是一個(gè)軟件擴(kuò)展月洛,用來為軟件提供擴(kuò)展功能, 可能是擴(kuò)展了軟件中的某些功能孽锥,添加了新的軟件接口嚼黔,或提供了額外的功能。大多數(shù)附加組件都可以作為自安裝包使用惜辑。這意味著用戶可以簡單地雙擊附加包來安裝相應(yīng)的程序文件唬涧。其他附加組件可能要求用戶手動(dòng)將文件移動(dòng)到特定目錄中。雖然不是所有的程序都支持附加組件盛撑,但是現(xiàn)在許多程序都支持附加組件碎节,因?yàn)樗鼮槠渌_發(fā)人員擴(kuò)展程序的功能提供了一種簡單的方法。比如抵卫,瀏覽器的插件可以看做是一種附加組件钓株。
LANANA(The Linux Assigned Names And Numbers Authority)的宗旨是通過提供一種可響應(yīng)的、易于使用的注冊(cè)服務(wù)來防止名稱空間沖突 陌僵。
/run
該目錄存放了啟動(dòng)后的操作系統(tǒng)的信息數(shù)據(jù)轴合,必須在引導(dǎo)過程開始時(shí)清除這個(gè)目錄下的文件。早期的 FHS 規(guī)定系統(tǒng)開機(jī)后所產(chǎn)生的各項(xiàng)信息應(yīng)該要放置到 /var/run
目錄下碗短,新版的 FHS 則規(guī)范到 /run
下面受葛。由于 /run
可以使用內(nèi)存來仿真,因此效能上會(huì)好很多偎谁。已遷移到使用 /run
的程序應(yīng)停止使用 /var/run
总滩,除非在 /var/run
部分中有所說明。但某些程序可能仍會(huì)繼續(xù)使用 /var/run
巡雨,為了向后兼容闰渔,在一些 Linux 發(fā)行版(比如 CentOS 7)中,/var/run
已經(jīng)變成了一個(gè)指向 /run
的符號(hào)鏈接铐望。建議使用到了 /var/run
目錄的老舊應(yīng)用程序遷移到 /run
目錄冈涧。
應(yīng)用程序可能會(huì)使用 /run
的子目錄,鼓勵(lì)應(yīng)用程序使用多個(gè)運(yùn)行時(shí)文件正蛙。用戶也可能會(huì)使用 /run
的子目錄督弓,但必須注意適當(dāng)?shù)叵拗圃L問權(quán)限,以防止未經(jīng)授權(quán)地使用 /run
本身和其他子目錄乒验。每個(gè)子目錄只能讓該目錄的所有者修改愚隧。
原本放在 /etc
目錄下的進(jìn)程 ID(PID
)文件現(xiàn)在必須放在 /run
目錄下,文件命名規(guī)范為 <program-name>.pid
锻全, 比如 crond
的 PID
文件名為 /run/crond.pid
狂塘。PID
文件的內(nèi)部格式未發(fā)生改變录煤,該文件必須由 ASCII 編碼的十進(jìn)制整數(shù)的進(jìn)程標(biāo)識(shí)符組成,后面跟著換行符荞胡, 例如辐赞,如果 crond
是進(jìn)程號(hào)25,/run/crond.pid
將包含三個(gè)字符:2硝训、5 和換行符。讀 PID
文件的程序應(yīng)該在接受什么方面有一定的靈活性新思。例如窖梁,它們應(yīng)該忽略額外的空格道川、前面的零大州、末尾缺失的換行、或 PID
文件中的額外行犬第。創(chuàng)建 PID
文件的程序應(yīng)該使用上面的簡單規(guī)范荸哟。維護(hù)臨時(shí) UNIX-domain 套接字的系統(tǒng)程序必須將它們放在這個(gè)目錄或上面所述的適當(dāng)?shù)淖幽夸浿小?/p>
/sbin
是 system binaries
的簡稱假哎,有時(shí)也稱為 static binaries
, 最初鞍历,/sbin
中的二進(jìn)制文件保存在 /etc
中舵抹。/sbin
包含了(除了 /bin
中的二進(jìn)制文件外的)用于啟動(dòng)、恢復(fù)(restoring)劣砍、恢復(fù)(recovering)和/或修復(fù)系統(tǒng)惧蛹、硬件配置程序所必需的二進(jìn)制文件,如 init
刑枝、ifconfig
香嗓、mount
等。FHS 要求 /sbin
目錄下不能有子目錄装畅,該目錄下必須包含 shutdown
命令靠娱。
系統(tǒng)管理員使用的程序和其他僅限 root 用戶可用的命令存儲(chǔ)在 /sbin
、/usr/sbin
和 /usr/local/sbin
中掠兄。/sbin
目錄下的二進(jìn)制程序是靜態(tài)鏈接( statically-linked)的,因?yàn)槟承┫到y(tǒng)需要確保在 /lib
目錄損毀后苫费,從而來保證系統(tǒng)可以啟動(dòng)柬泽。另一個(gè)包含系統(tǒng)二進(jìn)制文件的目錄是 /usr/sbin
睬棚,此目錄包含系統(tǒng)管理員使用的其他二進(jìn)制文件(比如某些服務(wù)器軟件程序,以及 fdisk
暑中、fsck
雕凹、ifconfig
俄精、mkfs
等指令)圾旨。在 /usr
之后執(zhí)行的(不太重要的)程序(當(dāng)沒有問題時(shí))通常被放在 /usr/sbin
中帚稠。在這里搁进,你會(huì)發(fā)現(xiàn)系統(tǒng)的網(wǎng)絡(luò)守護(hù)進(jìn)程以及其他二進(jìn)制文件(通常只有系統(tǒng)管理員有權(quán)訪問赢笨,但系統(tǒng)維護(hù)和修復(fù)不需要這些二進(jìn)制文件)。通常茧妒,這些目錄從來都不是普通用戶 $PATH
(PATH 是一個(gè)環(huán)境變量萧吠,它控制系統(tǒng)試圖查找命令的位置順序)的一部分,而是 root 的 $PATH
的一部分桐筏。本地安裝的系統(tǒng)管理程序應(yīng)該放在 /usr/local/sbin
中纸型。
很容易決定哪些內(nèi)容該放在 /sbin
目錄中:如果一個(gè)普通用戶(不是系統(tǒng)管理員)將直接運(yùn)行它,那么它必須被放在 /bin
目錄中梅忌。例如狰腌,像 chfn
這樣的文件,用戶只是偶爾使用牧氮,仍然必須放在 /usr/bin
中琼腔。盡管 ping
對(duì)于 root
(網(wǎng)絡(luò)恢復(fù)和診斷)是絕對(duì)必要的,但用戶經(jīng)常使用它踱葛,因此它必須駐留在 /bin
中丹莲。我們建議用戶擁有 /sbin
中所有內(nèi)容的讀取和執(zhí)行權(quán)限, 但某些 setuid
和 setgid
程序除外尸诽。建立 /bin
和 /sbin
之間的分隔并不是出于安全原因甥材,也不是為了防止用戶看到操作系統(tǒng),而是在每個(gè)人都使用的二進(jìn)制文件和主要用于系統(tǒng)維護(hù)性含、管理任務(wù)的二進(jìn)制文件之間提供良好的區(qū)分洲赵。對(duì)于用戶來說,禁止使用 /sbin
沒有固有的安全優(yōu)勢。
/srv
該目錄存放一些服務(wù)啟動(dòng)之后需要提取的數(shù)據(jù)板鬓。srv
可以視為 service
的縮寫悲敷,是一些網(wǎng)絡(luò)服務(wù)啟動(dòng)之后這些服務(wù)所需要取用的數(shù)據(jù)目錄。常見的服務(wù)例如 WWW, FTP 等俭令。舉例來說后德,WWW 服務(wù)器需要的網(wǎng)頁數(shù)據(jù)就可以放置在 /srv/www/
里面。不過抄腔,系統(tǒng)的服務(wù)數(shù)據(jù)如果尚未要提供給因特網(wǎng)任何人瀏覽的話瓢湃,預(yù)設(shè)還是建議放置到 /var/lib
下面即可。
/srv
子目錄命名的方法沒有具體的規(guī)定赫蛇,因?yàn)槟壳斑€沒有就如何做到這一點(diǎn)達(dá)成共識(shí)绵患。在 /srv
下構(gòu)造數(shù)據(jù)的一種方法是通過協(xié)議,例如悟耘,ftp
落蝙、rsync
、www
和 cvs
暂幼。在大型系統(tǒng)上筏勒,通過管理上下文(如 /srv/physics/www
、/srv/compsci/cvs
等)構(gòu)造 /srv
可能很有用旺嬉。這種設(shè)置將因主機(jī)而異管行。因此,任何程序都不應(yīng)該依賴 /srv
的特定子目錄結(jié)構(gòu)或者必須存放在 /srv
中的數(shù)據(jù)邪媳。但是捐顷,F(xiàn)HS 兼容的系統(tǒng)應(yīng)該始終存在于 /srv
,并應(yīng)將其用作此類數(shù)據(jù)的默認(rèn)位置雨效。 Linux 發(fā)行版必須注意不要在沒有管理員許可的情況下刪除這些目錄中本地放置的文件迅涮。
/tmp
此目錄主要包含臨時(shí)需要的文件,那些可能需要使用臨時(shí)文件的程序必須要能夠使用該目錄徽龟,這些程序可能會(huì)在該目錄下存放解壓后的臨時(shí)程序文件以便在運(yùn)行時(shí)使用逗柴,例如,Java 程序使用的 jar
包中的 *.so
文件等顿肺。許多程序使用它來創(chuàng)建鎖文件和臨時(shí)存儲(chǔ)數(shù)據(jù)戏溺。
不要從這個(gè)目錄中刪除文件,除非你知道你在做什么屠尊!其中許多文件對(duì)于當(dāng)前運(yùn)行的程序非常重要旷祸,刪除它們可能會(huì)導(dǎo)致系統(tǒng)崩潰。通常讼昆,它不會(huì)包含超過幾 KB 文件托享。雖然存儲(chǔ)在 /tmp
中的數(shù)據(jù)可以以特定站點(diǎn)的方式刪除,但建議在系統(tǒng)啟動(dòng)時(shí)刪除 /tmp
中的文件和目錄。FHS 根據(jù)歷史先例和慣例增加了這項(xiàng)建議闰围,但沒有將其作為一項(xiàng)要求赃绊,因?yàn)橄到y(tǒng)管理不屬于這一標(biāo)準(zhǔn)的范圍。因此羡榴,用戶和程序不能假設(shè)在程序調(diào)用之間會(huì)保存 /tmp
中的任何文件或目錄碧查。
Java 程序中使用
System.getproperty(“java.io.tmpdir”)
是獲取操作系統(tǒng)緩存的臨時(shí)目錄,Unix-like 操作系統(tǒng)中該系統(tǒng)屬性代表的就是/tmp
校仑,而在Windows中則為:C:\Users\登錄用戶\AppData\Local\Temp\
忠售。
/usr
在早期(70 年代,當(dāng)時(shí)還沒有 Linux 系統(tǒng))的 Unix 實(shí)現(xiàn)中迄沫,/usr
目錄是存放用戶主目錄的位置稻扬,當(dāng)時(shí)的 /usr/someone
目錄相當(dāng)于如今的 /home/someone
目錄,而現(xiàn)在 /usr
目錄是用戶級(jí)別程序和數(shù)據(jù)的位置羊瘩。usr
的名稱一直沿用至今泰佳,但其意義從 everything user related
變成了 user usable programs and data
。所以尘吗,有人將 /usr
解釋稱 User System Resources
或 Unix specific(or system ) resources
逝她。很多人都習(xí)慣將其讀成 user
的發(fā)音。這是一個(gè)非常重要的目錄摇予,存放著共享的只讀數(shù)據(jù)汽绢,類似于 Windows 下的 C:\Program Files
目錄吗跋,用戶的很多應(yīng)用程序侧戴、文檔、庫和頭文件等都放在這個(gè)目錄下跌宛。
-
/usr/bin
:存放非必需的(non-essential)二進(jìn)制命令(不是單用戶模式必須的)酗宋,如 vim、tail疆拘、yum 等蜕猫; -
/usr/include
:存放 C 語言程序編譯時(shí)所需的系統(tǒng)頭文件。 -
/usr/lib
:包含對(duì)象和庫文件(.so
和.a
格式)哎迄。應(yīng)用程序可能會(huì)使用該目錄下的單個(gè)子目錄回右。 -
/usr/libexec
:包含不被用戶和 shell 腳本直接使用的二進(jìn)制文件。應(yīng)用程序可能會(huì)使用該目錄下的單個(gè)子目錄漱挚,使用該目錄下的某個(gè)目錄后翔烁,應(yīng)用程序就不能再使用/usr/lib
下的目錄了。 -
/usr/local/
: 該目錄用來存放系統(tǒng)管理員本地安裝的軟件旨涝。本地安裝的軟件必須安裝在該目錄下而不是/usr
目錄下蹬屹,除非安裝的軟件是用來替換或升級(jí)/usr
目錄下的軟件。該目錄下的子目錄結(jié)構(gòu)類似于/usr
目錄。 -
/usr/sbin
:存放系統(tǒng)管理員專用的非必需的系統(tǒng)程序慨默,如多個(gè)網(wǎng)絡(luò)服務(wù)的守護(hù)進(jìn)程贩耐。 -
/usr/share
:用來存放所有架構(gòu)獨(dú)立的(architecture-independent)只讀數(shù)據(jù)文件(docs、icons厦取、fonts 等)潮太,用于在不同架構(gòu)平臺(tái)上共享,而不是用于不同 OS 或相同 OS 的不同版本之間共享的蒜胖。任何程序或包所需的不用修改的文件應(yīng)該放在/usr/share
或/usr/local/share
的子目錄下消别。 -
/usr/src
:內(nèi)核源代碼默認(rèn)的放置目錄。 -
/usr/etc
:理論是配置文件所在的另一個(gè)目錄台谢,現(xiàn)在已不使用寻狂。 -
/usr/games
:從前該目錄下存放著網(wǎng)絡(luò)游戲文件,現(xiàn)在很少使用朋沮。 -
/usr/tmp
:存放用戶臨時(shí)文件的目錄蛇券。該目錄是從 Unix 繼承而來的遺產(chǎn),在許多 Linux 發(fā)行版中都不存在了樊拓。
/bin
纠亚、/usr/bin
存放著給系統(tǒng)用戶使用的指令(除 root 外的跑普通用戶),而 /sbin
筋夏、/usr/sbin
則存放著是給 root 用戶使用的指令蒂胞。
早期 Linux 在設(shè)計(jì)的時(shí)候,若發(fā)生問題時(shí)条篷,救援模式通常僅掛載根目錄而已骗随,因此有五個(gè)重要的目錄被要求一定要與根目錄放置在一起,那就是 /etc
赴叹、/bin
鸿染、/dev
、/lib
乞巧、/sbin
這五個(gè)重要目錄≌墙罚現(xiàn)在許多的 Linux 發(fā)行版已經(jīng)將許多非必要的文件移出到 /usr
之外了,所以 /usr
也是越來越精簡绽媒。同時(shí)因?yàn)?/usr
被建議為即使掛載成為只讀蚕冬,系統(tǒng)還是可以正常運(yùn)作,所以救援模式也能同時(shí)掛載 /usr
是辕。CentOS 7.x 版本在救援模式的情況下就是這樣囤热。CentOS 7.x 已經(jīng)將 /sbin
、/bin
免糕、/lib
通通移到 /usr
底下了赢乓,因此忧侧,那個(gè)五大目錄的限制已經(jīng)被打破了。
/var
這個(gè)目錄中存放著variable files
牌芋,習(xí)慣將那些經(jīng)常被修改的目錄放在這個(gè)目錄下蚓炬。包括各種日志、進(jìn)程 ID躺屁、臨時(shí)目錄和郵件池等肯夏。原來 /var
目錄中有些內(nèi)容是在 /usr
中的,但為了保持 /usr
目錄的相對(duì)穩(wěn)定犀暑,就把那些需要經(jīng)常改變的目錄放到 /var
中了驯击。
-
/var/catman
: 包括了格式化過的幫助頁(man page
)。幫助頁的源文件一般存在/usr/man/catman
中耐亏;有些man
頁可能有預(yù)格式化的版本徊都,存在/usr/man/cat
中。而其他的man
頁在第一次看時(shí)都需要格式化广辰,格式化完的版本存在/var/man
中暇矫,這樣其他人再看相同的頁時(shí)就無須等待格式化了。/var/catman
經(jīng)常被清除择吊,就像清除臨時(shí)目錄一樣李根。 -
/var/lib
: 存放系統(tǒng)正常運(yùn)行時(shí)要改變的文件。 -
/var/local
: 存放/usr/local
中安裝的程序的可變數(shù)據(jù) ( 即系統(tǒng)管理員安裝的程序 ) 几睛。注意房轿,如果必要, 即使本地安裝的程序也會(huì)使用其他/var
目錄所森,例如/var/lock
囱持。 -
/var/lock
: 鎖文件。許多程序遵循在/var/lock
中產(chǎn)生一個(gè)鎖文件的約定必峰,以用來支持它們正在使用某個(gè)特定的設(shè)備或文件洪唐。其他程序注意到這個(gè)鎖定文件時(shí)钻蹬,就不會(huì)再使用這個(gè)設(shè)備或文件吼蚁。 -
/var/log
: 各種程序的日志文件,尤其是login
(/var/log/wtmplog
紀(jì)錄所有到系統(tǒng)的登錄和注銷)和syslog
(/var/log/messages
紀(jì)錄存儲(chǔ)所有核心和系統(tǒng)程序信息)问欠。/var/log
里的文件經(jīng)常不確定地增長肝匆,應(yīng)該定期清除。 -
/var/run
: 保存在下一次系統(tǒng)引導(dǎo)前有效的關(guān)于系統(tǒng)的信息文件顺献。例如旗国,/var/run/utmp
包含當(dāng)前登錄的用戶信息。 -
/var/spool
: 放置spool
程序的目錄注整,如 mail 能曾、 news 度硝、打印隊(duì)列和其他隊(duì)列工作的目錄。每個(gè)不同的spool
在/var/spool
下有自己的子目錄寿冕,例如蕊程,用戶的郵箱就存放在/var/spool/mail
中。 -
/var/tmp
: 比/tmp
允許更大的或需要存在較長時(shí)間的臨時(shí)文件驼唱。注意系統(tǒng)管理員可能不允許/var/tmp
有很舊的文件藻茂。
/proc
這個(gè)目錄是一個(gè)虛擬文件系統(tǒng)(virtual filesystem),它是系統(tǒng)內(nèi)存的文件映射玫恳,其內(nèi)容(諸如系統(tǒng)核心辨赐、行程信息、周邊設(shè)備的狀態(tài)及網(wǎng)絡(luò)狀態(tài)等)是不在硬盤上而是在內(nèi)存里京办,也不占用硬盤空間掀序。我們可以通過直接訪問這個(gè)目錄來獲取系統(tǒng)信息,也可以直接修改里面的某些文件惭婿,比如可以通過下面的命令來屏蔽主機(jī)的 ping 命令森枪,使別人無法 ping 你的機(jī)器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
FHS 中可選的目錄
/home
存放所有用戶的主目錄,類似于 Windows 中 C:\Users
目錄审孽,一般為單獨(dú)的分區(qū)县袱。在Linux中,每個(gè)用戶都有一個(gè)自己的目錄佑力,一般該用戶目錄名是以用戶的賬號(hào)命名的式散。
/root
該目錄為 root
用戶(超級(jí)權(quán)限管理員)的主目錄。
/selinux
這個(gè)目錄是 Redhat/CentOS
所特有的目錄打颤,是用來存放 Selinux
相關(guān)的文件的暴拄。Selinux
是一個(gè)比較復(fù)雜安全機(jī)制,類似于 Windows 的防火墻编饺。
/sys
這個(gè)目錄類似于 /proc
目錄乖篷,也是一個(gè)虛擬的文件系統(tǒng),同樣不占硬盤空間透且。該目錄是 Linux 2.6 內(nèi)核的一個(gè)很大的變化撕蔼,該目錄下安裝了 2.6 內(nèi)核中新出現(xiàn)的一個(gè)文件系統(tǒng) sysfs
。sysfs
文件系統(tǒng)集成了下面 3 種文件系統(tǒng)的信息:針對(duì)進(jìn)程信息的 proc 文件系統(tǒng)秽誊、針對(duì)系統(tǒng)硬件設(shè)備的 devfs
文件系統(tǒng)以及針對(duì)偽終端的 devpts
文件系統(tǒng)鲸沮。該文件系統(tǒng)是內(nèi)核設(shè)備樹的一個(gè)直觀反映。當(dāng)一個(gè)內(nèi)核對(duì)象被創(chuàng)建的時(shí)候锅论,對(duì)應(yīng)的文件和目錄也在內(nèi)核對(duì)象子系統(tǒng)中被創(chuàng)建讼溺。
/lost+found
這個(gè)目錄一般情況下是空的,當(dāng)系統(tǒng)非法關(guān)機(jī)后最易,這里就存放了一些文件怒坯。這個(gè)目錄是使用標(biāo)準(zhǔn)的 ext2/ext3/ext4
文件系統(tǒng)格式才會(huì)產(chǎn)生的一個(gè)目錄炫狱,目的在于當(dāng)文件系統(tǒng)發(fā)生 錯(cuò)誤時(shí),將一些遺失的片段放置到這個(gè)目錄下剔猿。不過如果使用的是 xfs
文件系統(tǒng)的話毕荐,就不會(huì)存在這個(gè)目錄了。
絕對(duì)路徑和相對(duì)路徑
根據(jù)寫法的不同艳馒,也可將所謂的路徑定義為絕對(duì)路徑(absolute path)與相對(duì)路徑(relative path)憎亚。
-
絕對(duì)路徑:由根目錄(
/
)開始的路徑(可以是一個(gè)文件,也可以是一個(gè)目錄)弄慰。例如/home/vincent
第美,/home/vincent/.bashrc
。 -
相對(duì)路徑:相對(duì)于當(dāng)前工作目錄的路徑陆爽,不以根目錄(
/
)開始什往。相對(duì)路徑前面加上當(dāng)前工作目錄的絕對(duì)路徑就是該相對(duì)路徑對(duì)應(yīng)的絕對(duì)路徑。例如慌闭,從/usr/share/doc
目錄切換到/usr/share/man
目錄下時(shí)别威,對(duì)應(yīng)的命令可以寫成cd ../man
,這里cd
命令的目錄參數(shù)就是相對(duì)路徑的寫法驴剔。
使用相對(duì)路徑可以方便地在一個(gè)大目錄中各個(gè)子目錄中相互切換省古,而不需要知道每個(gè)子目錄的絕對(duì)路徑。使用絕對(duì)路徑雖然麻煩丧失,但其確定性較好豺妓,只要絕對(duì)路徑書寫正確,就可以正確使用對(duì)應(yīng)的文件布讹,而相對(duì)路徑在某些工作環(huán)境中可能無法正確找到文件琳拭。
特殊目錄
在 Linux 文件系統(tǒng)中還有幾個(gè)特殊的目錄:
-
.
表示用戶所在的工作目錄,也叫當(dāng)前目錄描验,也可以使用./
來表示白嘁。 -
..
表示當(dāng)前目錄的上一級(jí)目錄,也叫父目錄膘流,也可以../
來代表絮缅。 -
-
表示前一個(gè)工作目錄。比如睡扬,使用cd -
命令可以切換到上一個(gè)目錄中盟蚣。 -
~
表示當(dāng)前用戶的主目錄黍析,也可以用~/
表示卖怜。
如果一個(gè)目錄或文件名以一個(gè)點(diǎn) .
開始,表示這個(gè)目錄或文件是一個(gè)隱藏目錄或文件(如:.bashrc
)阐枣。即以默認(rèn)方式查找時(shí)马靠,不顯示該目錄或文件奄抽,如果要顯示出隱藏目錄,需要在 ls
或 ll
命令后面加 -a
選項(xiàng)甩鳄。
經(jīng)吵讯龋可以看到類似于 ./run.sh
的運(yùn)行可執(zhí)行文件的寫法,這是如何解析的呢妙啃?由于命令的執(zhí)行需要變量的支持档泽,若執(zhí)行文件放置在當(dāng)前工作目錄中,并且當(dāng)前工作目錄并非正規(guī)的執(zhí)行文件目錄(/bin
揖赴、/usr/bin
等為正規(guī))馆匿,此時(shí)要運(yùn)行的可執(zhí)行文件就需要嚴(yán)格指定可執(zhí)行文件。./
代表當(dāng)前工作目錄的意思燥滑,所以
./run.sh
代表運(yùn)行當(dāng)前工作目錄下名為 run.sh
的可執(zhí)行文件渐北。