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

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

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

如何學(xué)習(xí)Linux的文件系統(tǒng)

xCb1_yikoulinux ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-07-21 14:42 ? 次閱讀

文件系統(tǒng)

概述

提到文件系統(tǒng),Linux的老江湖們對(duì)這個(gè)概念當(dāng)然不會(huì)陌生,然而剛接觸Linux的新手們就會(huì)被文件系統(tǒng)這個(gè)概念弄得暈頭轉(zhuǎn)向,恰好我當(dāng)年正好屬于后者。

windows下轉(zhuǎn)到Linux的童鞋聽(tīng)到最多的應(yīng)該是fat32ntfs(在windows 2000之后所出現(xiàn)的一種新型的日志文件系統(tǒng)),那個(gè)年代經(jīng)常聽(tīng)到說(shuō)“我要把C盤格式化成ntfs格式,D盤格式化成fat32格式”。

一到Linux下,很多入門Linux的書籍中當(dāng)牽扯到文件系統(tǒng)這個(gè)術(shù)語(yǔ)時(shí),二話不說(shuō),不管三七二十一就給出了下面這個(gè)圖,然后逐一解釋一下每個(gè)目錄是拿來(lái)干啥的、里面會(huì)放什么類型的文件就完事兒了,弄得初學(xué)者經(jīng)?!罢啥蜕忻恢^腦”。

f7ecb8fa-08a7-11ed-ba43-dac502259ad0.jpg

本文的目的就是和大家分享一下我當(dāng)初是如何學(xué)習(xí)Linux的文件系統(tǒng)的,也算是一個(gè)“老”油條的一些心得吧。

文件系統(tǒng)”的主語(yǔ)是“文件”,那么文件系統(tǒng)的意思就是“用于管理文件的(管理)系統(tǒng)”,在大多數(shù)操作系統(tǒng)教材里,“文件是數(shù)據(jù)的集合”這個(gè)基本點(diǎn)是一致的,而這些數(shù)據(jù)最終都是存儲(chǔ)在存儲(chǔ)介質(zhì)里,如硬盤、光盤、U盤等。

另一方面,用戶在管理數(shù)據(jù)時(shí)也是文件為基本單位,他們所關(guān)心的問(wèn)題是:

  • ? 1.我的文件在什么地方放著?

  • ? 2.我如何將數(shù)據(jù)存入某個(gè)文件?

  • ? 3.如何從文件里將數(shù)據(jù)讀出來(lái)?

  • ? 4.不再需要的文件怎么將其刪除?

簡(jiǎn)而言之,文件系統(tǒng)就是一套用于定義文件的命名和組織數(shù)據(jù)的規(guī)范,其根本目的是便對(duì)文件進(jìn)行查詢和存取。

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

在Linux早期設(shè)計(jì)階段,文件系統(tǒng)與內(nèi)核代碼是整合在一起的,這樣做的缺點(diǎn)是顯而易見(jiàn)的。假如,我的系統(tǒng)只能識(shí)別ext3格式的文件系統(tǒng),我的U盤是fat32格式,那么很不幸的是我的U盤將不會(huì)被我的系統(tǒng)所識(shí)別,

為了支持不同種類的文件系統(tǒng),Linux采用了在Unix系統(tǒng)中已經(jīng)廣泛采用的設(shè)計(jì)思想,通過(guò)虛擬文件系統(tǒng)VFS來(lái)屏蔽下層各種不同類型文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)和差異。

其實(shí)VFS最早是由Sun公司提出的,其基本思想是將各種文件系統(tǒng)的公共部分抽取出來(lái),形成一個(gè)抽象層。對(duì)用戶的應(yīng)用程序而言,VFS提供了文件系統(tǒng)的系統(tǒng)調(diào)用接口。而對(duì)具體的文件系統(tǒng)來(lái)說(shuō),VFS通過(guò)一系列統(tǒng)一的外部接口屏蔽了實(shí)現(xiàn)細(xì)節(jié),使得對(duì)文件的操作不再關(guān)心下層文件系統(tǒng)的類型,更不用關(guān)心具體的存儲(chǔ)介質(zhì),這一切都是透明的。

ext2文件系統(tǒng)

虛擬文件系統(tǒng)VFS是對(duì)各種文件系統(tǒng)的一個(gè)抽象層,抽取其共性,以便對(duì)外提供統(tǒng)一管理接口,便于內(nèi)核對(duì)不同種類的文件系統(tǒng)進(jìn)行管理。那么首先我們得看一下對(duì)于一個(gè)具體的文件系統(tǒng),我們?cè)撽P(guān)注重點(diǎn)在哪里。

