一,Linux的一切皆文件
Linux 中的各種事物比如像文檔、目錄(Mac OS X 和 Windows 系統(tǒng)下稱之為文件夾)、鍵盤(pán)、監(jiān)視器、硬盤(pán)、可移動(dòng)媒體設(shè)備、打印機(jī)、調(diào)制解調(diào)器、虛擬終端,還有進(jìn)程間通信(IPC)和網(wǎng)絡(luò)通信等輸入/輸出資源都是定義在文件系統(tǒng)空間下的字節(jié)流。
一切都可看作是文件,其最顯著的好處是對(duì)于上面所列出的輸入/輸出資源,只需要相同的一套 Linux 工具、實(shí)用程序和 API。你可以使用同一套api(read, write)和工具(cat , 重定向, 管道)來(lái)處理unix中大多數(shù)的資源。設(shè)計(jì)一個(gè)系統(tǒng)的終極目標(biāo)往往就是要找到原子操作,一旦鎖定了原子操作,設(shè)計(jì)工作就會(huì)變得簡(jiǎn)單而有序?!拔募弊鳛橐粋€(gè)抽象概念,其原子操作非常簡(jiǎn)單,只有讀和寫(xiě),這無(wú)疑是一個(gè)非常好的模型。通過(guò)這個(gè)模型,API的設(shè)計(jì)可以化繁為簡(jiǎn),用戶可以使用通用的方式去訪問(wèn)任何資源,自有相應(yīng)的中間件做好對(duì)底層的適配。
現(xiàn)代操作系統(tǒng)為解決信息能獨(dú)立于進(jìn)程之外被長(zhǎng)期存儲(chǔ)引入了文件,文件作為進(jìn)程創(chuàng)建信息的邏輯單元可被多個(gè)進(jìn)程并發(fā)使用。在 UNIX 系統(tǒng)中,操作系統(tǒng)為磁盤(pán)上的文本與圖像、鼠標(biāo)與鍵盤(pán)等輸入設(shè)備及網(wǎng)絡(luò)交互等 I/O操作設(shè)計(jì)了一組通用 API,使他們被處理時(shí)均可統(tǒng)一使用字節(jié)流方式。換言之,UNIX 系統(tǒng)中除進(jìn)程之外的一切皆是文件,而 Linux 保持了這一特性。為了便于文件的管理,Linux 還引入了目錄(有時(shí)亦被稱為文件夾)這一概念。目錄使文件可被分類管理,且目錄的引入使 Linux 的文件系統(tǒng)形成一個(gè)層級(jí)結(jié)構(gòu)的目錄樹(shù)
在Linux系統(tǒng)中,一切都是文件,理解文件系統(tǒng),對(duì)于學(xué)習(xí)Linux來(lái)說(shuō),是一個(gè)非常有必要的前提
Linux上的文件系統(tǒng)一般來(lái)說(shuō)就是EXT2或EXT3,但這篇文章并不準(zhǔn)備一上來(lái)就直接講它們,而希望結(jié)合Linux操作系統(tǒng)并從文件系統(tǒng)建立的基礎(chǔ)——硬盤(pán)開(kāi)始,一步步認(rèn)識(shí)Linux的文件系統(tǒng)。
1. 機(jī)械硬盤(pán)的物理存儲(chǔ)機(jī)制
現(xiàn)代計(jì)算機(jī)大部分文件存儲(chǔ)功能都是由機(jī)械硬盤(pán)這種設(shè)備提供的。(現(xiàn)在的SSD和閃存從概念和邏輯上都部分繼承自機(jī)械硬盤(pán),所以使用機(jī)械硬盤(pán)來(lái)進(jìn)行理解也是沒(méi)有問(wèn)題的)機(jī)械硬盤(pán)能實(shí)現(xiàn)信息存儲(chǔ)的功能基于:磁性存儲(chǔ)介質(zhì)能夠被磁化,且磁化后會(huì)長(zhǎng)久保留被磁化的狀態(tài),這種被磁化狀態(tài)能夠被讀取出來(lái),同時(shí)這種磁化狀態(tài)還能夠不斷被修改,磁化正好有兩個(gè)方向,所以可以表示0和1。于是硬盤(pán)就是把這種磁性存儲(chǔ)介質(zhì)做成一個(gè)個(gè)盤(pán)片,每一個(gè)盤(pán)片上都分布著數(shù)量巨大的磁性存儲(chǔ)單位,使用磁性讀寫(xiě)頭對(duì)盤(pán)片進(jìn)行寫(xiě)入和讀?。◤脑砩项愃坪谀z唱片的播放)。一個(gè)硬盤(pán)中的磁性存儲(chǔ)單位數(shù)以億計(jì)(1T硬盤(pán)就有約80億個(gè)),所以需要一套規(guī)則來(lái)規(guī)劃信息如何存?。ū热缫槐敬鎯?chǔ)信息的書(shū)我們還會(huì)分為頁(yè),每一頁(yè)從上到下從左到右讀取,同時(shí)還有章節(jié)目錄)于是就有了這些物理、邏輯概念:
1、一個(gè)硬盤(pán)有多張盤(pán)片疊成,不同盤(pán)片有編號(hào)
2、每張盤(pán)片上的存儲(chǔ)顆粒成環(huán)形一圈圈地排布,每一圈稱為磁道,有編號(hào)
3、每條磁道上都有一圈存儲(chǔ)顆粒,每512*8(512字節(jié),0.5KB)個(gè)存儲(chǔ)顆粒作為一個(gè)扇區(qū),扇區(qū)是硬盤(pán)上存儲(chǔ)的最小物理單位
4、N個(gè)扇區(qū)可以組成簇,N取決于不同的文件系統(tǒng)或是文件系統(tǒng)的配置,簇是此文件系統(tǒng)中的最小存儲(chǔ)單位
5、所有盤(pán)面上的同一磁道構(gòu)成一個(gè)圓柱,稱為柱面,柱面是系統(tǒng)分區(qū)的最小單位
磁頭讀寫(xiě)文件的時(shí)候,首先是分區(qū)讀寫(xiě)的,由inode編號(hào)(區(qū)內(nèi)唯一的編號(hào)后面介紹)找到對(duì)應(yīng)的磁道和扇區(qū),然后一個(gè)柱面一個(gè)柱面地進(jìn)行讀寫(xiě)。機(jī)械硬盤(pán)的讀寫(xiě)控制系統(tǒng)是一個(gè)令人嘆為觀止的精密工程(一個(gè)盤(pán)面上有幾億個(gè)存儲(chǔ)單位,每個(gè)磁道寬度不到幾十納米,磁盤(pán)每分鐘上萬(wàn)轉(zhuǎn)),同時(shí)關(guān)于讀寫(xiě)的邏輯也是有諸多細(xì)節(jié)(比如扇區(qū)的編號(hào)并不是連續(xù)的),非常有意思,可以自行搜索文章拓展閱讀。 有了硬盤(pán)并不意味著LInux可以立刻把它用來(lái)存儲(chǔ),還需要組合進(jìn)Linux的文件體系才能被Linux使用。

