RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入剖析Linux內(nèi)核虛擬文件系統(tǒng)

書生途 ? 來源:書生途 ? 作者:書生途 ? 2022-05-14 15:53 ? 次閱讀

虛擬文件系統(tǒng)(Virtual File System,簡稱VFS)是Linux內(nèi)核的子系統(tǒng)之一,它為用戶程序提供文件和文件系統(tǒng)操作的統(tǒng)一接口,屏蔽不同文件系統(tǒng)的差異和操作細(xì)節(jié)。借助VFS可以直接使用open()、read()、write()這樣的系統(tǒng)調(diào)用操作文件,而無須考慮具體的文件系統(tǒng)和實(shí)際的存儲介質(zhì)。

通過VFS系統(tǒng),Linux提供了通用的系統(tǒng)調(diào)用,可以跨越不同文件系統(tǒng)和介質(zhì)之間執(zhí)行,極大簡化了用戶訪問不同文件系統(tǒng)的過程。另一方面,新的文件系統(tǒng)、新類型的存儲介質(zhì),可以無須編譯的情況下,動(dòng)態(tài)加載到Linux中。

"一切皆文件"是Linux的基本哲學(xué)之一,不僅是普通的文件,包括目錄、字符設(shè)備、塊設(shè)備、套接字等,都可以以文件的方式被對待。實(shí)現(xiàn)這一行為的基礎(chǔ),正是Linux的虛擬文件系統(tǒng)機(jī)制。

VFS之所以能夠銜接各種各樣的文件系統(tǒng),是因?yàn)樗橄罅艘粋€(gè)通用的文件系統(tǒng)模型,定義了通用文件系統(tǒng)都支持的、概念上的接口。新的文件系統(tǒng)只要支持并實(shí)現(xiàn)這些接口,并注冊到Linux內(nèi)核中,即可安裝和使用。

舉個(gè)例子,比如Linux寫一個(gè)文件:

int ret = write(fd, buf, len);

調(diào)用了write()系統(tǒng)調(diào)用,它的過程簡要如下:

首先,勾起VFS通用系統(tǒng)調(diào)用sys_write()處理。
接著,sys_write()根據(jù)fd找到所在的文件系統(tǒng)提供的寫操作函數(shù),比如op_write()。
最后,調(diào)用op_write()實(shí)際的把數(shù)據(jù)寫入到文件中。


操作示意圖如下:

poYBAGJ_YASAUwjJAAA7Acyjm8U821.jpg

文件系統(tǒng)

Linux下常用文件系統(tǒng)介紹

  • swap 文件系統(tǒng)
    swap文件系統(tǒng)用于Linux的交換分區(qū)。在Linux中,使用整個(gè)交換分區(qū)來提供虛擬內(nèi)存,其分區(qū)大小一般應(yīng)是系統(tǒng)物理內(nèi)存的2倍,在安裝Linux操作系統(tǒng)時(shí),就應(yīng)創(chuàng)建交換分區(qū),它是Linux正常運(yùn)行所必需的,其類型必須是swap,交換分區(qū)由操作系統(tǒng)自行管理
  • Btrfs 文件系統(tǒng)
  • Ext系列文件系統(tǒng)
    ext是第一個(gè)專門為Linux設(shè)計(jì)的文件系統(tǒng)類型,稱為擴(kuò)展文件系統(tǒng)。目前已經(jīng)到了第四版分別是ext2, ext3,ext4 其中 centOS6默認(rèn)是ext4文件系統(tǒng)
  • xfs 文件系統(tǒng)
  • NFS文件系統(tǒng)
  • FAT系列文件系統(tǒng)

比較

文件系統(tǒng) 最大文件名長度 最大文件大小 最大分區(qū)大小
ext2 255 bytes 2 TB 16 TB
ext3 255 bytes 2 TB 16 TB
ext4 255 bytes 16 TB 1 EB
XFS 255 bytes 8 EB 8 EB
Btrfs 255 bytes 16 EB 16 EB

選擇

文件系統(tǒng) 適用場景 原因
ext2 U盤 U盤一般不會存很多文件,且U盤的文件在電腦上有備份,安全性要求沒那么高,由于ext2不寫日志(journal),所以寫U盤性能比較好。當(dāng)然由于ext2的兼容性沒有fat好,目前大多數(shù)U盤格式還是用fat
ext3 對穩(wěn)定性要求高的地方 有了ext4后,好像沒什么原因還要用ext3,ext4現(xiàn)在的問題是出來時(shí)間不長,還需要一段時(shí)間變穩(wěn)定
ext4 小文件較少 ext系列的文件系統(tǒng)都不支持inode動(dòng)態(tài)分配,所以如果有大量小文件需要存儲的話,不建議用ext4
xfs 小文件多或者需要大的xttr空間,如openstack swift將數(shù)據(jù)文件的元數(shù)據(jù)放在了xttr里面 xfs支持inode動(dòng)態(tài)分配,所以不存在inode不夠的情況,并且xttr的最大長度可以達(dá)到64K
btrfs 沒有頻繁的寫操作,且需要btrfs的一些特性 btrfs雖然還不穩(wěn)定,但支持眾多的功能,如果你需要這些功能,且不會頻繁地寫文件,那么選擇btrfs

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?/p> pYYBAGJ_YASAJ6ViAADZ9NmCySQ377.jpg

