Linux中文件系統(tǒng)的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下Linux中文件系統(tǒng)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、潼關(guān)網(wǎng)絡(luò)推廣、小程序制作、潼關(guān)網(wǎng)絡(luò)營銷、潼關(guān)企業(yè)策劃、潼關(guān)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供潼關(guān)建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

Linux上的文件系統(tǒng)一般來說就是EXT2或EXT3,但這篇文章并不準備一上來就直接講它們,而希望結(jié)合Linux操作系統(tǒng)并從文件系統(tǒng)建立的基礎(chǔ)——硬盤開始,一步步認識Linux的文件系統(tǒng)。

1.機械硬盤的物理存儲機制

現(xiàn)代計算機大部分文件存儲功能都是由機械硬盤這種設(shè)備提供的。(現(xiàn)在的SSD和閃存從概念和邏輯上都部分繼承自機械硬盤,所以使用機械硬盤來進行理解也是沒有問題的)

機械硬盤能實現(xiàn)信息存儲的功能基于:磁性存儲介質(zhì)能夠被磁化,且磁化后會長久保留被磁化的狀態(tài),這種被磁化狀態(tài)能夠被讀取出來,同時這種磁化狀態(tài)還能夠不斷被修改,磁化正好有兩個方向,所以可以表示0和1。
于是硬盤就是把這種磁性存儲介質(zhì)做成一個個盤片,每一個盤片上都分布著數(shù)量巨大的磁性存儲單位,使用磁性讀寫頭對盤片進行寫入和讀?。◤脑砩项愃坪谀z唱片的播放)。

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

一個硬盤有多張盤片疊成,不同盤片有編號每張盤片上的存儲顆粒成環(huán)形一圈圈地排布,每一圈稱為磁道,有編號每條磁道上都有一圈存儲顆粒,每512*8(512字節(jié),0.5KB)個存儲顆粒作為一個扇區(qū),扇區(qū)是硬盤上存儲的最小物理單位 N個扇區(qū)可以組成簇,N取決于不同的文件系統(tǒng)或是文件系統(tǒng)的配置,簇是此文件系統(tǒng)中的最小存儲單位所有盤面上的同一磁道構(gòu)成一個圓柱,稱為柱面,柱面是系統(tǒng)分區(qū)的最小單位

Linux中文件系統(tǒng)的示例分析

磁頭讀寫文件的時候,首先是分區(qū)讀寫的,由inode編號(區(qū)內(nèi)唯一的編號后面介紹)找到對應(yīng)的磁道和扇區(qū),然后一個柱面一個柱面地進行讀寫。機械硬盤的讀寫控制系統(tǒng)是一個令人嘆為觀止的精密工程(一個盤面上有幾億個存儲單位,每個磁道寬度不到幾十納米,磁盤每分鐘上萬轉(zhuǎn)),同時關(guān)于讀寫的邏輯也是有諸多細節(jié)(比如扇區(qū)的編號并不是連續(xù)的),非常有意思,可以自行搜索文章拓展閱讀。

有了硬盤并不意味著LInux可以立刻把它用來存儲,還需要組合進Linux的文件體系才能被Linux使用。

2.Linux文件體系

Linux以文件的形式對計算機中的數(shù)據(jù)和硬件資源進行管理,也就是徹底的一切皆文件,反映在Linux的文件類型上就是:普通文件、目錄文件(也就是文件夾)、設(shè)備文件、鏈接文件、管道文件、套接字文件(數(shù)據(jù)通信的接口)等等。而這些種類繁多的文件被Linux使用目錄樹進行管理, 所謂的目錄樹就是以根目錄(/)為主,向下呈現(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)的東西用文件這個載體實現(xiàn):文件系統(tǒng)掛載在操作系統(tǒng)上,操作系統(tǒng)整個系統(tǒng)又放在文件系統(tǒng)里。但本文中文件體系的相關(guān)內(nèi)容不是很多,大部分地方都可以用文件系統(tǒng)代替文件體系。

