文件系统之FAT32、NTFS
2015-07-21 10:39
633 查看
一、磁盘的MBR
MasterBootRecord,主引导记录
大小为一个扇区即512B=446(引导程序)+64(16*4,DiskPartitionTable硬盘分区表)+55
AA(结束标志)
四个DPT一般为“基本分区、扩展分区、保留、保留”对应“C、其它盘、无、无”
二、分区结构
1、FAT32
DBR(DosBootRecord,引导记录)
FAT(FileAllocationTable,文件分配表)
→ 磁盘文件是以簇为单位进行存储的,簇的大小是扇区的倍数,通常最大32KB也就是64个扇区;FAT32的簇号
是32位即4B,类似的,FAT16是2B
→
根文件夹中的每一项对应一个文件,大小为32B,其中有该文件首簇号和文件簇数等信息
→ FAT表记录了文件数据的簇链,通过根文件夹首簇可以跳转到FAT中对应位置,根据簇号来定位数据存储位置
2、NTFS
MFT(MasterFileTable,主控文件表)
→ MFT的表项叫做FR,FileRecord,文件记录,大小为1KB,0~15个FR是元数据文件记录,16之后的是用户文件或目录记录(目录也被看作是文件);其中$Bitmap的文件用数组方式记录了DATA区每一簇的使用情况
→
FR由“表头+属性+FFFFFFFFH结束标志”构成,属性由“header+body”构成,其中header的前四字节是属性标志,如30H--文件名属性,、80H--数据属性
→ Data属性详解:
小文件(不超过700多字节)直接存在该属性的body中,大文件则以“运行”的方式来存储
PS:相当于一段连续的簇打了个包,包的首簇号和簇数等信息以“运行项”的形式存储在body中
PPS:一个文件有多个包时就有多个运行项,要注意的是,后面运行项的首簇号是相对于前一项首簇号的偏移值
eg:0x20处的0040H是data run的偏移值,由80H开始偏移0040H即data
run;有三个运行项,“4[/u] 1[/u] 12[/u]
30 DD 81
00[/u]”中“1”和“4”分别指后面1B和4B是该运行的簇数和首簇号
运行一,首簇号0081DD30H,簇数12H;运行二,首簇号(81DD30+4A03)H,簇数02H;…
三、直接删除文件的变动
1、FAT32
① 根文件夹中对应项的首字节置“E5”,首簇号高位两字节置“00 00”
② FAT表中对应簇链表的各簇号置“00 00 00 00”
2、NTFS
①
该文件的FR偏移16H处的一个字节改变:0--文件被删除,1--文件正被使用,2--是一个目录,3--目录被删除
②
该文件父文件夹的INDEX_ROOT属性(90H属性)或者INDEX_ALLOCATION(A0H属性)改变…
③ $Bitmap中把该文件所占用的簇对应的位置置0
四、一些问题
1、在存储文件时,FAT32先按顺序进行簇分配,先存的文件首簇号在前,后存的在后,存储顺序和簇链顺序是线性的;删除一些文件后簇链表之中出现一些未占用簇碎片,此时再存储新文件时就打破了线性规则,可能出现“后存的比先存的首簇号要小”“簇链中簇不是连续的”,这给FAT32的数据恢复增加了难度。
2、簇的大小和FAT表的大小之间的平衡关系。之所以引入簇作为文件存储的单位,是因为扇区512B的大小太小,如果以扇区为单位,就要花大量空间来记录扇区号;但是簇也不是越大越好,簇过大会导致“大材小用”的局面,也就是空间浪费。
MasterBootRecord,主引导记录
大小为一个扇区即512B=446(引导程序)+64(16*4,DiskPartitionTable硬盘分区表)+55
AA(结束标志)
四个DPT一般为“基本分区、扩展分区、保留、保留”对应“C、其它盘、无、无”
二、分区结构
1、FAT32
DBR(DosBootRecord,引导记录)
FAT(FileAllocationTable,文件分配表)
→ 磁盘文件是以簇为单位进行存储的,簇的大小是扇区的倍数,通常最大32KB也就是64个扇区;FAT32的簇号
是32位即4B,类似的,FAT16是2B
→
根文件夹中的每一项对应一个文件,大小为32B,其中有该文件首簇号和文件簇数等信息
→ FAT表记录了文件数据的簇链,通过根文件夹首簇可以跳转到FAT中对应位置,根据簇号来定位数据存储位置
2、NTFS
MFT(MasterFileTable,主控文件表)
→ MFT的表项叫做FR,FileRecord,文件记录,大小为1KB,0~15个FR是元数据文件记录,16之后的是用户文件或目录记录(目录也被看作是文件);其中$Bitmap的文件用数组方式记录了DATA区每一簇的使用情况
→
FR由“表头+属性+FFFFFFFFH结束标志”构成,属性由“header+body”构成,其中header的前四字节是属性标志,如30H--文件名属性,、80H--数据属性
→ Data属性详解:
小文件(不超过700多字节)直接存在该属性的body中,大文件则以“运行”的方式来存储
PS:相当于一段连续的簇打了个包,包的首簇号和簇数等信息以“运行项”的形式存储在body中
PPS:一个文件有多个包时就有多个运行项,要注意的是,后面运行项的首簇号是相对于前一项首簇号的偏移值
eg:0x20处的0040H是data run的偏移值,由80H开始偏移0040H即data
run;有三个运行项,“4[/u] 1[/u] 12[/u]
30 DD 81
00[/u]”中“1”和“4”分别指后面1B和4B是该运行的簇数和首簇号
运行一,首簇号0081DD30H,簇数12H;运行二,首簇号(81DD30+4A03)H,簇数02H;…
三、直接删除文件的变动
1、FAT32
① 根文件夹中对应项的首字节置“E5”,首簇号高位两字节置“00 00”
② FAT表中对应簇链表的各簇号置“00 00 00 00”
2、NTFS
①
该文件的FR偏移16H处的一个字节改变:0--文件被删除,1--文件正被使用,2--是一个目录,3--目录被删除
②
该文件父文件夹的INDEX_ROOT属性(90H属性)或者INDEX_ALLOCATION(A0H属性)改变…
③ $Bitmap中把该文件所占用的簇对应的位置置0
四、一些问题
1、在存储文件时,FAT32先按顺序进行簇分配,先存的文件首簇号在前,后存的在后,存储顺序和簇链顺序是线性的;删除一些文件后簇链表之中出现一些未占用簇碎片,此时再存储新文件时就打破了线性规则,可能出现“后存的比先存的首簇号要小”“簇链中簇不是连续的”,这给FAT32的数据恢复增加了难度。
2、簇的大小和FAT表的大小之间的平衡关系。之所以引入簇作为文件存储的单位,是因为扇区512B的大小太小,如果以扇区为单位,就要花大量空间来记录扇区号;但是簇也不是越大越好,簇过大会导致“大材小用”的局面,也就是空间浪费。
相关文章推荐
- java 执行cmd/shell keytool 导入证书
- ASP.Net和新对象之context.Server
- 2015GitWebRTC编译实录6
- 关于IOS应用程序视图
- Spring 注入
- innodb与Myisam的区别
- Java小数四舍五入与保留位(一)
- java 反射机制
- Online Judge System For SzNOI 题库 语法百题 C++ d002
- hdu 5282 Senior's String动态规划
- 某些浏览器中的My97日历控件点击后无效的解决方案
- PHP中类的继承关系
- ARP 命令运行实现静态IP/MAC绑定
- 堆排序
- OpenVSwitch 配置QOS
- 网站采取黑白配色的方法
- delphi编码
- 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools
- PAT (Advanced Level) 1016. Phone Bills (25) 电话账单
- [Tip] Install OpenCV3.0.0 for python3.4.3 under ubuntu15.04