2.Linux文件體系
Linux以文件的形式對(duì)計(jì)算機(jī)中的數(shù)據(jù)和硬件資源進(jìn)行管理,也就是徹底的一切皆文件,反映在Linux的文件類型上就是:普通文件、目錄文件(也就是文件夾)、設(shè)備文件、鏈接文件、管道文件、套接字文件(數(shù)據(jù)通信的接口)等等。而這些種類繁多的文件被Linux使用目錄樹(shù)進(jìn)行管理, 所謂的目錄樹(shù)就是以根目錄(/)為主,向下呈現(xiàn)分支狀的一種文件結(jié)構(gòu)。不同于純粹的ext2之類的文件系統(tǒng),我把它稱為文件體系,一切皆文件和文件目錄樹(shù)的資源管理方式一起構(gòu)成了Linux的文件體系,讓Linux操作系統(tǒng)可以方便使用系統(tǒng)資源。所以文件系統(tǒng)比文件體系涵蓋的內(nèi)容少很多,Linux文件體系主要在于把操作系統(tǒng)相關(guān)的東西用文件這個(gè)載體實(shí)現(xiàn):文件系統(tǒng)掛載在操作系統(tǒng)上,操作系統(tǒng)整個(gè)系統(tǒng)又放在文件系統(tǒng)里。但本文中文件體系的相關(guān)內(nèi)容不是很多,大部分地方都可以用文件系統(tǒng)代替文件體系。
1. Linux中的文件類型:
1.1. 普通文件(-)
從Linux的角度來(lái)說(shuō),類似mp4、pdf、html這樣應(yīng)用層面上的文件類型都屬于普通文件Linux用戶可以根據(jù)訪問(wèn)權(quán)限對(duì)普通文件進(jìn)行查看、更改和刪除
1.2. 目錄文件(d,directory file)
目錄文件對(duì)于用慣Windows的用戶來(lái)說(shuō)不太容易理解,目錄也是文件的一種目錄文件包含了各自目錄下的文件名和指向這些文件的指針,打開(kāi)目錄事實(shí)上就是打開(kāi)目錄文件,只要有訪問(wèn)權(quán)限,你就可以隨意訪問(wèn)這些目錄下的文件(普通文件的執(zhí)行權(quán)限就是目錄文件的訪問(wèn)權(quán)限),但是只有內(nèi)核的進(jìn)程能夠修改它們雖然不能修改,但是我們能夠通過(guò)vim去查看目錄文件的內(nèi)容
1.3. 符號(hào)鏈接(l,symbolic link)
這種類型的文件類似Windows中的快捷方式,是指向另一個(gè)文件的間接指針,也就是我們常說(shuō)的軟鏈接
1.4. 塊設(shè)備文件(b,block)和字符設(shè)備文件(c,char)
這些文件一般隱藏在/dev目錄下,在進(jìn)行設(shè)備讀取和外設(shè)交互時(shí)會(huì)被使用到比如磁盤(pán)光驅(qū)就是塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件系統(tǒng)中的所有設(shè)備要么是塊設(shè)備文件,要么是字符設(shè)備文件,無(wú)一例外
1.5. FIFO(p,pipe)
管道文件主要用于進(jìn)程間通訊。比如使用mkfifo命令可以創(chuàng)建一個(gè)FIFO文件,啟用一個(gè)進(jìn)程A從FIFO文件里讀數(shù)據(jù),啟動(dòng)進(jìn)程B往FIFO里寫(xiě)數(shù)據(jù),先進(jìn)先出,隨寫(xiě)隨讀。
1.6. 套接字(s,socket)
用于進(jìn)程間的網(wǎng)絡(luò)通信,也可以用于本機(jī)之間的非網(wǎng)絡(luò)通信這些文件一般隱藏在/var/run目錄下,證明著相關(guān)進(jìn)程的存在
Linux 的文件是沒(méi)有所謂的擴(kuò)展名的,一個(gè) Linux文件能不能被執(zhí)行與它是否可執(zhí)行的屬性有關(guān),只要你的權(quán)限中有 x ,比如[ -rwx-r-xr-x ] 就代表這個(gè)文件可以被執(zhí)行,與文件名沒(méi)有關(guān)系。跟在 Windows下能被執(zhí)行的文件擴(kuò)展名通常是 .com .exe .bat 等不同。不過(guò),可以被執(zhí)行跟可以執(zhí)行成功不一樣。比如在 root 主目錄下的 install.log 是一個(gè)文本文件,修改權(quán)限成為 -rwxrwxrwx后這個(gè)文件能夠真的執(zhí)行成功嗎? 當(dāng)然不行,因?yàn)樗膬?nèi)容根本就沒(méi)有可以執(zhí)行的數(shù)據(jù)。所以說(shuō),這個(gè) x 代表這個(gè)文件具有可執(zhí)行的能力, 但是能不能執(zhí)行成功,當(dāng)然就要看該文件的內(nèi)容了。
雖然如此,不過(guò)我們?nèi)匀幌M軓臄U(kuò)展名來(lái)了解該文件是什么東西,所以一般我們還是會(huì)以適當(dāng)?shù)臄U(kuò)展名來(lái)表示該文件是什么種類的。所以Linux 系統(tǒng)上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執(zhí)行與否仍然需要權(quán)限的規(guī)范才行。比如常見(jiàn)的/bin/ls 這個(gè)顯示文件屬性的指令要是權(quán)限被修改為無(wú)法執(zhí)行,那么ls 就變成不能執(zhí)行了。這種問(wèn)題最常發(fā)生在文件傳送的過(guò)程中。例如你在網(wǎng)絡(luò)上下載一個(gè)可執(zhí)行文件,但是偏偏在你的 Linux 系統(tǒng)中就是無(wú)法執(zhí)行,那就可能是檔案的屬性被改變了。而且從網(wǎng)絡(luò)上傳送到你面前 的 Linux 系統(tǒng)中,文件的屬性權(quán)限確實(shí)是會(huì)被改變的
二,Linux目錄樹(shù)
對(duì)Linux系統(tǒng)和用戶來(lái)說(shuō),所有可操作的計(jì)算機(jī)資源都存在于目錄樹(shù)這個(gè)邏輯結(jié)構(gòu)中,對(duì)計(jì)算機(jī)資源的訪問(wèn)都可以認(rèn)為是目錄樹(shù)的訪問(wèn)。就硬盤(pán)來(lái)說(shuō),所有對(duì)硬盤(pán)的訪問(wèn)都變成了對(duì)目錄樹(shù)中某個(gè)節(jié)點(diǎn)也就是文件夾的訪問(wèn),訪問(wèn)時(shí)不需要知道它是硬盤(pán)還是硬盤(pán)中的文件夾。目錄樹(shù)的邏輯結(jié)構(gòu)也非常簡(jiǎn)單,就是從根目錄(/)開(kāi)始,不斷向下展開(kāi)各級(jí)子目錄。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?/p>

