欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)分析Linux文件系統(tǒng)

 更新時(shí)間:2017年12月10日 08:49:07   投稿:laozhang  
本片文章通過存儲(chǔ)機(jī)制,結(jié)構(gòu)等方便對(duì)Linux文件系統(tǒng)做了詳細(xì)分析和解讀,一起學(xué)習(xí)參考下吧。

本片文章針對(duì)Linux文件系統(tǒng)從原理到運(yùn)行機(jī)制做了非常詳細(xì)的理論分析,有助于讀者對(duì)此深入的理解,以下是具體內(nèi)容:

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ì)長(zhǎng)久保留被磁化的狀態(tài),這種被磁化狀態(tài)能夠被讀取出來,同時(shí)這種磁化狀態(tài)還能夠不斷被修改,磁化正好有兩個(gè)方向,所以可以表示0和1。
于是硬盤就是把這種磁性存儲(chǔ)介質(zhì)做成一個(gè)個(gè)盤片,每一個(gè)盤片上都分布著數(shù)量巨大的磁性存儲(chǔ)單位,使用磁性讀寫頭對(duì)盤片進(jìn)行寫入和讀?。◤脑砩项愃坪谀z唱片的播放)。

一個(gè)硬盤中的磁性存儲(chǔ)單位數(shù)以億計(jì)(1T硬盤就有約80億個(gè)),所以需要一套規(guī)則來規(guī)劃信息如何存?。ū热缫槐敬鎯?chǔ)信息的書我們還會(huì)分為頁,每一頁從上到下從左到右讀取,同時(shí)還有章節(jié)目錄)
于是就有了這些物理、邏輯概念:

一個(gè)硬盤有多張盤片疊成,不同盤片有編號(hào)每張盤片上的存儲(chǔ)顆粒成環(huán)形一圈圈地排布,每一圈稱為磁道,有編號(hào)每條磁道上都有一圈存儲(chǔ)顆粒,每512*8(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)代替文件體系。

Linux中的文件類型

那就先簡(jiǎn)單說說Linux中的文件類型,主要關(guān)注普通文件、目錄文件和符號(hào)連接文件。

普通文件(-) 從Linux的角度來說,類似mp4、pdf、html這樣應(yīng)用層面上的文件類型都屬于普通文件 Linux用戶可以根據(jù)訪問權(quán)限對(duì)普通文件進(jìn)行查看、更改和刪除 目錄文件(d,directory file) 目錄文件對(duì)于用慣Windows的用戶來說不太容易理解,目錄也是文件的一種目錄文件包含了各自目錄下的文件名和指向這些文件的指針,打開目錄事實(shí)上就是打開目錄文件,只要有訪問權(quán)限,你就可以隨意訪問這些目錄下的文件(普通文件的執(zhí)行權(quán)限就是目錄文件的訪問權(quán)限),但是只有內(nèi)核的進(jìn)程能夠修改它們雖然不能修改,但是我們能夠通過vim去查看目錄文件的內(nèi)容 符號(hào)鏈接(l,symbolic link) 這種類型的文件類似Windows中的快捷方式,是指向另一個(gè)文件的間接指針,也就是我們常說的軟鏈接 塊設(shè)備文件(b,block)和字符設(shè)備文件(c,char) 這些文件一般隱藏在/dev目錄下,在進(jìn)行設(shè)備讀取和外設(shè)交互時(shí)會(huì)被使用到比如磁盤光驅(qū)就是塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件系統(tǒng)中的所有設(shè)備要么是塊設(shè)備文件,要么是字符設(shè)備文件,無一例外 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)先出,隨寫隨讀。 套接字(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ì)被改變的

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)也非常簡(jiǎn)單,就是從根目錄(/)開始,不斷向下展開各級(jí)子目錄。

3.硬盤分區(qū)

硬盤分區(qū)是硬盤結(jié)合到文件體系的第一步,本質(zhì)是「硬盤」這個(gè)物理概念轉(zhuǎn)換成「區(qū)」這個(gè)邏輯概念,為下一步格式化做準(zhǔn)備。