磁盤的組成原理

除了固態(tài)硬盤之外,硬盤一般都由磁盤、主軸馬達(dá)、磁頭臂、磁頭、永磁鐵等部分組成。

盤片

盤片的表面涂有磁性物質(zhì),這些磁性物質(zhì)用來記錄二進(jìn)制數(shù)據(jù)。因?yàn)檎磧擅娑伎赏可洗判晕镔|(zhì),故一個(gè)盤片可能會有兩個(gè)盤面,硬盤的存儲介質(zhì)是磁性材料,磁頭通過電流改變磁盤的磁性來存儲數(shù)據(jù)。硬盤在邏輯上被劃分為磁道、柱面以及扇區(qū)。

poYBAGJ_YASAVYn9AAD-SY-VD1E146.jpg

扇區(qū),磁道

每個(gè)盤片被劃分為一個(gè)個(gè)磁道,每個(gè)磁道又劃分為一個(gè)個(gè)扇區(qū)。如下圖:

pYYBAGJ_YASAKWLPAADS000QWn0658.jpg

其中,最內(nèi)側(cè)磁道上的扇區(qū)面積最小,因此數(shù)據(jù)密度最大。

柱面

硬盤通常由重疊的一組盤片構(gòu)成,每個(gè)盤面都被劃分為數(shù)目相等的磁道,并從外緣的“0”開始編號,具有相同編號的磁道形成一個(gè)圓柱,稱之為磁盤的柱面。

poYBAGJ_YASADs4lAAGnL_fsG_s422.jpg

分區(qū)

為什么要對硬盤進(jìn)行分區(qū)呢?

因?yàn)槲覀儽仨氁嬖V操作系統(tǒng):這塊硬盤可以訪問的區(qū)域是從 A 柱面到 B 柱面。如此一來,操作系統(tǒng)才能控制硬盤磁頭去 A-B 范圍內(nèi)的柱面上訪問數(shù)據(jù)。如果沒有告訴操作系統(tǒng)這些信息,它就無法在磁盤上存取數(shù)據(jù)。所以對磁盤分區(qū)的要點(diǎn)是:記錄每一個(gè)分區(qū)的起始與結(jié)束柱面。 實(shí)際上,分區(qū)時(shí)指定的開始和結(jié)束位置是柱面上的扇區(qū)(sector):

下面我們以CentOS7 為例來看一下分區(qū)情況:

[root@CentOS7 ~]# fdisk -l

磁盤 /dev/sda:21.5 GB, 21474836480 字節(jié),41943040 個(gè)扇區(qū)
Units = 扇區(qū) of 1 * 512 = 512 bytes
扇區(qū)大小(邏輯/物理):512 字節(jié) / 512 字節(jié)
I/O 大小(最小/最佳):512 字節(jié) / 512 字節(jié)
磁盤標(biāo)簽類型:dos # 使 用dos---MBR 分區(qū)方式
磁盤標(biāo)識符:0x000ce1c0

   設(shè)備    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM(邏輯卷)
# sda 分區(qū)
磁盤 /dev/mapper/centos-root:18.2 GB, 18249416704 字節(jié),35643392 個(gè)扇區(qū)
Units = 扇區(qū) of 1 * 512 = 512 bytes
扇區(qū)大小(邏輯/物理):512 字節(jié) / 512 字節(jié)
I/O 大小(最小/最佳):512 字節(jié) / 512 字節(jié)

# 交換分區(qū)
磁盤 /dev/mapper/centos-swap:2147 MB, 2147483648 字節(jié),4194304 個(gè)扇區(qū)
Units = 扇區(qū) of 1 * 512 = 512 bytes
扇區(qū)大小(邏輯/物理):512 字節(jié) / 512 字節(jié)
I/O 大小(最小/最佳):512 字節(jié) / 512 字節(jié)

分區(qū)的組成結(jié)構(gòu)

pYYBAGJ_YASAPD5QAADs7fh8uCI409.jpg

MBR

那么,這些分區(qū)的信息(起始柱面與結(jié)束柱面)被存放在磁盤的主引導(dǎo)區(qū)(Master Boot Recorder, MBR)。MBR 在一塊硬盤的第 0 軌上,這也是計(jì)算機(jī)啟動(dòng)之后要去使用硬盤時(shí)必須讀取的第一個(gè)區(qū)域。

這個(gè)區(qū)域內(nèi)記錄了硬盤里所有分區(qū)的信息即磁盤分區(qū)表,以及啟動(dòng)時(shí)可以寫入引導(dǎo)程序的位置。因此 MBR 對于硬盤來說至關(guān)重要,如果它壞掉了,這塊磁盤也就壽終正寢了。