三,硬盤(pán)分區(qū)
硬盤(pán)分區(qū)是硬盤(pán)結(jié)合到文件體系的第一步,本質(zhì)是「硬盤(pán)」這個(gè)物理概念轉(zhuǎn)換成「區(qū)」這個(gè)邏輯概念,為下一步格式化做準(zhǔn)備。所以分本身并不是必須的,你完全可以把一整塊硬盤(pán)作為一個(gè)區(qū)。但從數(shù)據(jù)的安全性以及系統(tǒng)性能角度來(lái)看,分區(qū)還是有很多用處的,所以一般都會(huì)對(duì)硬盤(pán)進(jìn)行分區(qū)。
講分區(qū)就不得不先提每塊硬盤(pán)上最重要的第一扇區(qū),這個(gè)扇區(qū)中有硬盤(pán)主引導(dǎo)記錄(Master boot record, MBR) 及分區(qū)表(partition table), 其中 MBR 占有 446 bytes,而分區(qū)表占有 64 bytes。硬盤(pán)主引導(dǎo)記錄放有最基本的引導(dǎo)加載程序,是系統(tǒng)開(kāi)機(jī)啟動(dòng)的關(guān)鍵環(huán)節(jié),在附錄中有更詳細(xì)的說(shuō)明。而分區(qū)表則跟分區(qū)有關(guān),它記錄了硬盤(pán)分區(qū)的相關(guān)信息,但因分區(qū)表僅有 64bytes , 所以最多只能記彔四塊分區(qū)(分區(qū)本身其實(shí)就是對(duì)分區(qū)表進(jìn)行設(shè)置)。
只能分四個(gè)區(qū)實(shí)在太少了,于是就有了擴(kuò)展分區(qū)的概念,既然第一個(gè)扇區(qū)所在的分區(qū)表只能記錄四條數(shù)據(jù), 那我可否利用額外的扇區(qū)來(lái)記錄更多的分區(qū)信息。
把普通可以訪問(wèn)的分區(qū)稱為主分區(qū),擴(kuò)展分區(qū)不同于主分區(qū),它本身并沒(méi)有內(nèi)容,它是為進(jìn)一步邏輯分區(qū)提供空間的。在某塊分區(qū)指定為擴(kuò)展分區(qū)后,就可以對(duì)這塊擴(kuò)展分區(qū)進(jìn)一步分成多個(gè)邏輯分區(qū)。操作系統(tǒng)規(guī)定:
1、四塊分區(qū)每塊都可以是主分區(qū)或擴(kuò)展分區(qū)
2、擴(kuò)展分區(qū)最多只能有一個(gè)(也沒(méi)必要有多個(gè))
3、擴(kuò)展分區(qū)可以進(jìn)一步分割為多個(gè)邏輯分區(qū)
4、擴(kuò)展分區(qū)只是邏輯概念,本身不能被訪問(wèn),也就是不能被格式化后作為數(shù)據(jù)訪問(wèn)的分區(qū),能夠作為數(shù)據(jù)訪問(wèn)的分區(qū)只有主分區(qū)和邏輯分區(qū)
5、邏輯分區(qū)的數(shù)量依操作系統(tǒng)而不同,在 Linux 系統(tǒng)中,IDE 硬盤(pán)最多有 59 個(gè)邏輯分區(qū)(5 號(hào)到 63 號(hào)), SATA 硬盤(pán)則有 11 個(gè)邏輯分區(qū)(5 號(hào)到 15 號(hào))一般給硬盤(pán)進(jìn)行分區(qū)時(shí),一個(gè)主分區(qū)一個(gè)擴(kuò)展分區(qū),然后把擴(kuò)展分區(qū)劃分為N個(gè)邏輯分區(qū)是最好的。
是否可以不要主分區(qū)呢?不知道,但好像不用管,你創(chuàng)建分區(qū)的時(shí)候會(huì)自動(dòng)給你配置類型特殊的,你最好單獨(dú)分一個(gè)swap區(qū)(內(nèi)存置換空間),它獨(dú)為一類,功能是:當(dāng)有數(shù)據(jù)被存放在物理內(nèi)存里面,但是這些數(shù)據(jù)又不是常被 CPU 所取用時(shí),那么這些不常被使用的程序?qū)?huì)被丟到硬盤(pán)的 swap 置換空間當(dāng)中, 而將速度較快的物理內(nèi)存空間釋放出來(lái)給真正需要的程序使用
四,格式化
我們知道Linux操作系統(tǒng)支持很多不同的文件系統(tǒng),比如ext2、ext3、XFS、FAT等等,而Linux把對(duì)不同文件系統(tǒng)的訪問(wèn)交給了VFS(虛擬文件系統(tǒng)),VFS能訪問(wèn)和管理各種不同的文件系統(tǒng)。所以有了區(qū)之后就需要把它格式化成具體的文件系統(tǒng)以便VFS訪問(wèn)。
標(biāo)準(zhǔn)的Linux文件系統(tǒng)Ext2是使用「基于inode的文件系統(tǒng)」
1、我們知道一般操作系統(tǒng)的文件數(shù)據(jù)除了文件實(shí)際內(nèi)容外, 還帶有很多屬性,例如 Linux 操作系統(tǒng)的文件權(quán)限(rwx)與文件屬性(擁有者、群組、 時(shí)間參數(shù)等),文件系統(tǒng)通常會(huì)將屬性和實(shí)際內(nèi)容這兩部分?jǐn)?shù)據(jù)分別存放在不同的區(qū)塊
2、在基于inode的文件系統(tǒng)中,權(quán)限與屬性放置到 inode 中,實(shí)際數(shù)據(jù)放到 data block 區(qū)塊中,而且inode和data block都有編號(hào)
Ext2 文件系統(tǒng)在此基礎(chǔ)上:
1、文件系統(tǒng)最前面有一個(gè)啟動(dòng)扇區(qū)(boot sector)
- 這個(gè)啟動(dòng)扇區(qū)可以安裝開(kāi)機(jī)管理程序, 這個(gè)設(shè)計(jì)讓我們能將不同的引導(dǎo)裝載程序安裝到個(gè)別的文件系統(tǒng)前端,而不用覆蓋整個(gè)硬盤(pán)唯一的MBR, 也就是這樣才能實(shí)現(xiàn)多重引導(dǎo)的功能
2、把每個(gè)區(qū)進(jìn)一步分為多個(gè)塊組 (block group),每個(gè)塊組有獨(dú)立的inode/block體系
- 如果文件系統(tǒng)高達(dá)數(shù)百 GB 時(shí),把所有的 inode 和block 通通放在一起會(huì)因?yàn)?inode 和 block的數(shù)量太龐大,不容易管理
- 這其實(shí)很好理解,因?yàn)榉謪^(qū)是用戶的分區(qū),實(shí)際計(jì)算機(jī)管理時(shí)還有個(gè)最適合的大小,于是計(jì)算機(jī)會(huì)進(jìn)一步的在分區(qū)中分塊
- (但這樣豈不是可能出現(xiàn)大文件放不了的問(wèn)題?有什么機(jī)制善后嗎?)
3、每個(gè)塊組實(shí)際還會(huì)分為分為6個(gè)部分,除了inode table 和 data block外還有4個(gè)附屬模塊,起到優(yōu)化和完善系統(tǒng)性能的作用
所以整個(gè)分區(qū)大概會(huì)這樣劃分:

