小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

磁盤、分區(qū)及Linux文件系統(tǒng) [Disk, Partition, Linux File Syste...

 梅與牛 2021-02-17

1、磁盤基礎(chǔ)知識(shí) 

1.1 物理結(jié)構(gòu)

硬盤的物理結(jié)構(gòu)一般由磁頭與碟片、電動(dòng)機(jī)、主控芯片與排線等部件組成;當(dāng)主電動(dòng)機(jī)帶動(dòng)碟片旋轉(zhuǎn)時(shí),副電動(dòng)機(jī)帶動(dòng)一組(磁頭)到相對應(yīng)的碟片上并確定讀取正面還是反面的碟面,磁頭懸浮在碟面上畫出一個(gè)與碟片同心的圓形軌道(磁軌或稱柱面),這時(shí)由磁頭的磁感線圈感應(yīng)碟面上的磁性與使用硬盤廠商指定的讀取時(shí)間或數(shù)據(jù)間隔定位扇區(qū),從而得到該扇區(qū)的數(shù)據(jù)內(nèi)容。所有的盤片都固定在一個(gè)旋轉(zhuǎn)軸上,這個(gè)軸即盤片主軸。而所有盤片之間是絕對平行的,在每個(gè)盤片的存儲(chǔ)面上都有一個(gè)磁頭,磁頭與盤片之間的距離比頭發(fā) 絲的直徑還小。所有的磁頭連在一個(gè)磁頭控制器上,由磁頭控制器負(fù)責(zé)各個(gè)磁頭的運(yùn)動(dòng)。磁頭可沿盤片的半徑方向動(dòng)作,而盤片以每分鐘數(shù)千轉(zhuǎn)到上萬轉(zhuǎn)的速度在高 速旋轉(zhuǎn),這樣磁頭就能對盤片上的指定位置進(jìn)行數(shù)據(jù)的讀寫操作。
  •  磁道(Track)
當(dāng)磁盤旋轉(zhuǎn)時(shí),磁頭若保持在一個(gè)位置上,則每個(gè)磁頭都會(huì)在磁盤表面劃出一個(gè)圓形軌跡,這些圓形軌跡就叫做磁道(Track)。信息以脈沖串的形式記錄在這些軌跡中,這些同心圓不是連續(xù)記錄數(shù)據(jù),而是被劃分成一段段的圓弧(扇區(qū)),這些圓弧 的角速度一樣。
  • 柱面 (Cylinder)
在有多個(gè)盤片構(gòu)成的盤組中,由不同盤片的面,但處于同一半徑圓的多個(gè)磁道組成的一個(gè)圓柱面(Cylinder)。所有盤面上的同一磁道構(gòu)成一個(gè)圓柱,通常稱做柱面(Cylinder),每個(gè)圓柱上的磁頭由上而下從“0”開始編號。數(shù)據(jù)的讀/寫按柱面進(jìn)行,即磁 頭讀/寫數(shù)據(jù)時(shí)首先在同一柱面內(nèi)從“0”磁頭開始進(jìn)行操作,依次向下在同一柱面的不同盤面即磁頭上進(jìn)行操作,只在同一柱面所有的磁頭全部讀/寫完畢后磁頭 才轉(zhuǎn)移到下一柱面,因?yàn)檫x取磁頭只需通過電子切換即可,而選取柱面則必須通過機(jī)械切換。電子切換相當(dāng)快,比在機(jī)械上磁頭向鄰近磁道移動(dòng)快得多,所以,數(shù)據(jù) 的讀/寫按柱面進(jìn)行,而不按盤面進(jìn)行。也就是說,一個(gè)磁道寫滿數(shù)據(jù)后,就在同一柱面的下一個(gè)盤面來寫,一個(gè)柱面寫滿后,才移到下一個(gè)扇區(qū)開始寫數(shù)據(jù)。讀數(shù) 據(jù)也按照這種方式進(jìn)行,這樣就提高了硬盤的讀/寫效率。
  • 扇區(qū)(Sector)
磁盤上的每個(gè)磁道被等分為若干個(gè)弧段,這些弧段便是硬盤的扇區(qū)(Sector)。硬盤的第一個(gè)扇區(qū),叫做引導(dǎo)扇區(qū)。操作系統(tǒng)以扇區(qū)(Sector)形式將信息存儲(chǔ)在硬盤上,每個(gè)扇區(qū)包括512個(gè)字節(jié)的數(shù)據(jù)和一些其他信息。
  • 磁頭(Head)
