[譯] Linux 檔案系統深度討論
本文旨在對Linux檔案系統概念高階工作方式進行的討論,不是對特定檔案系統型別(如EXT4)如何工作的低階描述,也不是對檔案系統命令的教程。
每臺通用計算機都需要將各種型別的資料儲存在硬碟驅動器(HDD)或某些等效裝置上,例如USB儲存棒。這有幾個原因,首先,當計算機關閉時RAM會丟失其內容,有一些非易失性型別的RAM可以在斷電後維持儲存在那裡的資料(例如USB儲存棒和固態驅動器中使用的快閃記憶體RAM),但快閃記憶體RAM比易失性RAM要昂貴得多。
資料需要儲存在硬碟驅動器上的第二個原因是,即標準RAM仍然比磁碟空間更昂貴。RAM和磁碟成本都在迅速下降,但RAM仍然在每位元組成本方面處於領先地位。根據16GB RAM與2TB硬碟驅動器的成本,計算每位元組成本,表明RAM的單位成本比硬碟高出約71倍。 RAM的典型成本約為每位元組0.0000000043743750美金。
為了快速記錄目前的RAM成本,在計算的早期階段,一種型別的儲存器是基於CRT螢幕上的點。這非常昂貴,每位約1.00美元!
定義
可能會聽到人們以多種不同且令人困惑的方式談論檔案系統。單詞本身可以有多種含義,可能必須從討論或文件的上下文中辨別出正確的含義。
我將嘗試根據在不同情況下使用它的方式來定義“檔案系統”一詞的各種含義。請注意,在嘗試遵循標準的“官方”含義時,我的意圖是根據其各種用法來定義該術語。將在本文的以下部分中更詳細地探討這些含義。
1. 整個Linux目錄結構從頂部(/)根目錄開始。
2. 特定型別的資料儲存格式,例如EXT3,EXT4,BTRFS,XFS等。Linux支援近100種類型的檔案系統,包括一些非常舊的檔案系統以及一些最新的檔案系統。這些檔案系統型別中的每一種都使用其自己的元資料結構來定義資料的儲存和訪問方式。
3. 使用特定型別的檔案系統格式化的分割槽或邏輯卷,可以安裝在Linux檔案系統上的指定掛載點上。
基本檔案系統功能
磁碟儲存是必不可少的,它帶來了一些有趣且不可避免的細節。顯然,檔案系統旨在為非易失性資料儲存提供空間;這是它的終極功能。但是,還有許多其他重要功能來自該要求。
所有檔案系統都需要提供名稱空間,即命名和組織方法。這定義瞭如何命名檔案,特別是檔名的長度,以及可用於字元總數中的檔名的字元子集。它還定義了磁碟上資料的邏輯結構,例如使用目錄來組織檔案,而不是將它們全部集中在一個巨大的檔案集合中。
定義名稱空間後,需要元資料結構來為該名稱空間提供邏輯基礎。這包括支援分層目錄結構所需的資料結構;用於確定磁碟上哪些空間塊,以及哪些可用空間的結構;允許維護檔案和目錄名稱的結構;有關檔案的資訊,例如它們的大小和建立,修改或上次訪問的時間;以及屬於磁碟上檔案的資料的位置或位置。其他元資料用於儲存有關磁碟細分的高階資訊,例如邏輯卷和分割槽。此更高級別的元資料及其表示的結構包含描述儲存在驅動器或分割槽上的檔案系統的資訊,但是與檔案系統元資料分離並獨立於檔案系統元資料。
檔案系統還需要一個應用程式程式設計介面(API),它提供對系統函式呼叫的訪問,這些函式呼叫操作檔案系統物件,如檔案和目錄。 API提供建立,移動和刪除檔案等任務。它還提供了一些演算法,用於確定檔案放在檔案系統中的位置。這樣的演算法可以解決諸如速度或最小化磁碟碎片之類的目標。
現代檔案系統還提供安全模型,該模型是用於定義檔案和目錄的訪問許可權的方案。Linux檔案系統安全模型有助於確保使用者只能訪問自己的檔案,而不能訪問其他檔案或作業系統本身。
最後的構建塊是實現所有這些功能所需的軟體。Linux使用兩部分軟體實現來提高系統和程式設計師的效率。
圖1:Linux兩部分檔案系統軟體實現
這個由兩部分組成的實現的第一部分是Linux虛擬檔案系統。這個虛擬檔案系統為核心和開發人員提供了一組命令來訪問所有型別的檔案系統。虛擬檔案系統軟體呼叫與各種型別的檔案系統介面所需的特定裝置驅動程式。特定於檔案系統的裝置驅動程式是實現的第二部分。裝置驅動程式將標準檔案系統命令集解釋為特定於分割槽或邏輯捲上的檔案系統型別的命令。
目錄結構
作為一個非常有處女座情節的人,我喜歡儲存在較小的,有組織的目錄,而不是把所有東西都放到一個目錄中。目錄的使用幫助我能夠儲存,並且在我想要時,找到相關檔案,目錄也稱為資料夾。
在Linux和許多其他作業系統中,目錄以樹狀層次結構構建。Linux目錄結構在檔案系統層次結構標準(FHS)中得到了很好的定義和記錄。訪問它們時引用這些目錄是通過使用正斜槓(/)連線的順序更深的目錄名來完成的,例如/var/log和/var/spool/mail,這些被稱為路徑。
下表提供了標準,眾所周知和已定義的頂級Linux目錄及其用途的簡要列表。
目錄 |
描述 |
/ (root filesystem) |
根檔案系統是檔案系統的頂級目錄。它必須包含在掛載其他檔案系統之前引導Linux系統所需的所有檔案。它必須包括引導剩餘檔案系統所需的所有必需的可執行檔案和庫。系統啟動後,所有其他檔案系統都安裝在標準的,定義良好的掛載點上,作為根檔案系統的子目錄。 |
/bin |
/bin目錄包含使用者可執行檔案。 |
/boot |
包含引導Linux計算機所需的靜態引導載入程式,核心可執行檔案以及配置檔案。 |
/dev |
此目錄包含連線到系統的每個硬體裝置的檔案。這不是裝置驅動程式,而是代表計算機上每個裝置的檔案,便於訪問這些裝置。 |
/etc |
包含主機的本地系統配置檔案。 |
/home |
使用者檔案的主目錄儲存。每個使用者在/ home中都有一個子目錄。 |
/lib |
包含引導系統所需的共享庫檔案。 |
/media |
掛載可連線到主機的外部可移動介質裝置(如USB驅動器)的位置。 |
/mnt |
常規檔案系統的臨時掛載點(如在不可移動介質中),可在管理員修復或處理檔案系統時使用。 |
/opt |
供應商提供的應用程式等可選檔案應位於此處。 |
/root |
這不是根(/)檔案系統。它是root使用者的主目錄。 |
/sbin |
系統二進位制檔案。這些是用於系統管理的可執行檔案。 |
/tmp |
臨時目錄。由作業系統和許多程式用於儲存臨時檔案。使用者也可以臨時儲存檔案。 請注意,此處儲存的檔案可能隨時被刪除,恕不另行通知。 |
/usr |
這些是可共享的只讀檔案,包括可執行二進位制檔案和庫,man檔案和其他型別的文件。 |
/var |
可變資料檔案儲存在此處。這可以包括日誌檔案,SQL/">MySQL和其他資料庫檔案,Web伺服器資料檔案,電子郵件收件箱等等。 |
表1:Linux檔案系統層次結構的頂級
表1中具有青色背景的表示目錄及其子目錄及,被視為根檔案系統的組成部分。也就是說,它們不能建立為單獨的檔案系統並在啟動時掛載。這是因為它們(具體地說,它們的內容)必須在引導時出現,以便系統正確引導。
/media和/mnt目錄是根檔案系統的一部分,但它們永遠不應包含任何資料。相反,它們只是臨時掛載點。
其餘目錄(表1中沒有背景顏色的目錄)在引導期間不需要必須存在,但是將在稍後,在準備主機執行有用工作的啟動期間安裝。
請務必參閱官方Linux檔案系統層次結構標準(FHS)網頁,以獲取有關每個目錄及其許多子目錄的詳細資訊。維基百科也對FHS有很好的描述。應儘可能遵循該標準,以確保操作和功能的一致性。無論主機上使用的檔案系統型別如何,此分層目錄結構都是相同的。
Linux統一目錄結構
在某些非Linux PC作業系統中,如果有多個物理硬碟驅動器或多個分割槽,則會為每個磁碟或分割槽分配一個驅動器號。有必要知道檔案或程式所在的硬碟驅動器,例如C:或D:。然後將驅動器號作為命令D:發出,例如,更改為D:驅動器,然後使用cd命令切換到正確的目錄以找到所需的檔案。每個硬碟驅動器都有自己獨立的完整目錄樹。
Linux檔案系統將所有物理硬碟驅動器和分割槽統一到一個目錄結構中。這一切都從頂部,根(/)目錄開始。所有其他目錄及其子目錄位於單個Linux根目錄下。這意味著只有一個目錄樹可用於搜尋檔案和程式。
這可以起作用,因為可以在/(根)檔案系統上的單獨物理硬碟驅動器,不同分割槽或不同邏輯捲上建立檔案系統,例如/home,/tmp,/var,/opt或/usr然後作為根檔案系統樹的一部分掛載在mountpoint(目錄)上。甚至可移動驅動器(如USB驅動器或外部USB或ESATA硬碟驅動器)也將安裝到根檔案系統上,併成為該目錄樹的組成部分。
在從一個版本的Linux發行版升級到另一個版本,或從一個發行版更改為另一個發行版時,掛載是顯而易見的一個很好的理由。一般而言,除了Fedora中的dnf-upgrade之類的任何升級實用程式之外,在升級期間偶爾重新格式化包含作業系統的硬碟驅動器是明智的,以積極地消除隨時間累積的任何殘餘物。如果/home是根檔案系統的一部分,它也將被重新格式化,然後必須從備份中恢復。通過將/home作為單獨的檔案系統,安裝程式將其稱為單獨的檔案系統,並且可以跳過它的格式化。這也適用於/var,其中儲存資料庫,電子郵件收件箱,網站和其他可變使用者和系統資料。
將Linux目錄樹的某些部分維護為單獨的檔案系統還有其他原因。例如,很久以前,當我還沒有意識到將所有必需的Linux目錄作為/(根)檔案系統的一部分的潛在問題時,我設法填充了我的主目錄中的大量非常大檔案。由於/ home目錄和/ tmp目錄都不是單獨的檔案系統,而是根檔案系統的子目錄,因此整個根檔案系統都已填滿。作業系統沒有空間來建立臨時檔案或擴充套件現有資料檔案。起初,應用程式開始抱怨沒有儲存檔案的空間,然後作業系統本身開始表現得非常奇怪。引導到單使用者模式並清除主目錄中的有問題的檔案,允許我再次開始。然後,我使用非常標準的多檔案系統設定重新安裝Linux,並且能夠防止再次發生整體的系統崩潰。
我曾經遇到Linux主機繼續執行的情況,但阻止使用者使用GUI桌面登入。我能夠使用其中一個虛擬控制檯在本地使用命令列介面(CLI)登入,並使用SSH遠端登入。問題是/tmp檔案系統已經填滿,並且在登入時無法建立GUI桌面所需的一些臨時檔案。由於CLI登入不需要在/tmp中建立檔案,因此缺少空間並不會阻止我使用CLI登入。在這種情況下,/tmp目錄是一個單獨的檔案系統,並且/tmp邏輯卷所屬的卷組中有足夠的可用空間。我只是將/tmp邏輯卷擴充套件到一個大小,以便我對該主機所需的臨時檔案空間量有了新的理解,並解決了問題。請注意,此解決方案不需要重新啟動,並且只要放大/tmp檔案系統,使用者就可以登入到桌面。
當我在一家大型科技公司擔任實驗室管理員時,又出現了另一種情況。我們的一位開發人員在錯誤的位置(/var)安裝了一個應用程式。應用程式崩潰是因為/var檔案系統已滿並且由於缺少空間而無法在該檔案系統上的/var/log中儲存日誌檔案。但是,系統保持啟動並執行,因為關鍵/(根)和/tmp檔案系統沒有填滿。刪除違規應用程式並在/opt檔案系統中重新安裝它可以解決該問題。
檔案系統型別
Linux支援讀取大約100種分割槽型別;它只能建立和寫入其中的一小部分。但是在同一個根檔案系統上安裝不同型別的檔案系統是可能的,而且很常見。在此上下文中,我們討論了在硬碟驅動器或邏輯卷的分割槽上儲存和管理使用者資料,所需的結構和元資料方面的檔案系統。此處提供了Linux fdisk命令識別的檔案系統分割槽型別的完整列表,以便了解Linux與許多型別的系統之間的高度相容性。
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT 10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto 1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep 1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
支援讀取這麼多分割槽型別的能力的主要目的是,允許相容性和至少一些與其他計算機系統的檔案系統的互操作性。使用Fedora建立新檔案系統時可用的選項如下表所示。
• btrfs
• cramfs
• ext2
• ext3
• ext4
• fat
• gfs2
• hfsplus
• minix
• msdos
• ntfs
• reiserfs
• vfat
• xfs
其他發行版支援建立不同的檔案系統型別。例如,CentOS 6僅支援在上面的列表中建立以粗體突出顯示的檔案系統。
掛載
mount命令在Linux檔案系統可以追溯到計算的早期階段,當磁帶或可移動磁碟包需要物理安裝在適當的驅動器裝置上時。在物理上放置在驅動器上之後,作業系統將邏輯地安裝磁碟包上的檔案系統,以使內容可供作業系統,應用程式和使用者訪問。
掛載點只是一個目錄,就像任何其他目錄一樣,是作為根檔案系統的一部分建立的。因此,例如,主檔案系統掛載在目錄/home上。檔案系統可以掛載在其他非根檔案系統的掛載點上,但這種情況不太常見。
Linux根檔案系統在引導序列的早期掛載在根目錄(/)上。其他檔案系統稍後由Linux啟動程式掛載,可以是SystemV下的rc,也可以是較新Linux版本中的systemd。在啟動過程中掛載檔案系統由/etc/fstab配置檔案管理。記住這一點的一個簡單方法是fstab代表“檔案系統表”,它是要掛載的檔案系統列表,它們的指定掛載點以及特定檔案系統可能需要的任何選項。
使用mount命令將檔案系統掛載在現有目錄/掛載點上。通常,用作掛載點的任何目錄都應為空,並且不包含任何其他檔案。 Linux不會阻止使用者將一個檔案系統掛載到已存在的檔案系統或包含檔案的目錄上。如果在現有目錄或檔案系統上掛載檔案系統,則將隱藏原始內容,並且只顯示新掛載的檔案系統的內容。
結論
我希望本文能夠解決圍繞術語檔案系統的一些可能的混淆。我花了很長時間和一個非常有幫助的導師才能真正理解和欣賞Linux檔案系統的複雜性,優雅和功能的所有含義。
原文連結:
https://opensource.com/life/16/10/introduction-linux-filesystems
↓↓↓ 點選"閱讀原文" 【 加入雲技術社群 】
相關閱讀:
OTAzMDEwMA==&mid=2652499914&idx=1&sn=4adea2d229225dcd788eefff4d6094ec&scene=21#wechat_redirect" target="_blank" rel="nofollow,noindex"> 高階私有云專案交流群,歡迎加入!
Gartner:2018 年 公有云IaaS魔力象限出爐,大量公司消失了。。。
OpenShift 3.9 重磅釋出!多項新功能「附48頁PPT」
3607adbebd35fc314fe3971bf39c5&scene=21#wechat_redirect" target="_blank" rel="nofollow,noindex"> 雲端計算趨勢:RightScale 2018 年雲狀況調查報告「附下載」