Linux中的文件類型

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

普通文件(-) 從Linux的角度來說,類似mp4、pdf、html這樣應(yīng)用層面上的文件類型都屬于普通文件 Linux用戶可以根據(jù)訪問權(quán)限對普通文件進行查看、更改和刪除 目錄文件(d,directory file) 目錄文件對于用慣Windows的用戶來說不太容易理解,目錄也是文件的一種目錄文件包含了各自目錄下的文件名和指向這些文件的指針,打開目錄事實上就是打開目錄文件,只要有訪問權(quán)限,你就可以隨意訪問這些目錄下的文件(普通文件的執(zhí)行權(quán)限就是目錄文件的訪問權(quán)限),但是只有內(nèi)核的進程能夠修改它們雖然不能修改,但是我們能夠通過vim去查看目錄文件的內(nèi)容 符號鏈接(l,symbolic link) 這種類型的文件類似Windows中的快捷方式,是指向另一個文件的間接指針,也就是我們常說的軟鏈接 塊設(shè)備文件(b,block)和字符設(shè)備文件(c,char) 這些文件一般隱藏在/dev目錄下,在進行設(shè)備讀取和外設(shè)交互時會被使用到比如磁盤光驅(qū)就是塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件系統(tǒng)中的所有設(shè)備要么是塊設(shè)備文件,要么是字符設(shè)備文件,無一例外 FIFO(p,pipe) 管道文件主要用于進程間通訊。比如使用mkfifo命令可以創(chuàng)建一個FIFO文件,啟用一個進程A從FIFO文件里讀數(shù)據(jù),啟動進程B往FIFO里寫數(shù)據(jù),先進先出,隨寫隨讀。 套接字(s,socket) 用于進程間的網(wǎng)絡(luò)通信,也可以用于本機之間的非網(wǎng)絡(luò)通信這些文件一般隱藏在/var/run目錄下,證明著相關(guān)進程的存在

Linux 的文件是沒有所謂的擴展名的,一個 Linux文件能不能被執(zhí)行與它是否可執(zhí)行的屬性有關(guān),只要你的權(quán)限中有 x ,比如[ -rwx-r-xr-x ] 就代表這個文件可以被執(zhí)行,與文件名沒有關(guān)系。跟在 Windows下能被執(zhí)行的文件擴展名通常是 .com .exe .bat 等不同。

不過,可以被執(zhí)行跟可以執(zhí)行成功不一樣。比如在 root 主目彔下的 install.log 是一個文本文件,修改權(quán)限成為 -rwxrwxrwx 后這個文件能夠真的執(zhí)行成功嗎? 當然不行,因為它的內(nèi)容根本就沒有可以執(zhí)行的數(shù)據(jù)。所以說,這個 x 代表這個文件具有可執(zhí)行的能力, 但是能不能執(zhí)行成功,當然就得要看該文件的內(nèi)容了。

雖然如此,不過我們?nèi)匀幌M軓臄U展名來了解該文件是什么東西,所以一般我們還是會以適當?shù)臄U展名來表示該文件是什么種類的。

所以Linux 系統(tǒng)上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執(zhí)行與否仍然需要權(quán)限的規(guī)范才行。比如常見的/bin/ls 這個顯示文件屬性的指令要是權(quán)限被修改為無法執(zhí)行,那么ls 就變成不能執(zhí)行了。這種問題最常發(fā)生在文件傳送的過程中。例如你在網(wǎng)絡(luò)上下載一個可執(zhí)行文件,但是偏偏在你的 Linux 系統(tǒng)中就是無法執(zhí)行,那就可能是檔案的屬性被改變了。而且從網(wǎng)絡(luò)上傳送到你 的 Linux 系統(tǒng)中,文件的屬性權(quán)限確實是會被改變的

Linux目錄樹

對Linux系統(tǒng)和用戶來說,所有可操作的計算機資源都存在于目錄樹這個邏輯結(jié)構(gòu)中,對計算機資源的訪問都可以認為是目錄樹的訪問。就硬盤來說,所有對硬盤的訪問都變成了對目錄樹中某個節(jié)點也就是文件夾的訪問,訪問時不需要知道它是硬盤還是硬盤中的文件夾。
目錄樹的邏輯結(jié)構(gòu)也非常簡單,就是從根目錄(/)開始,不斷向下展開各級子目錄。

3.硬盤分區(qū)

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

所以分本身并不是必須的,你完全可以把一整塊硬盤作為一個區(qū)。但從數(shù)據(jù)的安全性以及系統(tǒng)性能角度來看,分區(qū)還是有很多用處的,所以一般都會對硬盤進行分區(qū)。

講分區(qū)就不得不先提每塊硬盤上最重要的第一扇區(qū),這個扇區(qū)中有硬盤主引導(dǎo)記錄(Master boot record, MBR) 及分區(qū)表(partition table), 其中 MBR 占有 446 bytes,而分區(qū)表占有 64 bytes。硬盤主引導(dǎo)記錄放有最基本的引導(dǎo)加載程序,是系統(tǒng)開機啟動的關(guān)鍵環(huán)節(jié),在附錄中有更詳細的說明。而分區(qū)表則跟分區(qū)有關(guān),它記錄了硬盤分區(qū)的相關(guān)信息,但因分區(qū)表僅有 64bytes , 所以最多只能記彔四塊分區(qū)(分區(qū)本身其實就是對分區(qū)表進行設(shè)置)。

只能分四個區(qū)實在太少了,于是就有了擴展分區(qū)的概念,既然第一個扇區(qū)所在的分區(qū)表只能記錄四條數(shù)據(jù), 那我可否利用額外的扇區(qū)來記錄更多的分區(qū)信息。

把普通可以訪問的分區(qū)稱為主分區(qū),擴展分區(qū)不同于主分區(qū),它本身并沒有內(nèi)容,它是為進一步邏輯分區(qū)提供空間的。在某塊分區(qū)指定為擴展分區(qū)后,就可以對這塊擴展分區(qū)進一步分成多個邏輯分區(qū)。操作系統(tǒng)規(guī)定:

四塊分區(qū)每塊都可以是主分區(qū)或擴展分區(qū)擴展分區(qū)最多只能有一個(也沒必要有多個)擴展分區(qū)可以進一步分割為多個邏輯分區(qū)擴展分區(qū)只是邏輯概念,本身不能被訪問,也就是不能被格式化后作為數(shù)據(jù)訪問的分區(qū),能夠作為數(shù)據(jù)訪問的分區(qū)只有主分區(qū)和邏輯分區(qū)邏輯分區(qū)的數(shù)量依操作系統(tǒng)而不同,在 Linux 系統(tǒng)中,IDE 硬盤最多有 59 個邏輯分區(qū)(5 號到 63 號), SATA 硬盤則有 11 個邏輯分區(qū)(5 號到 15 號)

一般給硬盤進行分區(qū)時,一個主分區(qū)一個擴展分區(qū),然后把擴展分區(qū)劃分為N個邏輯分區(qū)是最好的

是否可以不要主分區(qū)呢?不知道,但好像不用管,你創(chuàng)建分區(qū)的時候會自動給你配置類型特殊的,你最好單獨分一個swap區(qū)(內(nèi)存置換空間),它獨為一類,功能是:當有數(shù)據(jù)被存放在物理內(nèi)存里面,但是這些數(shù)據(jù)又不是常被 CPU 所取用時,那么這些不常被使用的程序?qū)粊G到硬盤的 swap 置換空間當中, 而將速度較快的物理內(nèi)存空間釋放出來給真正需要的程序使用

4.格式化

我們知道Linux操作系統(tǒng)支持很多不同的文件系統(tǒng),比如ext2、ext3、XFS、FAT等等,而Linux把對不同文件系統(tǒng)的訪問交給了VFS(虛擬文件系統(tǒng)),VFS能訪問和管理各種不同的文件系統(tǒng)。所以有了區(qū)之后就需要把它格式化成具體的文件系統(tǒng)以便VFS訪問。

標準的Linux文件系統(tǒng)Ext2是使用「基于inode的文件系統(tǒng)」

我們知道一般操作系統(tǒng)的文件數(shù)據(jù)除了文件實際內(nèi)容外, 還帶有很多屬性,例如 Linux 操作系統(tǒng)的文件權(quán)限(rwx)與文件屬性(擁有者、群組、 時間參數(shù)等),文件系統(tǒng)通常會將屬性和實際內(nèi)容這兩部分數(shù)據(jù)分別存放在不同的區(qū)塊在基于inode的文件系統(tǒng)中,權(quán)限與屬性放置到 inode 中,實際數(shù)據(jù)放到 data block 區(qū)塊中,而且inode和data block都有編號

Ext2 文件系統(tǒng)在此基礎(chǔ)上

文件系統(tǒng)最前面有一個啟動扇區(qū)(boot sector) 這個啟動扇區(qū)可以安裝開機管理程序, 這個設(shè)計讓我們能將不同的引導(dǎo)裝載程序安裝到個別的文件系統(tǒng)前端,而不用覆蓋整個硬盤唯一的MBR, 也就是這樣才能實現(xiàn)多重引導(dǎo)的功能 把每個區(qū)進一步分為多個塊組 (block group),每個塊組有獨立的inode/block體系 如果文件系統(tǒng)高達數(shù)百 GB 時,把所有的 inode 和block 通通放在一起會因為 inode 和 block的數(shù)量太龐大,不容易管理這其實很好理解,因為分區(qū)是用戶的分區(qū),實際計算機管理時還有個最適合的大小,于是計算機會進一步的在分區(qū)中分塊(但這樣豈不是可能出現(xiàn)大文件放不了的問題?有什么機制善后嗎?) 每個塊組實際還會分為分為6個部分,除了inode table 和 data block外還有4個附屬模塊,起到優(yōu)化和完善系統(tǒng)性能的作用

所以整個分區(qū)大概會這樣劃分:

Linux中文件系統(tǒng)的示例分析

