一
二
1)扇區:扇區并不是一個物理概念,而是一個單位,大小是521Byte
2)塊:是一個Linux文件系統的基本單元,大小是4096Byte
3)塊組:ext2文件系統是以塊組為基本單元
4)Inode:存儲文件基本信息(除文件名和文件類型),一個文件對應一個Inode;在ext2文件系統中,大小是128Byte
Boot Block:啟動塊,大小是1KB;存儲磁盤分區信息和啟動信息;PS:一個文件系統隻有1份
Super Block:超級塊,大小是1塊;為了提高系統的健壯性,每一個塊組都有一個(ext4采用稀疏拷貝),并且每份内容一緻;用來描述整個分區的文件系統信息;例如塊大小、文件系統版本号、上次mount的時間等等
GDT:塊組描述符表,大小是多個塊,塊數不确定;由很多塊組描述符組成,整個分區分成多少個塊組就對應有多少個塊組描述符。 每個塊組描述符(Group Descriptor)存儲一個塊組的描述信息,例如在這個塊組中從哪裡開始是inode表,從哪裡開始是數據塊,通常内核隻用到第0個塊組中的拷貝,當執行e2fsck檢查文件系統一緻性時,第0個塊組中的超級塊和塊組描述符表就會拷貝到其它塊組,這樣當第0個塊組的開頭意外損壞時就可以用其它拷貝來恢複,從而減少損失。
Block Bitmap:塊位圖,原理和Bitmap算法一緻(用每位來表示數據);标志每個塊的使用情況(0沒被使用,1被使用)一個塊組中的塊是這樣利用的:塊位圖就是用來描述整個塊組中哪些塊已用哪些塊空閑的,它本身占一個塊,其中的每個bit代表本塊組中的一個塊,這個bit為 1表示該塊已用,這個bit為0表示該塊空閑可用。
Inode Bitmap:和塊位圖類似,本身占用一個塊;其中每一位表示一個inode是否可用;
Inode Table:存儲Inode的表,inode表占多少個塊在格式化時就要決定并寫入塊組描述符中,mke2fs格式化工具的默認策略是:一個塊組有多少個8KB就分配多少個inode。
Data Blocks:存儲數據
三
如圖所示,一個數據指針指針指向一個數據塊,後三個多級指針為了拓展數據塊
四 文件放入流程:
1. 先找GDT,查看InodeTable所在位置
2. 查找Table裡未被使用的最小值分配給文件使用,
3. Inode Bitmap對應位置由0置1
4. Inode存放文件信息,更新Table
注:1)文件系統很複雜,以上隻是放入文件大緻flow,實際系統還有空閑檢測、動态分配等
2)文件删除隻是将Inode BItma由1置0,更新block bimap 更行GDT,所以文件并沒有真正被删除
五 目錄結構
一個目錄占一個塊或多個塊,目錄塊内容如下:
注:1. 符号連接是新建一個記錄項,指向次文件記錄項
2. 硬鍊接是新建一個記錄項,指向此文件
附:遞歸列出目錄中的文件列表
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#define MAX_PATH 1024
/* dirwalk: apply fcn to all files in dir */
void dirwalk(char *dir, void (*fcn)(char *)) {
char name[MAX_PATH];
struct dirent *dp; DIR *dfd;
if ((dfd = opendir(dir)) == NULL) {
fprintf(stderr, "dirwalk: can't open %s\n", dir);
return;
}
while ((dp = readdir(dfd)) != NULL) {
if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
continue; /* skip self and parent */
if (strlen(dir) strlen(dp->d_name) 2 > sizeof(name))
fprintf(stderr, "dirwalk: name %s %s too long\n", dir, dp->d_name);
else {
sprintf(name, "%s/%s", dir, dp->d_name);
(*fcn)(name);
}
}
closedir(dfd);
}
/* fsize: print the size and name of file "name" */
void fsize(char *name) {
struct stat stbuf;
if (stat(name, &stbuf) == -1) {
fprintf(stderr, "fsize: can't access %s\n", name);
return;
}
if ((stbuf.st_mode & S_IFMT) == S_IFDIR)
dirwalk(name, fsize);
printf("%8ld %s\n", stbuf.st_size, name);
}
int main(int argc, char **argv) {
if (argc == 1) /* default: current directory */
fsize(".");
else
while (--argc > 0)
fsize(* argv);
return 0;
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!