在硬盤系 統(tǒng)中,硬盤的每一個(gè)盤片都有兩個(gè)盤面(Side),即上、下盤面,一般每個(gè)盤面都會(huì)利 用,都可以存儲(chǔ)數(shù)據(jù)。盤面號又叫磁頭號,因?yàn)槊恳粋€(gè)有效盤面都有一個(gè)對應(yīng)的讀寫磁頭。
 
在 linux 中可以使用 fdisk -l 查看一個(gè)磁盤的物理結(jié)構(gòu):
該磁盤有255個(gè)heads,也就是說共有255個(gè)盤面。3263個(gè)柱面(cylinders),也就是說每個(gè)盤面上都有3263個(gè)磁道, 63 sectors/track說的是每個(gè)磁道上共有63個(gè)扇區(qū)。命令結(jié)果也給出了Sector size的值是512bytes。那我們動(dòng)筆算一下該磁盤的大小吧。
255盤面  * 3263柱面 * 63扇區(qū) * 每個(gè)扇區(qū)512bytes = 26839088640byte。
結(jié)果是26.8G,和磁盤的總大小相符。 

1.2 磁盤的讀寫原理

系統(tǒng)將文件存儲(chǔ)到磁盤上時(shí),按柱面、磁頭、扇區(qū)的方式進(jìn)行,即最先是第1磁道的第一磁頭下(也就是第1盤面的第一磁道)的所有扇區(qū),然后,是同一柱面的下一磁頭,……,一個(gè)柱面存儲(chǔ)滿后就推進(jìn)到下一個(gè)柱面,直到把文件內(nèi)容全部寫入磁盤。
系統(tǒng)也以相同的順序讀出數(shù)據(jù)。讀出數(shù)據(jù)時(shí)通過告訴磁盤控制器要讀出扇區(qū)所在的柱面號、磁頭號和扇區(qū)號(物理地址的三個(gè)組成部分)進(jìn)行。磁盤控制器則直接使磁頭部件步進(jìn)到相應(yīng)的柱面,選通相應(yīng)的磁頭,等待要求的扇區(qū)移動(dòng)到磁頭下。在扇區(qū)到來時(shí),磁盤控制器讀出每個(gè)扇區(qū)的頭標(biāo),把這些頭標(biāo)中的地址信息與 期待檢出的磁頭和柱面號做比較(即尋道),然后,尋找要求的扇區(qū)號。待磁盤控制器找到該扇區(qū)頭標(biāo)時(shí),根據(jù)其任務(wù)是寫扇區(qū)還是讀扇區(qū),來決定是轉(zhuǎn)換寫電路, 還是讀出數(shù)據(jù)和尾部記錄。找到扇區(qū)后,磁盤控制器必須在繼續(xù)尋找下一個(gè)扇區(qū)之前對該扇區(qū)的信息進(jìn)行后處理。如果是讀數(shù)據(jù),控制器計(jì)算此數(shù)據(jù)的ECC碼,然 后,把ECC碼與已記錄的ECC碼相比較。如果是寫數(shù)據(jù),控制器計(jì)算出此數(shù)據(jù)的ECC碼,與數(shù)據(jù)一起存儲(chǔ)。在控制器對此扇區(qū)中的數(shù)據(jù)進(jìn)行必要處理期間,磁 盤繼續(xù)旋轉(zhuǎn)。其實(shí)我們的文件大多數(shù)的時(shí)候都是破碎的,在文件沒有破碎的時(shí)候,搖臂只需要尋找1次磁道并由磁頭進(jìn)行讀取,只需要1次就可以成功讀取;但是如果文件破碎成11處,那么搖臂要來回尋找11次磁道磁頭進(jìn)行11次讀取才能完整的讀取這個(gè)文件,讀取時(shí)間相對沒有破碎的時(shí)候就變得冗長。 
因此,磁盤IO時(shí)的過程包括:
  • 第一步,首先是磁頭徑向移動(dòng)來尋找數(shù)據(jù)所在的磁道。這部分時(shí)間叫尋道時(shí)間。
  • 第二步,找到目標(biāo)磁道后通過盤面旋轉(zhuǎn),將目標(biāo)扇區(qū)移動(dòng)到磁頭的正下方。
  • 第三步,向目標(biāo)扇區(qū)讀取或者寫入數(shù)據(jù)。到此為止,一次磁盤IO完成,故:
所以,單次磁盤IO時(shí)間 = 尋道時(shí)間 + 旋轉(zhuǎn)延遲 + 存取時(shí)間。 
  • 對于旋轉(zhuǎn)延時(shí),現(xiàn)在主流服務(wù)器上經(jīng)常使用的是1W轉(zhuǎn)/分鐘的磁盤,每旋轉(zhuǎn)一周所需的時(shí)間為60*1000/10000=6ms,故其旋轉(zhuǎn)延遲為(0-6ms)。
  • 對于存取時(shí)間,一般耗時(shí)較短,為零點(diǎn)幾ms。
  • 對于尋道時(shí)間,現(xiàn)代磁盤大概在3-15ms,其中尋道時(shí)間大小主要受磁頭當(dāng)前所在位置和目標(biāo)磁道所在位置相對距離的影響。
候選的磁盤分區(qū)方案:
  • 方案一: 255個(gè)盤面,C盤是0-100盤面, D盤是101-200個(gè)盤面,……
  • 方案二:3263個(gè)柱面,C盤0-1000個(gè)柱面,D盤1001-20001個(gè)柱面,……
其實(shí)采用哪一種,最主要看的是那種方式性能更快。因?yàn)橥环謪^(qū)下的數(shù)據(jù)經(jīng)常會(huì)一起讀取,假如采用第一種,那么這樣磁頭就需要在3000多個(gè)track間不停地跳來跳去,這樣磁盤的尋道時(shí)間就會(huì)翻倍,磁盤性能就會(huì)下降。而對于方案二,假如對于磁盤C,只需要在磁頭在1-1000個(gè)磁道間移動(dòng)就可以了,大大降低了尋道時(shí)間。(實(shí)際上分區(qū)并不是從0開始的,磁盤的第一個(gè)磁道對應(yīng)的柱面會(huì)被用來安裝引導(dǎo)加載程序以及磁盤分區(qū)表)。所以,方案二的分區(qū)方式可以降低磁盤IO時(shí)間中的尋道時(shí)間部分,所以所有的操作系統(tǒng)采用的都是方案二,沒有用方案一的。 

2. Linux 下磁盤命名和分區(qū) 

在為主機(jī)添加硬盤前,首先要了解Linux系統(tǒng)下對硬盤和分區(qū)的命名方法。 

2.1 磁盤命名

在Linux下對 SCSI 和 SATA 設(shè)備是以 sd 命名的,第一個(gè) scsi 設(shè)備是 sda,第二個(gè)是 sdb,依此類推。一般主板上有兩個(gè)SCSI接口,因此一共可以安裝四個(gè)SCSI設(shè)備。主 SCSI 上的兩個(gè)設(shè)備分別對應(yīng) sda 和 sdb,第二個(gè) SCSI 口上的兩個(gè)設(shè)備對應(yīng) sdc 和 sdd。一般硬盤安裝在主 SCSI 的主接口上,所以是 sda 或者 sdb,而光驅(qū)一般安裝在第二個(gè)SCSI的主接口上,所以是 sdc。(IDE接口設(shè)備是用 hd 命名的,第一個(gè)設(shè)備是hda,第二個(gè)是hdb,依此類推。)
IDE 磁盤描述配置
/dev/hda1st (Primary) IDE controllerMaster
/dev/hdb1st (Primary) IDE controllerSlave
/dev/hdc2nd (Secondary) IDE controllerMaster
/dev/hdd2nd (Secondary) IDE controllerSlave

2.2 分區(qū)命名 

所謂的磁盤分區(qū)指的是告訴操作系統(tǒng)『我這顆磁盤在此分割槽可以存取的區(qū)域是由 A 磁柱到 B 磁柱之間的區(qū)塊』, 如此一來操作系統(tǒng)就能夠知道他可以在所指定的區(qū)塊內(nèi)進(jìn)行文件數(shù)據(jù)的讀/寫/搜尋等動(dòng)作了。 也就是說,磁盤分區(qū)意即指定分割槽的啟始與結(jié)束磁柱就是了。
分區(qū)是用設(shè)備名稱加數(shù)字命名的。例如 hda1 代表hda這個(gè)硬盤設(shè)備上的第一個(gè)分區(qū)。 每個(gè)硬盤可以最多有四個(gè)主分區(qū),作用是 1-4 命名硬盤的主分區(qū)。多個(gè)主分區(qū)中只能有一個(gè)active 主分區(qū)作為啟動(dòng)分區(qū)。邏輯分區(qū)是從5開始的,每多一個(gè)分區(qū),每個(gè)磁盤上最多可以有 24個(gè)擴(kuò)展分區(qū)。 

