tft每日頭條

 > 科技

 > linux文件系統的基礎知識簡介

linux文件系統的基礎知識簡介

科技 更新时间:2024-12-05 12:40:31

 一

  • 首先對于Linux系統來說,如圖所示,系統層級分為用戶層、内核層、以及物理設備層、

linux文件系統的基礎知識簡介(揭秘Linux文件系統)1

  • 例如C語言中對于文件的寫操作,首先C語言本身會設置緩沖區,來提高讀寫效率。C寫函數會調用linux的系統函數接口write(),這是在用戶态下。緊接着write()會調用linux系統内核函數進入到内核層進行寫入,這個寫操作顯然是由文件系統來控制的,而内核中依舊還有一個高速緩沖設備來提高讀寫效率,之後通過設備驅動寫入磁盤中,簡單來說從調用C讀寫函數到将數據操作到磁盤上是這樣的流程。

 二

  • 當我們了解了Linux文件系統所處的位置之後,接下來說明一些基本概念

1)扇區:扇區并不是一個物理概念,而是一個單位,大小是521Byte

2)塊:是一個Linux文件系統的基本單元,大小是4096Byte

3)塊組:ext2文件系統是以塊組為基本單元

4)Inode:存儲文件基本信息(除文件名和文件類型),一個文件對應一個Inode;在ext2文件系統中,大小是128Byte

  • 接下來開始解釋ext2文件系統,如圖所示,ext2采用一下的基本結構來管理數據存儲,每一個Block Group為一個基本單元,了解基本單元後就了解了文件系統

linux文件系統的基礎知識簡介(揭秘Linux文件系統)2

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:存儲數據


  • 接下來說明一下Inode結構

linux文件系統的基礎知識簡介(揭秘Linux文件系統)3

如圖所示,一個數據指針指針指向一個數據塊,後三個多級指針為了拓展數據塊


四 文件放入流程:

1. 先找GDT,查看InodeTable所在位置

2. 查找Table裡未被使用的最小值分配給文件使用,

3. Inode Bitmap對應位置由0置1

4. Inode存放文件信息,更新Table

注:1)文件系統很複雜,以上隻是放入文件大緻flow,實際系統還有空閑檢測、動态分配等

2)文件删除隻是将Inode BItma由1置0,更新block bimap 更行GDT,所以文件并沒有真正被删除

五 目錄結構

一個目錄占一個塊或多個塊,目錄塊内容如下:

linux文件系統的基礎知識簡介(揭秘Linux文件系統)4

注: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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved