A. linux文件系統中包括的主要文件類型有哪些
主要文件類型包括如下:
ext: ext 是第一個專門為 Linux 的文件系統類型,叫做擴展文件系統。
ext2:ext2 是為解決 ext 文件系統的缺陷而設計的可擴展的高性能的文件系統.又被稱為 二級擴展文件系統
ext3: ext3 是由開放資源社區開發的日誌文件系統,. ext3 被設計成是 ext2 的升級版本。
jsf: jsf 提供了基於日誌的位元組級文件系統,該文件系統是為面向事務的高性能系統而開發的。
ReiserFS: ReiserFS 基於平 衡樹結構的 、ReiserFS 文件系統在網上公手氏戚布.ReiserFS 3.6.x(作為 Linux 2.4 一部分 的版本),設計成員相信最好的文件系統是那些能夠有助於創建獨立的共享環境或者命名空間的文件系統。
Xfs: xfs 是一種非常優秀的日誌文件系統,它是 SGI 公司設計的.xfs 被稱為業界最先進 的,最具可升級性的文件系統技術.它是一個全 64 位,快速,穩固的日誌文件系統,
B. 求Linux和windows下不同的文件系統比較
查看/Lib/moles/內核版本/kernel/fs文件夾下的內容,表明當前系統支持那些文件系統,即linux的磁碟分區格式。
ext 是第一個專門為Linux的文件系統類型,叫做擴展文件系統,缺陷很多。
ext2 是為解決ext文件系統的缺陷而設計的可擴展的高性能的文件系統。又被稱為二級擴展文件系統。2000年以前幾乎所有的Linux發行版都用ext2作為默認的文件系統。ext2的缺點:ext2的設計者主要考慮的是文件系統性能方面的問題。ext2在寫入文件內容的同時並沒有同時寫入文件的有關的信息,例鄭猛沒如:許可權、所有者以及創建和訪問時間。換句話說,Linux先寫入文件的內容,然後等到有空的時候才寫入文件的相關信息。這樣若出現寫入文件內容之後系統突然斷電,就可能造成在文件系統就會處於不一致的狀態。
ext3 是一種日誌式文件系統,是在保有目前 ext2 的格式之下再加上日誌功能。日誌式文件系統的優越性在於:由於文件系統都有快取層參與運作,知空如不使用時必須將文件系統卸下,以便將快取層的資料寫回磁碟中。因此每當系統要關機時,必須將其所有的文件系統全部卸下後才能進行關機。如果在文件系統尚未卸下前就關機 (如停電) 時,下次重開機後會造成文件系統的資料不一致,故這時必須做文件系統的重整工作,將不一致與錯誤的地方修復。然而,此一重整的工作是相當耗時的,特別是容 量大的文件系統,而且也不能百分之百保證所有的資料都不會流失。故這在大型的伺服器上可能會造成問題。
jsf 提供了基於日誌的位元組級文件系統,該文件系統是為面向事務的高性喊納能系統而開發的。是一個有大量用戶安裝使用的企業級文件系統。它具有可伸縮性和健壯性,與非日誌文件系統相比,它的優點是其快速重啟能力:jsf 能夠在幾秒或幾分鍾內就把文件系統恢復到一致狀態。jsf的缺點:使用jsf日誌文件系統,性能上會有一定損失,系統資源佔用的比率也偏高。是因為當它保持一個日誌時,系統需要寫許多數據。
xfs 是一種非常優秀的日誌文件系統,它是一個全64位,快速、穩固的日誌文件系統,可以支持超大數量的文件(9g× 1gb,甚至更大的18g×1gb),可在大型 2d 和 3d 數據方面提供顯著的性能。xfs有能力預測其它文件系統薄弱環節,同時xfs提供了在不妨礙性能的情況下增強可靠性和快速的事故恢復。由於xfs比較復雜,實施起來有一些難度,所以目前xfs主要應用於Linux企業應用的高端。
nfs 是Sun公司推出的網路文件系統,允許多台計算機之間共享同一文件系統,易於從所有這些計算機上存取文件。
NTFS 是微軟Windows NT內核的系列操作系統支持的、一個特別為網路和磁碟配額、文件加密等管理安全特性設計的磁碟格式。
C. 操作系統linux 二級文件系統具體是怎麼實現的
說通俗一點就類似於數組加上鏈表的結構,i_addr[8]數組中每一個元素都指向了一個磁碟塊,如果那個磁碟塊中也存放了一個虛團i_addr[8]數組,並且那個數組中的渣譽薯每個元素也指向了一個磁碟塊,那麼這就是二級的索引文件結構如者了~
建議看一下操作系統原理(龐麗萍)一書中的文件系統一章
這個東西是Unix V的一種典型的文件系統~呵呵~
D. 安裝linux 硬碟分區的時候應該選哪個文件系統
安裝linux硬碟分區格式一般以ext3,etx4為主。
ext是為linux核心所做的第一個文件系統。採用Unix文件系統(UFS)的元數據結構,以克服MINIX文件系統性能不佳的問題。它是在linux上,第一個利用虛擬文件系統實現出的文件系統,在linux核心0.96c版中首次加入支持,最大可支持2GB的文件。
(4)linux二級文件系統的設計擴展閱讀
Ext4文件系統的特點
1、更大的文件系統和更大的文件
Ext3文件系昌判統最多隻能支持32TB的文件系統和2TB的文件,根據使用的具體架構和系統設置,實際容量上限可能宏迅沖比這個數字還要低,即只能容納2TB的文件系統和16GB的文件。而Ext4的文件系統容量蔽殲達到1EB,而文件容量則達到16TB。
2、更多的子目錄數量
Ext3目前只支持32000個子目錄,而Ext4取消了這一限制,理論上支持無限數量的子目錄。
3、更多的塊和i-節點數量
Ext3文件系統使用32位空間記錄塊數量和i-節點數量,而Ext4文件系統將它們擴充到64位。
E. Linux文件系統中包括的主要文件類型有哪些
主要文件類型包括如下:
ext:
ext
是第一個專門為
Linux
的文件系統類型,叫做擴展文件系統。
ext2:ext2
是為解決
ext
文件系統的缺陷而設計的可擴展的高性能的文件系統.又被稱為
二級擴展文件系統
ext3:
ext3
是由開放資源社區開發的日誌文件系統,.
ext3
被設計成是
ext2
的升級版本。
jsf:
jsf
提供了基於日誌的位元組級文件系統,該文件系統是為面向事務的高性能系統而開發的。
ReiserFS:
ReiserFS
基於平
衡樹結構的
、ReiserFS
文件系統在網上公布.ReiserFS
3.6.x(作為
Linux
2.4
一部分
的版本),設計成員相信最好的文件系統是那些能夠有助於創建獨立的共享環境或者命名空間的文件系統。
Xfs:
xfs
是一種非常優秀的日誌文件系統,它是
SGI
公司設計的.xfs
被稱為業界最先進
的,最具可升級性的文件系統技術.它是一個全
64
位,快速,穩固的日誌文件系統,
Linux文件系統中的文件是數據的集合,文件系統不僅包含著文件中的數據而且還有文件系統的結構,所有Linux
用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。
很詳細地了解某個操作系統的實際工作方式是非常困難的,因為大多數操作系統的源代碼都是嚴格保密的。在以實際使用為目標的操作系統中,讓任何人都可以自由獲取系統源代碼,無論目的是要了解、學習還是修改,這樣的系統並不多。本論文的主題就是這些少數操作系統中的一個:Linux。
F. 為linux系統設計一個簡單的二級文件系統。要求做到以下幾點:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MEM_D_SIZE 1024*1024 //總磁碟空間讓弊為1M
#define DISKSIZE 1024 //磁碟塊的大小1K
#define DISK_NUM 1024 //磁碟塊數目1K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號
#define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小
#define DIR_MAXSIZE 1024 //路徑最大長度為1KB
#define MSD 5 //最大子目錄數5
#define MOFN 5 //最大文件深度為5
#define MAX_WRITE 1024*128 //最大寫入文字長度128KB
struct fatitem /* size 8*/
{
int item; /*存放文件下一個磁碟的指針*/
char em_disk; /*磁碟塊是否空閑標志位 0 空閑*/
};
struct direct
{
/*-----文件控制快信息-----*/
struct FCB
{
char name[9]; /*文件/目錄名 8位*/
char property; /*屬性 1位目錄 0位普通文件*/
int size; /*文件/目錄位元組數、盤塊數顫配)*/
int firstdisk; /*文件/目錄 起始盤塊號*/
int next; /*子目錄起始盤塊號*/
int sign; /*1是根目錄 0不是根目錄*/
}directitem[MSD+2];
};
struct opentable
{
struct openttableitem
{
char name[9]; /*文件名*/
int firstdisk; /*起始盤塊號*/
int size; /*文件的大小*/
}openitem[MOFN];
int cur_size; /*當前打文件的數目*/
};
struct fatitem *fat; /*FAT表*/
struct direct *root; /*根目錄*/
struct direct *cur_dir; /*當前目錄*/
struct opentable u_opentable; /*文件打開表*/
int fd=-1; /*文件打開表的序號*/
char *bufferdir; /*記錄當前路徑的名稱*/
char *fdisk; /*虛擬磁碟起始地址*/
void initfile();
void format();
void enter();
void halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int read(int fd,char *buf);
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();
void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
format();
}
void format()
{
int i;
FILE *fp;
fat = (struct fatitem *)(fdisk+DISKSIZE); /*計算FAT表地址,引坦洞族導區向後偏移 1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1; /*引導塊*/
fat[0].em_disk='1';
for(i=1;i<ROOT_DISK_NO-1;i++) /*存放 FAT表的磁碟塊號*/
{
fat[i].item=i+1;
fat[i].em_disk='1';
}
fat[ROOT_DISK_NO].item=-1; /*存放根目錄的磁碟塊號*/
fat[ROOT_DISK_NO].em_disk='1';
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*-----------------------------------------------*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目錄的地址*/
/*初始化目錄*/
/*---------指向當前目錄的目錄項---------*/
root->directitem[0].sign = 1;
root->directitem[0].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstdisk;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_DISK_SIZE;
/*-------指向上一級目錄的目錄項---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstdisk;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_DISK_SIZE;
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
for(i=2;i<MSD+2;i++) /*-子目錄初始化為空-*/
{
root->directitem[i].sign = 0;
root->directitem[i].firstdisk = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虛擬磁碟空間保存到磁碟文件中*/
{
printf("Error:\n File write error! \n");
}
fclose(fp);
}
void enter()
{
FILE *fp;
int i;
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁碟文件disk.dat 讀入虛擬磁碟空間(內存)*/
{
printf("Error:\nCannot read file\n");
exit(0);
}
fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目錄地址*/
fclose(fp);
/*--------------初始化用戶打開表------------------*/
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;
cur_dir = root; /*當前目錄為根目錄*/
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:");
}
void halt()
{
FILE *fp;
int i;
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虛擬磁碟空間(內存)內容讀入磁碟文件disk.dat */
{
printf("Error:\nFile write error!\n");
}
fclose(fp);
free(fdisk);
free(bufferdir);
return;
}
int create(char *name)
{
int i,j;
if(strlen(name)>8) /*文件名大於 8位*/
return(-1);
for(j=2;j<MSD+2;j++) /*檢查創建文件是否與已存在的文件重名*/
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2) /*文件已經存在*/
return(-4);
for(i=2;i<MSD+2;i++) /*找到第一個空閑子目錄*/
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2) /*無空目錄項*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*打開文件太多*/
return(-3);
for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空閑盤塊 j 後退出*/
{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk = '1'; /*將空閑塊置為已經分配*/
/*-----------填寫目錄項-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
/*---------------------------------*/
fd = open(name);
return 0;
}
int open(char *name)
{
int i, j;
for(i=2;i<MSD+2;i++) /*文件是否存在*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件還是目錄-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);
/*--------文件是否打開-----------------------*/
for(j=0;j<MOFN;j++)
{
if(!strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j<MOFN) /*文件已經打開*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*文件打開太多*/
return(-3);
/*--------查找一個空閑用戶打開表項-----------------------*/
for(j=0;j<MOFN;j++)
{
if(u_opentable.openitem[j].firstdisk==-1)
break;
}
/*--------------填寫表項的相關信息------------------------*/
u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size = cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用戶打開表表項的序號--------------------------*/
return(j);
}
int close(char *name)
{
int i;
for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
/*-----------清空該文件的用戶打開表項的內容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;
return 0;
}
int write(int fd, char *buf, int len)
{
char *first;
int item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字元作為空格 # 字元作為換行符-----------------------*/
char Space = 32;
char Endter= '\n';
for(i=0;i<len;i++)
{
if(buf[i] == '$')
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
}
/*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/
item = u_opentable.openitem[fd].firstdisk;
/*-------------找到當前目錄所對應表項的序號-------------------------*/
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==item)
break;
}
temp = i; /*-存放當前目錄項的下標-*/
/*------找到的item 是該文件的最後一塊磁碟塊-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找該文件的下一盤塊--*/
}
/*-----計算出該文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
/*-----如果最後磁碟塊剩餘的大小大於要寫入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*寫一部分內容到最後一塊磁碟塊的剩餘空間(位元組)*/
first[i] = buf [i];
}
/*-----計算分配完最後一塊磁碟的剩餘空間(位元組) 還剩下多少位元組未存儲-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁碟塊-*/
for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*尋找空閑磁碟塊*/
{
if(fat[i].em_disk=='0')
break;
}
if(i>=DISK_NUM) /*--如果磁碟塊已經分配完了-*/
return(-1);
first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁碟塊的起始地址-*/
if(j==ilen2-1) /*--如果是最後要分配的一塊-*/
{
for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)
first[k] = buf[k];
}
else/*-如果不是要最後分配的一塊--*/
{
for(k=0;k<DISKSIZE;k++)
first[k] =buf[k];
}
fat[item].item = i; /*--找到一塊後將它的序號存放在上一塊的指針中-*/
fat[i].em_disk = '1'; /*--置找到的磁碟快的空閑標志位為已分配-*/
fat[i].item = -1; /*--它的指針為 -1 (即沒有下一塊)-*/
}
/*--修改長度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
return 0;
}
int read(int fd, char *buf)
{
int len = u_opentable.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;
item = u_opentable.openitem[fd].firstdisk;
ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--計算文件所佔磁碟的塊數-*/
first = fdisk+item*DISKSIZE; /*--計算文件的起始位置-*/
for(i=0;i<ilen1;i++)
{
if(i==ilen1-1) /*--如果在最後一個磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
}
else /*--不在最後一塊磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盤塊-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}
int del(char *name)
{
int i,cur_item,item,temp;
for(i=2;i<MSD+2;i++) /*--查找要刪除文件是否在當前目錄中-*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
G. linux文件系統程序
直接mkdir就行
標准C++絕對可以
必要的時候加上system的命令
H. Linux根文件系統基本包括哪些內容
通常情況下,Linux內核啟動後期,會尋找並掛載根文件系緩畢統。根文件系統可以存在於磁碟上,也可以是存在於內存中的映擾喚芹像,其中包含了Linux系統正常運行所必須的庫和程序等等,按照鏈譽一定的目錄結構存放。Linux根文件系統基本包括如下內容:
基本的目錄結構:/bin、/sbin、/dev、/etc、/lib、/var、/proc、/sys、/tmp等;整個根文件系統都是掛在根目錄(/)下,FHS對頂層目錄的要求和說明如下表所列。
基本程序運行所需的庫文件,如glibc等;
基本的系統配置文件,如inittab、rc等;
必要的設備文件,如/dev/ttyS0、/dev/console等;
基本應用程序,如sh、ls、cd、mv等。
你可以去【周立功】那邊了解一下的,蠻多信息的。
I. linux文件系統基礎知識
linux文件系統基礎知識匯總
1、linux文件系統分配策略
塊分配( block allocation ) 和 擴展分配 ( extent allocation )
塊分配:磁碟上的文件塊根據需要分配給文件,避免了存儲空間的浪費。但當文件擴充時,會造成文件中文件塊的不連續,從而導致過多的磁碟尋道時間。
每一次文件擴展時,塊分配演算法就需要寫入文件塊的結構信息,也就是 meta-dada 。meta-data總是與文件一起寫入存儲設備,改變文件的操作要等到所有meta-data的操作都完成後才能進行,
因此,meta-data的操作會明顯降低整個文件系統的性能。
擴展分配: 文件創建時,一次性分配一連串連續的塊,當文件擴展時,也一次分配很多塊。meta-data在文件創建時寫入,當文件大小沒有超過所有已分配文件塊大小時,就不用寫入meta-data,直到需要再分配文件塊的時候。
擴展分配採用成組分配塊的方式,減少了SCSI設備寫數據的時間,在讀取順序文件時具有良好的性能,但隨機讀取文件時,就和塊分配類似了。
文件塊的組或塊簇 ( block cluster) 的大小是在編譯時確定的。簇的大小對文件系統的性能有很大的影響。
註: meta-data 元信息:和文件有關的信息,比如許可權、所有者以及創建、訪問或更改時間等。
2、文件的記錄形式
linux文家系統使用索引節點(inode)來記錄文件信息。索引節點是一種數據結構,它包含了一個文件的長度、創建及修改時間、許可權、所屬關系、磁碟中的位置等信息。
一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一的元素對應。每個索引節點在數組中的索引號,稱為索引節點號。
linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。
對於一個文件來說,有一個索引節點號與之對應;而對於一個索引節點號,卻可以對應多個文件名。
連接分為軟連接和硬連接,其中軟連接又叫符號連接。
硬連接: 原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨文件系統(不能跨越不同的分區),文件在磁碟中只有一個拷貝。
由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此硬連接可以防止不必要的誤刪除。
軟連接: 用 ln -s 命令建立文件的符號連接。符號連接是linux特殊文件的.一種,作為一個文件,它的數據是它所連接的文件的路徑名。沒有防止誤刪除的功能。
3、文件系統類型:
ext2 : 早期linux中常用的文件系統
ext3 : ext2的升級版,帶日誌功能
RAMFS : 內存文件系統,速度很快
NFS : 網路文件系統,由SUN發明,主要用於遠程文件共享
MS-DOS : MS-DOS文件系統
VFAT : Windows 95/98 操作系統採用的文件系統
FAT : Windows XP 操作系統採用的文件系統
NTFS : Windows NT/XP 操作系統採用的文件系統
HPFS : OS/2 操作系統採用的文件系統
PROC : 虛擬的進程文件系統
ISO9660 : 大部分光碟所採用的文件系統
ufsSun : OS 所採用的文件系統
NCPFS : Novell 伺服器所採用的文件系統
SMBFS : Samba 的共享文件系統
XFS : 由SGI開發的先進的日誌文件系統,支持超大容量文件
JFS :IBM的AIX使用的日誌文件系統
ReiserFS : 基於平衡樹結構的文件系統
udf: 可擦寫的數據光碟文件系統
4、虛擬文件系統VFS
linux支持的所有文件系統稱為邏輯文件系統,而linux在傳統的邏輯文件系統的基礎上增加料一個蓄念文件系統( Vitual File System ,VFS) 的介面層。
虛擬文件系統(VFS) 位於文件系統的最上層,管理各種邏輯文件系統,並可以屏蔽各種邏輯文件系統之間的差異,提供統一文件和設備的訪問介面。
5、文件的邏輯結構
文件的邏輯結構可分為兩大類: 位元組流式的無結構文件 和 記錄式的有結構文件。
由位元組流(位元組序列)組成的文件是一種無結構文件或流式文件 ,不考慮文件內部的邏輯結構,只是簡單地看作是一系列位元組的序列,便於在文件的任意位置添加內容。
由記錄組成的文件稱為記錄式文件 ,記錄是這種文件類型的基本信息單位,記錄式文件通用於信息管理。
6、文件類型
普通文件 : 通常是流式文件
目錄文件 : 用於表示和管理系統中的全部文件
連接文件 : 用於不同目錄下文件的共享
設備文件 : 包括塊設備文件和字元設備文件,塊設備文件表示磁碟文件、光碟等,字元設備文件按照字元操作終端、鍵盤等設備。
管道(FIFO)文件 : 提供進程建通信的一種方式
套接字(socket) 文件: 該文件類型與網路通信有關
7、文件結構: 包括索引節點和數據
索引節點 : 又稱 I 節點,在文件系統結構中,包含有關相應文件的信息的一個記錄,這些信息包括文件許可權、文件名、文件大小、存放位置、建立日期等。文件系統中所有文件的索引節點保存在索引節點表中。
數據 : 文件的實際內容。可以是空的,也可以非常大,並且擁有自己的結構。
8、ext2文件系統
ext2文件系統的數據塊大小一般為 1024B、2048B 或 4096B
ext2文件系統採用的索引節點(inode):
索引節點採用了多重索引結構,主要體現在直接指針和3個間接指針。直接指針包含12個直接指針塊,它們直接指向包含文件數據的數據塊,緊接在後面的3個間接指針是為了適應文件的大小變化而設計的。
e.g: 假設數據塊大小為1024B ,利用12個直接指針,可以保存最大為12KB的文件,當文件超過12KB時,則要利用單級間接指針,該指針指向的數據塊保存有一組數據塊指針,這些指針依次指向包含有實際數據的數據塊,
假如每個指針佔用4B,則每個單級指針數據塊可保存 1024/4=256 個數據指針,因此利用直接指針和單級間接指針可保存 1024*12+1024*256=268 KB的文件。當文件超過268KB時,再利用二級間接指針,直到使用三級間接指針。
利用直接指針、單級間接指針、二級間接指針、三級間接指針可保存的最大文件大小為:
1024*12+1024*256+1024*256*256+1024*256*256*256=16843020 KB,約 16GB
若數據塊大小為2048B,指針佔4B,則最大文件大小為: 2048*12+2048*512+2048*512*512+2048*512*512*512=268,960,792 KB 約 268GB
若數據塊大小為4096B,指針佔4B,則最大文件大小為: 4096*12+4096*1024+4096*1024*1024+4096*1024*1024*1024=4,299,165,744 KB ,約 4TB
註: 命令 tune2fs -l /dev/sda5 可查看文件系統
ext2文件系統最大文件名長度: 255個字元
ext2文件系統的缺點:
ext2在寫入文件內容的同時並沒有同時寫入文件meta-data, 其工作順序是先寫入文件的內容,然後等空閑時候才寫入文件的meta-data。若發生意外,則文件系統就會處於不一致狀態。
在重新啟動系統的時候,linux會啟動 fsk ( file system check) 的程序,掃描整個文件系統並試圖修復,但不提供保證。
9、ext3文件系統:
ext3基於ext2的代碼,所以磁碟格式與ext2相同,使用相同的元數據。
ext2文件系統無損轉化為ext3文件系統: tune2fs -j /dev/sda6
日誌塊設備( Journaling block device layer,JBD)完成ext3文件系統日誌功能。JBD不是ext3文件系統所特有的,它的設計目標是為了向一個塊設備添加日誌功能。
當一個文件修改執行時,ext3文件系統代碼將通知JBD,稱為一個事務(transaction)。發生意外時,日誌功能具有的重放功能,能重新執行中斷的事務。
日誌中的3種數據模式:
1)、data=writeback :不處理任何形式的日誌數據,給用戶整體上的最高性能
2)、data=odered :只記錄元數據日誌,但將元數據和數據組成一個單元稱為事務(transaction) 。此模式保持所句句的可靠性與文件系統的一致性,性能遠低於data=writeback模式,但比data=journal模式快
3)、data=journal :提供完整的數據及元數據日誌,所有新數據首先被寫入日誌,然後才被定位。意外發生過後,日誌可以被重放,將數據與元數據帶回一致狀態。這種模式整體性能最慢,但數據需要從磁碟讀取和寫入磁碟時卻是3種模式中最快的。
ext3文件系統最大文件名長度: 255個字元
ext3文件系統的優點:可用性、數據完整性、速度、兼容性
10、ReiserFS文件系統
ReiserFS文件系統是由Hans Reiser和他領導的開發小組共同開發的,整個文件系統完全是從頭設計的,是一個非常優秀的文件系統。也是最早用於Linux的日誌文件系統之一。
ReiserFS的特點
先進的日誌機制
ReiserFS有先進的日誌(Journaling/logging)功能 機制。日誌機制保證了在每個實際數據修改之前,相應的日誌已經寫入硬碟。文件與數據的安全性有了很大提高。
高效的磁碟空間利用
Reiserfs對一些小文件不分配inode。而是將這些文件打包,存放在同一個磁碟分塊中。而其它文件系統則為每個小文件分別放置到一個磁碟分塊中。
獨特的搜尋方式
ReiserFS基於快速平衡樹(balanced tree)搜索,平衡樹在性能上非常卓越,這是一種非常高效的演算法。ReiserFS搜索大量文件時,搜索速度要比ext2快得多。Reiserfs文件 系統使用B*Tree存儲文件,而其它文件系統使用B+Tree樹。B*Tree查詢速度比B+Tree要快很多。Reiserfs在文件定位上速度非常 快。
在實際運用中,ReiserFS 在處理小於 4k 的文件時,比ext2 快 5 倍;帶尾文件壓縮功能(默認)的ReiserFS 比ext2文件系統多存儲6%的數據。
支持海量磁碟
ReiserFS是一個非常優秀的文件系統,一直被用在高端UNIX系統上,可輕松管理上百G的文件系統,ReiserFS文件系統最大支持的文件系統尺寸為16TB。這非常適合企業級應用中。
優異的性能
由於它的高效存儲和快速小文件I/O特點,使用ReiserFs文件系統的PC,在啟動X窗口系統時,所花的時間要比在同一台機器上使用ext2文 件系統少1/3。另外,ReiserFS文件系統支持單個文件尺寸為4G的文件,這為大型資料庫系統在linux上的應用提供了更好的選擇。
;