所以分本身并不是必須的,你完全可以把一整塊硬盤作為一個(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ū)每塊都可以是主分區(qū)或擴(kuò)展分區(qū)擴(kuò)展分區(qū)最多只能有一個(gè)(也沒必要有多個(gè))擴(kuò)展分區(qū)可以進(jìn)一步分割為多個(gè)邏輯分區(qū)擴(kuò)展分區(qū)只是邏輯概念,本身不能被訪問,也就是不能被格式化后作為數(shù)據(jù)訪問的分區(qū),能夠作為數(shù)據(jù)訪問的分區(qū)只有主分區(qū)和邏輯分區(qū)邏輯分區(qū)的數(shù)量依操作系統(tǒng)而不同,在 Linux 系統(tǒng)中,IDE 硬盤最多有 59 個(gè)邏輯分區(qū)(5 號(hào)到 63 號(hào)), SATA 硬盤則有 11 個(gè)邏輯分區(qū)(5 號(hào)到 15 號(hào))

一般給硬盤進(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ì)被丟到硬盤的 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ì)這樣劃分:

 

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ì)見附錄) 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 大小 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的救援 Filesystem Description 文件系統(tǒng)描述這個(gè)區(qū)段可以描述每個(gè)block group的開始與結(jié)束的block號(hào)碼,以及說明每個(gè)區(qū)段(superblock, bitmap, inodemap, data block)分別介于哪一個(gè)block號(hào)碼之間 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)志位就得要修改成為「未使用中」 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)「注冊(cè)」進(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è)新文件: 文件名記錄在該文件所在目錄的目錄文件的block中,沒有新文件生成文件屬性、權(quán)限信息、記錄具體內(nèi)容的block編號(hào)記錄在inode中,inode是新生成文件文件具體內(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í)請(qǐng)注意,由于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è)文件過程 因?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)路徑文件夾的信息:

$ ll -di / /etc /etc/passwd
128 dr-xr-x r-x . 17 root root 4096 May 4 17:56 /
33595521 drwxr-x r-x . 131 root root 8192 Jun 17 00:20 /etc
36628004 -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) 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)容的資料讀出來

附錄:開機(jī)流程和硬盤主引導(dǎo)記錄

可以稍微講下開機(jī)流程和硬盤主引導(dǎo)記錄(MBR,或者叫主引導(dǎo)分區(qū))

一臺(tái)可正常運(yùn)行的計(jì)算機(jī)會(huì)在BIOS上設(shè)置一塊啟動(dòng)硬盤,其實(shí)每塊硬盤都可以作為啟動(dòng)盤,硬盤本身的設(shè)計(jì)提供的這種可能,這就要從硬盤上的第一個(gè)扇區(qū)說起,這個(gè)扇區(qū)中有硬盤主引導(dǎo)記錄(Master boot record, MBR)及分區(qū)表(partition table), 其中 MBR 占有 446 bytes,而分區(qū)表則占有 64 bytes。

計(jì)算機(jī)主板上有一段寫入到主板的程序BIOS,BIOS是開機(jī)之后計(jì)算機(jī)系統(tǒng)會(huì)主動(dòng)執(zhí)行的第一個(gè)程序。BIOS 會(huì)去分析計(jì)算機(jī)里面有哪些儲(chǔ)存設(shè)備,我們以硬盤為例,BIOS 會(huì)依據(jù)使用者的設(shè)定去取得能夠開機(jī)的硬盤, 并且到該硬盤里面去讀取第一個(gè)扇區(qū)的MBR位置。

MBR 這個(gè)僅有 446 bytes 的硬盤容量里面會(huì)放置最基本的引導(dǎo)加載程序(Boot loader),它的目的是加載操作系統(tǒng)內(nèi)核文件,由于引導(dǎo)加載程序是操作系統(tǒng)在安裝的時(shí)候所提供的,所以它會(huì)認(rèn)識(shí)硬盤內(nèi)的文件系統(tǒng)格式,因此就能夠讀取操作系統(tǒng)內(nèi)核文件。接下來就是內(nèi)核文件的工作,也就是大家所知道癿操作系統(tǒng)的任務(wù)了。

所以簡(jiǎn)單說開機(jī)流程就是:

BIOS:開機(jī)主動(dòng)運(yùn)行的程序,會(huì)識(shí)別第一個(gè)可開機(jī)的設(shè)備 MBR-引導(dǎo)加載程序:第一個(gè)可開機(jī)設(shè)備的第一個(gè)扇區(qū)內(nèi)的主引導(dǎo)分區(qū)中的引導(dǎo)加載程序,可讀取操作系統(tǒng)內(nèi)核文件操作系統(tǒng)內(nèi)核文件:不同的操作系統(tǒng)中關(guān)于開啟自己的程序

