Linux 文件系統概覽

 

本文旨在高屋建瓴地來討論 Linux 文件系統概念,而不是對某種特定的文件系統,好比 EXT4 是如何工做的進行具體的描述。另外,本文也不是一個文件系統命令的教程。html

每臺通用計算機都須要將各類數據存儲在硬盤驅動器(HDD)或其餘相似設備上,好比 USB 存儲器。這樣作有兩個緣由。首先,當計算機關閉之後,內存(RAM)會失去存於它裏面的內容。儘管存在非易失類型的 RAM,在計算機斷電之後還能把數據存儲下來(好比採用 USB 閃存和固態硬盤的閃存),可是,閃存和標準的、易失性的 RAM,好比 DDR3 以及其餘類似類型的 RAM 相比,要貴不少。linux

數據須要存儲在硬盤驅動上的另外一個緣由是,即便是標準的 RAM 也要比普通硬盤貴得多。儘管 RAM 和硬盤的價格都在迅速降低,可是 RAM 的價格依舊在以字節爲單位來計算。讓咱們進行一個以字節爲單位的快速計算:基於 16 GB 大的 RAM 的價格和 2 TB 大的硬盤驅動的價格。計算顯示 RAM 的價格大約比硬盤驅動貴 71 倍。今天,一個典型的 RAM 的價格大約是 0.000000004373750 美圓/每字節。git

直觀的展現一下在好久之前 RAM 的價格,在計算機發展的很是早的時期,其中一種類型的 RAM 是基於在 CRT 屏幕上的點。這種 RAM 很是昂貴,大約 1 美圓/每字節。程序員

定義

你可能聽過其餘人以各類不一樣和使人迷惑的方式談論過文件系統。文件系統這個單詞自己有多重含義,你須要從一個討論或文件的上下文中理解它的正確含義。github

我將根據我所觀察到的在不一樣狀況下使用「文件系統」這個詞來定義它的不一樣含義。注意,儘管我試圖遵循標準的「官方」含義,可是我打算基於它的不一樣用法來定義這個術語(以下)。這就是說我將在本文的後續章節中進行更詳細的探討。算法

  1. 始於頂層 root(/)目錄的整個 Linux 目錄結構。
  2. 特定類型的數據存儲格式,好比 EXT三、EXT四、BTRFS 以及 XFS 等等。Linux 支持近百種類型的文件系統,包括一些很是老的以及一些最新的。每一種文件系統類型都使用它本身獨特的元數據結構來定義數據是如何存儲和訪問的。
  3. 用特定類型的文件系統格式化後的分區或邏輯卷,能夠掛載到 Linux 文件系統的指定掛載點上。

文件系統的基本功能

磁盤存儲是文件系統必須的功能,它與之伴生的有一些有趣並且不可或缺的細節。很明顯,文件系統是用來爲非易失數據的存儲提供空間,這是它的基本功能。然而,它還有許多從需求出發的重要功能。數據庫

全部文件系統都須要提供一個名字空間,這是一種命名和組織方法。它定義了文件應該如何命名、文件名的最大長度,以及全部可用字符集中可用於文件名中字符集子集。它也定義了一個磁盤上數據的邏輯結構,好比使用目錄來組織文件而不是把全部文件彙集成一個單一的、巨大的文件混合體。安全

定義名字空間之後,元數據結構是爲該名字空間提供邏輯基礎所必須的。這包括所需數據結構要可以支持分層目錄結構,同時可以經過結構來肯定硬盤空間中的塊是已用的或可用的,支持修改文件或目錄的名字,提供關於文件大小、建立時間、最後訪問或修改時間等信息,以及位置或數據所屬的文件在磁盤空間中的位置。其餘的元數據用來存儲關於磁盤細分的高級信息,好比邏輯卷和分區。這種更高層次的元數據以及它所表明的結構包含描述文件系統存儲在驅動器或分區中的信息,但與文件系統元數據無關,與之獨立。服務器

文件系統也須要一個應用程序接口(API),從而提供了對文件系統對象,好比文件和目錄進行操做的系統功能調用的訪問。API 也提供了諸如建立、移動和刪除文件的功能。它也提供了算法來肯定某些信息,好比文件存於文件系統中的位置。這樣的算法能夠用來解釋諸如磁盤速度和最小化磁盤碎片等術語。數據結構

現代文件系統還提供一個安全模型,這是一個定義文件和目錄的訪問權限的方案。Linux 文件系統安全模型確保用戶只能訪問本身的文件,而不能訪問其餘用戶的文件或操做系統自己。