inode table
1.主要記錄文件的屬性以及該文件實(shí)際數(shù)據(jù)是放置在哪些block中,它記錄的信息至少有這些:
- 大小、真正內(nèi)容的block號(hào)碼(一個(gè)或多個(gè))
- 訪問(wèn)模式(read/write/excute)
- 擁有者與群組(owner/group)
- 各種時(shí)間:建立或狀態(tài)改變的時(shí)間、最近一次的讀取時(shí)間、最近修改的時(shí)間
- 沒(méi)有文件名!文件名在目錄的block中!
2、一個(gè)文件占用一個(gè) inode,每個(gè)inode有編號(hào)
3、Linux 系統(tǒng)存在 inode 號(hào)被用完但磁盤(pán)空間還有剩余的情況
4、注意,這里的文件不單單是普通文件,目錄文件也就是文件夾其實(shí)也是一個(gè)文件,還有其他的也是
5、inode 的數(shù)量與大小在格式化時(shí)就已經(jīng)固定了,每個(gè)inode 大小均固定為128 bytes (新的ext4 與xfs 可設(shè)定到256 bytes)
6、文件系統(tǒng)能夠建立的文件數(shù)量與inode 的數(shù)量有關(guān),存在空間還夠但inode不夠的情況
7、系統(tǒng)讀取文件時(shí)需要先找到inode,并分析inode 所記錄的權(quán)限與使用者是否符合,若符合才能夠開(kāi)始實(shí)際讀取 block 的內(nèi)容
8、inode 要記錄的資料非常多,但偏偏又只有128bytes , 而inode 記錄一個(gè)block 號(hào)碼要花掉4byte ,假設(shè)我一個(gè)文件有400MB 且每個(gè)block 為4K 時(shí), 那么至少也要十萬(wàn)條block 號(hào)碼的記錄!inode 哪有這么多空間來(lái)存儲(chǔ)?為此我們的系統(tǒng)很聰明的將inode 記錄block 號(hào)碼的區(qū)域定義為12個(gè)直接,一個(gè)間接, 一個(gè)雙間接與一個(gè)三間接記錄區(qū)(詳細(xì)見(jiàn)附錄)
data block
1、放置文件內(nèi)容數(shù)據(jù)的地方
2、在格式化時(shí)block的大小就固定了,且每個(gè)block都有編號(hào),以方便inode的記錄
- 原則上,block 的大小與數(shù)量在格式化完就不能夠再改變了(除非重新格式化)
3、在Ext2文件系統(tǒng)中所支持的block大小有1K, 2K及4K三種,由于block大小的區(qū)別,會(huì)導(dǎo)致該文件系統(tǒng)能夠支持的最大磁盤(pán)容量與最大單一文件容量各不相同:
- Block 大小 1KB 2KB 4KB
- 最大單一檔案限制 16GB 256GB 2TB
- 最大檔案系統(tǒng)總?cè)萘?2TB 8TB 16TB
4、每個(gè)block 內(nèi)最多只能夠放置一個(gè)文件的資料,但一個(gè)文件可以放在多個(gè)block中(大的話)
5、若文件小于block ,則該block 的剩余容量就不能夠再被使用了(磁盤(pán)空間會(huì)浪費(fèi))
- 所以如果你的檔案都非常小,但是你的block 在格式化時(shí)卻選用最大的4K 時(shí),可能會(huì)產(chǎn)生容量的浪費(fèi)
- 既然大的block 可能會(huì)產(chǎn)生較嚴(yán)重的磁碟容量浪費(fèi),那么我們是否就將block 大小定為1K ?這也不妥,因?yàn)槿绻鸼lock 較小的話,那么大型檔案將會(huì)占用數(shù)量更多的block ,而inode 也要記錄更多的block 號(hào)碼,此時(shí)將可能導(dǎo)致檔案系統(tǒng)不良的讀寫(xiě)效能
- 事實(shí)上現(xiàn)在的磁盤(pán)容量都太大了,所以一般都會(huì)選擇4K 的block 大小
superblock
1、記錄整個(gè)文件系統(tǒng)相關(guān)信息的地方,一般大小為1024bytes,記錄的信息主要有:
- block 與inode 的總量
- 未使用與已使用的inode / block 數(shù)量
- 一個(gè)valid bit 數(shù)值,若此文件系統(tǒng)已被掛載,則valid bit 為0 ,若未被掛載,則valid bit 為1
- block 與inode 的大小 (block 為1, 2, 4K,inode 為128bytes 或256bytes);
- 其他各種文件系統(tǒng)相關(guān)信息:filesystem 的掛載時(shí)間、最近一次寫(xiě)入資料的時(shí)間、最近一次檢驗(yàn)磁碟(fsck) 的時(shí)間
2、Superblock是非常重要的, 沒(méi)有Superblock ,就沒(méi)有這個(gè)文件系統(tǒng)了,因此如果superblock死掉了,你的文件系統(tǒng)可能就需要花費(fèi)很多時(shí)間去挽救
3、每個(gè)塊都可能含有superblock,但是我們也說(shuō)一個(gè)文件系統(tǒng)應(yīng)該僅有一個(gè)superblock 而已,那是怎么回事?事實(shí)上除了第一個(gè)塊內(nèi)會(huì)含有superblock 之外,后續(xù)的塊不一定含有superblock,而若含有superblock則該superblock主要是做為第一個(gè)塊內(nèi)superblock的備份,這樣可以進(jìn)行superblock的救援
Filesystem Description
1、文件系統(tǒng)描述
2、這個(gè)區(qū)段可以描述每個(gè)block group的開(kāi)始與結(jié)束的block號(hào)碼,以及說(shuō)明每個(gè)區(qū)段(superblock, bitmap, inodemap, data block)分別介于哪一個(gè)block號(hào)碼之間
block bitmap
1、塊對(duì)照表
2、如果你想要新增文件時(shí)要使用哪個(gè)block 來(lái)記錄呢?當(dāng)然是選擇「空的block」來(lái)記錄。那你怎么知道哪個(gè)block 是空的?這就得要通過(guò)block bitmap了,它會(huì)記錄哪些block是空的,因此我們的系統(tǒng)就能夠很快速的找到可使用的空間來(lái)記錄
3、同樣在你刪除某些文件時(shí),那些文件原本占用的block號(hào)碼就得要釋放出來(lái), 此時(shí)在block bitmap 中對(duì)應(yīng)該block號(hào)碼的標(biāo)志位就得要修改成為「未使用中」
inode bitmap
1、與block bitmap 是類似的功能,只是block bitmap 記錄的是使用與未使用的block 號(hào)碼, 至于inode bitmap 則是記錄使用與未使用的inode 號(hào)碼
五,掛載
在一個(gè)區(qū)被格式化為一個(gè)文件系統(tǒng)之后,它就可以被Linux操作系統(tǒng)使用了,只是這個(gè)時(shí)候Linux操作系統(tǒng)還找不到它,所以我們還需要把這個(gè)文件系統(tǒng)「注冊(cè)」進(jìn)Linux操作系統(tǒng)的文件體系里,這個(gè)操作就叫「掛載」 (mount)。掛載是利用一個(gè)目錄當(dāng)成進(jìn)入點(diǎn)(類似選一個(gè)現(xiàn)成的目錄作為代理),將文件系統(tǒng)放置在該目錄下,也就是說(shuō),進(jìn)入該目錄就可以讀取該文件系統(tǒng)的內(nèi)容,類似整個(gè)文件系統(tǒng)只是目錄樹(shù)的一個(gè)文件夾(目錄)。這個(gè)進(jìn)入點(diǎn)的目錄我們稱為「掛載點(diǎn)」。
由于整個(gè) Linux 系統(tǒng)最重要的是根目錄,因此根目錄一定需要掛載到某個(gè)分區(qū)。 而其他的目錄則可依用戶自己的需求來(lái)給予掛載到不同的分去。
到這里L(fēng)inux的文件體系的構(gòu)建過(guò)程其實(shí)已經(jīng)大體講完了,總結(jié)一下就是:硬盤(pán)經(jīng)過(guò)分區(qū)和格式化,每個(gè)區(qū)都成為了一個(gè)文件系統(tǒng),掛載這個(gè)文件系統(tǒng)后就可以讓Linux操作系統(tǒng)通過(guò)VFS訪問(wèn)硬盤(pán)時(shí)跟訪問(wèn)一個(gè)普通文件夾一樣。這里通過(guò)一個(gè)在目錄樹(shù)中讀取文件的實(shí)際例子來(lái)細(xì)講一下目錄文件和普通文件。
6.目錄樹(shù)的讀取過(guò)程
首先我們要知道:
1、每個(gè)文件(不管是一般文件還是目錄文件)都會(huì)占用一個(gè)inode
2、依據(jù)文件內(nèi)容的大小來(lái)分配一個(gè)或多個(gè)block給該文件使用
3、創(chuàng)建一個(gè)文件后,文件完整信息分布在3處地方,生成2個(gè)新文件:
- 文件名記錄在該文件所在目錄的目錄文件的block中,沒(méi)有新文件生成
- 文件屬性、權(quán)限信息、記錄具體內(nèi)容的block編號(hào)記錄在inode中,inode是新生成文件
- 文件具體內(nèi)存記錄在block中,block是新生成文件
4、因?yàn)槲募挠涗浭窃谀夸浀腷lock當(dāng)中,「新增/刪除/更名文件名」與目錄的w權(quán)限有關(guān)所以在Linux/Unix中,文件名稱只是文件的一個(gè)屬性,叫別名也好,叫綽號(hào)也罷,僅為了方便用戶記憶和使用,但系統(tǒng)內(nèi)部并不需要用文件名來(lái)定為文件位置,這樣處理最直觀的好處就是,你可以對(duì)正在使用的文件改名,換目錄,甚至放到廢紙簍,都不會(huì)影響當(dāng)前文件的使用,這在Windows里是無(wú)法想象的。比如你打開(kāi)個(gè)Word文件,然后對(duì)其進(jìn)行重命名操作,Windows會(huì)告訴你門(mén)兒都沒(méi)有,關(guān)閉文件先!但在Mac里就毫無(wú)壓力,因?yàn)镸ac的操作系統(tǒng)同樣采用了inode的設(shè)計(jì)。
創(chuàng)建文件過(guò)程
當(dāng)在ext2下建立一個(gè)一般文件時(shí), ext2 會(huì)分配一個(gè)inode 與相對(duì)于該文件大小的block 數(shù)量給該文件
- 例如:假設(shè)我的一個(gè)block 為4 Kbytes ,而我要建立一個(gè)100 KBytes 的文件,那么linux 將分配一個(gè)inode 與25 個(gè)block 來(lái)儲(chǔ)存該文件
- 但同時(shí)請(qǐng)注意,由于inode 僅有12 個(gè)直接指向,因此還要多一個(gè)block 來(lái)作為區(qū)塊號(hào)碼的記錄
創(chuàng)建目錄過(guò)程
當(dāng)在ext2文件系統(tǒng)建立一個(gè)目錄時(shí)(就是新建了一個(gè)目錄文件),文件系統(tǒng)會(huì)分配一個(gè)inode與至少一塊block給該目錄
- inode記錄該目錄的相關(guān)權(quán)限與屬性,并記錄分配到的那塊block號(hào)碼
- 而block則是記錄在這個(gè)目錄下的文件名與該文件對(duì)應(yīng)的inode號(hào)
- block中還會(huì)自動(dòng)生成兩條記錄,一條是.文件夾記錄,inode指向自身,另一條是..文件夾記錄,inode指向父文件夾
從目錄樹(shù)中讀取某個(gè)文件過(guò)程
- 因?yàn)槲募怯涗浽谀夸浀腷lock當(dāng)中,因此當(dāng)我們要讀取某個(gè)文件時(shí),就一定會(huì)經(jīng)過(guò)目錄的inode與block ,然后才能夠找到那個(gè)待讀取文件的inode號(hào)碼,最終才會(huì)讀到正確的文件的block內(nèi)的資料。
- 由于目錄樹(shù)是由根目錄開(kāi)始,因此操作系統(tǒng)先通過(guò)掛載信息找到掛載點(diǎn)的inode號(hào),由此得到根目錄的inode內(nèi)容,并依據(jù)該inode讀取根目錄的block信息,再一層一層的往下讀到正確的文件。舉例來(lái)說(shuō),如果我想要讀取/etc/passwd 這個(gè)文件時(shí),系統(tǒng)是如何讀取的呢?先看一下這個(gè)文件以及有關(guān)路徑文件夾的信息:
1$ ll -di / /etc /etc/passwd
2 128 dr-xr-x r-x . 17 root root 4096 May 4 17:56 /
333595521 drwxr-x r-x . 131 root root 8192 Jun 17 00:20 /et
c436628004 -rw-r-- r-- . 1 root root 2092 Jun 17 00:20 /etc/passwd
于是該文件的讀取流程為:
1、/的inode:
通過(guò)掛載點(diǎn)的信息找到inode號(hào)碼為128的根目錄inode,且inode規(guī)定的權(quán)限讓我們可以讀取該block的內(nèi)容(有r與x)
2、/的block:
經(jīng)過(guò)上個(gè)步驟取得block的號(hào)碼,并找到該內(nèi)容有etc/目錄的inode號(hào)碼(33595521)
3、etc/的inode:
讀取33595521號(hào)inode得知具有r與x的權(quán)限,因此可以讀取etc/的block內(nèi)容
4、etc/的block:
經(jīng)過(guò)上個(gè)步驟取得block號(hào)碼,并找到該內(nèi)容有passwd文件的inode號(hào)碼(36628004)
5、passwd的inode:
讀取36628004號(hào)inode得知具有r的權(quán)限,因此可以讀取passwd的block內(nèi)容
6、passwd的block:
最后將該block內(nèi)容的資料讀出來(lái)
電子發(fā)燒友App







































評(píng)論