inode table 主要記錄文件的屬性以及該文件實際數(shù)據(jù)是放置在哪些block中,它記錄的信息至少有這些: 大小、真正內(nèi)容的block號碼(一個或多個)訪問模式(read/write/excute) 擁有者與群組(owner/group) 各種時間:建立或狀態(tài)改變的時間、最近一次的讀取時間、最近修改的時間沒有文件名!文件名在目錄的block中! 一個文件占用一個 inode,每個inode有編號 Linux 系統(tǒng)存在 inode 號被用完但磁盤空間還有剩余的情況注意,這里的文件不單單是普通文件,目錄文件也就是文件夾其實也是一個文件,還有其他的也是 inode 的數(shù)量與大小在格式化時就已經(jīng)固定了,每個inode 大小均固定為128 bytes (新的ext4 與xfs 可設(shè)定到256 bytes) 文件系統(tǒng)能夠建立的文件數(shù)量與inode 的數(shù)量有關(guān),存在空間還夠但inode不夠的情況系統(tǒng)讀取文件時需要先找到inode,并分析inode 所記錄的權(quán)限與使用者是否符合,若符合才能夠開始實際讀取 block 的內(nèi)容 inode 要記錄的資料非常多,但偏偏又只有128bytes , 而inode 記錄一個block 號碼要花掉4byte ,假設(shè)我一個文件有400MB 且每個block 為4K 時, 那么至少也要十萬條block 號碼的記錄!inode 哪有這么多空間來存儲?為此我們的系統(tǒng)很聰明的將inode 記錄block 號碼的區(qū)域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區(qū)(詳細見附錄) data block 放置文件內(nèi)容數(shù)據(jù)的地方在格式化時block的大小就固定了,且每個block都有編號,以方便inode的記錄 原則上,block 的大小與數(shù)量在格式化完就不能夠再改變了(除非重新格式化) 在Ext2文件系統(tǒng)中所支持的block大小有1K, 2K及4K三種,由于block大小的區(qū)別,會導(dǎo)致該文件系統(tǒng)能夠支持的大磁盤容量與大單一文件容量各不相同: Block 大小 1KB 2KB 4KB 大單一檔案限制 16GB 256GB 2TB 大檔案系統(tǒng)總?cè)萘?2TB 8TB 16TB 每個block 內(nèi)最多只能夠放置一個文件的資料,但一個文件可以放在多個block中(大的話)若文件小于block ,則該block 的剩余容量就不能夠再被使用了(磁盤空間會浪費) 所以如果你的檔案都非常小,但是你的block 在格式化時卻選用大的4K 時,可能會產(chǎn)生容量的浪費既然大的block 可能會產(chǎn)生較嚴重的磁碟容量浪費,那么我們是否就將block 大小定為1K ?這也不妥,因為如果block 較小的話,那么大型檔案將會占用數(shù)量更多的block ,而inode 也要記錄更多的block 號碼,此時將可能導(dǎo)致檔案系統(tǒng)不良的讀寫效能事實上現(xiàn)在的磁盤容量都太大了,所以一般都會選擇4K 的block 大小 superblock 記錄整個文件系統(tǒng)相關(guān)信息的地方,一般大小為1024bytes,記錄的信息主要有: block 與inode 的總量未使用與已使用的inode / block 數(shù)量一個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 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟(fsck) 的時間 Superblock是非常重要的, 沒有Superblock ,就沒有這個文件系統(tǒng)了,因此如果superblock死掉了,你的文件系統(tǒng)可能就需要花費很多時間去挽救每個塊都可能含有superblock,但是我們也說一個文件系統(tǒng)應(yīng)該僅有一個superblock 而已,那是怎么回事?事實上除了第一個塊內(nèi)會含有superblock 之外,后續(xù)的塊不一定含有superblock,而若含有superblock則該superblock主要是做為第一個塊內(nèi)superblock的備份,這樣可以進行superblock的救援 Filesystem Description 文件系統(tǒng)描述這個區(qū)段可以描述每個block group的開始與結(jié)束的block號碼,以及說明每個區(qū)段(superblock, bitmap, inodemap, data block)分別介于哪一個block號碼之間 block bitmap 塊對照表如果你想要新增文件時要使用哪個block 來記錄呢?當然是選擇「空的block」來記錄。那你怎么知道哪個block 是空的?這就得要通過block bitmap了,它會記錄哪些block是空的,因此我們的系統(tǒng)就能夠很快速的找到可使用的空間來記錄同樣在你刪除某些文件時,那些文件原本占用的block號碼就得要釋放出來, 此時在block bitmap 中對應(yīng)該block號碼的標志位就得要修改成為「未使用中」 inode bitmap 與block bitmap 是類似的功能,只是block bitmap 記錄的是使用與未使用的block 號碼, 至于inode bitmap 則是記錄使用與未使用的inode 號碼

5.掛載

在一個區(qū)被格式化為一個文件系統(tǒng)之后,它就可以被Linux操作系統(tǒng)使用了,只是這個時候Linux操作系統(tǒng)還找不到它,所以我們還需要把這個文件系統(tǒng)「注冊」進Linux操作系統(tǒng)的文件體系里,這個操作就叫「掛載」 (mount)。

掛載是利用一個目錄當成進入點(類似選一個現(xiàn)成的目錄作為代理),將文件系統(tǒng)放置在該目錄下,也就是說,進入該目錄就可以讀取該文件系統(tǒng)的內(nèi)容,類似整個文件系統(tǒng)只是目錄樹的一個文件夾(目錄)。

