《比起Windows,怎樣解讀Linux的文件系統與目錄結構?》要點:
本文介紹了比起Windows,怎樣解讀Linux的文件系統與目錄結構?,希望對您有用。如果有疑問,可以聯系我們。
Linux 和Windows的文件系統有些不同,在學習使用 Linux 之前,若能夠了解這些不同,會有助于后續學習.
本文先對Windows和 Linux 上面文件系統原理、組織概念進行區分,并給出例子、列舉兩者的優缺點以具體說明,最后較為詳細地介紹了 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
再有,假設用戶安裝和卸載一個程序 firefox
:
C:\Program Files\Firefox
類似的目錄中,或指定的安裝路徑中; 可執行文件一般在程序的安裝路徑;依賴的內部庫、第三方庫、和系統庫可能在安裝路徑中,也可能在 C:\Windows\System32
, 或 C:\Windows\system
等類似的路徑;而程序訪問期間的系統和用戶配置文件和產生的輸入輸出文件,可能會在安裝路徑配置中,或者在 C:\Windows\
下的某些文件中(比如注冊表數據庫文件、用戶目錄等),這就不一定了.而且不同的系統版本,應用程序版本下,這些目錄的具體名稱和路徑可能會有所不同.卸載的時候由于不確定哪些地方安裝了什么內容,很容易造成文件刪除補全,遺留系統垃圾等現象,造成系統越來越癱腫./usr/bin
中, 全局配置文件在/etc/firefox
類似的目錄, 用戶配置文件一般在用戶主目錄的 .firefox
的路徑下(用戶主目錄路徑名稱統一格式為 /home/<username>
) ,依賴的內部庫和第三方庫在 /usr/lib
, 系統庫在 /lib
下, 數據文件一般就在用戶主目錄下. 如果指定安裝目錄,那么所有內部庫和可執行程序,全局配置文件,會在 <安裝路徑>
下的 bin
, lib
, etc
子目錄下,其它文件一般和默認情況相同.卸載程序之時,只需在對應目錄中,將可執行文件、內部庫、配置文件、數據文件刪除即可,基本沒有不確定是否遺留垃圾文件的問題.這些都是大多數應用程序安裝的和訪問的默認策略,就像是不成文的業界標準,不排除有個別程序不安裝這種策略部署應用,但是 Linux 用戶帶來 “麻煩“ 的應用,早晚也會被淘汰,不可能會流行在 Linux 系統中,這樣,自然的,好的應用都保存在 Linux 系統中并逐漸流行起來,還不會破壞系統結構.可見, Linux 文件的存放和組織明顯方式更高效,層次更分明.
基于上述內容,Windows和 Linux 文件系統的各有優缺點分別如下.
C
分區),盡量少往 C
盤存放數據文件,根據具體情況可以將一些 “重要并且常用的” 程序安裝在 C
分區,隨時保持系統目錄的清潔和大小助于提升系統的運行速度,用戶安裝的一般軟件盡量不要安裝在 C
盤,安裝軟件時候指定的位置最好采用默認標準目錄名稱(例如 X:\Program Files
目錄,這里 X
表示盤符而不要自己定義一些奇怪名字的目錄,這樣便于軟件的維護等等.實質上,我們啟動系統所看到的 “根目錄” ,邏輯上是 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
會顯示它們的大小).當您查看它們時,您實際上看到的是內存里的信息,這些文件助于我們了解系統內部信息.例如:/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
恢復文件存放的位置當系統崩潰的時候,在系統修復過程中需要恢復的文件,可能就會在這里被找到了,這個目錄一般為空.以上目錄,是最常見的重要目錄.其中,有些目錄初學者容易混淆,這里簡單區分一下:
/bin
, /sbin
與 /usr/bin
, /usr/sbin
/bin
一般存放對于用戶和系統來說“必須”的程序(二進制文件)./sbin
一般存放用于系統管理的“必需”的程序(二進制文件),一般普通用戶不會使用,根用戶使用./usr/bin
一般存放的只是對用戶和系統來說“不是必需的”程序(二進制文件)./usr/sbin
一般存放用于系統管理的系統管理的不是必需的程序(二進制文件)./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
的簡單翻譯.
作者:呂凱
文章出處:高效開發運維微信公眾號
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4275.html