比起 Windows,怎樣解讀 Linux 的檔案系統與目錄結構?

呂凱發表於2018-06-09

  Linux 和Windows的檔案系統有些不同,在學習使用 Linux 之前,若能夠了解這些不同,會有助於後續學習。

  本文先對Windows和 Linux 上面檔案系統原理、組織概念進行區分,並給出例子、列舉兩者的優缺點以具體說明,最後較為詳細地介紹了 Linux 系統的目錄結構。

 Windows 和 Linux 檔案系統

  下面將介紹啟動Windows和 Linux 後,在檔案系統的角度上,它們分別是怎樣看待自己世界的。

  訪問原理

  在Windows系統中, 一切東西都是存放在硬碟上的。啟動系統後,先確定硬碟,再確定硬碟上的分割槽以及每個分割槽所對應檔案系統,最後是存放在某個分割槽特定的檔案系統中的檔案。 也就是說,Windows是通過 “某個硬碟-硬碟上的某個分割槽-分割槽上的特定檔案系統-特定檔案系統中的檔案” 這樣的順序來訪問到一個檔案的。

  但是與Windows不同, Linux 系統中的一切都是存放在唯一的 虛擬檔案系統中的,這個 虛擬檔案系統是樹狀的結構以一個根目錄開始。啟動系統後,先有這個 虛擬檔案系統,再識別出各個硬碟, 再把某個硬碟的某個分割槽掛載到這個 虛擬檔案系統的某個子樹上(即分割槽用某個子目錄來表示),再確定分割槽對應的子目錄檔案系統,最後的檔案就存放在這個特定的檔案系統中。 也就是說, Linux 系統是通過 “虛擬檔案系統-硬碟-硬碟上的分割槽-分割槽上的特定檔案系統-特定檔案系統中的檔案” 這樣的順序來訪問一個檔案的。

  可能對習慣了使用Windows的使用者來說, Linux 的方式有些不適應,它的 虛擬檔案系統,實質就是一顆目錄樹,最開始的目錄叫做根目錄,根目錄中又有每一級子目錄,或者檔案,子目錄又有子子目錄和檔案,其中每個子目錄都特定的功能這個功能(這些是約定俗成了的,在後面 常用的重要目錄 (See section 1.2.1) 中會詳細說明)。

  也許有人會問,沒有這個虛擬檔案系統就無法使用硬碟,可是最開始沒有硬碟,那麼這個 虛擬檔案系統以及相應的組織結構是怎麼存放起來的呢?這個問題,就像先有雞還是先有蛋這個問題一樣看似簡單實則……但是,在 Linux 中,很輕易地跳出了這個思維迴圈,問題的答案並沒在 虛擬檔案系統 和 硬碟 這兩者之間徘徊,而是第三者—— 記憶體 ,Linux系統啟動起來之後,整個 虛擬檔案系統的組織結構,都是隨著每次核心系統的啟動自動在記憶體中建立好了的,根本就不需要硬碟。 

  另外還要注意,就是在我們使用者的角度上,無論在Windows還是 Linux 上面,都是使用路徑來訪問一個檔案的。表示檔案的路徑由 “檔案所在的目錄+各級目錄的分隔符+檔案” 三個部分組成,這個策略在兩者之間是一樣的,所不同的是,Windows下面目錄分隔符是 \ , Linux 下面是 / ,也許這也是兩者之間為了表示其各自立場不同的一個原因吧?^_^

  系統組織

  在Windows系統中,我們可以把檔案大體分為兩種: 系統檔案和使用者檔案 。一般來說系統檔案(例如Windows作業系統本身,一些系統程式,程式執行所需的庫檔案,以及一些系統配置檔案等)存放的預設位置在 C 盤,當然也可以在安裝時候指定在其他盤;其它使用者檔案,包含使用者後來安裝的程式以及一些資料檔案等,使用者可以把它們隨意存放在任意的分割槽。

  在 Linux 系統中,主要有兩個概念: 虛擬檔案系統中的檔案和 Linux作業系統核心 本身。邏輯上可以認為前者屬於上層,後者在下層,前者基於後者,後者依賴前者而存在。 Linux 把除了它本身( Linux作業系統核心 )以外的一切事物都看作是在 虛擬檔案系統中的檔案了。無論是鍵盤,滑鼠,資料,程式,CPU,記憶體,網路卡……無論是硬體、軟體、資料還是記憶體中的東西,我們都可以在 虛擬檔案系統中的相應子目錄對他們進行訪問和操作,操作統一。而實現這些管理的幕後就是 Linux作業系統核心 本身:啟動 Linux 系統的時候,首先電腦把 Linux作業系統核心 載入到記憶體中,核心本身提供了檔案管理,裝置管理,記憶體管理,CPU程式排程管理,網路管理等功能,等核心執行起來之後,就在記憶體中建立起相應的 虛擬檔案系統,最後就是核心利用它提供的那些功能,通過管理檔案的方式,來管理 虛擬檔案系統中的硬體軟體等各種資源了。

  Linux 把提供作業系統本身功能(管理計算機軟硬體資源)的那些部分劃給了 Linux作業系統核心 ,使得Linux作業系統核心 成為一個獨立的部分,有它自己獨立的開原始碼;而其它的一切(軟體應用,硬體驅動,資料)都根據其特性有自己的開原始碼、或者自由地組織並且存放在那個 虛擬檔案系統中由 Linux作業系統核心 來管理。這樣,將系統本身和系統所管理的資源分開,並開放原始碼,有助於對系統或者系統所管理的資源進行靈活的定製和擴充套件,還能按需快速建立起只適合自己使用的作業系統,也利於作業系統本身的發展。實際 Ubuntu , Fedora , RedHat 等各種不同的 Linux 作業系統發行版,簡單來說就是不同廠商對其檔案系統和核心進行了不同的配置而產生的 “大眾化” 的作業系統。相比之下,Windows就顯得非常地零亂複雜,將系統、軟體、硬體、資料都混在了一起,其不同版本只能由Microsoft 一家公司發行。

  舉例說明

  下面用直觀的例子,來說明兩者的不同,以加深理解。假設我們的機器上面有一個硬碟,硬碟分為三個區。

  在Windows系統中, 我們啟動系統之後就會看到 C, D, E, 碟符,它們分別對應硬碟上的三個分割槽,增加硬碟,或者分割槽,會導致碟符的增加(注意由於歷史原因, A, B 用於表示軟碟機,硬碟分割槽碟符從 C 開始按字母遞增),這裡的每個分割槽都各自可以被格式化為不同的檔案系統(這裡的檔案系統,包括例如 NTFS 格式, FAT32 格式等),檔案系統的基本功能就是為了存放檔案的,不同檔案系統區別一般在於管理其中存放的檔案的功能的強弱,所以分割槽被格式化成指定格式的檔案系統之後,就可以存放任何檔案和目錄了,我們看到的 C, D, E 內容也就對應了硬碟中相應分割槽的資料內容。

  但是,與Windows中把硬碟分割槽看成 C, D, E 碟符不同, Linux 中最開始根本就沒有硬碟的概念,就只有一個純粹的 虛擬檔案系統。如果想要使用哪個硬碟的某個分割槽,就把那個分割槽 “掛載” 到某個子目錄之下,這樣硬碟中的分割槽,檔案系統,目錄等內容就呈現到了那個子目錄裡面。也就是說,在 Linux 中,我們使用硬碟中的資料,實際是先把硬碟的某個分割槽 “掛載” 到某個子目錄下,然後通過那個子目錄來訪問的。這個例子中, 通常硬碟會對應 虛擬檔案系統中的/dev/sda (如有多個硬碟,則為 /dev/sda, /dev/sdb, ……, 按字母遞增), 其三個分割槽對應 /dev/sda1, /dev/sda2,/dev/sda3 (多個分割槽按數字遞增,不同硬碟的分割槽,對應為 /dev/sdb1, /dev/sdb2 等等), 預設硬碟各個分割槽會被掛載到 虛擬檔案系統系統中類似 /mnt/sda1/, /mnt/sda2/, /mnt/sda3/ 的目錄(在 Linux 又叫掛載點)中,在/etc/fstab 檔案中,我們可以找到分割槽檔案和掛載點的對應關係描述。這樣,硬碟相應的分割槽就做為整個 虛擬檔案系統根目錄下的一顆子樹,反映到了子目錄(掛載點)上,子目錄中的內容就對應分割槽中的資料。

  假設訪問上述硬碟第三個分割槽 dir1 目錄中的檔案 test.file