2.3 分區(qū)步驟

1.  運(yùn)行 fdisk  來分區(qū):
其中第一個(gè)框和第二個(gè)框,是已經(jīng)分好區(qū)的磁盤,第三個(gè)硬盤沒有分區(qū)。
[root]# fdisk /dev/sdbCommand (m for help): m (Enter the letter 'm' to get list of commands)Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-9729, default 1):Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-9729, default 9729):Using default value 9729Command (m for help): w (Write and save partition table)[root]# mkfs.ext4 -L disk2 /dev/sdb
 分多個(gè)區(qū)有以下幾個(gè)目的:
  • 在不損失數(shù)據(jù)的情況下重裝系統(tǒng),比如獨(dú)立設(shè)置 /home 掛載點(diǎn),重裝系統(tǒng)的時(shí)候直接標(biāo)記回 /home,數(shù)據(jù)不會(huì)有任何損失。
  • 針對不同的掛載點(diǎn)的特性分配合適的文件系統(tǒng)以合理發(fā)揮性能,比如對 /var 使用reiserfs,對 /home 使用xfs,對 / 使用ext4。
  • 針對不同的掛載點(diǎn)開啟不同的掛載選項(xiàng),如是否需要即時(shí)同步,是否開啟日志,是否啟用壓縮。
  • 大硬盤搜索范圍大,效率低
  • 磁盤配額只能對分區(qū)做設(shè)定
  • /home、/var、/usr/local 經(jīng)常是單獨(dú)分區(qū),因?yàn)榻?jīng)常會(huì)操作,容易產(chǎn)生碎片
2. 格式化分區(qū):mkfs -t ext3 /dev/sda1
每塊硬盤都分為若干個(gè)分區(qū),每個(gè)分區(qū)都有自己的文件系統(tǒng)。Windows為這些文件系統(tǒng)各自指定了一個(gè)字母。不過 GNU/Linux 使用唯一的樹形結(jié)構(gòu)來管理文件,而每個(gè)文件系統(tǒng)都掛載于樹形結(jié)構(gòu)的某個(gè)位置。
正如 Windows 需要有 C: 驅(qū)動(dòng)器一樣,GNU/Linux 必須能夠?qū)⒏募到y(tǒng)掛載于文件樹的根(/)上。當(dāng)根掛載完成之后,您就可以將其它文件系統(tǒng)掛載于樹形結(jié)構(gòu)各種掛載點(diǎn)上。根結(jié)構(gòu)下的任何目錄都可以作為掛載點(diǎn),而您也可以將同一文件系統(tǒng)同時(shí)掛載于不同的掛載點(diǎn)上。掛載點(diǎn)實(shí)際上就是linux中的磁盤文件系統(tǒng)的入口目錄:
關(guān)于文件系統(tǒng)的三個(gè)易混淆的概念:
  • 創(chuàng)建:以某種方式格式化磁盤的過程就是在其之上建立一個(gè)文件系統(tǒng)的過程。創(chuàng)建文件系統(tǒng)時(shí),會(huì)在磁盤的特定位置寫入關(guān)于該文件系統(tǒng)的控制信息。
  • 注冊:向內(nèi)核報(bào)到,聲明自己能被內(nèi)核支持。一般在編譯內(nèi)核的時(shí)侯注冊;也可以加載模塊的方式手動(dòng)注冊。注冊過程實(shí) 際上是將表示各實(shí)際文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)struct file_system_type 實(shí)例化。
  • 安裝:也就是我們熟悉的mount操作,將文件系統(tǒng)加入到 Linux 的根文件系統(tǒng)的目錄樹結(jié)構(gòu)上;這樣文件系統(tǒng)才能被訪問。