對(duì)于存儲(chǔ)設(shè)備(以硬盤為例)上的數(shù)據(jù),可分為兩部分:

  • ?用戶數(shù)據(jù):存儲(chǔ)用戶實(shí)際數(shù)據(jù)的部分;

  • ?管理數(shù)據(jù):用于管理這些數(shù)據(jù)的部分,這部分我們通常叫它元數(shù)據(jù)(metadata)。

我們今天要討論的就是這些元數(shù)據(jù)。這里有個(gè)概念首先需要明確一下:塊設(shè)備。所謂塊設(shè)備就是以塊為基本讀寫單位的設(shè)備,支持緩沖和隨機(jī)訪問(wèn)。每個(gè)文件系統(tǒng)提供的mk2fs.xx工具都支持在構(gòu)建文件系統(tǒng)時(shí)由用戶指定塊大小,當(dāng)然用戶不指定時(shí)會(huì)有一個(gè)缺省值。

我們知道一般硬盤的每個(gè)扇區(qū)512字節(jié),而多個(gè)相鄰的若干扇區(qū)就構(gòu)成了一個(gè),從文件系統(tǒng)的角度看這個(gè)簇對(duì)應(yīng)的就是我們這里所說(shuō)塊。用戶從上層下發(fā)的數(shù)據(jù)首先被緩存在塊設(shè)備的緩存里,當(dāng)寫滿一個(gè)塊時(shí)數(shù)據(jù)才會(huì)被發(fā)給硬盤驅(qū)動(dòng)程序?qū)?shù)據(jù)最終寫到存儲(chǔ)介質(zhì)上。如果想將設(shè)備緩存中數(shù)據(jù)立即寫到存儲(chǔ)介質(zhì)上可以通過(guò)sync命令來(lái)完成。

塊越大存儲(chǔ)性能越好,但浪費(fèi)比較嚴(yán)重;塊越小空間利用率較高,但性能相對(duì)較低。如果你不是專業(yè)的“骨灰級(jí)”玩兒家,在存儲(chǔ)設(shè)備上構(gòu)建文件系統(tǒng)時(shí),塊大小就用默認(rèn)值。通過(guò)命令“tune2fs -l /dev/sda1”可以查看該存儲(chǔ)設(shè)備上文件系統(tǒng)所使用的塊大小:

[root@localhost~]#tune2fs-l/dev/sda1
tune2fs1.39(29-May-2006)
Filesystemvolumename:/boot
Lastmountedon:
FilesystemUUID:6ade5e49-ddab-4bf1-9a45-a0a742995775
Filesystemmagicnumber:0xEF53
Filesystemrevision#:1(dynamic)
Filesystemfeatures:has_journalext_attrresize_inodedir_indexfiletypeneeds_recoverysparse_super
Defaultmountoptions:user_xattracl
Filesystemstate:clean
Errorsbehavior:Continue
FilesystemOStype:Linux
Inodecount:38152
Blockcount:152584
Reservedblockcount:7629
Freeblocks:130852
Freeinodes:38111
Firstblock:1
Blocksize:1024
Fragmentsize:1024
ReservedGDTblocks:256
Blockspergroup:8192
Fragmentspergroup:8192
Inodespergroup:2008
Inodeblockspergroup:251
Filesystemcreated:ThuDec1300:42:522012
Lastmounttime:TueNov2010:35:282012
Lastwritetime:TueNov2010:35:282012
Mountcount:12
Maximummountcount:-1
Lastchecked:ThuDec1300:42:522012
Checkinterval:0()
Reservedblocksuid:0(userroot)
Reservedblocksgid:0(grouproot)
Firstinode:11
Inodesize:128
Journalinode:8
Defaultdirectoryhash:tea
DirectoryHashSeed:72070587-1b60-42de-bd8b-a7b7eb7cbe63
Journalbackup:inodeblocks

該命令已經(jīng)暴露了文件系統(tǒng)的很多信息,接下我們將詳細(xì)分析它們。

下圖是我的虛擬機(jī)的情況,三塊IDE的硬盤。容量分別是:

hda: 37580963840/(102410241024)=35GB
hdb: 8589934592/(102410241024)=8GB
hdd: 8589934592/(102410241024)=8GB

f8041f7c-08a7-11ed-ba43-dac502259ad0.jpg