由上面的說明我們會(huì)知道,BIOS和MBR 都是硬件本身會(huì)支持的功能,到MBR中的Boot loader 則是操作系統(tǒng)寫在 MBR 上面的一段程序了。由于 MBR 僅有 446 bytes,因此這個(gè)引導(dǎo)加載程序是非常小而美的,它的主要任務(wù)有:

提供菜單:用戶可以選擇不同的開機(jī)項(xiàng)目,這也是多重引導(dǎo)的重要功能載入操作系統(tǒng)內(nèi)核:直接指向可開機(jī)的程序區(qū)段來啟動(dòng)操作系統(tǒng)轉(zhuǎn)交其他 loader:將引導(dǎo)加載功能轉(zhuǎn)交給其他 loader 負(fù)責(zé) 這點(diǎn)很有趣,表示你的計(jì)算機(jī)系統(tǒng)里面可能具有兩個(gè)以上的引導(dǎo)加載程序有可能嗎?我們的硬盤不是只有一個(gè) MBR 而已?是這樣,但是引導(dǎo)加載程序除了可以安 裝在 MBR 之外, 還可以安裝在每個(gè)分區(qū)的引導(dǎo)扇區(qū)(boot sector)內(nèi)分區(qū)的引導(dǎo)扇區(qū)這個(gè)特色造就了『多重引導(dǎo)』的功能(具體可以看鳥哥的書第三章第四節(jié)) 機(jī)械硬盤物理存儲(chǔ)結(jié)構(gòu)拓展閱讀 蔣致誠(chéng). 硬盤驅(qū)動(dòng)器巨磁電阻 (GMR) 磁頭: 從微米到納米[J]. 物理, 2004, 33(07): 0-0. 近年來電腦硬盤存儲(chǔ)密度的飛速增長(zhǎng)最關(guān)鍵的因素是自旋閥納米多層膜結(jié)構(gòu),即巨磁電阻(GMR)讀傳感器磁頭的應(yīng)用。巨磁電阻磁頭讀傳感器已經(jīng)實(shí)現(xiàn)由微電子器件向納米電子器件轉(zhuǎn)化,這一過程包含了自旋電子學(xué)、材料科學(xué)、微電子工程學(xué)、化學(xué)、微機(jī)械力學(xué)和工程學(xué)等諸學(xué)科和相關(guān)微加工技術(shù)綜合性挑戰(zhàn)極限。 磁盤工作原理揭秘大多數(shù)永久性或半永久性電腦數(shù)據(jù)都是將磁盤上的一小片金屬物質(zhì)磁化來實(shí)現(xiàn)。然后再將這些磁性圖可被轉(zhuǎn)換成原始數(shù)據(jù)。 機(jī)械硬盤內(nèi)部硬件結(jié)構(gòu)和工作原理詳解給扇區(qū)編號(hào)的最簡(jiǎn)單方法是l,2,3,4,5,6等順序編號(hào)。如果扇區(qū)按順序繞著磁道依次編號(hào),那么,控制器在處理一個(gè)扇區(qū)的數(shù)據(jù)期間,磁盤旋轉(zhuǎn)太遠(yuǎn),超過扇區(qū)間的間隔(這個(gè)間隔很?。刂破饕x出或?qū)懭氲南乱簧葏^(qū)已經(jīng)通過磁頭,也許是相當(dāng)大的一段距離。在這種情況下,磁盤控制器就只能等待磁盤再次旋轉(zhuǎn)幾乎一周,才能使得需要的扇區(qū)到達(dá)磁頭下面。這就很浪費(fèi)時(shí)間了。許多年前,IBM的一位杰出工程師想出了一個(gè)絕妙的辦法,即對(duì)扇區(qū)不使用順序編號(hào),而是使用一個(gè)交叉因子(interleave)進(jìn)行編號(hào)。 格式化的其他細(xì)節(jié) 每種操作系統(tǒng)能夠使用的文件系統(tǒng)并不相同。舉例來說,windows 98 以前的微 軟操作系統(tǒng)主要利用的文件系統(tǒng)是 FAT (或 FAT16),windows 2000 以后的版本有所謂的 NTFS 文件系統(tǒng),至于 Linux 的正統(tǒng)文件系統(tǒng)則為Ext2 (Linux second extended file system, ext2fs) 這一個(gè)。而且在默認(rèn)的情況下,windows 操作系統(tǒng)是不會(huì)認(rèn)識(shí) Linux的Ext2的。傳統(tǒng)的磁盤與文件系統(tǒng)的應(yīng)用中,一個(gè)分區(qū)只能夠被格式化成為一個(gè)文件系統(tǒng),所以我們可以說 一個(gè) 文件系統(tǒng) 就是一個(gè)分區(qū)。但是由于新技術(shù)的利用,例如我們常聽到的 LVM 與軟件磁盤陣列(software raid), 這些技術(shù)可以將一個(gè)分區(qū)格式化為多個(gè)文件系統(tǒng),也能夠?qū)⒍鄠€(gè)分區(qū)合成一個(gè)文件系統(tǒng),所以說,目前我們?cè)诟袷交瘯r(shí)已經(jīng)不再說成針對(duì)分區(qū)來格式化了, 通常我們可以稱呼一個(gè)可被掛載的數(shù)據(jù)為一個(gè)文件系統(tǒng)而不是一個(gè)分區(qū)。 inode/block 與文件大小的關(guān)系(有趣)