這個進入點的目錄我們稱為「掛載點」。

由于整個 Linux 系統(tǒng)最重要的是根目錄,因此根目錄一定需要掛載到某個分區(qū)。 而其他的目錄則可依用戶自己的需求來給予掛載到不同的分去。

到這里Linux的文件體系的構(gòu)建過程其實已經(jīng)大體講完了,總結(jié)一下就是:硬盤經(jīng)過分區(qū)和格式化,每個區(qū)都成為了一個文件系統(tǒng),掛載這個文件系統(tǒng)后就可以讓Linux操作系統(tǒng)通過VFS訪問硬盤時跟訪問一個普通文件夾一樣。這里通過一個在目錄樹中讀取文件的實際例子來細講一下目錄文件和普通文件。

6.目錄樹的讀取過程

首先我們要知道

每個文件(不管是一般文件還是目錄文件)都會占用一個inode 依據(jù)文件內(nèi)容的大小來分配一個或多個block給該文件使用創(chuàng)建一個文件后,文件完整信息分布在3處地方,生成2個新文件: 文件名記錄在該文件所在目錄的目錄文件的block中,沒有新文件生成文件屬性、權(quán)限信息、記錄具體內(nèi)容的block編號記錄在inode中,inode是新生成文件文件具體內(nèi)存記錄在block中,block是新生成文件 因為文件名的記錄是在目錄的block當中,「新增/刪除/更名文件名」與目錄的w權(quán)限有關(guān)

所以在Linux/Unix中,文件名稱只是文件的一個屬性,叫別名也好,叫綽號也罷,僅為了方便用戶記憶和使用,但系統(tǒng)內(nèi)部并不需要用文件名來定為文件位置,這樣處理最直觀的好處就是,你可以對正在使用的文件改名,換目錄,甚至放到廢紙簍,都不會影響當前文件的使用,這在Windows里是無法想象的。比如你打開個Word文件,然后對其進行重命名操作,Windows會告訴你門兒都沒有,關(guān)閉文件先!但在Mac里就毫無壓力,因為Mac的操作系統(tǒng)同樣采用了inode的設(shè)計。

創(chuàng)建文件過程

當在ext2下建立一個一般文件時, ext2 會分配一個inode 與相對于該文件大小的block 數(shù)量給該文件

例如:假設(shè)我的一個block 為4 Kbytes ,而我要建立一個100 KBytes 的文件,那么linux 將分配一個inode 與25 個block 來儲存該文件但同時請注意,由于inode 僅有12 個直接指向,因此還要多一個block 來作為區(qū)塊號碼的記錄 創(chuàng)建目錄過程

當在ext2文件系統(tǒng)建立一個目錄時(就是新建了一個目錄文件),文件系統(tǒng)會分配一個inode與至少一塊block給該目錄

inode記錄該目錄的相關(guān)權(quán)限與屬性,并記錄分配到的那塊block號碼而block則是記錄在這個目錄下的文件名與該文件對應(yīng)的inode號 block中還會自動生成兩條記錄,一條是.文件夾記錄,inode指向自身,另一條是..文件夾記錄,inode指向父文件夾 從目錄樹中讀取某個文件過程 因為文件名是記錄在目錄的block當中,因此當我們要讀取某個文件時,就一定會經(jīng)過目錄的inode與block ,然后才能夠找到那個待讀取文件的inode號碼,最終才會讀到正確的文件的block內(nèi)的資料。由于目錄樹是由根目錄開始,因此操作系統(tǒng)先通過掛載信息找到掛載點的inode號,由此得到根目錄的inode內(nèi)容,并依據(jù)該inode讀取根目錄的block信息,再一層一層的往下讀到正確的文件。

