基本介紹
- 中文名:檔案系統
- 外文名:file system
- 類別:作業系統
- 目的:為了管理空間
簡介,功能,代碼,FAT,NTFS,CDFS,exFAT,RAW,Ext,Ext2,Ext3,Ext4,Btrfs,ZFS,HFS,HFS檔案系統概念,HFS檔案系統開發過程,構成方式,HFS+,ReiserFS,JFS,VMFS,XFS,UFS,VXFS,ReFS,WBFS,PFS,
簡介
在計算機中,檔案系統(file system)是命名檔案及放置檔案的邏輯存儲和恢復的系統。DOS、Windows、OS/2、Macintosh和UNIX-based作業系統都有檔案系統,在此系統中檔案被放置在分等級的(樹狀)結構中的某一處。檔案被放置進目錄(Windows中的資料夾)或子目錄,在樹狀結構中你希望的位置中。
功能
磁碟或分區和它所包括的檔案系統的不同是很重要的。少數程式(包括最有理由的產生檔案系統的程式)直接對磁碟或分區的原始扇區進行操作;這可能破壞一個存在的檔案系統。大部分程式基於檔案系統進行操作,在不同種檔案系統上不能工作。
一個分區或磁碟在作為檔案系統使用前,需要初始化,並將記錄數據結構寫到磁碟上。這個過程就叫建立檔案系統。
大部分UNIX檔案系統種類具有類似的通用結構,即使細節有些變化。其中心概念是超級塊superblock,i節點inode,數據塊data block,目錄塊directory block,和間接塊indirection block。超級塊包括檔案系統的總體信息,比如大小(其準確信息依賴檔案系統)。i節點包括除了名字外的一個檔案的所有信息,名字與i節點數目一起存在目錄中,目錄條目包括檔案名稱和檔案的i節點數目。i節點包括幾個數據塊的數目,用於存儲檔案的數據。i節點中只有少量數據塊數的空間,如果需要更多,會動態分配指向數據塊的指針空間。這些動態分配的塊是間接塊;為了找到數據塊,這名字指出它必須先找到間接塊的號碼。
檔案系統的功能包括:管理和調度檔案的存儲空間,提供檔案的邏輯結構、物理結構和存儲方法;實現檔案從標識到實際地址的映射,實現檔案的控制操作和存取操作,實現檔案信息的共享並提供可靠的檔案保密和保護措施,提供檔案的安全措施。
檔案的邏輯結構是依照檔案的內容的邏輯關係組織檔案結構。檔案的邏輯結構可以分為流式檔案和記錄式檔案。
流式檔案:檔案中的數據是一串字元流,沒有結構。
主要缺陷:數據關聯差,數據不一致,冗餘性。
代碼
下面是檔案系統的代碼,根據這個代碼我們可以更好地了解檔案系統的工作流程
- main.cpp
#include"blockinodesuperblock.h"
//-----------------------
intmain()
{
control.open("control.txt",ios::in|ios::out|ios::nocreate);
inti;
control>>i;
control.close();
if(i!=0)//不為0就初始化
{
initial();
}
control.open("control.txt",ios::in|ios::out|ios::nocreate);
control.seekp(0);
control<<0;//默認是上次基礎上繼續下去不用再初始化
control.close();
strcpy(curname,"root");//當前目錄檔案名稱為root
road[0]=0;//當前目錄路徑(存放從根目錄到這裡的結點號)
num=1;//最後位road[num-1]為當前目錄檔案i結點號
cout<<"請登入系統\n";
while(!login())//登入為止
cout<<"wrong!!!\n";
cout<<"loginsuccess"<<endl;
cout<<"******Welcome"<<auser<<"******";
readsuper();
getcommand();//命令解析函式
writesuper();
return0;
}
blockinodesuperblock.h
intialloc()//申請一個i結點返回結點號否則返回-1
{
if(superblock.fiptr>0)
{
inttemp=superblock.fistack[80-superblock.fiptr];//當前可用
superblock.fistack[80-superblock.fiptr]=-1;
superblock.fiptr--;
returntemp;
}
return-1;
}
//----------------------
voidifree(intindex)//指定一個結點號,回收一個i結點
{
disk.open("disk.txt",ios::in|ios::out|ios::nocreate);//清空結點
disk.seekp(514+64*index+2*(index/8));
disk<<setw(64)<<'';
disk.close();
for(inti=80-superblock.fiptr;i<80;i++)//結點號找到合適位置插入空閒結點號棧
{
if(superblock.fistack<index)//小於它的前移一位
{
superblock.fistack[i-1]=superblock.fistack;
}
else//放在第一個大於它的結點號前面
{
superblock.fistack[i-1]=index;
break;
}
}
superblock.fiptr++;
}
//----------------------
/*成組連結法*/
intballoc()//申請一個盤塊返回盤塊號否則返回-1
{
inttemp=superblock.fbstack[10-superblock.fbptr];
if(superblock.fbptr==1)//是棧底了==>;是記錄盤塊了
{
//是最後記錄盤塊最後號0(保留作棧底分配不成功)
if(temp==0)
{
return-1;
}
suprblock.fbstack[10-superblock.fbptr]=-1;
superblock.fbptr=0;
//盤塊內容讀入棧
for(inti=0;i<10;i++)
{
intid,num=0;
disk.open("disk.txt",ios::in|ios::out|ios::nocreate);
//先計算盤塊內容個數num(最多10),最後盤塊可能不到10個
disk.seekg(514*temp);
for(inti=0;i<10;i++)
{
disk>>id;
num++;
if(id==0)break;
}
disk.seekg(514*temp);//盤塊內容讀入棧
for(intj=10-num;j<10;j++)
{
disk>>id;
superblock.fbstack[j]=id;
}
superblock.fbptr=num;
disk.close();
}
disk.open("disk.txt",ios::in|ios::out|ios::nocreate);//清空回收盤塊
disk.seekp(514*temp);
disk<<setw(512)<<'';
disk.close();
//盤塊使用掉
returntemp;
}
else//不是記錄盤塊==>;盤塊使用掉
{
superblock.fbstack[10-superblock.fbptr]=-1;
superblock.fbptr--;
returntemp;
}
}
//----------------------
FAT
在Win 9X下,FAT16支持的分區最大為2GB。我們知道計算機將信息保存在硬碟上稱為“簇”的區域內。使用的簇越小,保存信息的效率就越高。在FAT16的情況下,分區越大簇就相應的要大,存儲效率就越低,勢必造成存儲空間的浪費。並且隨著計算機硬體和套用的不斷提高,FAT16檔案系統已不能很好地適應系統的要求。在這種情況下,推出了增強的檔案系統FAT32。同FAT16相比,FAT32主要具有以下特點:
- 同FAT16相比FAT32最大的優點是可以支持的磁碟大小達到32GB,但是不能支持小於512MB的分區。
基於FAT32的Win 2000可以支持分區最大為32GB;而基於 FAT16的Win 2000支持的分區最大為4GB。
- 由於採用了更小的簇,FAT32檔案系統可以更有效率地保存信息。如兩個分區大小都為2GB,一個分區採用了FAT16檔案系統,另一個分區採用了FAT32檔案系統。採用FAT16的分區的簇大小為32KB,而FAT32分區的簇只有4KB的大小。這樣FAT32就比FAT16的存儲效率要高很多,通常情況下可以提高15%。
NTFS
NTFS檔案系統是一個基於安全性的檔案系統,是Windows NT所採用的獨特的檔案系統結構,它是建立在保護檔案和目錄數據基礎上,同時照顧節省存儲資源、減少磁碟占用量的一種先進的檔案系統。使用非常廣泛的Windows NT 4.0採用的就是NTFS 4.0檔案系統,相信它所帶來的強大的系統安全性一定給廣大用戶留下了深刻的印象。Win 2000採用了更新版本的NTFS檔案系統NTFS 5.0,它的推出使得用戶不但可以像Win 9X那樣方便快捷地操作和管理計算機,同時也可享受到NTFS所帶來的系統安全性。
NTFS 5.0的特點主要體現在以下幾個方面:
- NTFS可以支持的MBR分區(如果採用動態磁碟則稱為卷)最大可以達到2TB,GPT分區則無限制。而Win 2000中的FAT32支持單個檔案的大小最大為2GB。
- NTFS採用了更小的簇,可以更有效率地管理磁碟空間。在Win 2000的FAT32檔案系統的情況下,分區大小在2GB~8GB時簇的大小為4KB;分區大小在8GB~16GB時簇的大小為8KB;分區大小在16GB~32GB時,簇的大小則達到了16KB。而Win 2000的NTFS檔案系統,當分區的大小在2GB以下時,簇的大小都比相應的FAT32簇小;當分區的大小在2GB以上時(2GB~2TB),簇的大小都為4KB。相比之下,NTFS可以比FAT32更有效地管理磁碟空間,最大限度地避免了磁碟空間的浪費。
- 在NTFS分區上,可以為共享資源、資料夾以及檔案設定訪問許可許可權。許可的設定包括兩方面的內容:一是允許哪些組或用戶對資料夾、檔案和共享資源進行訪問;二是獲得訪問許可的組或用戶可以進行什麼級別的訪問。訪問許可許可權的設定不但適用於本地計算機的用戶,同樣也套用於通過網路的已分享檔案夾對檔案進行訪問的網路用戶。與FAT32檔案系統下對資料夾或檔案進行訪問相比,安全性要高得多。另外,在採用NTFS格式的Win 2000中,套用審核策略可以對資料夾、檔案以及活動目錄對象進行審核,審核結果記錄在安全日誌中,通過安全日誌就可以查看哪些組或用戶對資料夾、檔案或活動目錄對象進行了什麼級別的操作,從而發現系統可能面臨的非法訪問,通過採取相應的措施,將這種安全隱患減到最低。這些在FAT32檔案系統下,是不能實現的。
- NTFS使用一個“變更”日誌來跟蹤記錄檔案所發生的變更。
CDFS
exFAT
2·單檔案大小最大可達16EB(就是理論值,16×1024×1024TB,1TB=1024G)
3·簇大小可高達32MB
5·同一目錄下最大檔案數可達65 536個
6·支持訪問控制
7·支持TFAT
請注意:exFAT只是一個折中的方案,只為隨身碟而生。
下面請看exFAT、NTFS、FAT分區的比較:
檔案系統 | 作業系統 | 最小扇區 | 最大扇區 | 最大單一檔案 | 最大格式化容量 | 檔案數量 |
FAT32 | Win 95 OSR2之後 | 512bytes | 64KB | 2bytes-4GB | 2TB(但NT核心系統限制為32GB) | 4194304 |
NTFS | Win2000之後 | 512bytes | 64KB | 受最大分割容量 | 2TB~256TB(受MBR影響) | 無 |
exFAT | Win CE 6/Vista SP1/Win 8 | 512bytes | 32768KB | 16EB(理論值) | 16EB(理論值)(目前支持到256TB) | 至少可以大於1000 |
RAW
RAW檔案系統是一種磁碟未經處理或者未經格式化產生的檔案系統,一般來說有這幾種可能造成正常檔案系統變成RAW檔案系統:
●沒有格式化。
●格式化中途取消操作。
●硬碟出現壞道。
●硬碟出現不可預知的錯誤。
●病毒所致。
解決RAW檔案系統的最快的方法是立即格式化,並且使用防毒軟體全盤防毒。當然,如果檔案很重要的話可以考慮用磁碟數據恢復軟體先救出數據,然後再格式化和防毒,或者在網上查找一些有關於“raw檔案系統恢復”的內容。
Ext
Ext2
Ext是 GNU/Linux 系統中標準的檔案系統,其特點為存取檔案的性能極好,對於中小型的檔案更顯示出優勢,這主要得利於其簇快取層的優良設計。
但由於目前核心 2.4 所能使用的單一分割區最大只有 2048GB,實際上能使用的檔案系統容量最多也只有 2048GB。