linux 下一切皆文件!換言之就是linux操作系統(tǒng)將系統(tǒng)中的一切都作為文件來管理。在windows中我們常見的硬件設(shè)備(打印機(jī)、網(wǎng)卡、聲卡...)、磁盤分區(qū)等,在linux中統(tǒng)統(tǒng)都被視作文件,對設(shè)備、分區(qū)的訪問就是讀寫對應(yīng)的文件。
格式化命令:
mkfs.ext3   /dev/sdb1 //格式化分區(qū)成 ext3
mkfs.ext2   /dev/sdb1 //格式化分區(qū)成 ext2
3. 掛載 mount /dev/sda1 /test
df 命令用于查看已掛載磁盤的總?cè)萘?、使用容量、剩余容量等,可以不加任何參?shù),默認(rèn)是按k為單位顯示的。
du 命令用來查看某個(gè)目錄所占空間大小。
 
 
4. 開機(jī)直接掛載
編輯 /etc/fstab 文件,添加:/dev/sda1 /test ext3 defaults 1 1,重啟則發(fā)選已經(jīng)掛載上去。
5. 總結(jié) 
  • 掛載點(diǎn)必須是一個(gè)目錄。
  • 一個(gè)分區(qū)掛載在一個(gè)已存在的目錄上,這個(gè)目錄可以不為空,但掛載后這個(gè)目錄下以前的內(nèi)容將不可用。對于其他操作系統(tǒng)建立的文件系統(tǒng)的掛載也是這樣,卸載后,目錄以前的文件都還在,不會(huì)有任何丟失。
  • 目錄只占磁盤里的一個(gè)inode,存放文件屬性等信息。
  • 任何一個(gè)分區(qū)都必須掛載到某個(gè)目錄上。
  • 目錄是邏輯上的區(qū)分。分區(qū)是物理上的區(qū)分。
  • 磁盤Linux分區(qū)都必須掛載到目錄樹中的某個(gè)具體的目錄上才能進(jìn)行讀寫操作。
  • 根目錄是所有Linux的文件和目錄所在的地方,需要掛載上一個(gè)磁盤分區(qū)。
  • 一個(gè)分區(qū)可以掛在多個(gè)目錄,但反過來一個(gè)目錄只能是一個(gè)分區(qū)的掛載點(diǎn)。

3. Linux 文件系統(tǒng)

文件系統(tǒng)是對一個(gè)存儲(chǔ)設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進(jìn)行組織的機(jī)制。它的最終目的是把大量數(shù)據(jù)有組織的放入持久性(persistant)的存儲(chǔ)設(shè)備中,比如硬盤和磁盤。文件系統(tǒng)(file system)是就是文件在邏輯上組織形式,它以一種更加清晰的方式來存放各個(gè)文件。數(shù)據(jù)被存入到某個(gè)分區(qū)中。一個(gè)典型的Linux分區(qū)(partition)包含有下面各個(gè)部分:
文件是文件系統(tǒng)對數(shù)據(jù)的分割單元。文件系統(tǒng)用目錄來組織文件,賦予文件以上下分級的結(jié)構(gòu)。在硬盤上實(shí)現(xiàn)這一分級結(jié)構(gòu)的關(guān)鍵,是使用 inode 來虛擬普通文件和目錄文件對象。在Linux系統(tǒng)中,目錄也是一種文件。所以/home/sammy 是指向目錄文件 sammy 的絕對路徑。
磁盤與文件系統(tǒng):
 

3.1 inode 

inodes 是實(shí)現(xiàn)文件存儲(chǔ)的關(guān)鍵。在 Linux 中,文件系統(tǒng)中管理的每個(gè)對象(文件或目錄)表示為一個(gè) inode。inode 包含管理文件系統(tǒng)中的對象所需的所有元數(shù)據(jù)(包括可以在對象上執(zhí)行的操作)。在 Linux 系統(tǒng)中,一個(gè)文件可以分成幾個(gè)數(shù)據(jù)塊存儲(chǔ)在分區(qū)內(nèi)。為了搜集各數(shù)據(jù)塊,我們需要該文件對應(yīng)的inode。每個(gè)文件對應(yīng)一個(gè) inode。這個(gè) inode 中包含多個(gè)指針,指向?qū)儆谠撐募鱾€(gè)數(shù)據(jù)塊。當(dāng)操作系統(tǒng)需要讀取文件時(shí),只需要找到對應(yīng) inode,收集分散的數(shù)據(jù)塊,就可以收獲我們的文件了。
讀取文件:
 