最後一塊組成部分是實現這些全部功能所須要的軟件。Linux 使用兩層軟件實現的方式來提升系統和程序員的效率。

圖片 1:Linux 兩層文件系統軟件實現。

圖片 1:Linux 兩層文件系統軟件實現。

這兩層中的第一層是 Linux 虛擬文件系統。虛擬文件系統提供了內核和開發者訪問全部類型文件系統的的單一命令集。虛擬文件系統軟件經過調用特殊設備驅動來和不一樣類型的文件系統進行交互。特定文件系統的設備驅動是第二層實現。設備驅動程序將文件系統命令的標準集解釋爲在分區或邏輯捲上的特定類型文件系統命令。

目錄結構

做爲一個一般來講很是有條理的處女座,我喜歡將東西存儲在更小的、有組織的小容器中,而不是存於同一個大容器中。目錄的使用使我可以存儲文件並在我想要查看這些文件的時候也可以找到它們。目錄也被稱爲文件夾,之因此被稱爲文件夾,是由於其中的文件被類比存放於物理桌面上。

在 Linux 和其餘許多操做系統中,目錄能夠被組織成樹狀的分層結構。在 Linux 文件系統層次標準中定義了 Linux 的目錄結構(LCTT 譯註:可參閱這篇)。當經過目錄引用來訪問目錄時,更深層目錄名字是經過正斜槓(/)來鏈接,從而造成一個序列,好比 /var/log 和 /var/spool/mail 。這些被稱爲路徑。

下表提供了標準的、衆所周知的、預約義的頂層 Linux 目錄及其用途的簡要清單。

目錄 描述
/ (root 文件系統) root 文件系統是文件系統的頂級目錄。它必須包含在掛載其它文件系統前須要用來啓動 Linux 系統的所有文件。它必須包含須要用來啓動剩餘文件系統的所有可執行文件和庫。文件系統啓動之後,全部其餘文件系統做爲 root 文件系統的子目錄掛載到標準的、預約義好的掛載點上。
/bin /bin 目錄包含用戶的可執行文件。
/boot 包含啓動 Linux 系統所須要的靜態引導程序和內核可執行文件以及配置文件。
/dev 該目錄包含每個鏈接到系統的硬件設備的設備文件。這些文件不是設備驅動,而是表明計算機上的每個計算機可以訪問的設備。
/etc 包含主機計算機的本地系統配置文件。
/home 主目錄存儲用戶文件,每個用戶都有一個位於 /home 目錄中的子目錄(做爲其主目錄)。
/lib 包含啓動系統所須要的共享庫文件。
/media 一個掛載外部可移動設備的地方,好比主機可能鏈接了一個 USB 驅動器。
/mnt 一個普通文件系統的臨時掛載點(如不可移動的介質),當管理員對一個文件系統進行修復或在其上工做時可使用。
/opt 可選文件,好比供應商提供的應用程序應該安裝在這兒。
/root 這不是 root(/)文件系統。它是 root 用戶的主目錄。
/sbin 系統二進制文件。這些是用於系統管理的可執行文件。
/tmp 臨時目錄。被操做系統和許多程序用來存儲臨時文件。用戶也可能臨時在這兒存儲文件。注意,存儲在這兒的文件可能在任什麼時候候在沒有通知的狀況下被刪除。
/usr 該目錄裏面包含可共享的、只讀的文件,包括可執行二進制文件和庫、man 文件以及其餘類型的文檔。
/var 可變數據文件存儲在這兒。這些文件包括日誌文件、MySQL 和其餘數據庫的文件、Web 服務器的數據文件、郵件以及更多。

表 1:Linux 文件系統層次結構的頂層

這些目錄以及它們的子目錄如表 1 所示,在全部子目錄中,粗體的目錄組成了 root 文件系統的必需部分。也就是說,它們不能建立爲一個分離的文件系統而且在開機時進行掛載。這是由於它們(特別是它們包含的內容)必須在系統啓動的時候出現,從而系統才能正確啓動。

/media 目錄和 /mnt 目錄是 root 文件系統的一部分,可是它們歷來不包含任何數據,由於它們只是一個臨時掛載點。

表 1 中剩下的非粗體的目錄不須要在系統啓動過程當中出現,但會在以後掛載到 root 文件系統上,在開機階段,它們爲主機進行準備,從而執行有用的工做。