主引導(dǎo)記錄由三個(gè)部分組成:

  • 引導(dǎo)程序占用其中的前446字節(jié)(偏移0~1BDH)
  • 隨后的64字節(jié)(偏移1BEH~1FDH)為DPT(Disk Partition Table,硬盤分區(qū)表)
  • 最后的兩個(gè)字節(jié)“55 AA”(偏移1FEH~1FFH)是結(jié)束標(biāo)志。

poYBAGJ_YAWAMqlKAACXw_YfVfY231.jpg

分區(qū)表:

pYYBAGJ_YAWANBiRAAC_UHoDySU606.jpg

GDT

Disk label type: gpt—GPT

在MBR硬盤中,分區(qū)信息直接存儲于主引導(dǎo)記錄(MBR)中(主引導(dǎo)記錄中還存儲著系統(tǒng)的引導(dǎo)程序)。但在GPT硬盤中,分區(qū)表的位置信息儲存在GPT頭中。但出于兼容性考慮,硬盤的第一個(gè)扇區(qū)仍然用作MBR,之后才是GPT頭。

跟現(xiàn)代的MBR一樣,GPT也使用邏輯區(qū)塊地址(LBA)取代了早期的CHS尋址方式。傳統(tǒng)MBR信息存儲于LBA 0,GPT頭存儲于LBA 1,接下來才是分區(qū)表本身。

poYBAGJ_YAWAOKKvAAIUeVuK-Z8298.jpg

為什么要提出新的方案呢?那就讓我們看看MBR分區(qū)方案有什么問題。前面已經(jīng)提到了

  • 主分區(qū)數(shù)目不能超過4個(gè)的限制
  • 關(guān)鍵的是MBR分區(qū)方案無法支持超過2TB容量的磁盤。因?yàn)檫@一方案用4個(gè)字節(jié)存儲分區(qū)的總扇區(qū)數(shù),最大能表示2的32次方的扇區(qū)個(gè)數(shù),按每扇區(qū)512字節(jié)計(jì)算,每個(gè)分區(qū)最大不能超過2TB。磁盤容量超過2TB以后,分區(qū)的起始位置也就無法表示了。

有了扇區(qū)(sector),有了柱面(cylinder),有了 磁頭(head),顯然可以定位數(shù)據(jù)了,這就是數(shù)據(jù)定位(尋址)方式之一,CHS(也稱3D),對早期的磁盤(上圖所示)非常有效,知道用哪個(gè) 磁頭,讀取哪個(gè)柱面上的第幾扇區(qū)就OK了。CHS模式支持的硬盤容量有限,用8bit來存儲 磁頭地址,用10bit來存儲柱面地址,用6bit來存儲扇區(qū)地址,而一個(gè)扇區(qū)共有512Byte,這樣使用CHS尋址一塊硬盤最大容量為256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B來算就是8.4GB)
但現(xiàn)在很多硬盤采用同密度盤片,意味著內(nèi)外磁道上的扇區(qū)數(shù)量不同,扇區(qū)數(shù)量增加,容量增加,3D很難定位尋址,新的尋址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示實(shí)際硬盤的實(shí)際 物理地址(柱面、 磁頭和扇區(qū))。LBA編址方式將CHS這種三維尋址方式轉(zhuǎn)變?yōu)橐痪S的線性尋址,它把硬盤所有的 物理扇區(qū)的C/H/S編號通過一定的規(guī)則轉(zhuǎn)變?yōu)橐痪€性的編號,系統(tǒng)效率得到大大提高,避免了煩瑣的 磁頭/柱面/扇區(qū)的尋址方式。在訪問硬盤時(shí),由硬盤控制器再將這種 邏輯地址轉(zhuǎn)換為實(shí)際硬盤的 物理地址。
LBA下的編號,扇區(qū)編號是從0開始。邏輯扇區(qū)號LBA的公式:
LBA(邏輯扇區(qū)號)=磁頭數(shù) × 每磁道扇區(qū)數(shù) × 當(dāng)前所在柱面號 + 每磁道扇區(qū)數(shù) × 當(dāng)前所在磁頭號 + 當(dāng)前所在扇區(qū)號 – 1
例如:CHS=0/0/1,則根據(jù)公式LBA=255 × 63 × 0 + 63 × 0 + 1 – 1= 0
也就是說 物理0柱面0 磁頭1扇區(qū),是 邏輯0扇區(qū)。也就是說 LBA就是扇區(qū)的編號, 按照磁道 柱面 和 磁頭 從小到大的順序編號

計(jì)算機(jī)啟動(dòng)的過程

1. BIOS 程序啟動(dòng)

上個(gè)世紀(jì)70年代初,“只讀內(nèi)存”(read-only memory,縮寫為ROM)發(fā)明,開機(jī)程序被刷入ROM芯片,計(jì)算機(jī)通電后,第一件事就是讀取它。這塊芯片里的程序叫做"基本輸出輸入系統(tǒng)"(Basic Input/Output System),簡稱為BIOS。