我們簡(jiǎn)單分析一下EXT2 的inode / block 與文件大小的關(guān)系。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ū)。這是啥?我們將inode 的結(jié)構(gòu)畫一下好了。

上圖最左邊為inode本身(128 bytes),里面有12個(gè)直接指向block號(hào)碼的對(duì)照,這12條記錄就能夠直接取得block號(hào)碼啦!至于所謂的間接就是再拿一個(gè)block來當(dāng)作記錄block號(hào)碼的記錄區(qū),如果文件太大時(shí),就會(huì)使用間接的block來記錄號(hào)碼。如上圖中間接只是拿一個(gè)block來記錄額外的號(hào)碼而已。同理,如果文件持續(xù)長(zhǎng)大,那么就會(huì)利用所謂的雙間接,第一個(gè)block僅再指出下一個(gè)記錄號(hào)碼的block在哪里,實(shí)際記錄的在第二個(gè)block當(dāng)中。依此類推,三間接就是利用第三層block來記錄號(hào)碼啦!
這樣子inode 能夠指定多少個(gè)block 呢?我們以較小的1K block 來說明好了,可以指定的情況如下:

12個(gè)直接指向: 12*1K=12K 由于是直接指向,所以總共可記錄12筆記錄,因此總額大小為如上所示 間接: 256*1K=256K 每筆block號(hào)碼的記錄會(huì)花去4bytes,因此1K的大小能夠記錄256筆記錄,因此一個(gè)間接可以記錄的文件大小如上; 雙間接: 2562561K=256 2 K 第一層block會(huì)指定256個(gè)第二層,每個(gè)第二層可以指定256個(gè)號(hào)碼,因此總額大小如上; 三間接: 256256256*1K=256 3 K 第一層block會(huì)指定256個(gè)第二層,每個(gè)第二層可以指定256個(gè)第三層,每個(gè)第三層可以指定256個(gè)號(hào)碼,因此總額大小如上; 總額:將直接、間接、雙間接、三間接加總,得到12 + 256 + 256256 + 256256*256 (K) = 16GB 此時(shí)我們知道當(dāng)文件系統(tǒng)將block格式化為1K大小時(shí),能夠容納的最大文件為16GB,比較一下文件系統(tǒng)限制表的結(jié)果可發(fā)現(xiàn)是一致的!但這個(gè)方法不能用在2K及4K block大小的計(jì)算中,因?yàn)榇笥?K的block將會(huì)受到Ext2文件系統(tǒng)本身的限制,所以計(jì)算的結(jié)果會(huì)不太符合 文件系統(tǒng)大小與磁盤讀取性能