舉例來說,如果我想要讀取/etc/passwd 這個文件時,系統(tǒng)是如何讀取的呢?
先看一下這個文件以及有關(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: 通過掛載點的信息找到inode號碼為128的根目錄inode,且inode規(guī)定的權(quán)限讓我們可以讀取該block的內(nèi)容(有r與x) /的block: 經(jīng)過上個步驟取得block的號碼,并找到該內(nèi)容有etc/目錄的inode號碼(33595521) etc/的inode: 讀取33595521號inode得知具有r與x的權(quán)限,因此可以讀取etc/的block內(nèi)容 etc/的block: 經(jīng)過上個步驟取得block號碼,并找到該內(nèi)容有passwd文件的inode號碼(36628004) passwd的inode: 讀取36628004號inode得知具有r的權(quán)限,因此可以讀取passwd的block內(nèi)容 passwd的block: 最后將該block內(nèi)容的資料讀出來

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

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

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

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

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

所以簡單說開機流程就是:

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

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

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

我們簡單分析一下EXT2 的inode / block 與文件大小的關(guān)系。inode 要記錄的資料非常多,但偏偏又只有128bytes , 而inode 記錄一個block 號碼要花掉4byte ,假設(shè)我一個文件有400MB 且每個block 為4K 時, 那么至少也要十萬條block 號碼的記錄!inode 哪有這么多空間來存儲?為此我們的系統(tǒng)很聰明的將inode 記錄block 號碼的區(qū)域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區(qū)。這是啥?我們將inode 的結(jié)構(gòu)畫一下好了。

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

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

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

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

Linux的一切皆文件

Linux 中的各種事物比如像文檔、目錄(Mac OS X 和 Windows 系統(tǒng)下稱之為文件夾)、鍵盤、監(jiān)視器、硬盤、可移動媒體設(shè)備、打印機、調(diào)制解調(diào)器、虛擬終端,還有進程間通信(IPC)和網(wǎng)絡(luò)通信等輸入/輸出資源都是定義在文件系統(tǒng)空間下的字節(jié)流。

一切都可看作是文件,其最顯著的好處是對于上面所列出的輸入/輸出資源,只需要相同的一套 Linux 工具、實用程序和 API。你可以使用同一套api(read, write)和工具(cat , 重定向, 管道)來處理unix中大多數(shù)的資源.

設(shè)計一個系統(tǒng)的終極目標往往就是要找到原子操作,一旦鎖定了原子操作,設(shè)計工作就會變得簡單而有序?!拔募弊鳛橐粋€抽象概念,其原子操作非常簡單,只有讀和寫,這無疑是一個非常好的模型。通過這個模型,API的設(shè)計可以化繁為簡,用戶可以使用通用的方式去訪問任何資源,自有相應(yīng)的中間件做好對底層的適配。

現(xiàn)代操作系統(tǒng)為解決信息能獨立于進程之外被長期存儲引入了文件,文件作為進程創(chuàng)建信息的邏輯單元可被多個進程并發(fā)使用。在 UNIX 系統(tǒng)中,操作系統(tǒng)為磁盤上的文本與圖像、鼠標與鍵盤等輸入設(shè)備及網(wǎng)絡(luò)交互等 I/O 操作設(shè)計了一組通用 API,使他們被處理時均可統(tǒng)一使用字節(jié)流方式。換言之,UNIX 系統(tǒng)中除進程之外的一切皆是文件,而 Linux 保持了這一特性。為了便于文件的管理,Linux 還引入了目錄(有時亦被稱為文件夾)這一概念。目錄使文件可被分類管理,且目錄的引入使 Linux 的文件系統(tǒng)形成一個層級結(jié)構(gòu)的目錄樹。

以上是“Linux中文件系統(tǒng)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當前名稱:Linux中文件系統(tǒng)的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://muchs.cn/article20/deisjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站改版網(wǎng)頁設(shè)計公司、標簽優(yōu)化ChatGPT、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司