如果這是三塊實(shí)際的物理硬盤的話,廠家所標(biāo)稱的容量就分別是37.5GB、8.5GB和8.5GB??赡苡行┩X(jué)得虛擬機(jī)有點(diǎn)“假”,那么我就來(lái)看看實(shí)際硬盤到底是個(gè)啥樣子。

主角1:西部數(shù)據(jù) 500G SATA接口 CentOS 5.5

實(shí)際容量:500107862016B = 465.7GB

f82376ec-08a7-11ed-ba43-dac502259ad0.jpg

主角2:希捷 160G SCSI接口 CentOS 5.5

實(shí)際容量:160041885696B=149GB

f833850a-08a7-11ed-ba43-dac502259ad0.jpg

大家可以看到,VMware公司的水平還是相當(dāng)不錯(cuò)的,虛擬硬盤和物理硬盤“根本”看不出差別,畢竟屬于云平臺(tái)基礎(chǔ)架構(gòu)支撐者的風(fēng)云人物嘛。

以硬盤/dev/hdd1為例,它是我新增的一塊新盤,格式化成ext2后,根目錄下只有一個(gè)lost+found目錄,讓我們來(lái)看一下它的布局情況,以此來(lái)開(kāi)始我們的文件系統(tǒng)之旅。

f84a0afa-08a7-11ed-ba43-dac502259ad0.jpg

對(duì)于使用了ext2文件系統(tǒng)的分區(qū)來(lái)說(shuō),有一個(gè)叫superblock的結(jié)構(gòu)superblock的大小為1024字節(jié),其實(shí)ext3的superblock也是1024字節(jié)。下面的小程序可以證明這一點(diǎn)

#include
#include
#include

intmain(intargc,char**argv){
printf("sizeofofext2superblock=%d
",sizeof(structext2_super_block));
printf("sizeofofext3superblock=%d
",sizeof(structext3_super_block));
return0;
}

******************【運(yùn)行結(jié)果】******************
sizeofofext2superblock=1024
sizeofofext3superblock=1024

盤的第一個(gè)字節(jié)是從0開(kāi)始編號(hào),所以第一個(gè)字節(jié)是byte0,以此類推。/dev/hdd1分區(qū)頭部的1024個(gè)字節(jié)(從byte0~byte1023)都用0填充,因?yàn)?dev/hdd1不是主引導(dǎo)盤。superblock是從byte1024開(kāi)始,占1024B存儲(chǔ)空間。我們用dd命令把superblock的信息提取出來(lái)

dd if=/dev/hdd1 of=./hdd1sb bs=1024 skip=1 count=1

上述命令將從/dev/hdd1分區(qū)的byte1024處開(kāi)始,提取1024個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)到當(dāng)前目錄下的hdd1sb文件里,該文件里就存儲(chǔ)了我們superblock的所有信息,上面的程序稍加改造,我們就可以以更直觀的方式看到superblock的輸出了如下:

#include
#include
#include
#include
#include
#include
#include
#include