請參考官方 Linux 文件系統層次標準(FHS)網頁來了解這些每個目錄以及它們的子目錄的更多細節。維基百科上也有關於 FHS 的一個很好的介紹。應該儘量的遵循這些標準,從而確保操做和功能的一致性。不管在主機上使用什麼類型的文件系統,該層次目錄結構都是相同的。

Linux 統一目錄結構

在一些非 Linux 操做系統的我的電腦上,若是有多個物理硬盤驅動器或多個分區,每個硬盤或分區都會分配一個驅動器號。知道文件或程序位於哪個硬盤驅動器上是頗有必要的,好比 C: 或 D: 。而後,你能夠在命令中使用驅動器號,以 D: 爲例,爲了進入 D: 驅動器,你可使用 cd 命令來更改工做目錄爲正確的目錄,從而定位須要的文件。每個硬盤驅動器都有本身單獨的、完整的目錄樹。

Linux 文件系統將全部物理硬盤驅動器和分區統一爲一個目錄結構。它們均從頂層 root 目錄(/)開始。全部其它目錄以及它們的子目錄均位於單一的 Linux 根目錄下。這意味着只有一棵目錄樹來搜索文件和程序。

由於只有一個文件系統,因此 /home/tmp/var/opt 或 /usr 可以建立在和 root(/)文件系統不一樣的物理硬盤驅動器、分區或邏輯分區上,而後掛載到一個掛載點(目錄)上,從而做爲 root 文件系統樹的一部分。甚至可移動驅動器,好比 USB 驅動器或一個外接的 USB 或 ESATA 硬盤驅動器都可以掛載到 root 文件系統上,成爲目錄樹不可或缺的部分。

當從 Linux 發行版的一個版本升級到另外一個版本或從一個發行版更改到另外一個發行版的時候,就會很清楚地看到這樣建立到不一樣分區的好處。一般狀況下,除了任何像 Fedora 中的 dnf-upgrade 之類的升級工具,會明智地在升級過程當中偶爾從新格式化包含操做系統的硬盤驅動來刪除那些長期積累的垃圾。若是 /home 目錄是 root 文件系統的一部分(位於同一個硬盤驅動器),那麼它也會被格式化,而後須要經過以前的備份恢復。若是 /home 目錄做爲一個分離的文件系統,那麼安裝程序將會識別到,並跳過它的格式化。對於存儲數據庫、郵箱、網頁和其它可變的用戶以及系統數據的 /var 目錄也是這樣的。

將 Linux 系統目錄樹的某些部分做爲一個分離的文件系統還有一些其餘緣由。好比,在好久之前,我還不知道將全部須要的 Linux 目錄均做爲 root(/)文件系統的一部分可能存在的問題,因而,一些很是大的文件填滿了 /home 目錄。由於 /home 目錄和 /tmp 目錄均不是分離的文件系統,而是 root 文件系統的簡單子目錄,整個 root 文件系統就被填滿了。因而就再也不有剩餘空間可讓操做系統用來存儲臨時文件或擴展已存在數據文件。首先,應用程序開始抱怨沒有空間來保存文件,而後,操做系統也開始異常行動。啓動到單用戶模式,並清除了 /home 目錄中的多餘文件以後,終於又可以從新工做了。而後,我使用很是標準的多重文件系統設置來從新安裝 Linux 系統,從而避免了系統崩潰的再次發生。

我曾經遇到一個狀況,Linux 主機還在運行,可是卻不容許用戶經過 GUI 桌面登陸。我能夠經過使用虛擬控制檯之一,經過命令行界面(CLI)本地登陸,而後遠程使用 SSH 。問題的緣由是由於 /tmp 文件系統滿了,所以 GUI 桌面登陸時所須要的一些臨時文件不能被建立。由於命令行界面登陸不須要在 /tmp 目錄中建立文件,因此無可用空間並不會阻止我使用命令行界面來登陸。在這種狀況下,/tmp 目錄是一個分離的文件系統,在 /tmp 所位於的邏輯捲上還有大量的可用空間。我簡單地擴展了 /tmp 邏輯卷的容量到可以容納主機所須要的臨時文件,因而問題便解決了。注意,這個解決方法不須要重啓,當 /tmp 文件系統擴大之後,用戶就能夠登陸到桌面了。

當我在一家很大的科技公司當實驗室管理員的時候,遇到過另一個故障。開發者將一個應用程序安裝到了一個錯誤的位置(/var)。結果該應用程序崩潰了,由於 /var 文件系統滿了,因爲缺少空間,存儲於 /var/log 中的日誌文件沒法附加新的日誌消息。然而,系統仍然在運行,由於 root 文件系統和 /tmp 文件系統尚未被填滿。刪除了該應用程序並從新安裝在 /opt 文件系統後,問題便解決了。

