前言
什么是文件系統(tǒng)?
?
文件系統(tǒng)是操作系統(tǒng)用于明確存儲設(shè)備(通常是磁盤,也可能是基于 NAND Flash 的固態(tài)硬盤)或分區(qū)上文件的方法和數(shù)據(jù)結(jié)構(gòu);即在存儲設(shè)備上組織文件的方式。操作系統(tǒng)中負責(zé)管理和存儲文件信息的軟件機構(gòu)稱為文件管理系統(tǒng),簡稱文件系統(tǒng)。文件系統(tǒng)由三部分組成:文件系統(tǒng)的接口,對對象操縱和管理的軟件集合,以及對象及其屬性。從系統(tǒng)的角度來看,文件系統(tǒng)是對文件存儲設(shè)備的空間進行組織和分配,負責(zé)文件存儲并對存入的文件進行保護和檢索的系統(tǒng)。具體而言,它負責(zé)為用戶建立文件,存入、讀取、修改、轉(zhuǎn)儲文件,控制文件的存取,以及在用戶不再需要時撤銷文件等。
1. Linux 下文件系統(tǒng)的層次結(jié)構(gòu)
?
ls?-l?/
對于 Linux 軟件開發(fā)人員來說,對 Linux 系統(tǒng)的目錄結(jié)構(gòu)應(yīng)該已經(jīng)非常熟悉了。文件系統(tǒng)可以根據(jù)其結(jié)構(gòu)而變化,但在大多數(shù)情況下,它們應(yīng)該遵循文件系統(tǒng)層次標(biāo)準。執(zhí)行 ls -l / 命令來查看根目錄下列出的目錄。你的目錄可能與我的有些許不同,但它們應(yīng)該大致如下所示:
我們來看一下各個目錄都是做什么用的:
- / -根目錄,整個文件系統(tǒng)層次結(jié)構(gòu)的根目錄,所有內(nèi)容都位于此目錄下。
- /bin -存放基本的可執(zhí)行的程序(二進制文件),包括最基本的命令,如ls和cp。
- /boot -包含內(nèi)核引導(dǎo)加載程序文件。
- /cdrom -光盤安裝點
- /dev -存放設(shè)備文件。
- /etc -核心系統(tǒng)配置目錄,應(yīng)該只保存配置文件。
- /home -用戶的主目錄,保存你的文檔,文件,設(shè)置等。
- /lib、/lib32、/lib64、/libx32 -主要目的是存放特定的庫,這些庫是在/bin和/sbin目錄里的工具所需要的庫,/lib中的庫可以是32位或64位
- /lost+found -這個目錄一般情況下是空的,當(dāng)系統(tǒng)非法關(guān)機后,如果你丟失了一些文件,在這里能找回來,通常很少用到此目錄
- /media -用作可移動媒體的連接點,如USB驅(qū)動器。
- /mnt -臨時掛載的文件系統(tǒng)。
- /opt -可選應(yīng)用軟件包。
- /proc -當(dāng)前運行進程的信息。
- /root -root用戶的主目錄。
- /run -自上次引導(dǎo)以來運行系統(tǒng)的信息。
- /sbin -包含基本的系統(tǒng)二進制文件,通常只能由root用戶運行。
- /srv -系統(tǒng)提供的特定于站點的數(shù)據(jù)。
- /tmp -臨時文件的存儲
- /usr -通常它不包含主文件夾意義上的用戶文件。這意味著用戶安裝的軟件和實用程序,但這并不是說你不能在那里添加個人目錄。在這個目錄中有/usr/bin、/usr/local等子目錄。
- /var -變量目錄,用于系統(tǒng)日志記錄、用戶跟蹤、緩存等。
2. 文件系統(tǒng)類型
文件系統(tǒng)分很多種類,有許多不同的文件系統(tǒng)實現(xiàn)可用。有些比其他的更快,有些支持更大容量的存儲,而另一些只能在更小容量的存儲上工作。不同的文件系統(tǒng)有不同的組織數(shù)據(jù)的方式。由于有很多不同的實現(xiàn),應(yīng)用程序需要一種方法來處理不同的操作。因此,有一種東西叫做虛擬文件系統(tǒng)抽象層。它是應(yīng)用程序和不同文件系統(tǒng)類型之間的一層,因此無論擁有什么文件系統(tǒng),你的應(yīng)用程序都能夠使用它。
你的磁盤上可以有許多文件系統(tǒng),這取決于它們是如何分區(qū)的。
Linux系統(tǒng)中日志記錄
在大多數(shù)文件系統(tǒng)類型上,日志記錄是默認的,但是為了以防萬一,你應(yīng)該知道它是做什么的。假設(shè)你正在復(fù)制一個大文件,突然斷電。如果你使用的是一個沒有日志記錄的文件系統(tǒng),那么文件最終會損壞,你的文件系統(tǒng)也會不一致,然后當(dāng)你重新啟動時,系統(tǒng)將執(zhí)行文件系統(tǒng)檢查以確保一切正常。但是,修復(fù)可能需要一段時間,這取決于你的文件系統(tǒng)有多大。
現(xiàn)在,如果你使用的是帶日志記錄的系統(tǒng),在你的機器開始復(fù)制文件之前,它會將你將要做的事情寫入日志文件。當(dāng)你實際復(fù)制文件時,一旦它完成,日志將該任務(wù)標(biāo)記為完成。因此,文件系統(tǒng)總是處于一致的狀態(tài),因此,如果你的機器突然關(guān)閉,它將確切地知道你停止的位置。這也減少了引導(dǎo)時間,因為它不檢查整個文件系統(tǒng),只查看日志。
常見桌面文件系統(tǒng)類型
- ext4:這是本地Linux文件系統(tǒng)的最新版本。它與舊的ext2和ext3版本兼容。它支持高達10億字節(jié)的磁盤卷和高達16TB甚至更多的文件大小。它是Linux文件系統(tǒng)的標(biāo)準選擇。
- Btrfs:“Better or Butter FS”,它是一種新的Linux文件系統(tǒng),提供快照、增量備份、性能提升等功能。它是廣泛可用的,但還不太穩(wěn)定和兼容。
- XFS:高性能日志文件系統(tǒng),非常適合具有大文件的系統(tǒng),例如媒體服務(wù)器。
- NTFS和FAT:Windows文件系統(tǒng)
- HFS+:蘋果系統(tǒng)的文件系統(tǒng)
查看以下Ubuntu系統(tǒng)上的文件系統(tǒng):
3. Linux下磁盤的分區(qū)
硬盤可以細分為多個分區(qū),本質(zhì)上就是多個塊設(shè)備。回想一下這樣的例子,/dev/sda1和/dev/sda2, /dev/sda是整個磁盤,但是/dev/sda1是磁盤上的第一個分區(qū)。分區(qū)對于分離數(shù)據(jù)非常有用,如果你需要某個文件系統(tǒng),可以輕松地創(chuàng)建一個分區(qū),而不是將整個磁盤設(shè)置為一種文件系統(tǒng)類型。
分區(qū)表每個磁盤都有一個分區(qū)表,這個表告訴系統(tǒng)磁盤是如何分區(qū)的。該表告訴你分區(qū)的開始和結(jié)束位置,哪些分區(qū)是可引導(dǎo)的,磁盤的哪些扇區(qū)分配給哪些分區(qū)等等。有兩種主要的分區(qū)表方案,主引導(dǎo)記錄(MBR)和GUID分區(qū)表(gpt)。
分區(qū)磁盤由幫助我們組織數(shù)據(jù)的分區(qū)組成。你可以在一個磁盤上有多個分區(qū),它們不能相互重疊。如果有未分配給分區(qū)的空間,則稱為空閑空間。分區(qū)的類型取決于你的分區(qū)表。在一個分區(qū)中,你可以擁有一個文件系統(tǒng),也可以將一個分區(qū)專用于其他功能,如交換分區(qū)。
MBR
- 傳統(tǒng)的分區(qū)表,被用作標(biāo)準
- 可以有主分區(qū)、擴展分區(qū)和邏輯分區(qū)
- MBR有四個主分區(qū)的限制
- 通過將一個主分區(qū)劃分為一個擴展分區(qū)(一個磁盤上只能有一個擴展分區(qū)),可以創(chuàng)建額外的分區(qū)。然后在擴展分區(qū)中添加邏輯分區(qū)。邏輯分區(qū)的使用就像任何其他分區(qū)一樣。
- 支持最大2TB的磁盤
GPT
- GUID分區(qū)表(GPT)正在成為磁盤分區(qū)的新標(biāo)準
- 只有一種類型的隔斷,你可以做很多
- 每個分區(qū)都有一個全局唯一ID (GUID)
- 主要用于基于UEFI的引導(dǎo)
文件系統(tǒng)結(jié)構(gòu)
文件系統(tǒng)是文件和目錄的有組織的集合。在其最簡單的形式中,它由一個管理文件的數(shù)據(jù)庫和實際文件本身組成。
- 引導(dǎo)塊:它位于文件系統(tǒng)的前幾個扇區(qū)中,文件系統(tǒng)并沒有真正使用它。相反,它包含用于引導(dǎo)操作系統(tǒng)的信息。操作系統(tǒng)只需要一個引導(dǎo)塊。如果你有多個分區(qū),它們將有引導(dǎo)塊,但其中許多是未使用的。
- 超級塊:這是在引導(dǎo)塊之后的單個塊,它包含關(guān)于文件系統(tǒng)的信息,例如inode表的大小、邏輯塊的大小和文件系統(tǒng)的大小。
- 索引表:把它看作是管理文件的數(shù)據(jù)庫。每個文件或目錄在索引表中都有一個唯一的條目,并且包含關(guān)于該文件的各種信息。
- 數(shù)據(jù)塊:這是文件和目錄的實際數(shù)據(jù)。
讓我們看一下不同的分區(qū)表。下面是一個使用MBR分區(qū)表(msdos)的分區(qū)示例。你可以看到系統(tǒng)上的主分區(qū)、擴展分區(qū)和邏輯分區(qū)。
磁盤分區(qū)
如果我們需要對磁盤進行分區(qū)。有很多工具可以做到這一點:
- fdisk 基本的命令行分區(qū)工具,不支持GPT
- parted 這是一個命令行工具,支持MBR和GPT分區(qū)
- gparted 這是parted的GUI版本
- gdisk fdisk但不支持MBR,只支持GPT 我們用parted來劃分。假設(shè)我連接了USB設(shè)備,我們看到設(shè)備名稱是/dev/sdb2.
4. 創(chuàng)建文件系統(tǒng)
你可以創(chuàng)建一個文件系統(tǒng):
sudo?mkfs?-t?ext4?/dev/sdb2
就這么簡單!mkfs(制作文件系統(tǒng))工具允許我們指定我們想要的文件系統(tǒng)類型和位置。你只希望在新分區(qū)的磁盤上創(chuàng)建文件系統(tǒng),或者在對舊磁盤重新分區(qū)時創(chuàng)建文件系統(tǒng)。如果你試圖在現(xiàn)有文件系統(tǒng)之上創(chuàng)建一個文件系統(tǒng),那么很可能會使你的文件系統(tǒng)處于損壞狀態(tài)。
5. mount and umount
在你可以查看文件系統(tǒng)的內(nèi)容之前,你必須掛載它。要做到這一點,我需要設(shè)備位置、文件系統(tǒng)類型和掛載點,掛載點是系統(tǒng)上文件系統(tǒng)將要附加的目錄。我們要把設(shè)備掛載到一個掛載點。
首先創(chuàng)建掛載點,然后進行掛載:
mkdir?/myTest sudo?mount?-t?ext4?/dev/sdb2?/myTest
就這么簡單!現(xiàn)在當(dāng)我們轉(zhuǎn)到/myTest目錄時,我們可以看到文件系統(tǒng)的內(nèi)容,-t指定文件系統(tǒng)的類型,然后是設(shè)備位置,然后是掛載點。
從掛載點卸載設(shè)備:
sudo?umount?/myTest 或者 sudo?umount?/dev/sdb2
請記住,內(nèi)核按照找到設(shè)備的順序命名設(shè)備。如果我們的設(shè)備名稱在我們掛載它之后因為某種原因改變了怎么辦? 你可以使用設(shè)備的通用唯一ID (UUID)而不是名稱。
查詢系統(tǒng)中塊設(shè)備的uuid:
我們可以看到我們的設(shè)備名稱、它們對應(yīng)的文件系統(tǒng)類型和它們的uuid。現(xiàn)在,當(dāng)我們想要掛載某個設(shè)備時,我們可以使用:
sudo?mount?UUID=59c03b23-fd61-4bfc-b9fa-570edf47a0b9?/myTest
大多數(shù)情況下,你不需要通過設(shè)備的uuid來掛載設(shè)備,使用設(shè)備名稱要容易得多,而且通常情況下,操作系統(tǒng)知道掛載常見的設(shè)備,如USB驅(qū)動器。如果你需要在啟動時自動掛載文件系統(tǒng),就像你添加了一個輔助硬盤驅(qū)動器一樣,可能會使用UUID。
6. /etc/fstab
當(dāng)我們想在系統(tǒng)啟動時自動掛載文件系統(tǒng),我們可以將它們添加到文件系統(tǒng)表的縮寫文件/etc/fstab中。該文件包含已掛載的文件系統(tǒng)的永久列表。
每一行代表一個文件系統(tǒng),字段是:
- UUID -設(shè)備標(biāo)識
- 掛載點 -文件系統(tǒng)掛載到的目錄
- 文件系統(tǒng)類型
- 選項 -其他掛載選項
- 轉(zhuǎn)儲 -由轉(zhuǎn)儲實用程序用來決定何時進行備份,默認為0
- Pass -用來決定應(yīng)該檢查文件系統(tǒng)的順序,如果值為0,則不檢查
要添加一個條目,只需使用上面的條目語法直接修改/etc/fstab文件。修改這個文件時要小心,如果搞砸了,可能會給帶來一些麻煩
其中swap屬于交換分區(qū),這個交換分區(qū)是什么?交換是我們用來給系統(tǒng)分配虛擬內(nèi)存的。如果內(nèi)存不足,系統(tǒng)會使用這個分區(qū)將空閑進程的內(nèi)存“交換”到磁盤,這樣就不會陷入內(nèi)存困境。
使用分區(qū)作為交換空間假設(shè)我們希望將/dev/sdb2分區(qū)設(shè)置為交換空間。
- 首先確保我們沒有任何東西在分區(qū)上
- 執(zhí)行命令mkswap /dev/sdb2初始化交換區(qū)
- 運行swapon /dev/sdb2將啟用交換設(shè)備
- 如果你希望交換分區(qū)在啟動時保持不變,你需要在/etc/fstab文件中添加一個條目。w是使用的文件系統(tǒng)類型。
- 刪除交換模塊:swapoff /dev/sdb2
通常應(yīng)該分配大約兩倍于內(nèi)存的交換空間。但是現(xiàn)在系統(tǒng)通常已經(jīng)足夠強大并且有足夠的內(nèi)存。
7. 磁盤使用情況
你可以使用一些工具來查看磁盤的利用率:
df命令顯示當(dāng)前掛載的文件系統(tǒng)的利用率。-h標(biāo)志提供了一種可讀的格式。你可以看到設(shè)備是什么,以及有多少容量被使用和可用。
假設(shè)你的磁盤快要滿了,你想知道哪些文件或目錄占用了這些空間,你可以使用du命令。
du?-h
8. 文件系統(tǒng)修復(fù)
有時我們的文件系統(tǒng)并不總是處于最佳狀態(tài),如果我們突然關(guān)閉系統(tǒng),我們的數(shù)據(jù)可能會損壞。這取決于系統(tǒng)是否試圖讓我們回到工作狀態(tài)。
fsck(文件系統(tǒng)檢查)命令用于檢查文件系統(tǒng)的一致性,甚至可以嘗試為我們修復(fù)它。通常,當(dāng)你啟動磁盤時,fsck將在磁盤掛載之前運行,以確保一切正常。但有時磁盤非常糟糕,需要手動執(zhí)行此操作。但是,一定要在你處于修復(fù)磁盤或可以在不掛載的情況下訪問文件系統(tǒng)的地方執(zhí)行此操作。
sudo?fsck?/dev/sdb1
9. 索引節(jié)點
還記得我們的文件系統(tǒng)是如何由實際文件和管理這些文件的數(shù)據(jù)庫組成的嗎?該數(shù)據(jù)庫稱為索引節(jié)點表。
**什么是索引節(jié)點?**索引節(jié)點(inode)是該表中的一個條目,每個文件都有一個索引節(jié)點。它描述了關(guān)于文件的所有內(nèi)容,例如:
- 文件類型-常規(guī)文件,目錄,字符設(shè)備等
- 擁有者
- 擁有組
- 訪問權(quán)限
- 時間戳- mtime(最后一次修改文件的時間),ctime(最后一次修改屬性的時間),atime(最后一次訪問的時間)
- 文件的硬鏈接數(shù)
- 文件大小
- 分配給文件的塊數(shù)
- 指向文件數(shù)據(jù)塊的指針 基本上索引節(jié)點存儲了關(guān)于文件的所有內(nèi)容,除了文件名和文件本身
**什么時候創(chuàng)建索引節(jié)點?**創(chuàng)建文件系統(tǒng)時,也會為索引分配空間。有一些算法可以根據(jù)磁盤容量等確定需要多少索引節(jié)點空間。你可能在某些時候看到過磁盤空間不足的錯誤問題。同樣的情況也會發(fā)生在索引節(jié)點上,你可能會耗盡索引節(jié)點,因此無法創(chuàng)建更多的文件
索引節(jié)點信息索引節(jié)點是由數(shù)字標(biāo)識的,當(dāng)一個文件被創(chuàng)建時,它被分配一個索引號,這個編號是按順序分配的。然而,有時你可能會注意到,當(dāng)你創(chuàng)建一個新文件時,它得到的索引號比其他文件低,這是因為一旦索引被刪除,它們就可以被其他文件重用。查看索引編號執(zhí)行l(wèi)s -li命令:
該命令的第一個字段列出了索引號。
你還可以使用stat查看有關(guān)文件的詳細信息,它還會告訴你有關(guān)索引節(jié)點的信息。
10. 符號鏈接
在Windows操作系統(tǒng)中,有一種叫做快捷鍵的東西,快捷鍵只是其他文件的別名。如果對原始文件做了一些操作,可能會破壞快捷方式。在Linux中,等同于快捷方式的是符號鏈接(或軟鏈接或符號鏈接)。symlinks允許我們通過文件名鏈接到另一個文件。Linux中的另一種類型的鏈接是硬鏈接,它們實際上是另一個指向索引節(jié)點的鏈接文件。
可以看到,我創(chuàng)建了一個名為myFile1Link的符號鏈接,指向myFile1。符號鏈接用->表示。注意我是如何獲得一個新的節(jié)點號的,符號鏈接只是指向文件名的文件。當(dāng)你修改符號鏈接時,文件也會被修改。節(jié)點號對于文件系統(tǒng)是唯一的,你不能在一個文件系統(tǒng)中有兩個相同的節(jié)點號,這意味著你不能通過節(jié)點號在不同的文件系統(tǒng)中引用文件。但是,如果你使用符號鏈接,它們不使用節(jié)點號,而是使用文件名,因此可以跨不同的文件系統(tǒng)引用它們。
硬鏈接
硬鏈接只是創(chuàng)建另一個文件,該文件具有到同一節(jié)點的鏈接。因此,如果我修改了myFile2或myFile2link的內(nèi)容,兩者都將看到更改,但如果我刪除了myFile2,則仍然可以通過myFile2link訪問該文件。這就是ls命令中的鏈接計數(shù)發(fā)揮作用的地方。鏈接數(shù)是一個節(jié)點擁有的硬鏈接的數(shù)量,當(dāng)你刪除一個文件時,它會減少鏈接數(shù)。只有當(dāng)節(jié)點的所有硬鏈接都被刪除時,節(jié)點才會被刪除。當(dāng)你創(chuàng)建一個文件時,它的鏈接計數(shù)是1,因為它是唯一指向該節(jié)點的文件。與符號鏈接不同,硬鏈接不跨文件系統(tǒng),因為索引節(jié)點對于文件系統(tǒng)是唯一的。
小結(jié)
?
好了,這次就總結(jié)到這里吧。本文我們總結(jié)了Linux系統(tǒng)下文件系統(tǒng)相關(guān)的常用且重要的知識點,希望對小伙伴們有所幫助!喜歡的小伙伴記得點贊??、分享??、再看?,你的每一個動作都是對作者的最大支持!