2. 硬件自檢

BIOS程序首先檢查,計(jì)算機(jī)硬件能否滿足運(yùn)行的基本條件,這叫做"硬件自檢"(Power-On Self-Test),縮寫為POST。
如果硬件出現(xiàn)問題,主板會發(fā)出不同含義的蜂鳴,啟動(dòng)中止。如果沒有問題,屏幕就會顯示出CPU、內(nèi)存、硬盤等信息。

硬件自檢完成后,BIOS把控制權(quán)轉(zhuǎn)交給下一階段的啟動(dòng)程序。這時(shí),BIOS需要知道,“下一階段的啟動(dòng)程序"具體存放在哪一個(gè)設(shè)備。也就是說,BIOS需要有一個(gè)外部儲存設(shè)備的排序,排在前面的設(shè)備就是優(yōu)先轉(zhuǎn)交控制權(quán)的設(shè)備。這種排序叫做"啟動(dòng)順序”(Boot Sequence)。

打開BIOS的操作界面,里面有一項(xiàng)就是"設(shè)定啟動(dòng)順序"。

pYYBAGJ_YAWAVwoYAAC2HD2M2Ks438.jpg

3. 主引導(dǎo)記錄

BIOS按照"啟動(dòng)順序",把控制權(quán)轉(zhuǎn)交給排在第一位的儲存設(shè)備。

這時(shí),計(jì)算機(jī)讀取該設(shè)備的第一個(gè)扇區(qū),也就是讀取最前面的512個(gè)字節(jié)。如果這512個(gè)字節(jié)的最后兩個(gè)字節(jié)是0x55和0xAA,表明這個(gè)設(shè)備可以用于啟動(dòng);如果不是,表明設(shè)備不能用于啟動(dòng),控制權(quán)于是被轉(zhuǎn)交給"啟動(dòng)順序"中的下一個(gè)設(shè)備。 這最前面的512個(gè)字節(jié),就叫做"主引導(dǎo)記錄"(Master boot record,縮寫為MBR)。 主引導(dǎo)記錄"只有512個(gè)字節(jié),放不了太多東西。它的主要作用是,告訴計(jì)算機(jī)到硬盤的哪一個(gè)位置去找操作系統(tǒng)

4. 啟動(dòng)管理器

在這種情況下,計(jì)算機(jī)讀取"主引導(dǎo)記錄"前面446字節(jié)的機(jī)器碼之后,不再把控制權(quán)轉(zhuǎn)交給某一個(gè)分區(qū),而是運(yùn)行事先安裝的"啟動(dòng)管理器"(boot loader),由用戶選擇啟動(dòng)哪一個(gè)操作系統(tǒng)。Linux環(huán)境中,目前最流行的啟動(dòng)管理器是Grub。

5. 操作系統(tǒng)

控制權(quán)轉(zhuǎn)交給操作系統(tǒng)后,操作系統(tǒng)的內(nèi)核首先被載入內(nèi)存。 以Linux系統(tǒng)為例,先載入/boot目錄下面的kernel。內(nèi)核加載成功后,第一個(gè)運(yùn)行的程序是/sbin/init。它根據(jù)配置文件(Debian系統(tǒng)是/etc/initab, CentOS 是systemd)產(chǎn)生init進(jìn)程。這是Linux啟動(dòng)后的第一個(gè)進(jìn)程,pid進(jìn)程編號為1,其他進(jìn)程都是它的后代。

然后,init線程加載系統(tǒng)的各個(gè)模塊,比如窗口程序和網(wǎng)絡(luò)程序,直至執(zhí)行/bin/login程序,跳出登錄界面,等待用戶輸入用戶名和密碼。

文件存貯

文件系統(tǒng)到底是怎么管理磁盤的被?首先,操作系統(tǒng)會將磁盤分區(qū)后,同一個(gè)文件系統(tǒng)中,我們以ext系列為例來說明: ext系統(tǒng)將空間(這里的空間是指的一段連續(xù)的磁盤空間)劃分為不同的功能區(qū),比如元數(shù)據(jù)區(qū)和數(shù)據(jù)區(qū)。元數(shù)據(jù)去主要存貯文件的一些屬性,比如說大小,快信息,這些信息被存貯在inode當(dāng)中,而數(shù)據(jù)去以datablock 為存貯單元,主要是存放了文件的數(shù)據(jù)。

因?yàn)榇疟P上的數(shù)據(jù)要和內(nèi)存交互,而內(nèi)存通常是以4KB為單位的,所以從邏輯上,把磁盤按照4KB劃分比較方便(稱為一個(gè)block)?,F(xiàn)在假設(shè)由一個(gè)文件系統(tǒng)管理64個(gè)blocks的一個(gè)磁盤區(qū)域:

順序文件結(jié)構(gòu)

顧名思義,文件的存貯數(shù)據(jù)塊是連續(xù)的空間。