關(guān)于文件系統(tǒng)的使用效率,當(dāng)你的一個(gè)文件系統(tǒng)規(guī)劃的很大時(shí),例如100GB這么大時(shí),由于磁盤上的資料總是來來去去的,所以,整個(gè)文件系統(tǒng)上面的文件通常無法連續(xù)寫在一起(block號(hào)碼不連續(xù)),而是填入式的將資料填入沒有被使用的block當(dāng)中。如果文件寫入的block真的分的很散,此時(shí)就會(huì)有所謂的文件資料離散的問題發(fā)生了。
如前所述,雖然我們的ext2 在inode 處已經(jīng)將該文件所記錄的block 號(hào)碼都記上了, 所以資料可以一次性讀取,但是如果文件真的太過離散,確實(shí)還是會(huì)發(fā)生讀取效率低的問題。因?yàn)榇疟P讀取頭還是得要在整個(gè)文件系統(tǒng)中來來去去的頻繁讀??!果真如此,那么可以將整個(gè)文件系統(tǒng)內(nèi)的資料全部復(fù)制出來,將該文件系統(tǒng)重新格式化, 再將資料給他復(fù)制回去即可解決這個(gè)問題。

此外,如果文件系統(tǒng)真的太大了,那么當(dāng)一個(gè)文件分別記錄在這個(gè)文件系統(tǒng)的最前面與最后面的block 號(hào)碼中, 此時(shí)會(huì)造成磁碟的機(jī)械手臂移動(dòng)幅度過大(不是還會(huì)分塊嗎?),也會(huì)造成資料讀取效能的低落。而且讀取頭在搜尋整個(gè)文件系統(tǒng)時(shí), 也會(huì)花費(fèi)比較多的時(shí)間去搜尋。因此分區(qū)的規(guī)劃并不是越大越好, 而是真的要針對(duì)你的主機(jī)用途來進(jìn)行規(guī)劃才行。

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ì)變得簡(jiǎn)單而有序。“文件”作為一個(gè)抽象概念,其原子操作非常簡(jiǎn)單,只有讀和寫,這無疑是一個(gè)非常好的模型。通過這個(gè)模型,API的設(shè)計(jì)可以化繁為簡(jiǎ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)為磁盤上的文本與圖像、鼠標(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)的目錄樹。

相關(guān)文章

  • 在CentOS 7.2下安裝Mono 5.0的方法教程

    在CentOS 7.2下安裝Mono 5.0的方法教程

    這篇文章主要給大家分享了在CentOS 7.2下安裝Mono 5.0的方法教程,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)安裝Mono具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • 阿里云Centos7安裝LNMP+wordpress

    阿里云Centos7安裝LNMP+wordpress

    這篇文章主要介紹了阿里云Centos7安裝LNMP+wordpress的方法和步奏,十分的簡(jiǎn)潔明了,推薦給大家,有需要的小伙伴可以參考下
    2016-04-04
  • Win10 安裝Linux ubuntu-18.04雙系統(tǒng)(安裝指南)

    Win10 安裝Linux ubuntu-18.04雙系統(tǒng)(安裝指南)

    這篇文章主要介紹了Win10+Linux ubuntu-18.04雙系統(tǒng)安裝教程,本文分步驟給大家記錄下來,需要的朋友可以參考下
    2019-10-10
  • Linux bzip2 命令的使用

    Linux bzip2 命令的使用

    這篇文章主要介紹了Linux bzip2 命令的使用,幫助大家更好的理解和使用Linux系統(tǒng),感興趣的朋友可以了解下
    2020-08-08
  • Linux編輯啟動(dòng)、停止與重啟springboot jar包腳本實(shí)例

    Linux編輯啟動(dòng)、停止與重啟springboot jar包腳本實(shí)例

    這篇文章主要給大家介紹了關(guān)于Linux編輯啟動(dòng)、停止與重啟springboot jar包腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Linux中 find查找命令用法詳解

    Linux中 find查找命令用法詳解

    本篇文章主要介紹了Linux中 find查找命令詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Apache中的Order Allow,Deny用法詳解

    Apache中的Order Allow,Deny用法詳解

    這篇文章主要介紹了Apache中的Order Allow,Deny用法,結(jié)合實(shí)例較為詳細(xì)的分析了Apache中Order Allow,Deny的具體作用及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-12-12
  • 如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法

    如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法

    這篇文章主要介紹了如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Linux系統(tǒng)創(chuàng)建TCP連接流程介紹

    Linux系統(tǒng)創(chuàng)建TCP連接流程介紹

    大家好,本篇文章主要講的是Linux系統(tǒng)創(chuàng)建TCP連接流程,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下哦,方便下次瀏覽
    2021-12-12
  • linux 磁盤轉(zhuǎn)移空間的方法

    linux 磁盤轉(zhuǎn)移空間的方法

    本篇文章主要介紹了linux 磁盤轉(zhuǎn)移空間的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12

最新評(píng)論