Window系統上的路徑:E:\dir1\test.file
Linux系統上的路徑:/mnt/sda3/dir1/test.file

  再有,假設使用者安裝和解除安裝一個程式 firefox :

  • Windows系統中

    指定或不指定安裝路徑類似,程式的安裝目錄會在 C:\Program Files\Firefox 類似的目錄中,或指定的安裝路徑中; 可執行檔案一般在程式的安裝路徑;依賴的內部庫、第三方庫、和系統庫可能在安裝路徑中,也可能在C:\Windows\System32, 或 C:\Windows\system 等類似的路徑;而程式訪問期間的系統和使用者配置檔案和產生的輸入輸出檔案,可能會在安裝路徑配置中,或者在 C:\Windows\ 下的某些檔案中(比如登錄檔資料庫檔案、使用者目錄等),這就不一定了。而且不同的系統版本,應用程式版本下,這些目錄的具體名稱和路徑可能會有所不同。解除安裝的時候由於不確定哪些地方安裝了什麼內容,很容易造成檔案刪除補全,遺留系統垃圾等現象,造成系統越來越癱腫。

  • Linux 系統中

    如果不指定安裝路徑,所有程式的可執行檔案在 /usr/bin 中, 全域性配置檔案在 /etc/firefox 類似的目錄, 使用者配置檔案一般在使用者主目錄的 .firefox 的路徑下(使用者主目錄路徑名稱統一格式為 /home/<username>) ,依賴的內部庫和第三方庫在 /usr/lib, 系統庫在 /lib 下, 資料檔案一般就在使用者主目錄下。 如果指定安裝目錄,那麼所有內部庫和可執行程式,全域性配置檔案,會在 <安裝路徑> 下的 bin, lib, etc 子目錄下,其它檔案一般和預設情況相同。解除安裝程式之時,只需在對應目錄中,將可執行檔案、內部庫、配置檔案、資料檔案刪除即可,基本沒有不確定是否遺留垃圾檔案的問題。這些都是大多數應用程式安裝的和訪問的預設策略,就像是不成文的業界標準,不排除有個別程式不安裝這種策略部署應用,但是 Linux 使用者帶來 “麻煩“ 的應用,早晚也會被淘汰,不可能會流行在 Linux 系統中,這樣,自然的,好的應用都儲存在 Linux 系統中並逐漸流行起來,還不會破壞系統結構。

  可見, Linux 檔案的存放和組織明顯方式更高效,層次更分明。

  優缺點

  基於上述內容,Windows和 Linux 檔案系統的各有優缺點分別如下。

  • Windows系統優點

    優點主要是使用者存放東西的位置比較自由,系統結構簡單便於新使用者上手。

  • Windows系統缺點

    缺點較多主要有:

    • 目錄組織缺乏標準

      由於對“系統檔案”和“使用者檔案”存放位置缺乏細緻的規定,資料組織的方式顯得比較凌亂,並且兩種檔案之間很容易相互干擾(例如資料檔案可能存放在系統區域給系統帶來垃圾檔案等)。

    • 使用者的使用經驗對系統的使用效率影響很大

      一般來說,我們使用Windows時候合理使用分割槽會提升的系統效率。例如根據需要設定合理的系統分割槽(假設為C 分割槽),儘量少往 C 盤存放資料檔案,根據具體情況可以將一些 “重要並且常用的” 程式安裝在 C 分割槽,隨時保持系統目錄的清潔和大小助於提升系統的執行速度,使用者安裝的一般軟體儘量不要安裝在 C 盤,安裝軟體時候指定的位置最好採用預設標準目錄名稱(例如 X:\Program Files 目錄,這裡 X 表示碟符而不要自己定義一些奇怪名字的目錄,這樣便於軟體的維護等等。

    • 共享不便

      Windows上有經驗的使用者們會將自己的目錄結構組織好,但是每個使用者組織自己內容的方式是不一樣的,所以他的機器上哪裡存放了什麼內容,別人很難知道,為共享帶來了麻煩。

  • Linux 系統缺點

    最開始 虛擬檔案系統中的每個子目錄的功能是事先規定好了的,我們需要事先知道那些目錄存放哪些檔案,然後在相應的位置中建立自己的內容,這也是 Linux 系統入門門檻高的一個原因。當然,最開始的新手,也完全可以無視這一點,可以像Windows那樣隨意地建立目錄和檔案(儘管不推薦這麼做)。

    實際上最開始的目錄也不多,主要就那麼幾個,花不了多長時間就會明白它們的作用的,而明白這些作用之後帶來的好處,遠不止付出那麼多(本文後面 常用的重要目錄 (See section 1.2.1) 會著重對此進行介紹)。

  • Linux 系統優點

    這裡只說幾個優點:

    • 目錄結構反映系統執行機理

      當我們瞭解了這些目錄的功能之後,我們對整個 Linux 作業系統的執行機理也會有一個大致的瞭解。

    • 結構清晰避免邏輯混亂

      這樣的目錄結構,有助於我們以一種高效的方式組織自己的資料,分類清晰並且不會對系統執行有任何影響,規定了最開始每個目錄的功能,並沒有限制我們的自由,因為我們知道我們可以在哪裡建立自己的子目錄並且在子目錄中任意建立自己的檔案。

    • 組織規範便於共享

      由於目錄具有統一的組織結構,所以 Linux 上面的使用者在共享資料的時候,能夠很容易地猜測出他所需要的資料大致存放在什麼位置,同時也不會影響到私有資料的保密性,畢竟具體來說,怎麼存放自己的私有資料,那是使用者自己決定的。

 Linux 上面的虛擬檔案系統目錄組織

  實質上,我們啟動系統所看到的 “根目錄” ,邏輯上是 Linux 虛擬檔案系統的根目錄中的一個子目錄,我們看不到除了這個 “根目錄” 以外的其他的目錄,那些目錄和作業系統的具體實現相關是被作業系統核心隱藏起來了的,所以這裡就介紹我們所能看到的檔案系統中的 “根目錄” 的各個子目錄中的作用吧。

  在 Linux 檔案系統中的每一個子目錄都有特定的目的和用途。一般都是根據 FHS 標準定義一個正式的檔案系統結構的,這個標準規定了哪些目錄應該哪些作用。這裡我們先介紹一些日常經常用到的目錄,然後給出 FHS 相關的內容。

  常用的重要目錄

  這裡,根據本人的使用經驗,給出比較常見重要的一些目錄,最開始我們對它們有所瞭解就可以了。隨著對 Linux 使用的經驗的加深,我們會了解越來越多的目錄。對目錄的功能知道得越多,我們對 Linux 系統的工p作原理就理解的越深刻,理解作業系統的工作原理,更助於我們更為規範地使用和理解系統中每個目錄存在的意義,直至最後幾乎知道系統中的每個檔案……

  • / 根目錄

    包含了幾乎所的檔案目錄。相當於中央系統。進入的最簡單方法是:cd /。

  • /boot 載入程式,核心等存放的目錄

    這個目錄,包括了在引導過程中所必需的檔案,載入程式的相關檔案(例如 grub , lilo 以及相應的配置檔案)以及 Linux 作業系統核心相關檔案(例如 vmlinuz 等)一般都存放在這裡。在最開始的啟動階段,通過載入程式將核心載入到記憶體,完成核心的啟動(這個時候, 虛擬檔案系統還不存在,載入的核心雖然是從硬碟讀取的,但是沒經過 Linux 的 虛擬檔案系統,這是比較底層的東西來實現的)。然後核心自己建立好 虛擬檔案系統,並且從 虛擬檔案系統的其他子目錄中(例如 /sbin 和 /etc )載入需要在開機啟動的其他程式或者服務或者特定的動作(部分可以由使用者自己在相應的目錄中修改相應的檔案來配製)。如果我們的機器中包含多個作業系統,那麼可以通過修改這個目錄中的某個配置檔案(例如 grub.conf )來調整啟動的預設作業系統,系統啟動的擇選單,以及啟動延遲等引數。

  • /sbin 超級使用者可以使用的命令的存放目錄

    存放大多涉及系統管理的命令(例如引導系統的 init 程式),是超級許可權使用者 root 的可執行命令存放地,普通使用者無許可權執行這個目錄下的命令(但是有時普通使用者也可能會用到)。這個目錄和 /usr/sbin ,/usr/X11R6/sbin或/usr/local/sbin 等目錄是相似的,我們要記住,凡是目錄 sbin 中包含的都是 root 許可權才能執行的,這樣就行了。後面會具體區分。

  • /bin 普通使用者可以使用的命令的存放目錄

    系統所需要的那些命令位於此目錄,比如 ls 、 cp 、 mkdir 等命令;類似的目錄還 /usr/bin , /usr/local/bin等等。這個目錄中的檔案都是可執行的、普通使用者都可以使用的命令。作為基礎系統所需要的最基礎的命令就是放在這裡。

  • /lib 根目錄下的所程式的共享庫目錄

    此目錄下包含系統引導和在根使用者執行命令時候所必需用到的共享庫。做個不太好但是比較形象的比喻,點類似於Windows上面的 system32 目錄。按理說,這裡存放的檔案應該是 /bin 目錄下程式所需要的庫檔案的存放地,也不排除一些例外的情況。類似的目錄還 /usr/lib , /usr/local/lib 等等。

  • /dev 裝置檔案目錄

    在 Linux 中裝置都是以檔案形式出現,這裡的裝置可以是硬碟,鍵盤,滑鼠,網路卡,終端,等裝置,通過訪問這些檔案可以訪問到相應的裝置。裝置檔案可以使用 mknod 命令來建立,具體參見相應的命令;而為了將對這些裝置檔案的訪問轉化為對裝置的訪問,需要向相應的裝置提供裝置驅動模組(一般將裝置驅動編譯之後,生成的結果是一個*.ko 型別的二進位制檔案),在核心啟動之後,再通過 insmod 等命令載入相應的裝置驅動之後,我們就可以通過裝置檔案來訪問裝置了。一般來說,想要 Linux 系統支援某個裝置,只需要三個東西:相應的硬體裝置,支援硬體的驅動模組,以及相應的裝置檔案。

  • /home 普通使用者的家目錄(或 $HOME 目錄、主目錄)

    在 Linux 機器上,使用者主目錄通常直接或間接地置在此目錄下。其結構通常由本地機的管理員來決定。通常而言,系統的每個使用者都有自己的家目錄,目錄以使用者名稱作為名字存放在 /home 下面(例如 quietheart 使用者,其家目錄的名字為 /home/quietheart )。該目錄中儲存了絕大多數的使用者檔案(使用者自己的配置檔案,定製檔案,文件,資料等), root 使用者除外(參見後面的 /root 目錄)。由於這個目錄包含了使用者實際的資料,通常系統管理員為這個目錄單獨掛載一個獨立的磁碟分割槽,這樣這個目錄的檔案系統格式就可能和其他目錄不一樣了(儘管表面上看,這個目錄還是屬於根目錄的一棵子樹上),將系統檔案和資料檔案分開存放,有利於維護。

  • /root 使用者root的 $HOME 目錄

    系統管理員(就是 root 使用者或超級使用者)的主目錄比較特殊,不存放在 /home 中,而是直接放在 /root 目錄下了。

  • /etc 全域性的配置檔案存放目錄

    系統和程式一般都可以通過修改相應的配置檔案,來進行配置。例如,要配置系統開機的時候啟動那些程式,配置某個程式啟動的時候顯示什麼樣的風格等等。通常這些配置檔案都集中存放在 /etc 目錄中,所以想要配置什麼東西的話,可以在 /etc 下面尋找我們可能需要修改的檔案。一些大型套件,如 X11 ,在 /etc 下它們自己的子目錄。系統配置檔案可以放在這裡或在 /usr/etc 。 不過所有程式總是在 /etc 目錄下查詢所需的配置檔案,你也可以將這些檔案連結到目錄 /usr/etc 。另外,還一個需要注意的常見現象就是,當某個程式在某個使用者下執行的時候,可能會在該使用者的家目錄中生成一個配置檔案(一般這個檔案最開始就是 /etc 下相應配置檔案的拷貝,存放相應於“當前使用者”的配置),這樣當前使用者可以通過配置這個家目錄的配置檔案,來改變程式的行為,並且這個行為只是該使用者特有的。原因就是:一般來說一個程式啟動,如果需要讀取一些配置檔案的話,它會首先讀取當前使用者家目錄的配置檔案,如果存在就使用;如果不存在它就到 /etc 下讀取全域性的配置檔案進而啟動程式。就是這個配置檔案不自動生成,我們手動在自己的家目錄中建立一個檔案的話,也有許多程式會首先讀取到這個家目錄的檔案並且以它的配置作為啟動的選項(例如我們可以在家目錄中建立 vim 程式的配置檔案 .vimrc ,來配置自己的 vim 程式)。

  • /usr 這個目錄中包含了命令庫檔案和在通常操作中不會修改的檔案

    這個目錄對於系統來說也是一個非常重要的目錄,其地位類似Windows上面的 Program Files 目錄(請原諒我可能這樣做比較不太恰當^_^)。安裝程式的時候,預設就是安裝在此檔案內部某個子資料夾內。輸入命令後系統預設執行 /usr/bin 下的程式(當然,前提是這個目錄的路徑已經被新增到了系統的環境變數中)。此目錄通常也會掛載一個獨立的磁碟分割槽,它應儲存共享只讀類檔案,這樣它可以被執行 Linux 的不同主機掛載。

  • /usr/lib 目標庫檔案,包括動態連線庫加上一些通常不是直接呼叫的可執行檔案的存放位置

    這個目錄功能類似 /lib 目錄,理說,這裡存放的檔案應該是 /bin 目錄下程式所需要的庫檔案的存放地,也不排除一些例外的情況。

  • /usr/bin 一般使用者使用並且不是系統自檢等所必需可執行檔案的目錄

    此目錄相當於根檔案系統下的對應目錄( /bin ),非啟動系統,非修復系統以及非本地安裝的程式一般都放在此目錄下。

  • /usr/sbin 管理員使用的非系統必須的可執行檔案存放目錄

    此目錄相當於根檔案系統下的對應目錄( /sbin ),儲存系統管理程式的二進位制檔案,並且這些檔案不是系統啟動或檔案系統掛載 /usr 目錄或修復系統所必需的。

  • /usr/share 存放共享檔案的目錄

    在此目錄下不同的子目錄中儲存了同一個作業系統在不同構架下工作時特定應用程式的共享資料(例如程式文件資訊)。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目錄下的這些類似資料。

  • /usr/include C程式語言編譯使用的標頭檔案

    Linux 下開發和編譯應用程式所需要的標頭檔案一般都存放在這裡,通過標頭檔案來使用某些庫函式。預設來說這個路徑被新增到了環境變數中,這樣編譯開發程式的時候編譯器會自動搜尋這個路徑,從中找到你的程式中可能包含的標頭檔案。

  • /usr/local 安裝本地程式的一般預設路徑

    當我們下載一個程式原始碼,編譯並且安裝的時候,如果不特別指定安裝的程式路徑,那麼預設會將程式相關的檔案安裝到這個目錄的對應目錄下。例如,安裝的程式可執行檔案被安裝(安裝實質就是複製)到了 /usr/local/bin 下面,此程式(可執行檔案)所需要依賴的庫檔案被安裝到了 /usr/local/lib 目錄下,被安裝的軟體如果是某個開發庫(例如 Qt , Gtk 等)那麼相應的標頭檔案可能就被安裝到了 /usr/local/include 中等等。也就是說,這個目錄存放的內容,一般都是我們後來自己安裝的軟體的預設路徑,如果擇了這個預設路徑作為軟體的安裝路徑,被安裝的軟體的所檔案都限制在這個目錄中,其中的子目錄就相應於根目錄的子目錄。

  • /proc 特殊檔案目錄

    這個目錄採用一種特殊的檔案系統格式( proc 格式),核心支援這種格式。其中包含了全部虛擬檔案。它們並不儲存在磁碟中,也不佔據磁碟空間(儘管命令 ls -c 會顯示它們的大小)。當您檢視它們時,您實際上看到的是記憶體裡的資訊,這些檔案助於我們瞭解系統內部資訊。例如:

    ├1/ 關於程式1的資訊目錄。每個程式在/proc 下一個名為其程式號的目錄。
    ├cpuinfo 處理器資訊,如型別、製造商、型號和效能。
    ├devices 當前執行的核心配置的裝置驅動的列表。
    ├dma 顯示當前使用的DMA通道。
    ├filesystems 核心配置的檔案系統。
    ├interrupts 顯示使用的中斷,and how many of each there have been.
    ├ioports 當前使用的I/O埠。
    ├kcore 系統實體記憶體映象。與實體記憶體大小一樣,但實際不佔這麼多記憶體;
    ├kmsg 核心輸出的訊息。也被送到syslog 。
    ├ksyms 核心符號表。
    ├loadavg 系統”平均負載”;3個沒意義的指示器指出系統當前的工作量。
    ├meminfo 儲存器使用資訊,包括實體記憶體和swap。
    ├modules 當前載入了哪些核心模組。
    ├net 網路協議狀態資訊。
    ├self 到檢視/proc 的程式的程式目錄的符號連線。
    ├stat 系統的不同狀態
    ├uptime 系統啟動的時間長度。
    └version 核心版本。
    
  • /opt 可擇的檔案目錄

    這個目錄表示的是可擇的意思,些自定義軟體包或者第方工具,就可以安裝在這裡。比如在 Fedora Core 5.0 中,OpenOffice 就是安裝在這裡。些我們自己編譯的軟體包,就可以安裝在這個目錄中;通過原始碼包安裝的軟體,可以把它們的安裝路徑設定成 /opt 這樣來安裝。這個目錄的作用一點類似 /usr/local 。

  • /mnt 臨時掛載目錄

    這個目錄一般是用於存放掛載儲存裝置的掛載目錄的,比如磁碟,光碟機,網路檔案系統等,當我們需要掛載某個磁碟裝置的時候,可以把磁碟裝置掛載到這個目錄上去,這樣我們可以直接通過訪問這個目錄來訪問那個磁碟了。一般來說,我們最好在 /mnt 目錄下面多建立幾個子目錄,掛載的時候掛載到這些子目錄上面,因為通常我們可能不僅僅是掛載一個裝置吧?

  • /media 掛載的媒體裝置目錄

    掛載的媒體裝置目錄,一般外部裝置掛載到這裡,例如 cdrom 等。比如我們插入一個U盤,我們一般會發現, Linux 自動在這個目錄下建立一個 disk 目錄,然後把U盤掛載到這個 disk 目錄上,通過訪問這個 disk 來訪問U盤。

  • /var 內容經常變化的目錄

    此目錄下檔案的大小可能會改變,如緩衝檔案,日誌檔案,快取檔案,等一般都存放在這裡。

  • /tmp 臨時檔案目錄

    該目錄存放系統中的一些臨時檔案,檔案可能會被系統自動清空。的系統直接把 tmpfs 型別的檔案系統掛載到這個目錄上, tmpfs 檔案系統由 Linux 核心支援,在這個檔案系統中的資料,實際上是記憶體中的,由於記憶體的資料斷電易失,當系統重新啟動的時候我們就會發現這個目錄被清空了。

  • /lost+found 恢復檔案存放的位置

    當系統崩潰的時候,在系統修復過程中需要恢復的檔案,可能就會在這裡被找到了,這個目錄一般為空。

  以上目錄,是最常見的重要目錄。其中,有些目錄初學者容易混淆,這裡簡單區分一下:

  1. /bin , /sbin 與 /usr/bin , /usr/sbin
    • /bin 一般存放對於使用者和系統來說“必須”的程式(二進位制檔案)。
    • /sbin 一般存放用於系統管理的“必需”的程式(二進位制檔案),一般普通使用者不會使用,根使用者使用。
    • /usr/bin 一般存放的只是對使用者和系統來說“不是必需的”程式(二進位制檔案)。
    • /usr/sbin 一般存放用於系統管理的系統管理的不是必需的程式(二進位制檔案)。
  2. /lib 與 /usr/lib
    • /lib 和 /usr/lib 的區別類似 /bin, /sbin 與 /usr/bin, /usr/sbin 。
    • /lib 一般存放對於使用者和系統來說“必須”的庫(二進位制檔案)。
    • /usr/lib 一般存放的只是對使用者和系統來說“不是必需的”庫(二進位制檔案)。

  其他還一些目錄例如: /home/user/bin, /home/user/opt, /home/user/etc, /usr/local/etc 等等,其作用都是類似於 /etc, /bin 等目錄的,可能只是層次概念不同了,使用 Linux 時間長了,會逐漸體會到其中的含義。

  當然,我們可以無視這些目錄,像使用Windows那樣自由的,不管啥檔案,想往哪存就往哪存,還是那句話,使用 Linux 時間長了,會逐漸體會到其中的含義,到時候也許我們想要亂來都不行了呢。^_^

  對檔案系統目錄的分類標準

  在大多數 Linux 系統上面,我們可以使用一個命令: man hier ,通過這個命令的輸出,就知道“根目錄”中所子目錄的作用了。這個命令含義我不多說了,總之這裡的 hier 就是對 Linux 檔案系統中各級目錄的標準功能,是一個大家都約定俗成了的東西。想要了解每個目錄更詳細的資訊,需要仔細參考 man hier 的輸出。下面就是一個比較簡短的中文描述的對檔案系統目錄分類的 FHS 標準,也就是對 man hier 的簡單翻譯。

NAME 名稱
hier - 檔案系統描述
 DESCRIPTION 描述
一個典型的Linux系統具以下幾個目錄結構:
/ 根目錄,是所目錄樹開始的地方。
/bin 此目錄下包括了單使用者方式及系統啟動或修復所用到的所執行程式。
/boot 包括了載入程式的靜態檔案。此目錄下包括了在引導過程中所必需的檔案。系統裝載程式及配製檔案在 /sbin 和 /etc 目錄中找到。
/dev 對應物理裝置的指定檔案或驅動程式。參見mknod(1)。
/dos 如果MS-DOS和Linux共存於一臺計算機時,這裡通常用於存放DOS 檔案系統。
/etc 用於存放本地機的配置檔案。一些大型套件,如X11,在 /etc 下它們自己的子目錄。系統配置檔案可以放在這裡或在 /usr/etc。 不過所程式總是在 /etc 目錄下查詢所需的配置檔案,你也可以將這些檔案連結到目錄 /usr/etc.
/etc/skel 當建立一個新使用者賬號時,此目錄下的檔案通常被複制到使用者的主目錄下。
/etc/X11X11 window system所需的配置檔案。
/home 在Linux機器上,使用者主目錄通常直接或間接地置在此目錄下。其結構通常由本地機的管理員來決定。
/lib 此目錄下包含系統引導和在根使用者執行命令所必需用到的共享庫。
/mnt 掛載臨時檔案系統的掛載點。
/proc 這是提供執行過程和核心檔案系統 proc 掛載點。這一”偽”檔案系統在以下章節中詳細敘述 proc(5)。
/sbin 類似於 /bin 此目錄儲存了系統引導所需的命令,但這些命令一般使用者不能執行。
/tmp 此目錄用於儲存臨時檔案,臨時檔案在日常維護或在系統啟動時無需通知便可刪除
/usr 此目錄通常用於從一個獨立的分割槽上掛載檔案。它應儲存共享只讀類檔案,這樣它可以被執行Linux的不同主機掛載。
/usr/X11R6 X-Window系統 Version 11 release 6.
/usr/X11R6/bin X-Windows系統使用的二進位制檔案;通常是在對更傳統的 /usr/bin/X11 中檔案的符號連線。
/usr/X11R6/lib 儲存與X-Windows系統關資料檔案。
/usr/X11R6/lib/X11 此目錄儲存與執行X-Windows系統關其他檔案。通常是對來自 /usr/lib/X11 中檔案的符號連線。
/usr/X11R6/include/X11 此目錄儲存包括使用X11視窗系統進行編譯程式所需的檔案。通常是對來自 /usr/lib/X11 中檔案的符號連線。
/usr/bin 這是執行程式的主要目錄,其中的絕大多數為一般使用者使用,除了那些啟動系統或修復系統或不是本地安裝的程式一般都放在此目錄下。
/usr/bin/X11
X11執行檔案放置的地方;在Linux系統中,它通常是對 /usr/X11R6/bin. 符號連線表
/usr/dict
此目錄儲存拼寫檢查器所使用的詞彙表檔案。
/usr/doc
此目錄下應可以找到那些已安裝的軟體檔案。
/usr/etc
此目錄可用來那些存放整個網共享的配置檔案。然而那可執行命令指向總是使用參照使用 /etc 目錄下的檔案。 /etc 目錄下連線檔案應指向 /usr/etc. 目錄下適當的檔案。
/usr/include
C程式語言編譯使用的Include”包括”檔案。
/usr/include/X11
C程式語言編譯和X-Windows系統使用的 Include”包括”檔案。它通常中指向 /usr/X11R6/include/X11. 符號連線表。
/usr/include/asm
申明彙編函式的Include”包括”檔案,它通常是指向 /usr/src/linux/include/asm 目錄的符號連線
/usr/include/linux
包含系統變更的資訊通常是指向 /usr/src/linux/include/linux 目錄的符號連線表,來獲得作業系統特定資訊。(注:使用者應在此自行包含那些保證自己開發的程式正常執行所需的libc 函式庫。不管怎樣,Linux核心系統不是設計用來執行直接執行使用者程式的,它並不知道使用者程式需要使用哪個版本的libc庫 。如果你隨意將 /usr/include/asm 和 /usr/include/linux 指向一個系統核心,系統很可能崩潰。Debian系統不這麼做。它使用 libc*-dev執行包中提供的核心繫統標識,以保證啟動所正確的檔案。)
 /usr/include/g++
GNU C++編譯程式所使用的Include”包括”檔案。
/usr/lib
目標庫檔案,包括動態連線庫加上一些通常不是直接呼叫的可執行檔案案。一些複雜的程式可能在此佔用整個子目錄。
/usr/lib/X11
存放X系統資料檔案及系統配置檔案的地方。 Linux中通常是指向 /usr/X11R6/lib/X11 目錄的符號連線表。
/usr/lib/gcc-lib
GNU C 編譯程式所使用的可執行檔案案和”包括”檔案。 gcc(1).
/usr/lib/groff
GNU groff 檔案格式系統所使用的檔案。
/usr/lib/uucp
uucp(1) 所使用的檔案。
/usr/lib/zoneinfo
關時區資訊檔案檔案。
/usr/local
安裝在本地執行程式的地方。
/usr/local/bin
在此地放置本地執行程式的二進位制檔案。
/usr/local/doc
放置本地檔案。
/usr/local/etc
安裝在本地程式的配置檔案。
/usr/local/lib
安裝在本地程式的庫檔案。
/usr/local/info
安裝在本地程式關資訊檔案。
/usr/local/man
安裝在本地程式使用手冊。
/usr/local/sbin
安裝在本地的系統管理程式。
/usr/local/src
安裝在本地程式的原始碼。
/usr/man
手冊頁通常放在此目錄,或相關子目錄下。
/usr/man//man[1-9]
此目錄在指定的地方以原始碼形式存放手冊頁。系統在所的手冊頁中使用自己獨特的語言及程式碼集,可能會省略 substring 子字串。
/usr/sbin
此目錄儲存系統管理程式的二進位制碼,這些檔案不是系統啟動或檔案系統掛載 /usr 目錄或修復系統所必需的。
/usr/share
在此目錄下不同的子目錄中儲存了同一個作業系統在不同構架下工作時特定應用程式的共享資料。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目錄下的這些資料。
/usr/src
系統不同組成部份的原始檔包括參考資料包。不要將你自己與專案關的檔案放這裡,因為在安裝軟體外,/usr下的檔案屬性除通常設為只讀。
/usr/src/linux
系統核心資源通常拆包安裝於此。這是系統中重要的一環,因為 /usr/include/linux 符號連線表指向此目錄。你應當使用其他目錄來來編譯建立新核心。
/usr/tmp
此目錄不再使用了。它應指向目錄 /var/tmp。 這個連結只是出於系統相容的目的,一般不再使用。
/var
此目錄下檔案的大小可能會改變,如緩衝檔案可日誌檔案。
/var/adm
此目錄為 /var/log 甩替代,通常是指向 /var/log 的符號連線表。
/var/backups
此目錄用來存放重要系統檔案的後備檔案
/var/catman/cat[1-9] or /var/cache/man/cat[1-9]
此目錄儲存根據手冊分類預先格式化的參考手冊頁。(這些參考手冊頁是相互獨立的)
/var/lock
此目錄儲存鎖定檔案。依據命名習慣,裝置鎖定檔案是 LCKxxxxx xxxxx與在檔案系統中該裝置名相同,使用的格式是HDU UUCP鎖定檔案,例如包含程式標識PID的鎖定檔案是一個10位元組的ASCII格式的數字,後面跟一個換行符。
/var/log
各種日誌檔案。
/var/preserve
這是 vi(1) 存放正在編輯中的檔案,以便以後可以恢復。
/var/run
執行時的變數檔案,如存放程式標識和登入使用者資訊的檔案。 (utmp) 此目錄下檔案在系統啟動時被自動清除。
/var/spool
各種程式產生的緩衝或排除等待的檔案
/var/spool/at
at(1) 的作業存緩區
/var/spool/cron
cron(1) 的作業存緩區
/var/spool/lpd
列印快取檔案。
/var/spool/mail
使用者郵箱。
/var/spool/smail
存放 smail(1) 郵件傳送程式的緩衝檔案。
/var/spool/news
新聞子系統的緩衝目錄
/var/spool/uucp
uucp(1) 的緩衝檔案
/var/tmp
類似 /tmp, 此目錄儲存未指定持續時間的臨時檔案。

 作者簡介

  呂凱,TPV資深主任工程師,大連理工大學碩士。關注軟體開發、系統運維、內容管理、行動管理等領域,喜歡計數寫作及分享。

相關文章