優(yōu)點(diǎn)是不需要額外的空間開銷,只要在文件目錄中指出文件的大小和首塊的塊號即可,對順序的訪問效率很高。適應(yīng)于順序存取且文件不經(jīng)常修改的情況。 缺點(diǎn)是

  • 文件動(dòng)態(tài)地增長和縮小時(shí)系統(tǒng)開銷很大;
  • 文件創(chuàng)建時(shí)要求用戶提供文件的大小;
  • 存儲空間浪費(fèi)較大。

鏈?zhǔn)轿募到y(tǒng)

poYBAGJ_YAWAbeZGAACB6m0sioo690.jpg

克服了連續(xù)文件的不足之處,但文件的隨機(jī)訪問系統(tǒng)開銷較大。適應(yīng)于順序訪問的文件。

索引式文件系統(tǒng)

在UNIX時(shí)代,就已經(jīng)實(shí)現(xiàn)了索引式的文件系統(tǒng)。它的原理是為一個(gè)文件的所有塊建立一個(gè)索引表,索引表就是塊地址數(shù)組,每個(gè)數(shù)組元素就是塊的地址,第n個(gè)數(shù)組元素指向文件中的第n個(gè)塊,這樣訪問任意一個(gè)塊的時(shí)候,只需要從索引表中獲得塊地址就可以了。而且文件中的塊依然可以分散到不連續(xù)的零散空間中。其結(jié)構(gòu)如下圖所示

pYYBAGJ_YAWAFkxYAABzVcnN9-M003.jpg

既適應(yīng)于順序存訪問,也適應(yīng)于隨機(jī)訪問,是一種比較好的文件物理結(jié)構(gòu),但要有用于索引表的空間開銷和文件索引的時(shí)間開銷

Ext 文件分區(qū)布局

poYBAGJ_YAaAfvxyAAErmg6RqJ8946.jpg

每個(gè)分區(qū),將若干個(gè)塊兒組成一個(gè)塊組,每個(gè)塊組會有以下幾個(gè)結(jié)構(gòu)

超級塊

1)超級塊(Super Block)描述整個(gè)分區(qū)的文件系統(tǒng)信息,如inode/block的大小、總量、使用量、剩余量,以及文件系統(tǒng)的格式與相關(guān)信息。超級塊在每個(gè)塊組的開頭都有一份拷貝(第一個(gè)塊組必須有,后面的塊組可以沒有)。

為了保證文件系統(tǒng)在磁盤部分扇區(qū)出現(xiàn)物理問題的情況下還能正常工作,就必須保證文件系統(tǒng)的super block信息在這種情況下也能正常訪問。所以一個(gè)文件系統(tǒng)的super block會在多個(gè)block group中進(jìn)行備份,這些super block區(qū)域的數(shù)據(jù)保持一致。 超級塊記錄的信息有:

1、block 與 inode 的總量(分區(qū)內(nèi)所有Block Group的block和inode總量);
2、未使用與已使用的 inode / block 數(shù)量;
3、block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes);
4、filesystem 的掛載時(shí)間、最近一次寫入數(shù)據(jù)的時(shí)間、最近一次檢驗(yàn)磁盤 (fsck) 的時(shí)間等文件系統(tǒng)的相關(guān)信息;
5、一個(gè) valid bit 數(shù)值,若此文件系統(tǒng)已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。

它的結(jié)構(gòu)如圖所示

pYYBAGJ_YAaAQZcTAAEPREVSgxE404.jpg

對于ext2/3/4文件系統(tǒng),以上介紹的這些inode bitmap, data block bitmap和inode table,都可以通過一個(gè)名為"dumpe2fs"的工具來查看其在磁盤上的具體位置

GDT

2)塊組描述符表(GDT,Group Descriptor Table)由很多塊組描述符組成,整個(gè)分區(qū)分成多個(gè)塊組就對應(yīng)有多少個(gè)塊組描述符。
每個(gè)塊組描述符存儲一個(gè)塊組的描述信息,如在這個(gè)塊組中從哪里開始是inode Table,從哪里開始是Data Blocks,空閑的inode和數(shù)據(jù)塊還有多少個(gè)等等。

Inode 和 Block 位圖

4)inode位圖(inode Bitmap)和塊位圖類似,本身占一個(gè)塊,其中每個(gè)bit表示一個(gè)inode是否空閑可用。 Inode bitmap的作用是記錄block group中Inode區(qū)域的使用情況,Ext文件系統(tǒng)中一個(gè)block group中可以有16384個(gè)Inode,代表著這個(gè)Ext文件系統(tǒng)中一個(gè)block group最多可以描述16384個(gè)文件。

poYBAGJ_YAaAaNVOAACx0QY8ELI371.jpg

inode

索引表的索引結(jié)構(gòu)稱為inode,是"index node"的簡稱,用來索引,跟蹤一個(gè)文件的所有塊。inode是文件索引結(jié)構(gòu)組織形式的具體體現(xiàn),一個(gè)文件就必須對應(yīng)一個(gè)inode。