intmain(intargc,char**argv){
printf("sizeofofext2superblock=%d
",sizeof(structext2_super_block));
printf("sizeofofext3superblock=%d
",sizeof(structext3_super_block));
charbuf[1024]={0};
intfd=-1;
structext2_super_blockhdd1sb;
memset(&hdd1sb,0,1024);

if(-1==(fd=open("./hdd1sb",O_RDONLY,0777))){
printf("openfileerror!
");
return1;
}

if(-1==read(fd,buf,1024)){
printf("readerror!
");
close(fd);
return1;
}

memcpy((char*)&hdd1sb,buf,1024);
printf("inodecount:%ld
",hdd1sb.s_inodes_count);
printf("blockcount:%ld
",hdd1sb.s_blocks_count);
printf("Reservedblockscount:%ld
",hdd1sb.s_r_blocks_count);
printf("Freeblockscount:%ld
",hdd1sb.s_free_blocks_count);
printf("Freeinodescount:%ld
",hdd1sb.s_free_inodes_count);
printf("FirstDataBlock:%ld
",hdd1sb.s_first_data_block);
printf("Blocksize:%ld
",1<<(hdd1sb.s_log_block_size+10));
printf("Fragmentsize:%ld
",1<<(hdd1sb.s_log_frag_size+10));
printf("Blockspergroup:%ld
",hdd1sb.s_blocks_per_group);
printf("Fragmentspergroup:%ld
",hdd1sb.s_frags_per_group);
printf("Inodespergroup:%ld
",hdd1sb.s_inodes_per_group);
printf("Magicsignature:0x%x
",hdd1sb.s_magic);
printf("sizeofinodestructure:%d
",hdd1sb.s_inode_size);
close(fd);
return0;
}

******************【運(yùn)行結(jié)果】******************
inodecount:1048576
blockcount:2097065
Reservedblockscount:104853
Freeblockscount:2059546
Freeinodescount:1048565
FirstDataBlock:0
Blocksize:4096
Fragmentsize:4096
Blockspergroup:32768
Fragmentspergroup:32768
Inodespergroup:16384
Magicsignature:0xef53
sizeofinodestructure:128

可以看出,superblock的作用就是記錄文件系統(tǒng)的類型、block大小、block總數(shù)、inode大小、inode總數(shù)、group的總數(shù)等信息。

對(duì)于ext2/ext3文件系統(tǒng)來(lái)說(shuō)數(shù)字簽名Magic signature都是0xef53,如果不是那么它一定不是ext2/ext3文件系統(tǒng)。這里我們可以看到,我們的/dev/hdd1確實(shí)是ext2文件系統(tǒng)類型。hdd1中一共包含1048576個(gè)inode節(jié)點(diǎn)(inode編號(hào)從1開(kāi)始),每個(gè)inode節(jié)點(diǎn)大小為128字節(jié),所有inode消耗的存儲(chǔ)空間是1048576×128=128MB;總共包含2097065個(gè)block,每個(gè)block大小為4096字節(jié),每32768個(gè)block組成一個(gè)group,所以一共有2097065/32768=63.99,即64個(gè)group(group編號(hào)從0開(kāi)始,即Group0~Group63)。所以整個(gè)/dev/hdd1被劃分成了64個(gè)group,詳情如下:

f8606124-08a7-11ed-ba43-dac502259ad0.jpg

用命令tune2fs可以驗(yàn)證我們之前的分析:

f875fab6-08a7-11ed-ba43-dac502259ad0.jpg

再通過(guò)命令dumpe2fs /dev/hdd1的輸出,可以得到我們關(guān)注如下部分:

f89d967a-08a7-11ed-ba43-dac502259ad0.jpg

接下來(lái)以Group0為例,主superblock在Group0的block0里,根據(jù)前面的分析,我們可以畫出主superblock在block0中的位置如下:

f8afce6c-08a7-11ed-ba43-dac502259ad0.jpg

因?yàn)?/span>superblock是如此之重要,一旦它出錯(cuò)你的整個(gè)系統(tǒng)就玩兒完了,所以文件系統(tǒng)中會(huì)存在磁盤的多個(gè)不同位置會(huì)存在主superblock的備份副本,一旦系統(tǒng)出問(wèn)題后還可以通過(guò)備份的superblock對(duì)文件系統(tǒng)進(jìn)行修復(fù)。

第一版ext2文件系統(tǒng)的實(shí)現(xiàn)里,每個(gè)Group里都存在一份superblock的副本,然而這樣做的負(fù)面效果也是相當(dāng)明顯,那就是嚴(yán)重降低了磁盤的空間利用率。所以在后續(xù)ext2的實(shí)現(xiàn)代碼中,選擇用于備份superblock的Group組號(hào)的原則是3的N次方、5的N次方、7的N次方其中N=0,1,2,3…。根據(jù)這個(gè)公式我們來(lái)計(jì)算一下/dev/hdd1中備份有supeblock的Group號(hào):

f8c8d2a4-08a7-11ed-ba43-dac502259ad0.png

也就是說(shuō)Group1、3、5、7、9、25、27、49里都保存有superblock的拷貝,如下:

f8db454c-08a7-11ed-ba43-dac502259ad0.jpg

用block號(hào)分別除以32768就得到了備份superblock的Group號(hào),和我們?cè)谏厦婵吹降慕Y(jié)果一致。我們來(lái)看一下/dev/hdd1中Group和block的關(guān)系:

f8f2ecec-08a7-11ed-ba43-dac502259ad0.jpg

從上圖中我們可以清晰地看出在使用了ext2文件系統(tǒng)的分區(qū)上,包含有主superblock的Group、備份superblock的Group以及沒(méi)有備份superblock的Group的布局情況。存儲(chǔ)了superblock的Group中有一個(gè)組描述符(Group descriptors)緊跟在superblock所在的block后面,占一個(gè)block大小;同時(shí)還有個(gè)Reserved GDT跟在組描述符的后面。

Reserved GDT的存在主要是支持ext2文件系統(tǒng)的resize功能,它有自己的inode和data block,這樣一來(lái)如果文件系統(tǒng)動(dòng)態(tài)增大,Reserved GDT就正好可以騰出一部分空間讓Group descriptor向下擴(kuò)展。

【底層原理】徹底理解Linux文件系統(tǒng)(二)

superblock,inode,block,group,group descriptor,block bitmap,inode table

下面我們來(lái)認(rèn)識(shí)一下superblock,inode,block,group,group descriptor,block bitmap,inode table這些家伙。

superblock

這個(gè)東西確實(shí)很重要,前面我們已經(jīng)見(jiàn)識(shí)過(guò)。為此,文件系統(tǒng)還特意精挑細(xì)選的找了N多后備Group,在這些Group中都存有superblock的副本,你就知道它有多重要了。

說(shuō)白了,superblock 的作用就是記錄文件系統(tǒng)的類型、block大小、block總數(shù)、inode大小、inode總數(shù)、group的總數(shù)等等。

group descriptors

千萬(wàn)不要以為這就是一個(gè)組描述符,看到descriptor后面加了個(gè)s就知道這是N多描述符的集合。確實(shí),這是文件系統(tǒng)中所有g(shù)roup的描述符所構(gòu)成的一個(gè)數(shù)組,它的結(jié)構(gòu)定義在include/linux/ext2_fs.h中:

//Structureofablocksgroupdescriptor
structext2_group_desc
{
__le32bg_block_bitmap;/*group中blockbitmap所在的第一個(gè)block號(hào)*/
__le32bg_inode_bitmap;/*group中inodebitmap所在的第一個(gè)block號(hào)*/
__le32bg_inode_table;/*group中inodestable所在的第一個(gè)block號(hào)*/
__le16bg_free_blocks_count;/*group中空閑的block總數(shù)*/
__le16bg_free_inodes_count;/*group中空閑的inode總數(shù)*/
__le16bg_used_dirs_count;/*目錄數(shù)*/
__le16bg_pad;
__le32bg_reserved[3];
};

下面的程序可以幫助了解一下/dev/hdd1中所有g(shù)roup的descriptor的詳情:

#defineB_LEN32//一個(gè)struct ext2_group_desc{}占固定32字節(jié)
intmain(intargc,char**argv){
charbuf[B_LEN]={0};
inti=0,fd=-1;
structext2_group_descgd;
memset(&gd,0,B_LEN);

if(-1==(fd=open(argv[1],O_RDONLY,0777))){
printf("openfileerror!
");
return1;
}

while(i<64){//因?yàn)槲乙呀?jīng)知道了/dev/hdd1中只有64個(gè)group
if(-1==read(fd,buf,B_LEN)){
printf("readerror!
");
close(fd);
return1;
}

memcpy((char*)&gd,buf,B_LEN);
printf("==========Group%d:==========
",i);
printf("Blocksbitmapblock%ld
",gd.bg_block_bitmap);
printf("Inodesbitmapblock%ld
",gd.bg_inode_bitmap);
printf("Inodestableblock%ld
",gd.bg_inode_table);
printf("Freeblockscount%d
",gd.bg_free_blocks_count);
printf("Freeinodescount%d
",gd.bg_free_inodes_count);
printf("Directoriescount%d
",gd.bg_used_dirs_count);

memset(buf,0,B_LEN);
i++;
}

close(fd);
return0;
}

運(yùn)行結(jié)果和dumpe2fs /dev/hdd1的輸出對(duì)比如下:
f8ffc0ac-08a7-11ed-ba43-dac502259ad0.jpg其中,文件gp0decp是由命令“dd if=/dev/hdd1 of=./gp0decp bs=4096 skip=1 count=1”生成。每個(gè)group descriptor里記錄了該group中的inode table的起始block號(hào),因?yàn)閕node table有可能會(huì)占用連續(xù)的多個(gè)block;空閑的block、inode數(shù)等等。

block bitmap:

在文件系統(tǒng)中每個(gè)對(duì)象都有一個(gè)對(duì)應(yīng)的inode節(jié)點(diǎn)(這句話有些不太準(zhǔn)確,因?yàn)榉?hào)鏈接和它的目標(biāo)文件共用一個(gè)inode),里存儲(chǔ)了一個(gè)對(duì)象(文件或目錄)的信息有權(quán)限、所占字節(jié)數(shù)、創(chuàng)建時(shí)間、修改時(shí)間、鏈接數(shù)、屬主ID、組ID,如果是文件的話還會(huì)包含文件內(nèi)容占用的block總數(shù)以及block號(hào)。inode是從1編號(hào),這一點(diǎn)不同于block。

需要格外注意。另外,/dev/hdd1是新掛載的硬盤,格式化成ext2后并沒(méi)有任何數(shù)據(jù),只有一個(gè)lost+found目錄。接下來(lái)我們用命令“dd if=/dev/hdd1 of=./gp0 bs=4096 count=32768”將Group0里的所有數(shù)據(jù)提取出來(lái)。

前面已經(jīng)了解了Group0的一些基本信息如下:

Group0:(Blocks0-32767)
Primarysuperblockat0,Groupdescriptorsat1-1
ReservedGDTblocksat2-512
Blockbitmapat513(+513),Inodebitmapat514(+514)
Inodetableat515-1026(+515)
31739freeblocks,16374freeinodes,1directories#包含一個(gè)目錄
Freeblocks:1028-1031,1033-32767#一共有31739個(gè)空閑block
Freeinodes:11-16384#一共有16374個(gè)空閑inode

一個(gè)block bitmap占用一個(gè)block大小,而block bitmap中每個(gè)bit表示一個(gè)對(duì)應(yīng)block的占用情況,0表示對(duì)應(yīng)的block為空,為1表示相應(yīng)的block中存有數(shù)據(jù)。在/dev/hdd1中,一個(gè)group里最多只能包含8×4096=32768個(gè)block,這一點(diǎn)我們已經(jīng)清楚了。接下來(lái)我們來(lái)看一下Group0的block bitmap,如下:
f90dae4c-08a7-11ed-ba43-dac502259ad0.jpg發(fā)現(xiàn)block bitmap的前128字節(jié)和第129字節(jié)的低4位都為1,說(shuō)明發(fā)現(xiàn)Group0中前128×8+4=1028個(gè)block,即block0block1027都已被使用了。第129字節(jié)的高4位為0,表示block1028block1031四個(gè)block是空閑的;第130字節(jié)的最低位是1,說(shuō)明block1032被占用了;從block1033~block32767的block bitmap都是0,所以這些block都是空閑的,和上表輸出的結(jié)果一致。

inode bitmap

和block bitmap類似,innode bitmap的每個(gè)比特表示相應(yīng)的inode是否被使用。Group0的inode bitmap如下:
f91e1b7e-08a7-11ed-ba43-dac502259ad0.jpg/dev/hdd1里inode總數(shù)為1048576,要被均分到64個(gè)Group里,所以每個(gè)Group中都包含了16384個(gè)inode。要表示每個(gè)Group中16384個(gè)inode,inode bitmap總共需要使用2048(16384/8)字節(jié)。inode bitmap本身就占據(jù)了一個(gè)block,所以它只用到了該block中的前2048個(gè)字節(jié),剩下的2048字節(jié)都被填充成1,如上圖所示。

我們可以看到Group0中的inode bitmap前兩個(gè)字節(jié)分別是ff和03,說(shuō)明Group0里的前11個(gè)inode已經(jīng)被使用了。其中前10個(gè)inode被ext2預(yù)留起來(lái),第11個(gè)inode就是lost+found目錄,如下:
f92870b0-08a7-11ed-ba43-dac502259ad0.jpg

inode table

那么每個(gè)Group中的所有inode到底存放在哪里呢?答案就是inode table。它是每個(gè)Group中所有inode的聚合地。

因?yàn)橐粋€(gè)inode占128字節(jié),所以每個(gè)Group里的所有inode共占16384×128=2097152字節(jié),總共消耗了512個(gè)block。Group的group descriptor里記錄了inode table的所占block的起始號(hào),所以就可以唯一確定每個(gè)Group里inode table所在的block的起始號(hào)和結(jié)束號(hào)了。inode的結(jié)構(gòu)如下:
f939e1d8-08a7-11ed-ba43-dac502259ad0.jpg這里我們主要關(guān)注的其中的數(shù)據(jù)block指針部分。前12個(gè)block指針直接指向了存有數(shù)據(jù)的block號(hào);第13個(gè)block指針?biāo)赶虻腷lock中存儲(chǔ)的并不是數(shù)據(jù)而是由其他block號(hào),這些block號(hào)所對(duì)應(yīng)的block里存儲(chǔ)的才是真正的數(shù)據(jù),即所謂的兩級(jí)block指針;第14個(gè)block為三級(jí)block指針;第15個(gè)block為四級(jí)block指針。最后效果圖如下:
f941a95e-08a7-11ed-ba43-dac502259ad0.jpg一個(gè)block為4096字節(jié),每個(gè)塊指針4字節(jié),所以一個(gè)block里最多可以容納4096/4=1024個(gè)block指針,我們可以計(jì)算出一個(gè)inode最大能表示的單個(gè)文件的最大容量如下:

直接block指針(字節(jié)) 兩級(jí)block指針(字節(jié)) 三 級(jí)block指針(字節(jié)) 四 級(jí)block指針(字節(jié)) 單個(gè)文件的最大容量(字節(jié))
12×409 4096/4×4096 40962/4×4096 40963/4×4096 4TB

所以,我們可以得出不同block大小,對(duì)單個(gè)文件最大容量的影響。假設(shè)block大小為X字節(jié),則:

f961f434-08a7-11ed-ba43-dac502259ad0.jpg

如下表所示:

block大小(字節(jié)) 單個(gè)文件容量(字節(jié))
1024 17247240192字節(jié)(16GB)
2048 275415826432字節(jié)(256GB)
4096 4402345672704字節(jié)(4TB)

最后來(lái)一張全家福:

f96dfd42-08a7-11ed-ba43-dac502259ad0.jpg

審核編輯 :李倩


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

    關(guān)注

    87

    文章

    11304

    瀏覽量

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

    關(guān)注

    0

    文章

    284

    瀏覽量

    19911

原文標(biāo)題:【底層原理】徹底理解Linux文件系統(tǒng)(二)

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    stm32單片機(jī)基于rt-thread 的 littlefs 文件系統(tǒng) 的使用

    簡(jiǎn)介littlefs是ARM官方推出的,專為嵌入式系統(tǒng)設(shè)計(jì)的文件系統(tǒng),相比傳統(tǒng)的文件系統(tǒng),littlefs具有以下優(yōu)點(diǎn):1、自帶擦寫均衡2、支持掉電保護(hù)3、占用的
    的頭像 發(fā)表于 11-06 08:04 ?687次閱讀
    stm32單片機(jī)基于rt-thread 的 littlefs <b class='flag-5'>文件系統(tǒng)</b> 的使用

    服務(wù)器數(shù)據(jù)恢復(fù)—EXT3文件系統(tǒng)下誤刪除數(shù)據(jù)的恢復(fù)案例

    服務(wù)器數(shù)據(jù)恢復(fù)環(huán)境: 郵件服務(wù)器中有一組由8塊盤組成的RAID5陣列, 上層是Linux操作系統(tǒng)+EXT3文件系統(tǒng)。 服務(wù)器故障: 由于誤刪除導(dǎo)致文件系統(tǒng)中的郵件數(shù)據(jù)丟失。
    的頭像 發(fā)表于 10-23 15:11 ?171次閱讀
    服務(wù)器數(shù)據(jù)恢復(fù)—EXT3<b class='flag-5'>文件系統(tǒng)</b>下誤刪除數(shù)據(jù)的恢復(fù)案例

    Linux開(kāi)發(fā)怎么學(xué)?

    可以幫助你更好地掌握 Linux 的命令行操作。可以通過(guò)閱讀相關(guān)的書籍、在線教程等方式學(xué)習(xí)。 5.學(xué)習(xí) Linux 文件系統(tǒng)
    發(fā)表于 10-10 14:34

    Linux文件系統(tǒng)的掛載過(guò)程

    Linux文件系統(tǒng)(rootfs)是Linux系統(tǒng)中所有其他文件系統(tǒng)和目錄的起點(diǎn),它是內(nèi)核啟動(dòng)時(shí)掛載的第一個(gè)
    的頭像 發(fā)表于 10-05 16:50 ?424次閱讀

    如何構(gòu)建Linux文件系統(tǒng)

    構(gòu)建Linux文件系統(tǒng)是一個(gè)涉及多個(gè)步驟和概念的過(guò)程,它對(duì)于Linux系統(tǒng)的啟動(dòng)和運(yùn)行至關(guān)重要。
    的頭像 發(fā)表于 10-05 16:47 ?304次閱讀

    想提高開(kāi)發(fā)效率,不要忘記文件系統(tǒng)

    ?同學(xué)們都知道,開(kāi)發(fā)過(guò)程中文件系統(tǒng)的重要性,同樣的,4G-Cat.1模組的文件系統(tǒng)也非常重要,它通常與數(shù)據(jù)傳輸速度、存儲(chǔ)效率,以及數(shù)據(jù)安全性等有非常重要的關(guān)系,在應(yīng)用開(kāi)發(fā)中也非常重要。
    的頭像 發(fā)表于 09-21 08:18 ?244次閱讀
    想提高開(kāi)發(fā)效率,不要忘記<b class='flag-5'>文件系統(tǒng)</b>

    服務(wù)器數(shù)據(jù)恢復(fù)—xfs文件系統(tǒng)服務(wù)器數(shù)據(jù)恢復(fù)案例

    某公司一臺(tái)服務(wù)器,連接了一臺(tái)存儲(chǔ)。該服務(wù)器安裝linux操作系統(tǒng)文件系統(tǒng)為xfs。 在運(yùn)行過(guò)程中該服務(wù)器出現(xiàn)故障,管理員使用xfs_repair工具試圖對(duì)xfs文件系統(tǒng)進(jìn)行修復(fù)但失
    的頭像 發(fā)表于 08-19 10:49 ?297次閱讀

    如何更改Linux文件系統(tǒng)終端顯示顏色

    自己制作的簡(jiǎn)單 Linux 文件系統(tǒng),你會(huì)發(fā)現(xiàn)終端顯示為黑白色,很不好看
    的頭像 發(fā)表于 08-12 17:29 ?551次閱讀
    如何更改<b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>終端顯示顏色

    如何修改buildroot和debian文件系統(tǒng)

    本文檔主要介紹在沒(méi)有編譯環(huán)境的情況下,如何修改buildroot和debian文件系統(tǒng)方法,如在buildroot文件系統(tǒng)中添加文件、修改目錄等文件操作,在debian
    的頭像 發(fā)表于 07-22 17:46 ?492次閱讀
    如何修改buildroot和debian<b class='flag-5'>文件系統(tǒng)</b>

    Linux高級(jí)文件系統(tǒng)管理詳解

    階的文件系統(tǒng)就得要學(xué)習(xí),本章我們會(huì)介紹磁盤陣列 (RAID),及邏輯卷軸文件系統(tǒng) (LVM),這些工具都可以幫助你管理與維護(hù)使用者可用的磁盤容量.
    的頭像 發(fā)表于 07-16 16:31 ?363次閱讀

    linux--sysfs文件系統(tǒng)

    sysfs文件系統(tǒng) sysfs,全稱為System Filesystem,是一個(gè)由Linux內(nèi)核實(shí)現(xiàn)的虛擬文件系統(tǒng)。它扮演著一個(gè)橋梁的角色,將內(nèi)核中的設(shè)備和驅(qū)動(dòng)程序信息以文件的形式呈現(xiàn)
    的頭像 發(fā)表于 07-08 11:37 ?876次閱讀
    <b class='flag-5'>linux</b>--sysfs<b class='flag-5'>文件系統(tǒng)</b>

    Linux系統(tǒng)如何擴(kuò)展文件系統(tǒng)

    當(dāng)數(shù)據(jù)盤沒(méi)有創(chuàng)建分區(qū),只在設(shè)備上創(chuàng)建了文件系統(tǒng)?;蛘吒袷交擞脖P,就直接mount上系統(tǒng)使用。
    的頭像 發(fā)表于 02-21 09:53 ?842次閱讀

    鴻蒙輕內(nèi)核源碼分析:虛擬文件系統(tǒng) VFS

    VFS(Virtual File System)是文件系統(tǒng)的虛擬層,它不是一個(gè)實(shí)際的文件系統(tǒng),而是一個(gè)異構(gòu)文件系統(tǒng)之上的軟件粘合層,為用戶提供統(tǒng)一的類 Unix 文件操作接口。由于不同
    的頭像 發(fā)表于 02-18 14:50 ?828次閱讀

    如何使用squashfs只讀文件系統(tǒng)制作Linux系統(tǒng)文件

    在 Colibri iMX6 的 eMMC 上我們將使用以下分區(qū)規(guī)劃。BootFS 為 FAT32 格式,該分區(qū)上包含 Linux 內(nèi)核文件,device tree 等啟動(dòng)文件,如果是 iMX8,則還包含一些其他固件
    發(fā)表于 01-09 11:43 ?1992次閱讀
    如何使用squashfs只讀<b class='flag-5'>文件系統(tǒng)</b>制作<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>文件</b>