Linux一切皆文件
Linux 中的各種事物比如像文檔抖僵、目錄(Mac OS X 和 Windows 系統(tǒng)下稱之為文件夾)边灭、鍵盤漩符、監(jiā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 , 重定向, 管道)來處理unix中大多數(shù)的資源。
設(shè)計(jì)一個(gè)系統(tǒng)的終極目標(biāo)往往就是要找到原子操作萄凤,一旦鎖定了原子操作室抽,設(shè)計(jì)工作就會(huì)變得簡單而有序∶遗“文件”作為一個(gè)抽象概念坪圾,其原子操作非常簡單,只有讀和寫惑朦,這無疑是一個(gè)非常好的模型兽泄。通過這個(gè)模型,API的設(shè)計(jì)可以化繁為簡漾月,用戶可以使用通用的方式去訪問任何資源病梢,自有相應(yīng)的中間件做好對(duì)底層的適配。
現(xiàn)代操作系統(tǒng)為解決信息能獨(dú)立于進(jìn)程之外被長期存儲(chǔ)引入了文件,文件作為進(jìn)程創(chuàng)建信息的邏輯單元可被多個(gè)進(jìn)程并發(fā)使用蜓陌。在 UNIX 系統(tǒng)中觅彰,操作系統(tǒng)為磁盤上的文本與圖像、鼠標(biāo)與鍵盤等輸入設(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)的目錄樹。
在Linux系統(tǒng)中性置,一切都是文件檐晕,理解文件系統(tǒng),對(duì)于學(xué)習(xí)Linux來說蚌讼,是一個(gè)非常有必要的前提
Linux上的文件系統(tǒng)一般來說就是EXT2或EXT3辟灰,但這篇文章并不準(zhǔn)備一上來就直接講它們,而希望結(jié)合Linux操作系統(tǒng)并從文件系統(tǒng)建立的基礎(chǔ)——硬盤開始篡石,一步步認(rèn)識(shí)Linux的文件系統(tǒng)芥喇。
1. 機(jī)械硬盤的物理存儲(chǔ)機(jī)制
- 現(xiàn)代計(jì)算機(jī)大部分文件存儲(chǔ)功能都是由機(jī)械硬盤這種設(shè)備提供的。(現(xiàn)在的SSD和閃存從概念和邏輯上都部分繼承自機(jī)械硬盤凰萨,所以使用機(jī)械硬盤來進(jìn)行理解也是沒有問題的)
-
機(jī)械硬盤能實(shí)現(xiàn)信息存儲(chǔ)的功能基于:磁性存儲(chǔ)介質(zhì)能夠被磁化继控,且磁化后會(huì)長久保留被磁化的狀態(tài),這種被磁化狀態(tài)能夠被讀取出來胖眷,同時(shí)這種磁化狀態(tài)還能夠不斷被修改武通,磁化正好有兩個(gè)方向,所以可以表示0和1珊搀。
于是硬盤就是把這種磁性存儲(chǔ)介質(zhì)做成一個(gè)個(gè)盤片冶忱,每一個(gè)盤片上都分布著數(shù)量巨大的磁性存儲(chǔ)單位,使用磁性讀寫頭對(duì)盤片進(jìn)行寫入和讀染澄觥(從原理上類似黑膠唱片的播放)囚枪。 - 一個(gè)硬盤中的磁性存儲(chǔ)單位數(shù)以億計(jì)(1T硬盤就有約80億個(gè)),所以需要一套規(guī)則來規(guī)劃信息如何存壤拖(比如一本存儲(chǔ)信息的書我們還會(huì)分為頁链沼,每一頁從上到下從左到右讀取,同時(shí)還有章節(jié)目錄)
于是就有了這些物理沛鸵、邏輯概念- 一個(gè)硬盤有多張盤片疊成括勺,不同盤片有編號(hào)
- 每張盤片上的存儲(chǔ)顆粒成環(huán)形一圈圈地排布,每一圈稱為磁道,有編號(hào)
- 每條磁道上都有一圈存儲(chǔ)顆粒疾捍,每512x8(512字節(jié)奈辰,0.5KB)個(gè)存儲(chǔ)顆粒作為一個(gè)扇區(qū)拾氓,扇區(qū)是硬盤上存儲(chǔ)的最小物理單位
- N個(gè)扇區(qū)可以組成簇冯挎,N取決于不同的文件系統(tǒng)或是文件系統(tǒng)的配置底哥,簇是此文件系統(tǒng)中的最小存儲(chǔ)單位
- 所有盤面上的同一磁道構(gòu)成一個(gè)圓柱咙鞍,稱為柱面,柱面是系統(tǒng)分區(qū)的最小單位
磁頭讀寫文件的時(shí)候趾徽,首先是分區(qū)讀寫的续滋,由inode編號(hào)(區(qū)內(nèi)唯一的編號(hào)后面介紹)找到對(duì)應(yīng)的磁道和扇區(qū),然后一個(gè)柱面一個(gè)柱面地進(jìn)行讀寫孵奶。機(jī)械硬盤的讀寫控制系統(tǒng)是一個(gè)令人嘆為觀止的精密工程(一個(gè)盤面上有幾億個(gè)存儲(chǔ)單位疲酌,每個(gè)磁道寬度不到幾十納米,磁盤每分鐘上萬轉(zhuǎn))了袁,同時(shí)關(guān)于讀寫的邏輯也是有諸多細(xì)節(jié)(比如扇區(qū)的編號(hào)并不是連續(xù)的)朗恳,非常有意思,可以自行搜索文章拓展閱讀载绿。
有了硬盤并不意味著LInux可以立刻把它用來存儲(chǔ)粥诫,還需要組合進(jìn)Linux的文件體系才能被Linux使用。
2.Linux文件體系
Linux以文件的形式對(duì)計(jì)算機(jī)中的數(shù)據(jù)和硬件資源進(jìn)行管理崭庸,也就是徹底的一切皆文件怀浆,反映在Linux的文件類型上就是:普通文件、目錄文件(也就是文件夾)怕享、設(shè)備文件执赡、鏈接文件、管道文件函筋、套接字文件(數(shù)據(jù)通信的接口)等等沙合。而這些種類繁多的文件被Linux使用目錄樹進(jìn)行管理, 所謂的目錄樹就是以根目錄(/)為主跌帐,向下呈現(xiàn)分支狀的一種文件結(jié)構(gòu)灌诅。不同于純粹的ext2之類的文件系統(tǒng),我把它稱為文件體系含末,一切皆文件和文件目錄樹的資源管理方式一起構(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的角度來說紊搪,類似mp4、pdf全景、html這樣應(yīng)用層面上的文件類型都屬于普通文件
Linux用戶可以根據(jù)訪問權(quán)限對(duì)普通文件進(jìn)行查看耀石、更改和刪除
1.2 目錄文件
目錄文件對(duì)于用慣Windows的用戶來說不太容易理解,目錄也是文件的一種目錄文件包含了各自目錄下的文件名和指向這些文件的指針爸黄,打開目錄事實(shí)上就是打開目錄文件滞伟,只要有訪問權(quán)限,你就可以隨意訪問這些目錄下的文件(普通文件的執(zhí)行權(quán)限就是目錄文件的訪問權(quán)限)炕贵,但是只有內(nèi)核的進(jìn)程能夠修改它們雖然不能修改梆奈,但是我們能夠通過vim去查看目錄文件的內(nèi)容
1.3 符合鏈接(l,symbolic link)
這種類型的文件類似Windows中的快捷方式称开,是指向另一個(gè)文件的間接指針亩钟,也就是我們常說的軟鏈接
1.4 塊設(shè)備文件(b,block)和字符設(shè)備文件(c鳖轰,char)
這些文件一般隱藏在/dev目錄下清酥,在進(jìn)行設(shè)備讀取和外設(shè)交互時(shí)會(huì)被使用到
比如磁盤光驅(qū)就是塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件
系統(tǒng)中的所有設(shè)備要么是塊設(shè)備文件蕴侣,要么是字符設(shè)備文件焰轻,無一例外
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里寫數(shù)據(jù)忆肾,先進(jìn)先出荸频,隨寫隨讀。
1.6 套接字(s客冈,socket)
用于進(jìn)程間的網(wǎng)絡(luò)通信旭从,也可以用于本機(jī)之間的非網(wǎng)絡(luò)通信
這些文件一般隱藏在/var/run目錄下,證明著相關(guān)進(jìn)程的存在
Linux 的文件是沒有所謂的擴(kuò)展名的场仲,一個(gè) Linux文件能不能被執(zhí)行與它是否可執(zhí)行的屬性有關(guān)和悦,只要你的權(quán)限中有 x ,比如[ -rwx-r-xr-x ] 就代表這個(gè)文件可以被執(zhí)行渠缕,與文件名沒有關(guān)系鸽素。跟在 Windows下能被執(zhí)行的文件擴(kuò)展名通常是 .com .exe .bat 等不同。
不過亦鳞,可以被執(zhí)行跟可以執(zhí)行成功不一樣馍忽。比如在 root 主目彔下的 install.log 是一個(gè)文本文件棒坏,修改權(quán)限成為 -rwxrwxrwx 后這個(gè)文件能夠真的執(zhí)行成功嗎? 當(dāng)然不行遭笋,因?yàn)樗膬?nèi)容根本就沒有可以執(zhí)行的數(shù)據(jù)坝冕。所以說,這個(gè) x 代表這個(gè)文件具有可執(zhí)行的能力瓦呼, 但是能不能執(zhí)行成功喂窟,當(dāng)然就得要看該文件的內(nèi)容了。雖然如此央串,不過我們?nèi)匀幌M軓臄U(kuò)展名來了解該文件是什么東西磨澡,所以一般我們還是會(huì)以適當(dāng)?shù)臄U(kuò)展名來表示該文件是什么種類的。所以Linux 系統(tǒng)上的文件名真的只是讓你了解該文件可能的用途而已蹋辅, 真正的執(zhí)行與否仍然需要權(quán)限的規(guī)范才行钱贯。比如常見的/bin/ls 這個(gè)顯示文件屬性的指令要是權(quán)限被修改為無法執(zhí)行挫掏,那么ls 就變成不能執(zhí)行了侦另。這種問題最常發(fā)生在文件傳送的過程中。例如你在網(wǎng)絡(luò)上下載一個(gè)可執(zhí)行文件尉共,但是偏偏在你的 Linux 系統(tǒng)中就是無法執(zhí)行褒傅,那就可能是檔案的屬性被改變了。而且從網(wǎng)絡(luò)上傳送到你 的 Linux 系統(tǒng)中袄友,文件的屬性權(quán)限確實(shí)是會(huì)被改變的
2. Linux目錄樹
對(duì)Linux系統(tǒng)和用戶來說殿托,所有可操作的計(jì)算機(jī)資源都存在于目錄樹這個(gè)邏輯結(jié)構(gòu)中,對(duì)計(jì)算機(jī)資源的訪問都可以認(rèn)為是目錄樹的訪問剧蚣。就硬盤來說支竹,所有對(duì)硬盤的訪問都變成了對(duì)目錄樹中某個(gè)節(jié)點(diǎn)也就是文件夾的訪問,訪問時(shí)不需要知道它是硬盤還是硬盤中的文件夾鸠按。
目錄樹的邏輯結(jié)構(gòu)也非常簡單礼搁,就是從根目錄(/)開始,不斷向下展開各級(jí)子目錄目尖。
3. 硬盤分區(qū)
硬盤分區(qū)是硬盤結(jié)合到文件體系的第一步馒吴,本質(zhì)是「硬盤」這個(gè)物理概念轉(zhuǎn)換成「區(qū)」這個(gè)邏輯概念,為下一步格式化做準(zhǔn)備瑟曲。
所以分區(qū)本身并不是必須的饮戳,你完全可以把一整塊硬盤作為一個(gè)區(qū)。但從數(shù)據(jù)的安全性以及系統(tǒng)性能角度來看洞拨,分區(qū)還是有很多用處的扯罐,所以一般都會(huì)對(duì)硬盤進(jìn)行分區(qū)。
講分區(qū)就不得不先提每塊硬盤上最重要的第一扇區(qū)烦衣,這個(gè)扇區(qū)中有硬盤主引導(dǎo)記錄(Master boot record, MBR) 及分區(qū)表(partition table)歹河, 其中 MBR 占有 446 bytes齿椅,而分區(qū)表占有 64 bytes。硬盤主引導(dǎo)記錄放有最基本的引導(dǎo)加載程序启泣,是系統(tǒng)開機(jī)啟動(dòng)的關(guān)鍵環(huán)節(jié)涣脚,在附錄中有更詳細(xì)的說明。而分區(qū)表則跟分區(qū)有關(guā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ū)來記錄更多的分區(qū)信息役衡。把普通可以訪問的分區(qū)稱為主分區(qū)澎办,擴(kuò)展分區(qū)不同于主分區(qū)曹鸠,它本身并沒有內(nèi)容蘑志,它是為進(jìn)一步邏輯分區(qū)提供空間的累奈。在某塊分區(qū)指定為擴(kuò)展分區(qū)后,就可以對(duì)這塊擴(kuò)展分區(qū)進(jìn)一步分成多個(gè)邏輯分區(qū)急但。操作系統(tǒng)規(guī)定:
是否可以不要主分區(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ì)被丟到硬盤的 swap 置換空間當(dāng)中撒穷, 而將速度較快的物理內(nèi)存空間釋放出來給真正需要的程序使用。
4. 格式化
我們知道Linux操作系統(tǒng)支持很多不同的文件系統(tǒng)敌蚜,比如ext2桥滨、ext3、XFS弛车、FAT等等齐媒,而Linux把對(duì)不同文件系統(tǒng)的訪問交給了VFS(虛擬文件系統(tǒng)),VFS能訪問和管理各種不同的文件系統(tǒng)纷跛。所以有了區(qū)之后就需要把它格式化成具體的文件系統(tǒng)以便VFS訪問喻括。
標(biāo)準(zhǔn)的Linux文件系統(tǒng)Ext2是使用「基于inode的文件系統(tǒng)」
我們知道一般操作系統(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ū)塊拷恨。
在基于inode的文件系統(tǒng)中脖律,權(quán)限與屬性放置到 inode 中,實(shí)際數(shù)據(jù)放到 data block 區(qū)塊中腕侄,而且inode和data block都有編號(hào)小泉。
Ext2 文件系統(tǒng)在此基礎(chǔ)上。
文件系統(tǒng)最前面有一個(gè)啟動(dòng)扇區(qū)(boot sector)冕杠,這個(gè)啟動(dòng)扇區(qū)可以安裝開機(jī)管理程序微姊, 這個(gè)設(shè)計(jì)讓我們能將不同的引導(dǎo)裝載程序安裝到個(gè)別的文件系統(tǒng)前端,而不用覆蓋整個(gè)硬盤唯一的MBR分预, 也就是這樣才能實(shí)現(xiàn)多重引導(dǎo)的功能兢交。
把每個(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)大文件放不了的問題?有什么機(jī)制善后嗎溉潭?)
每個(gè)塊組實(shí)際還會(huì)分為分為6個(gè)部分净响,除了inode table 和 data block外還有4個(gè)附屬模塊,起到優(yōu)化和完善系統(tǒng)性能的作用喳瓣。
所以整個(gè)分區(qū)大概會(huì)這樣劃分:
1.inode table
主要記錄文件的屬性以及該文件實(shí)際數(shù)據(jù)是放置在哪些block中馋贤,它記錄的信息至少有這些:
大小、真正內(nèi)容的block號(hào)碼(一個(gè)或多個(gè))
訪問模式(read/write/excute)
擁有者與群組(owner/group)
各種時(shí)間:建立或狀態(tài)改變的時(shí)間畏陕、最近一次的讀取時(shí)間配乓、最近修改的時(shí)間沒有文件名!文件名在目錄的block中惠毁!
一個(gè)文件占用一個(gè) inode犹芹,每個(gè)inode有編號(hào).
Linux 系統(tǒng)存在 inode 號(hào)被用完但磁盤空間還有剩余的情況
注意,這里的文件不單單是普通文件鞠绰,目錄文件也就是文件夾其實(shí)也是一個(gè)文件腰埂,還有其他的也是。
inode 的數(shù)量與大小在格式化時(shí)就已經(jīng)固定了蜈膨,每個(gè)inode 大小均固定為128 bytes (新的ext4 與xfs 可設(shè)定到256 bytes)屿笼。
文件系統(tǒng)能夠建立的文件數(shù)量與inode 的數(shù)量有關(guān)牺荠,存在空間還夠但inode不夠的情況。
系統(tǒng)讀取文件時(shí)需要先找到inode驴一,并分析inode 所記錄的權(quán)限與使用者是否符合休雌,若符合才能夠開始實(shí)際讀取 block 的內(nèi)容。
inode 要記錄的資料非常多肝断,但偏偏又只有128bytes 挑辆, 而inode 記錄一個(gè)block 號(hào)碼要花掉4byte ,假設(shè)我一個(gè)文件有400MB 且每個(gè)block 為4K 時(shí)孝情, 那么至少也要十萬條block 號(hào)碼的記錄鱼蝉!inode 哪有這么多空間來存儲(chǔ)?為此我們的系統(tǒng)很聰明的將inode 記錄block 號(hào)碼的區(qū)域定義為12個(gè)直接箫荡,一個(gè)間接, 一個(gè)雙間接與一個(gè)三間接記錄區(qū)(詳細(xì)見附錄)
2. data block
放置文件內(nèi)容數(shù)據(jù)的地方
在格式化時(shí)block的大小就固定了魁亦,且每個(gè)block都有編號(hào),以方便inode的記錄
原則上羔挡,block 的大小與數(shù)量在格式化完就不能夠再改變了(除非重新格式化)
在Ext2文件系統(tǒng)中所支持的block大小有1K, 2K及4K三種洁奈,由于block大小的區(qū)別,會(huì)導(dǎo)致該文件系統(tǒng)能夠支持的最大磁盤容量與最大單一文件容量各不相同:
Block 大小 1KB 2KB 4KB
最大單一檔案限制 16GB 256GB 2TB
最大檔案系統(tǒng)總?cè)萘?2TB 8TB 16TB
每個(gè)block 內(nèi)最多只能夠放置一個(gè)文件的資料绞灼,但一個(gè)文件可以放在多個(gè)block中(大的話)
若文件小于block 利术,則該block 的剩余容量就不能夠再被使用了(磁盤空間會(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)不良的讀寫效能。
事實(shí)上現(xiàn)在的磁盤容量都太大了终议,所以一般都會(huì)選擇4K 的block 大小汇竭。
3.superblock
記錄整個(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í)間彪蓬、最近一次寫入資料的時(shí)間寸莫、最近一次檢驗(yàn)磁碟(fsck) 的時(shí)間。
Superblock是非常重要的档冬, 沒有Superblock 膘茎,就沒有這個(gè)文件系統(tǒng)了,因此如果superblock死掉了酷誓,你的文件系統(tǒng)可能就需要花費(fèi)很多時(shí)間去挽救披坏。
每個(gè)塊都可能含有superblock,但是我們也說一個(gè)文件系統(tǒng)應(yīng)該僅有一個(gè)superblock 而已盐数,那是怎么回事棒拂?事實(shí)上除了第一個(gè)塊內(nèi)會(huì)含有superblock 之外,后續(xù)的塊不一定含有superblock玫氢,而若含有superblock則該superblock主要是做為第一個(gè)塊內(nèi)superblock的備份帚屉,這樣可以進(jìn)行superblock的救援。
4.Filesystem Description
文件系統(tǒng)描述:
這個(gè)區(qū)段可以描述每個(gè)block group的開始與結(jié)束的block號(hào)碼漾峡,以及說明每個(gè)區(qū)段(superblock, bitmap, inodemap, data block)分別介于哪一個(gè)block號(hào)碼之間
5.block bitmap
塊對(duì)照表:
如果你想要新增文件時(shí)要使用哪個(gè)block 來記錄呢攻旦?當(dāng)然是選擇「空的block」來記錄。那你怎么知道哪個(gè)block 是空的生逸?這就得要通過block bitmap了牢屋,它會(huì)記錄哪些block是空的,因此我們的系統(tǒng)就能夠很快速的找到可使用的空間來記錄同樣在你刪除某些文件時(shí)牺陶,那些文件原本占用的block號(hào)碼就得要釋放出來伟阔, 此時(shí)在block bitmap 中對(duì)應(yīng)該block號(hào)碼的標(biāo)志位就得要修改成為「未使用中」
6.inode bitmap
與block bitmap 是類似的功能,只是block bitmap 記錄的是使用與未使用的block 號(hào)碼掰伸, 至于inode bitmap 則是記錄使用與未使用的inode 號(hào)碼。
5. 掛載
在一個(gè)區(qū)被格式化為一個(gè)文件系統(tǒng)之后怀估,它就可以被Linux操作系統(tǒng)使用了狮鸭,只是這個(gè)時(shí)候Linux操作系統(tǒng)還找不到它,所以我們還需要把這個(gè)文件系統(tǒng)「注冊」進(jìn)Linux操作系統(tǒng)的文件體系里多搀,這個(gè)操作就叫「掛載」 (mount)歧蕉。
掛載是利用一個(gè)目錄當(dāng)成進(jìn)入點(diǎn)(類似選一個(gè)現(xiàn)成的目錄作為代理),將文件系統(tǒng)放置在該目錄下康铭,也就是說惯退,進(jìn)入該目錄就可以讀取該文件系統(tǒng)的內(nèi)容,類似整個(gè)文件系統(tǒng)只是目錄樹的一個(gè)文件夾(目錄)从藤。
這個(gè)進(jìn)入點(diǎn)的目錄我們稱為「掛載點(diǎn)」催跪。
由于整個(gè) Linux 系統(tǒng)最重要的是根目錄锁蠕,因此根目錄一定需要掛載到某個(gè)分區(qū)。 而其他的目錄則可依用戶自己的需求來給予掛載到不同的分去懊蒸。
到這里L(fēng)inux的文件體系的構(gòu)建過程其實(shí)已經(jīng)大體講完了荣倾,總結(jié)一下就是:硬盤經(jīng)過分區(qū)和格式化,每個(gè)區(qū)都成為了一個(gè)文件系統(tǒng)骑丸,掛載這個(gè)文件系統(tǒng)后就可以讓Linux操作系統(tǒng)通過VFS訪問硬盤時(shí)跟訪問一個(gè)普通文件夾一樣舌仍。這里通過一個(gè)在目錄樹中讀取文件的實(shí)際例子來細(xì)講一下目錄文件和普通文件。
6.目錄樹讀取過程
首先我們要知道
- 每個(gè)文件(不管是一般文件還是目錄文件)都會(huì)占用一個(gè)inode
- 依據(jù)文件內(nèi)容的大小來分配一個(gè)或多個(gè)block給該文件使用
- 創(chuàng)建一個(gè)文件后通危,文件完整信息分布在3處地方铸豁,生成2個(gè)新文件:
3.1 文件名記錄在該文件所在目錄的目錄文件的block中,沒有新文件生成
3.2 文件屬性菊碟、權(quán)限信息推姻、記錄具體內(nèi)容的block編號(hào)記錄在inode中,inode是新生成文件
3.3 文件具體內(nèi)存記錄在block中框沟,block是新生成文件 - 因?yàn)槲募挠涗浭窃谀夸浀腷lock當(dāng)中藏古,「新增/刪除/更名文件名」與目錄的w權(quán)限有關(guān)。
所以在Linux/Unix中忍燥,文件名稱只是文件的一個(gè)屬性拧晕,叫別名也好,叫綽號(hào)也罷梅垄,僅為了方便用戶記憶和使用厂捞,但系統(tǒng)內(nèi)部并不需要用文件名來定為文件位置,這樣處理最直觀的好處就是队丝,你可以對(duì)正在使用的文件改名靡馁,換目錄,甚至放到廢紙簍机久,都不會(huì)影響當(dāng)前文件的使用臭墨,這在Windows里是無法想象的。比如你打開個(gè)Word文件膘盖,然后對(duì)其進(jìn)行重命名操作胧弛,Windows會(huì)告訴你門兒都沒有,關(guān)閉文件先侠畔!但在Mac里就毫無壓力结缚,因?yàn)镸ac的操作系統(tǒng)同樣采用了inode的設(shè)計(jì)。
創(chuàng)建文件過程
當(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 來儲(chǔ)存該文件茵宪。
- 但同時(shí)請注意最冰,由于inode 僅有12 個(gè)直接指向,因此還要多一個(gè)block 來作為區(qū)塊號(hào)碼的記錄锌奴。
創(chuàng)建目錄過程
當(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指向父文件夾
從目錄樹中讀取某個(gè)文件過程
1.因?yàn)槲募怯涗浽谀夸浀腷lock當(dāng)中分冈,因此當(dāng)我們要讀取某個(gè)文件時(shí),就一定會(huì)經(jīng)過目錄的inode與block 霸株,然后才能夠找到那個(gè)待讀取文件的inode號(hào)碼,最終才會(huì)讀到正確的文件的block內(nèi)的資料去件。
-
由于目錄樹是由根目錄開始,因此操作系統(tǒng)先通過掛載信息找到掛載點(diǎn)的inode號(hào)倔叼,由此得到根目錄的inode內(nèi)容宫莱,并依據(jù)該inode讀取根目錄的block信息,再一層一層的往下讀到正確的文件肥印。
舉例來說绝葡,如果我想要讀取/etc/passwd 這個(gè)文件時(shí)腹鹉,系統(tǒng)是如何讀取的呢?
先看一下這個(gè)文件以及有關(guān)路徑文件夾的信息:
1$ ll -di / /etc /etc/passwd
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 /etc
436628004 -rw-r-- r-- . 1 root root 2092 Jun 17 00:20 /etc/passwd
于是該文件的讀取流程為:
- /的inode:
通過掛載點(diǎn)的信息找到inode號(hào)碼為128的根目錄inode愉阎,且inode規(guī)定的權(quán)限讓我們可以讀取該block的內(nèi)容(有r與x) - /的block:
經(jīng)過上個(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)容 - etc/的block:
經(jīng)過上個(gè)步驟取得block號(hào)碼澡屡,并找到該內(nèi)容有passwd文件的inode號(hào)碼(36628004) - passwd的inode:
讀取36628004號(hào)inode得知具有r的權(quán)限咐旧,因此可以讀取passwd的block內(nèi)容 - passwd的block:
最后將該block內(nèi)容的資料讀出來
參考鏈接:https://juejin.im/post/5b8ba9e26fb9a019c372e100#heading-10