5)inode表(inode Table)由一個(gè)塊組中的所有inode組成。一個(gè)文件除了數(shù)據(jù)需要存儲之外,一些描述信息也需要存儲,如文件類型,權(quán)限,文件大小,創(chuàng)建、修改、訪問時(shí)間等,這些信息存在inode中而不是數(shù)據(jù)塊中。

inode表占多少個(gè)塊在格式化時(shí)就要寫入塊組描述符中。 在Ext2/Ext3文件系統(tǒng)中,每個(gè)文件在磁盤上的位置都由文件系統(tǒng)block group中的一個(gè)Inode指針進(jìn)行索引,Inode將會把具體的位置指向一些真正記錄文件數(shù)據(jù)的block塊,需要注意的是這些block可能和Inode同屬于一個(gè)block group也可能分屬于不同的block group。我們把文件系統(tǒng)上這些真實(shí)記錄文件數(shù)據(jù)的block稱為Data blocks。

索引表本身要占用存儲空間,如果文件很大時(shí),塊就比較多,索引表就會很大。UNIX為了解決這個(gè)問題,采用間接索引表來處理。

pYYBAGJ_YAaAIUY4AADhcfYvlj4616.jpg

ls -i 命令可以顯示inode 號

?  command ls -ilt
total 24
3003623(inode號) -rwxr-xr-x  1 root  root    78  8 10 16:43 jump
3003622(inode號) -rwxr-xr-x  1 root  root   476  8 10 16:42 jumper.sh
3003624(inode號) -rwxr-xr-x  1 root  root  3346  3 24  2019 imgcat

data block

6)數(shù)據(jù)塊(Data Block)是用來放置文件內(nèi)容數(shù)據(jù)的地方。根據(jù)不同的文件類型有以下幾種情況:
對于普通文件,文件的數(shù)據(jù)存儲在數(shù)據(jù)塊中。
對于目錄,該目錄下的所有文件名和目錄名存儲在所在目錄的數(shù)據(jù)塊中,除了文件名外,ls -l命令看到的其它信息保存在該文件的inode中。

文件分區(qū)實(shí)踐

我們根據(jù)實(shí)踐一下磁盤分區(qū)的步驟,實(shí)踐一下ext4下的文件管理系統(tǒng)的步驟。我們的系統(tǒng)如下。

Linux CentOS7 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

首先第一步,我們需要一塊硬盤,用于我是CentOS7的系統(tǒng),這里我在虛擬機(jī)上新建了一塊硬盤,容量是1G,這塊硬盤還沒有格式,我可以在我的/dev 目錄下找到這塊硬盤。

[root@CentOS7 ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb

查看分區(qū),我一共有兩塊硬盤,一塊是sda,一塊是sdb。我們接下來需要格式化一下sdb.

格式化硬盤

首先,我們需要用fdisk 將sdb

[root@CentOS7 ~]# fdisk /dev/sdb
歡迎使用 fdisk (util-linux 2.23.2)。

更改將停留在內(nèi)存中,直到您決定將更改寫入磁盤。
使用寫入命令前請三思。

Device does not contain a recognized partition table
使用磁盤標(biāo)識符 0x30c1a40d 創(chuàng)建新的 DOS 磁盤標(biāo)簽。

命令(輸入 m 獲取幫助):m  #獲取幫助命令
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   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)

命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)   (這里表示,我們沒有任何分許,允許你創(chuàng)建4個(gè)可用分區(qū),0個(gè)主分區(qū),和一個(gè)邏輯分區(qū))
   e   extended
Select (default p): p   (我們來創(chuàng)建主分區(qū))
分區(qū)號 (1-4,默認(rèn) 1):    (選擇分區(qū)號,默認(rèn)即可)
起始 扇區(qū) (2048-2097151,默認(rèn)為 2048):      (0-2048) # 前2048是系統(tǒng)預(yù)留空間 
將使用默認(rèn)值 2048
Last 扇區(qū), +扇區(qū) or +size{K,M,G} (2048-2097151,默認(rèn)為 2097151):  (我們直接全部將1g劃分為這個(gè)分區(qū))
將使用默認(rèn)值 2097151
分區(qū) 1 已設(shè)置為 Linux 類型,大小設(shè)為 1023 MiB

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

使用CentOS7 自帶的文件系統(tǒng)格式工具,將sdb整個(gè)硬盤格式化成ext4文件格式。
mke2fs:ext系列文件系統(tǒng)專用管理工具

[root@CentOS7 ~]# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
無論如何也要繼續(xù)? (y,n) y
文件系統(tǒng)標(biāo)簽=
OS type: Linux
塊大小=4096 (log=2)  
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks   # inodes數(shù)量和blicks 是數(shù)量
13107 blocks (5.00%) reserved for the super user
第一個(gè)數(shù)據(jù)塊=0
Maximum filesystem blocks=268435456
8 block groups      # 8個(gè)塊組
32768 blocks per group, 32768 fragments per group
8192 inodes per group                   # 每組 inode 的數(shù)量
Superblock backups stored on blocks:    # 超級快的存貯位置
	32768, 98304, 163840, 229376