文件系統類型

Linux 系統支持大約 100 種分區類型的讀取,可是隻能對不多的一些進行建立和寫操做。可是,能夠掛載不一樣類型的文件系統在同一個 root 文件系統上,而且是很常見的。在這樣的背景下,咱們所說的文件系統一詞是指在硬盤驅動器或邏輯捲上的一個分區中存儲和管理用戶數據所須要的結構和元數據。可以被 Linux 系統的 fdisk命令識別的文件系統類型的完整列表在此,你能夠感覺一下 Linux 系統對許多類型的系統的高度兼容性。

Linux 支持讀取這麼多類型的分區系統的主要目的是爲了提升兼容性,從而至少可以與一些其餘計算機系統的文件系統進行交互。下面列出了在 Fedora 中建立一個新的文件系統時的全部可選類型:

  • btrfs
  • cramfs
  • ext2
  • ext3
  • ext4
  • fat
  • gfs2
  • hfsplus
  • minix
  • msdos
  • ntfs
  • reiserfs
  • vfat
  • xfs

其餘發行版支持建立的文件系統類型不一樣。好比,CentOS 6 只支持建立上表中標爲黑體的文件系統類型。

掛載

在 Linux 系統上「掛載mount」文件系統的術語是指在計算機發展的早期,磁帶或可移動的磁盤組須要須要物理地掛載到一個合適的驅動器設備上。當經過物理的方式放置到驅動器上之後,操做系統會邏輯地掛載位於磁盤上的文件系統,從而操做系統、應用程序和用戶纔可以訪問文件系統中的內容。

一個掛載點簡單的來講就是一個目錄,就像任何其它目錄同樣,是做爲 root 文件系統的一部分建立的。因此,好比,home 文件系統是掛載在目錄 /home 下。文件系統能夠被掛載到其餘非 root 文件系統的掛載點上,可是這並不常見。

在 Linux 系統啓動階段的最初階段,root 文件系統就會被掛載到 root 目錄下(/)。其它文件系統在以後經過 SystemV 下的 rc 或更新一些的 Linux 發行版中的 systemd 等 Linux 啓動程序掛載。在啓動進程中文件系統的掛載是由 /etc/fstab 配置文件管理的。一個簡單的記憶方法是,fstab 表明「文件系統表file system table」,它包含了須要掛載的文件系統的列表,這些文件系統均指定了掛載點,以及針對特定文件系統可能須要的選項。

使用 mount 命令能夠把文件系統掛載到一個已有的目錄/掛載點上。一般狀況下,任何做爲掛載點的目錄都應該是空的且不包含任何其餘文件。Linux 系統不會阻止用戶掛載一個已被掛載了文件系統的目錄或將文件系統掛載到一個包含文件的目錄上。若是你將文件系統掛載到一個已有的目錄或文件系統上,那麼其原始內容將會被隱藏,只有新掛載的文件系統的內容是可見的。

結論

我但願經過這篇文章,闡明瞭圍繞文件系統這個術語的一些可能的模糊之處。我花費了很長的時間,以及在一個良師的幫助下才真正理解和欣賞到 Linux 文件系統的複雜性、優雅性和功能以及它的所有含義。

若是你有任何問題,請寫到下面的評論中,我會盡力來回答它們。

下個月

Linux 的另外一個重要概念是:萬物皆爲文件。這個概念對用戶和系統管理員來講有一些有趣和重要的實際應用。當我說完這個理由以後,你可能會想閱讀個人文章:萬物皆爲文件,這篇文章會在我下個月計劃寫的關於 /dev 目錄的文章以前寫完。(LCTT 譯註,也可參閱這篇

(題圖 : wallup.net)


做者簡介:

David Both 居住在美國北卡羅納州的首府羅利,是一個 Linux 開源貢獻者。他已經從事 IT 行業 40 餘年,在 IBM 教授 OS/2 20 餘年。1981 年,他在 IBM 開發了第一個關於最初的 IBM 我的電腦的培訓課程。他也曾在 Red Hat 教授 RHCE 課程,也曾供職於 MCI worldcom,Cico 以及北卡羅納州等。他已經爲 Linux 開源社區工做近 20 年。


via: https://opensource.com/life/16/10/introduction-linux-filesystems

做者:David Both 譯者:ucasFL 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索