天天看點

史上最全Linux目錄結構說明

Linux和Windows作業系統中的檔案系統些不同,在學習使用linux之前,能夠了解這個不同之處助于後續的學習。本文先對Windows和Linux上面檔案系統的一些概念進行區分,然後介紹一些Linux檔案系統相關的原理,最後較為詳細地介紹了Linux系統的目錄結構。

一、Linux和Windows檔案系統

下面分别簡單介紹一下啟動Windows和Linux之後,它們是怎樣看待自己世界的。着重介紹Linux。

1、Window上面的檔案系統

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

具體點說,假設我們的機器上面一個硬碟,硬碟分為個區,那麼我們啟動系統之後就會看到C,D,E個分區(也就是我們啟動系統後看到的”C”盤,”D”盤等),每個分區可以被格式化為各自不同的檔案系統(例如NTFS格式,FAT32格式等,檔案系統的基本功能就是為了存放檔案的,不同檔案系統差別一般在于管理其中存放的檔案的功能的強弱,分區被格式化成指定格式的檔案系統之後,就可以存放任何檔案和目錄了。這裡,我們可以把檔案大體分為兩種:系統檔案和使用者檔案。一般來說系統檔案(例如Windows作業系統本身,一些系統程式,程式運作所需的庫檔案,以及一些系統配置檔案等)存放的預設位置在C槽,當然也可以在安裝時候指定在其他盤;其它使用者檔案,包含使用者後來安裝的程式以及一些資料檔案等,使用者可以把它們随意存放在任意的分區。

這樣組織優點更缺點。優點是:使用者存放東西的位置比較自由,系統結構簡單便于新使用者上手。缺點很多這裡隻列出幾種:(1由于對“系統檔案”和“使用者檔案”存放位置缺乏細緻的規定,資料組織的方式顯得比較淩亂,并且兩種檔案之間很容易互相幹擾(例如資料文。(2使用者的使用經驗對系統的使用效率影響很大。一般來說,我們使用Windows時候合理使用分區會提升的系統效率。例如根據需要設定合理的系統分區(C分區的大小,盡量少往C槽存放資料檔案,根據具體情況可以将一些“重要并且常用的” 程式安裝在C分區,随時保持系統目錄的清潔和大小助于提升系統的運作速度,使用者安裝的一般軟體盡量不要安裝在C槽,安裝軟體時候指定的位置最好采用預設标準目錄名稱(例如X:Program Files目錄,這裡X表示盤符而不要自己定義一些奇怪名字的目錄,這樣便于軟體的維護等等。(3共享不便。Windows上經驗的使用者們會将自己的目錄結構組織好,但是每個使用者組織自己内容的方式是不一樣的,是以他的機器上哪裡存放了什麼内容,别人很難知道,為共享帶來了麻煩。但是這些在Linux系統中,情況就所不同了。

2、Linux上面的檔案系統

在Linux系統中,正好相反,一切東西都是存放在一個唯一的“虛拟檔案系統”中的,這個“虛拟檔案系統”是樹狀的結構以一個根目錄開始。啟動系統後,先有這個虛拟檔案系統,再硬碟,再把某個硬碟的某個分區做為這個虛拟檔案系統的一部分(用某個子目錄表示這個分區,再通過這個虛拟檔案系統中對應硬碟分區的那個子目錄确定硬碟分區中的特定檔案系統,最後的檔案就存放在這個特定的檔案系統中,也就是說,Linux系統是通過“虛拟檔案系統-硬碟-硬碟上的分區-分區上的特定檔案系統-特定檔案系統中的檔案”這樣的順序來通路一個檔案的。

可能對習慣了使用Windows的使用者來說,這樣的組織點不太适應,這裡的“虛拟檔案系統”,實質就是一顆目錄樹,最開始的目錄叫做根目錄,根目錄中又有每一級子目錄,或者檔案,子目錄又有子子目錄和檔案,其中每個子目錄都特定的功能這個功能是約定俗成了的後面會詳細說明……和Windows中把硬碟分成的C,D,E分區的概念不同了,Linux中最開始根本就沒有硬碟的概念,就隻有一個純粹的“虛拟檔案系統”。如果想要使用哪個硬碟的某個分區,就把那個分區“挂載”到某個子目錄之下,這樣硬碟中的分區,檔案系統,目錄等内容就呈現到了那個子目錄裡面。也就是說,在Linux中,我們使用硬碟中的資料,實際是先把硬碟“挂載”到某個子目錄下,然後通過那個子目錄來通路硬碟的。硬碟中原的資料組織結構都反映到了子目錄上,成為了整個“虛拟檔案系統”根目錄下的一顆子樹。

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

Linux這樣組織它的目錄結構,缺點當然更多的是優點。缺點就是,最開始“虛拟檔案系統”中的每個子目錄的功能是事先規定好了的,我們需要事先知道那些目錄存放哪些檔案,然後在相應的位置中建立自己的内容(當然最開始的新手,也可以像Windows那樣随意地建立目錄和檔案,實際上最開始的目錄也不多,主要就那麼幾個,花不了多長時間就會明白它們的作用的,本文後面着重對這些目錄進行介紹。而它的優點這裡隻說幾點:(1當我們了解了這些目錄的功能之後,我們對整個Linux作業系統的運作機理也會一個大緻的了解。(2助于我們以一種最高效的方式組織自己的資料,分類清晰并且不會對系統運作有任何影響,規定了最開始每個目錄的功能,并沒有限制我們的自由,因為我們知道我們可以在哪裡建立自己的子目錄并且在子目錄中任意建立自己的檔案。(3由于一個統一性的目錄組織結構,是以Linux上面的使用者在共享資料的時候,能夠很容易地猜測出他所需要的資料大緻存放在什麼位置,同時也不會影響到私有資料的保密性(怎麼存放自己的私有資料,那是使用者自己決定的。

3、Linux檔案系統在作業系統中的位置

在Linux系統中,主要兩個東西:“虛拟檔案系統”中的檔案和Linux作業系統核心本身。邏輯上可以認為前者屬于上層,後者在下層,前者基于後者,後者依賴前者而存在。

Linux把除了它本身(Linux作業系統核心以外的一切事物都看作是在“虛拟檔案系統”中的檔案了。無論是鍵盤,滑鼠,資料,程式,CPU,記憶體,網卡……無論是硬體、軟體、資料還是記憶體中的東西,我們都可以在虛拟檔案系統中的相應子目錄對他們進行通路和操作,操作統一。而實作這些管理的幕後就是Linux作業系統核心本身:啟動Linux系統的時候,首先電腦把作業系統核心加載到記憶體中,核心本身提供了檔案管理,裝置管理,記憶體管理,CPU程序排程管理,網絡管理等功能,等核心運作起來之後,就在記憶體中建立起相應的“虛拟檔案系統”,最後就是核心利用它提供的那些功能,來管理虛拟檔案系統中的硬體軟體等各種資源了。

Linux把提供作業系統本身功能(管理計算機軟硬體資源的那些部分劃給了作業系統核心,使得作業系統核心成為一個獨立的部分,有它自己的源代碼;其他的一切(軟體,硬體,資料)都根據其特性有自己的源代碼或者自由地組織并且存放在那個“虛拟檔案系統中”由作業系統核心來管理。這樣,将系統本身和系統所管理的資源分開,有助于對系統或者系統所管理的資源進行靈活的定制和擴充,還能按需快速建立起隻适合自己使用的作業系統(實際Ubuntu,Fedora,RedHat等各種不同的Linux作業系統簡單來說就是對其檔案系統和核心進行了不同的配置而産生的“大衆化”的作業系統,相比之下,Windows就顯得非常地零亂複雜,将系統、軟體、硬體都混在了一起。

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

例如:

Window系統上的檔案:D:Program FilesPPStreamPPStream.exe

Linux系統上的檔案:/usr/bin/screen

二、Linux上面的虛拟檔案系統目錄組織

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

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

1、常用的重要目錄

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

/

根目錄。

包含了幾乎所的檔案目錄。相當于中央系統。進入的最簡單方法是: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

挂載的媒體裝置目錄。