Allocating group tables: 完成
正在寫入inode表: 完成
Creating journal (8192 blocks): 完成  # 創(chuàng)建日志區(qū)
Writing superblocks and filesystem accounting information: 完成

查看分區(qū)

經(jīng)過生面的步驟,我們已經(jīng)將分區(qū)創(chuàng)建完畢,我們使用blkid 命令來查看一下分區(qū)

[root@CentOS7 ~]# blkid
/dev/sda1: UUID="79678d4f-9276-4d1e-8093-28623d77461e" TYPE="xfs"
/dev/sda2: UUID="FtqgeH-yiRM-f1Wr-73LT-QkQf-2kgX-BkXYi1" TYPE="LVM2_member"
/dev/sr0: UUID="2020-04-22-00-54-00-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="d0412c8e-07f5-4716-8be7-8ed2da9affca" TYPE="xfs"
/dev/mapper/centos-swap: UUID="ac1ae2c7-d653-4496-97fa-d9315f56993f" TYPE="swap"
/dev/sdb: UUID="6285b923-0ee4-444d-9c68-d6af94914bc3" TYPE="ext4"

查看 超級塊和塊組

dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   
Last mounted on:          
Filesystem UUID:          6285b923-0ee4-444d-9c68-d6af94914bc3
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              262144
Reserved block count:     13107
Free blocks:              249189
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Wed Sep 30 12:22:05 2020
Last mount time:          n/a
Last write time:          Wed Sep 30 12:22:05 2020
Mount count:              0
Maximum mount count:      -1
Last checked:             Wed Sep 30 12:22:05 2020
Check interval:           0 ()
Lifetime writes:          33 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      61f49ab4-d494-4be8-95b7-404358b685aa
Journal backup:           inode blocks
Journal features:         (none)
日志大小:             32M
Journal length:           8192
Journal sequence:         0x00000001
Journal start:            0


Group 0: (Blocks 0-32767)
  Checksum 0x4cc2, unused inodes 8181
  主 superblock at 0, Group descriptors at 1-1
  保留的GDT塊位于 2-128
  Block bitmap at 129 (+129), Inode bitmap at 145 (+145)
  Inode表位于 161-672 (+161)
  28521 free blocks, 8181 free inodes, 2 directories, 8181個(gè)未使用的inodes
  可用塊數(shù): 142-144, 153-160, 4258-32767
  可用inode數(shù): 12-8192