在Linux中,我們通過解析路徑,根據(jù)沿途的目錄文件來找到某個(gè)文件。目錄中的條目除了所包含的文件名,還有對應(yīng)的inode編號。當(dāng)我們輸入$cat /var/test.txt時(shí),Linux 將在根目錄文件中找到 var 這個(gè)目錄文件的inode編號,然后根據(jù) inode 合成 var 的數(shù)據(jù)。隨后,根據(jù) var 中的記錄,找到 text.txt 的 inode 編號,沿著 inode 中的指針,收集數(shù)據(jù)塊,合成 text.txt 的數(shù)據(jù)。整個(gè)過程中,會(huì)參考三個(gè)inode:
  • 根目錄文件的 inode:2,用于找到 var 的 inode id
  • var 目錄文件的 inode:10747905,用于找到 test.txt 的 inode id
  • text.txt 文件的 inode: 10749034,用于找到 data blocks

因此,當(dāng)我們讀取一個(gè)文件時(shí),實(shí)際上是在目錄中找到了這個(gè)文件的inode編號,然后根據(jù)inode的指針,把數(shù)據(jù)塊組合起來,放入內(nèi)存供進(jìn)一步的處理。當(dāng)我們創(chuàng)建一個(gè)文件時(shí),是分配一個(gè)空白 inode 給該文件,將其 inode 編號記入該文件所屬的目錄,然后選取空白的數(shù)據(jù)塊,讓 inode 的指針指向這些數(shù)據(jù)塊,并放入內(nèi)存中的數(shù)據(jù)。

3.2 循環(huán)設(shè)備

類Unix系統(tǒng)中,/dev/loop 是一種偽設(shè)備,這種設(shè)備使得文件可以如同塊設(shè)備一般被訪問。在目錄上掛載包含文件系統(tǒng)的文件一般需要兩步:
  1. 用一個(gè)循環(huán)設(shè)備節(jié)點(diǎn)連接文件。
  2. 在目錄上掛載該循環(huán)設(shè)備
具體步驟:
dd if=/dev/zero of=file.img bs=1k count=10000 //創(chuàng)建一個(gè)初始化文件losetup /dev/loop0 file.img //創(chuàng)建一個(gè)循環(huán)設(shè)備mke2fs -c /dev/loop0 10000 //創(chuàng)建文件系統(tǒng)mkdir /mnt/point1 //創(chuàng)建掛載點(diǎn)mount -t ext2 /dev/loop0 /mnt/point1 //掛載 

3.3 文件系統(tǒng)的結(jié)構(gòu)

用戶空間包含一些應(yīng)用程序(例如,文件系統(tǒng)的使用者)和 GNU C 庫(glibc),它們?yōu)槲募到y(tǒng)調(diào)用(打開、讀取、寫和關(guān)閉)提供用戶接口。系統(tǒng)調(diào)用接口的作用就像是交換器,它將系統(tǒng)調(diào)用從用戶空間發(fā)送到內(nèi)核空間中的適當(dāng)端點(diǎn)。
VFS 是底層文件系統(tǒng)的主要接口,它是 Linux 內(nèi)核中的一個(gè)軟件抽象層。。這個(gè)組件導(dǎo)出一組接口,然后將它們抽象到各個(gè)文件系統(tǒng),各個(gè)文件系統(tǒng)的行為可能差異很大。有兩個(gè)針對文件系統(tǒng)對象的緩存(inode 和 dentry)。它們緩存最近使用過的文件系統(tǒng)對象。因?yàn)橛?VFS 存在,Linux 允許眾多不同的文件系統(tǒng)共存,并支持跨文件系統(tǒng)的文件操作。它通過一些數(shù)據(jù)結(jié)構(gòu)及其方法向?qū)嶋H的文件系統(tǒng)如 ext2,vfat 提供接口機(jī)制。
每個(gè)文件系統(tǒng)實(shí)現(xiàn)(比如 ext2、JFS 等等)導(dǎo)出一組通用接口,供 VFS 使用。緩沖區(qū)緩存會(huì)緩存文件系統(tǒng)和相關(guān)塊設(shè)備之間的請求。例如,對底層設(shè)備驅(qū)動(dòng)程序的讀寫請求會(huì)通過緩沖區(qū)緩存來傳遞。這就允許在其中緩存請求,減少訪問物理設(shè)備的次數(shù),加快訪問速度??梢允褂?nbsp;sync 命令將緩沖區(qū)緩存中的請求發(fā)送到存儲(chǔ)媒體(迫使所有未寫的數(shù)據(jù)發(fā)送到設(shè)備驅(qū)動(dòng)程序,進(jìn)而發(fā)送到存儲(chǔ)設(shè)備)。 

3.4 VFS (虛擬文件系統(tǒng))  

Linux 中允許眾多不同的文件系統(tǒng)共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統(tǒng)調(diào)用即可對 Linux 中的任意文件進(jìn)行操作而無需考慮其所在的具體文件系統(tǒng)格式;更進(jìn)一步,對文件的 操作可以跨文件系統(tǒng)而執(zhí)行。如下圖所示,我們可以使用 cp 命令從 vfat 文件系統(tǒng)格式的硬盤拷貝數(shù)據(jù)到 ext3 文件系統(tǒng)格式的硬盤;而這樣的操作涉及到兩個(gè)不同的文件系統(tǒng)。
圖片示例_跨文件系統(tǒng)的文件操作
過程:VFS調(diào)用 vfat 的讀文件方法將 a.txt 的數(shù)據(jù)讀入內(nèi)存;再將 a.txt 在內(nèi)存中的數(shù)據(jù)映射到b.txt對應(yīng)的內(nèi)存空間后,VFS調(diào)用ext3的寫文件方法將b.txt寫入磁盤;從而實(shí)現(xiàn)了最終的跨文件系統(tǒng)的復(fù)制操作。
“一切皆是文件”是 Unix/Linux 的基本哲學(xué)之一。不僅普通的文件,目錄、字符設(shè)備、塊設(shè)備、 套接字等在 Unix/Linux 中都是以文件被對待;它們雖然類型不同,但是對其提供的卻是同一套操作界面。操作文件時(shí)需先打開;打開文件時(shí),VFS 會(huì)知道該文件對應(yīng)的文件系統(tǒng)格式;當(dāng)VFS把控制權(quán)傳給實(shí)際的文件系統(tǒng)時(shí),實(shí)際的文件系統(tǒng)再做出具體區(qū)分,對不同的文件類型執(zhí)行不同的操作。這也就是“一切皆是文件”的根本所在。
圖片示例_VFS在內(nèi)核中與其他的內(nèi)核模塊的協(xié)同關(guān)系
從物理介質(zhì)讀文件的具體過程:
 圖片示例_從物理介質(zhì)讀數(shù)據(jù)的過程
當(dāng)在用戶應(yīng)用程序調(diào)用文件 I/O read()操作時(shí),系統(tǒng)調(diào)用 sys_read() 被激發(fā),sys_read() 找到文件所在的具體文件系統(tǒng),把控制權(quán)傳給該文件系統(tǒng),最后由具體文件系統(tǒng)與物理介質(zhì)交互,從介質(zhì)中讀出數(shù)據(jù)。 

3.5 Linux 文件系統(tǒng)類型 

3.5.1 ReiserFS

ReiserFS 是一種文件系統(tǒng)格式。Linux內(nèi)核從2.4.1版本開始支持ReiserFS。ReiserFS原先是Novell公司的SuSE Linux Enterprise采用的默認(rèn)文件系統(tǒng),直到2006年10月12日其宣稱將在未來的版本改采 ext3 為默認(rèn)。和同樣在 Linux Kernel 2.4 版本下的 ext2 及 ext3 相比較,處理 4KB 以下的小文件時(shí)(tail packing enable),ReiserFS 的速度快了 10 到 15 倍[3]。但是,有些目錄的操作在 ReiserFS 上面并不同步,(包括像 unlink(2)),可能會(huì)導(dǎo)致一些重度依賴文件鎖(file-based lock)機(jī)制的應(yīng)用程序上面數(shù)據(jù)的毀損。ReiserFS 在一個(gè)單一復(fù)合B+樹中存儲(chǔ)文件的亞數(shù)據(jù)信息(stat item)、目錄文件信息(directory items)、索引節(jié)點(diǎn)中的塊列表(indirect items),這些信息都有唯一的標(biāo)識(shí)號作為B+樹的索引值。

3.5.2 ext2 文件系統(tǒng)