Group 1: (Blocks 32768-65535) [INODE_UNINIT]
  Checksum 0xabae, unused inodes 8192
  備份 superblock at 32768, Group descriptors at 32769-32769
  保留的GDT塊位于 32770-32896
  Block bitmap at 130 (bg #0 + 130), Inode bitmap at 146 (bg #0 + 146)
  Inode表位于 673-1184 (bg #0 + 673)
  32639 free blocks, 8192 free inodes, 0 directories, 8192個(gè)未使用的inodes
  可用塊數(shù): 32897-65535
  可用inode數(shù): 8193-16384

...

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40275
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209322
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    284

    瀏覽量

    19904
收藏 人收藏

    評論

    相關(guān)推薦

    Linux平臺/proc虛擬文件系統(tǒng)詳解

    Linux 內(nèi)核提供了一種通過 /proc 文件系統(tǒng),在運(yùn)行時(shí)訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)、改變內(nèi)核設(shè)置的機(jī)制。proc
    發(fā)表于 06-08 10:49 ?1484次閱讀
    <b class='flag-5'>Linux</b>平臺/proc<b class='flag-5'>虛擬文件系統(tǒng)</b>詳解

    Linux虛擬文件系統(tǒng)的基礎(chǔ)知識

    虛擬文件系統(tǒng)是一個(gè)很龐大的架構(gòu),如果要分析的面面俱到,會顯得特別復(fù)雜而笨拙,讓人看著看著,就不知所云了(當(dāng)然主要還是筆者太菜),所以這篇博客,以 open() 函數(shù)為切入點(diǎn),來試著分析分析VFS文件系統(tǒng)的運(yùn)轉(zhuǎn)機(jī)理,本文的代碼來源于 li
    發(fā)表于 08-25 12:17 ?351次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>虛擬文件系統(tǒng)</b>的基礎(chǔ)知識

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

    1.VFS——虛擬文件系統(tǒng),是文件系統(tǒng)對外的接口2.cache——高速緩沖存儲器3.linux的每個(gè)文件都是由 i 節(jié)點(diǎn)的結(jié)構(gòu)體表示,i 節(jié)點(diǎn)包含對
    發(fā)表于 12-22 06:56

    Linux虛擬文件系統(tǒng)實(shí)現(xiàn)技術(shù)探討

    文章論述了 Linux 文件系統(tǒng)的邏輯關(guān)系和邏輯結(jié)構(gòu),對VFS 中幾個(gè)主要的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了分析,剖析Linux 文件系統(tǒng) 中一個(gè)物理
    發(fā)表于 06-08 17:51 ?32次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>虛擬文件系統(tǒng)</b>實(shí)現(xiàn)技術(shù)探討

    玩轉(zhuǎn)Linux,先把文件系統(tǒng)搞懂

    引入了虛擬文件系統(tǒng) VFS(Virtual File System) ,為各類文件系統(tǒng)提供一個(gè)統(tǒng)一的操作界面和應(yīng)用編程接口。
    發(fā)表于 08-16 10:50 ?2073次閱讀
    玩轉(zhuǎn)<b class='flag-5'>Linux</b>,先把<b class='flag-5'>文件系統(tǒng)</b>搞懂

    Xilinx Zynq制作修改根文件系統(tǒng)的方法

    proc文件系統(tǒng)是用來提供內(nèi)核和進(jìn)程信息的虛擬文件系統(tǒng),使用內(nèi)核自動(dòng)生成的文件,加載完成一定要能查到很多信息才對。
    發(fā)表于 07-13 08:31 ?3544次閱讀

    linux 虛擬文件可以系統(tǒng)實(shí)現(xiàn)

    虛擬文件系統(tǒng)(VFS)是linux內(nèi)核和具體I/O設(shè)備之間的封裝的一層共通訪問接口,通過這層接口,linux內(nèi)核可以以同一的方式訪問各種I/
    發(fā)表于 05-04 16:56 ?497次閱讀
    <b class='flag-5'>linux</b> <b class='flag-5'>虛擬文件</b>可以<b class='flag-5'>系統(tǒng)</b>實(shí)現(xiàn)

    嵌入式Linux常用文件系統(tǒng)

    Linux支持很多文件系統(tǒng),在選擇時(shí)應(yīng)根據(jù)應(yīng)用的功能選擇文件系統(tǒng) 內(nèi)核只認(rèn)識VFS(虛擬文件系統(tǒng)),不同的
    發(fā)表于 05-04 17:19 ?2390次閱讀
    嵌入式<b class='flag-5'>Linux</b>常用<b class='flag-5'>文件系統(tǒng)</b>

    簡單介紹Linux虛擬文件系統(tǒng)–VFS

    Linux中可以支持多種文件系統(tǒng),而且支持各種文件系統(tǒng)之間相互訪問,這是因?yàn)橛幸粋€(gè)虛擬文件系統(tǒng)。虛擬文件系統(tǒng)也叫
    發(fā)表于 04-24 14:35 ?1366次閱讀

    Linux 內(nèi)核/sys 文件系統(tǒng)介紹

    linux2.6內(nèi)核引入sysfs文件系統(tǒng),sysfs可以看成與proc,devfs和devpty同類別的文件系統(tǒng),該文件系統(tǒng)
    發(fā)表于 04-25 16:20 ?4291次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>/sys <b class='flag-5'>文件系統(tǒng)</b>介紹

    linux文件系統(tǒng)中的虛擬文件系統(tǒng)設(shè)計(jì)詳解

    Linux 中允許眾多不同的文件系統(tǒng)共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統(tǒng) 調(diào)用即可對 Linux
    發(fā)表于 04-02 14:37 ?1814次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>文件系統(tǒng)</b>中的<b class='flag-5'>虛擬文件系統(tǒng)</b>設(shè)計(jì)詳解

    如何區(qū)別Linux文件系統(tǒng)呢?

    虛擬文件系統(tǒng)是一種神奇的抽象,它使得 “一切皆文件” 哲學(xué)在 Linux 中成為了可能。
    的頭像 發(fā)表于 08-09 18:00 ?3694次閱讀

    Linux文件系統(tǒng)與持久性內(nèi)存

    1、Linux 虛擬文件系統(tǒng)介紹 在 Linux 系統(tǒng)中一切皆文件,除了通常所說的狹義的文件以外
    的頭像 發(fā)表于 11-26 14:34 ?2527次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>與持久性內(nèi)存

    RT-Thread文檔_虛擬文件系統(tǒng)

    RT-Thread文檔_虛擬文件系統(tǒng)
    發(fā)表于 02-22 18:42 ?1次下載
    RT-Thread文檔_<b class='flag-5'>虛擬文件系統(tǒng)</b>

    Jtti:Linux虛擬文件系統(tǒng)和容器化的關(guān)系

    Linux中,虛擬文件系統(tǒng)(VFS)和容器化技術(shù)之間有密切的關(guān)系。容器化是指通過使用容器來運(yùn)行應(yīng)用程序,而容器本質(zhì)上是在宿主機(jī)上運(yùn)行的獨(dú)立進(jìn)程,它們通常共享宿主機(jī)的操作系統(tǒng)內(nèi)核和部分
    的頭像 發(fā)表于 11-27 15:38 ?142次閱讀
    RM新时代网站-首页