ext2 文件系統(tǒng)(也稱為第二擴(kuò)展文件系統(tǒng))旨在克服早期 Linux 版本中使用的 Minix 文件系統(tǒng)的缺點(diǎn)。多年來,該文件系統(tǒng)一直廣泛應(yīng)用于 Linux。但 ext2 中沒有日志,現(xiàn)在基本上已被 ext3 和最新的 ext4 所取代。

3.5.3 ext3 文件系統(tǒng)

ext3 文件系統(tǒng)向標(biāo)準(zhǔn) ext2 文件系統(tǒng)添加了日志功能,因此是一個(gè)非常穩(wěn)定的文件系統(tǒng)的一個(gè)演化發(fā)展。它在大多數(shù)情況下提供合理的性能并且仍舊在改進(jìn)。由于它在可靠的 ext2 文件系統(tǒng)上添加了日志功能,因此可以將現(xiàn)有 ext2 文件系統(tǒng)轉(zhuǎn)換為 ext3 文件系統(tǒng),并且在必要時(shí)還可以轉(zhuǎn)換回來。

3.5.4 ext4 文件系統(tǒng)

ext4 是作為 ext3 的擴(kuò)展來啟動(dòng)的,它通過增加存儲(chǔ)限制和提高性能來滿足更大文件系統(tǒng)的需求。為了保留 ext3 的穩(wěn)定性,在2006 年 6 月,該擴(kuò)展被拆分成一個(gè)新的文件系統(tǒng),即 ext4。ext4 文件系統(tǒng)在 2008 年 12 月正式發(fā)布,包含在 2.6.28 內(nèi)核中。

3.5.5 vfat 文件系統(tǒng)

vfat 文件系統(tǒng)(也稱為 FAT32)沒有日志功能,且缺乏完整的 Linux 文件系統(tǒng)實(shí)現(xiàn)所需的許多特性。它可用于在 Windows 和 Linux 系統(tǒng)之間交換數(shù)據(jù),因?yàn)?Windows 和 Linux 都能讀取它。不要將這個(gè)文件系統(tǒng)用于 Linux,除非要在 Windows 和 Linux 之間共享數(shù)據(jù)。

3.5.6 XFS 文件系統(tǒng)

XFS 文件系統(tǒng)擁有日志功能,包含一些健壯的特性,并針對可伸縮性進(jìn)行了優(yōu)化。XFS 通常是相當(dāng)快的。在大文件操作方面,XFS 在所有測試中一直處于領(lǐng)先地位。XFS 的性能非常接近 ReiserFS,并在大多數(shù)測試指標(biāo)上都超過了 ext3。

3.5.7 IBM JFS 文件系統(tǒng)

IBM 的 Journaled File System (JFS),目前用于 IBM 企業(yè)服務(wù)器,專為高吞吐量服務(wù)器環(huán)境而設(shè)計(jì)。它可用于 Linux,包含在幾個(gè)發(fā)行版中。要?jiǎng)?chuàng)建 JFS 文件系統(tǒng),使用 mkfs.jfs 命令。 

3.6 選擇文件系統(tǒng)

選擇合適的下一代 Linux 文件系統(tǒng)一直很簡單。那些只尋求原始性能的人通常傾向于使用 ReiserFS,而那些更關(guān)心數(shù)據(jù)完整性特性的人則首選 ext3/4。然而,隨著 XFS 的 Linux 版的發(fā)布,事情突然變得令人困惑。尤其是,對于 ReiserFS 是否依然是下一代文件系統(tǒng)性能方面的佼佼者,人們開始感到疑惑。
  • XFS 的性能非常接近 ReiserFS,并在大多數(shù)測試指標(biāo)上都超過了 ext3。
  • 目前,ReiserFS 和 ext3 刪除文件要比 XFS 快得多。 

3.7 創(chuàng)建文件系統(tǒng) 

Linux 使用 mkfs 命令來創(chuàng)建文件系統(tǒng),使用 mkswap 命令創(chuàng)建交換空間。mkfs 命令實(shí)際上是幾個(gè)特定文件系統(tǒng)的命令的前端,比如面向 ext3 的 mkfs.ext3,面向 ext4 的 mkfs.ext4 以及面向 ReiserFS 的 mkfs.reiserfs。你的文件系統(tǒng)上安裝的是什么文件系統(tǒng)支持?使用 ls /sbin/mk* 命令即可得到答案。
參考文檔:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多