2009年2月4日星期三

硬盘分区表

  人们在使用电脑时,有时由于异常操作,有时由于病毒侵袭,会导致某个分区消失或硬盘无法启动。究其原因,就是硬盘分区表受损。硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。
  一.分区表的位置及识别标志
  分区表一般位于硬盘某柱面的0磁头
1扇区.而第1个分区表(也即主分区表)总是位于
(0柱面,1磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来.分区表有64个字节,占据其所在扇区的[441-509]字节.要判定是不是分区表,就看其后紧邻的两个字节(也即[510-511])是不是
"55AA",若是,则为分区表.二.分区表的结构分区表由4项组成,每项16个字节.共4×16
= 64个字节.每项描述一个分区的基本信息.每个字节的含义如下: 分区表项含义
  字节 含义
  0
Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区.
1,2,3 该分区的起始磁头号,扇区号,柱面号磁头号 -- 1字节, 扇区号 --
2字节低6位,柱面号 -- 2字节高2位 + 3字节 4 分区文件系统标志:分区未用:
0x00H. 扩展分区: 0x05H, 0x0FH.
  FAT16分区: 0x06H.
  FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.
  NTFS分区: 0x07H.
  5,6,7 该分区的结束磁头号,扇区号,柱面号,含义同上.
  8,9,10,11 逻辑起始扇区号。表示分区起点之前已用了的扇区数.
  12,13,14,15 该分区所占用的扇区数.
  分区表项有几个字节比较重要,下面分别阐述之: 1、(1,2,3)字节
  磁头号由(1)字节8位表示,其范围为(0 -- 28 - 1),也即(0 磁头--
254磁头)。扇区号由(2)字节低6位表示,其范围为(0 -- 26 -
1),由于扇区号从1开始,所以其范围是(1扇区--
63扇区)。柱面号由(2)字节高2位 + (3)字节,共10位表示,其范围为(0
--2 10 - 1),也即(0 柱面--
1023柱面)。当柱面号超过1023时,这10位依然表示成1023,需要注意。(5,6,7)字节含义同上。
2、(8, 9, 10, 11)字节如果是主分区表,则这4
个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面,0磁头,1扇区)之差。如果非主分区表,则这4
个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差,要么为63。详细情况在后面有所阐述。注意:
1、扇区上的字节是按左边低位,右边高位的顺序排列的。所以在取值时,需要把字节再反一下,让高位字节在左边,低位字节在右边,这一点在读取逻辑起始扇区号和分区大小时需要注意。举个例子:第一项的逻辑起始扇区为(3F
00 00 00),转换为十进制前要先反一下字节顺序,为(00 00 00
3F)然后在转换为十进制,即63 .同理分区大小为(3F 04 7D 00),先反为(00
7D 04 3F)再转换为十进制,即8193087。
2、逻辑扇区号与(柱面,磁头,扇区)的相互转换:令L = 逻辑扇区号,C =
柱面号,H = 磁头号,S = 扇区号。每道扇区数 = 63
  每柱面磁头数 = 255
  每柱面扇区数 = 每道扇区数* 每柱面磁头数
  = 63 × 255
  = 16065
  柱面号下标从0开始。磁头号[0 -- 254],扇区号[1 -- 63]。
  逻辑扇区号下标也从0开始。
  (柱面,磁头,扇区)转换成逻辑扇区号的公式为:
  L = C×16065 + H ×63 + S - 1 ;
  比如(1柱面,1磁头,1扇区),其逻辑扇区号为:
  L = 1×16065 + 1×63 + 1 - 1
  = 16128
  逻辑扇区号转换成(柱面,磁头,扇区) 公式为:
  C = L / 16065
  H = (L % 16065) / 63
  S = (L % 16065) % 63 + 1
  比如逻辑扇区号 16127:
  C = 16127 / 16065 = 1
  H = (16127 % 16065) / 63 = 0
  S = (16127 % 16065) % 63 + 1 = 63
  即(1柱面,0磁头,63扇区)
  3、分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区。主分
  区表上的4项用来表示主分区和扩展分区的信息。因为扩展分区最多只能有一个,所以硬盘
  最多可以有四个主分区或者三个主分区,一个扩展分区。余下的分区表是表示逻辑分区的。
  这里有必要阐述一点:逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。
  4、分区表所在扇区通常在(0磁头,1扇区),而该分区的开始扇区通常位于(1磁头,1扇区),中间隔了63
个隐藏扇区。三.分区表链的查找
  分区表链实际上相当于一个单向链表结构。第一个分区表,也即主分区表,可以有一项
描述扩展分区。而这一项就相当于指针,指向扩展分区。然后我们根据该指针来到扩展分
区起始柱面的0头1扇区,找到第二个分区表。对于该分区表,通常情况下:第一项描述了
扩展分区中第一个分区的信息,第二项描述下一个分区,而这第二项就相当于指向第二个分
区的指针,第三项,第四项一般均为0。我们可以根据该指针来到扩展分区中第二个分区起
始柱面的0头1扇区,找到第三个分区表。以此类推,只到最后一个分区表。而最后一个分
区表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可
以推导找出其后面所有分区表。不过该分区表前面的分区表就不好推导出来了。但令人高兴
的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面, 0磁头,
1扇区)处,
我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。以笔者的硬盘为例:一个主分区(C盘),
一个扩展分区.扩展分区中有两个逻辑分区(D盘,E盘)其分区表链示意图如下:
图一 分区表链示意图 (一).读取(0柱面,0磁头,1扇区)处C盘的主分区表:
[80 01 01 00 0B FE 7F FD 3F 00 00 00 3F 04 7D 00 ] [00 00 41 FE 0F FE
FF FF 7E 04 7D 00 1F 2C B4 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
第一项:(80)(01 01 00)(0B)(FE 7F FD )(3F 00 00 00 )(3F 04 7D
00)描述的是C盘的情况。
1.(80):表示C盘为活动分区。即系统会从C盘启动。 2.(01 01
00):表示C盘的起始扇区为(0柱面,0磁头,1扇区)。
3.(0B):表示C盘的文件系统为FAT32。 4.(FE 7F FD): (FE) 16 = (254)
10 (7F) 16 = (0111 1111) 2 (FD) 16 = (1111 1101) 2 磁头号:(254)
10;扇区号:(11 1111) 2 = (63) 10. 柱面号:(01 1111 1101) 2 = (509) 10
故C盘结束扇区为(509柱面,254磁头,63扇区)。 5.(3F 00 00
00):反向,(00 00 00 3F) 16 = (63)
10,为C盘起始逻辑扇区号与逻辑0扇区号之差。表示C盘前面已有63个扇区,这63个扇区为系统隐藏扇区。
6. (3F 04 7D 00):反向,(00 7D 04 3F) 16 = (8193087)
10。表明C盘有8193087个扇区。即(0柱面,1磁头,1扇区)至(509柱面,254磁头,63扇区)共有8193087个扇区。第二项:
(00)(00 41 FE)(0F)(FE FF FF)(7E 04 7D 00)(1F 2C B4
00)描述的是扩展分区的情况。 1. (00): 表示该分区不是活动分区。 2. (00
41 FE): (00) 16 = (0) 10 (41) 16 = (0100 0001) 2 (FE) 16 = (1111 1110)
2 磁头号:(0) 10;扇区号:(00 0001) 2 = (1) 10.
  柱面号:(01 1111 1110) 2 = (510) 10
  所以扩展分区的起始扇区为(510柱面,0磁头,1扇区)。
  3. (0F): 表示该分区为扩展分区。
  4. (FE FF FF):
  (FE) 16 = (254) 10 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2;
  磁头号:(254) 10;
  扇区号:(11 1111) 2 = (63) 10.
  柱面号:(11 1111 1111) 2 = (1023) 10
  但这是不准确的,因为当柱面号的真实值超过1023时,表示柱面号的10位也依然是1023。
  5. (7E 04 7D 00):
  反向,(00 7D 04 7E) 16 = (8193150) 10.
表示扩展分区的起始扇区号为8193150,即(510
柱面,0磁头,1扇区)。这是真实准确的,我一般都用这一项来定位分区起点。
6. (1F 2C B4 00): 反向, (00 B4 2C 1F) 16 = (11807775) 10.
表示扩展分区共有11807775个扇区。通过上面得到的起点和分区的大小,可以推导出扩展分区的结束位置:8193150
+ 11807775 = 20000925号扇区,即(1244
柱面,254磁头,63扇区)。二.查找D盘分区表
根据上面的信息,第二个分区表,也即D盘分区表在(510柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下:
[00 01 41 FE 0B FE FF 7B 3F 00 00 00 BF A3 5D 00 ] [00 00 C1 7C 05 FE
FF FF FE A3 5D 00 21 88 56 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
第一项:(00)(01 41 FE)(0B)(FE FF 7B)(3F 00 00 00 )(BF A3 5D
00)描述的是D盘的情况。 1.(00):表示D盘不是活动分区。
  2.(01 41 FE):
  (01) 16 = (1) 10 (41) 16 = (0100 0001) 2 (FE) 16 = (1111 1110) 2.
  磁头号:(1) 10;
  扇区号:(00 0001) 2 = (1) 10.
  柱面号:(01 1111 1110) 2 = (510) 10;
  故D盘开始扇区为(510柱面,1磁头,1扇区)。
  3.(0B):表示D盘的文件系统为FAT32。
  4.(FE FF 7B):
  (FE) 16 = (254) 10 。 (FF) 16 = (1111 1111) 2 (7B) 16 = (0111 1011)
2. 磁头号:(254) 10;
  扇区号:(11 1111) 2 = (63) 10.
  柱面号:(11 0111 1011) 2 = (891) 10
  故D盘结束扇区为(891柱面,254磁头,63扇区)。
  5.(3F 00 00 00):
  反向,(00 00 00 3F)16 =
(63)10,为D盘起始逻辑扇区号(510柱面,1磁头,1扇区)与扩展分区起始逻辑扇区号(510柱面,0磁头,1扇区)之差。表示D盘前面已有63个扇区,这63个扇区为系统隐藏扇区。
  6. (BF A3 5D 00):
  反向,(00 5D A3 BF) 16 = (6136767) 10。表明D盘有6136767个扇区。
  通过上面得到的起点和分区的大小,可以推导出D盘的结束位置:8193150 +
63 + 6136767 =
14329980号扇区。即(891柱面,254磁头,63扇区)。与上面的正好吻合。第二项:
  (00)(00 C1 7C)(05)(FE FF FF)(FE A3 5D 00)(21 88 56 00)
  描述的是E盘的情况。
  1. (00): 表示E盘不是活动分区。
  2. (00 C1 7C):
  (00) 16 = (0) 10 (C1) 16 = (1100 0001) 2 (7C) 16 = (0111 1100) 2
  磁头号:(0) 10
  扇区号:(00 0001) 2 = (1) 10
  柱面号:(11 0111 1100) 2 = (892) 10
  所以E盘的起始扇区为(892柱面,0磁头,1扇区)。
  3. (05): 表示E盘的在扩展分区里面。
  4.(FE FF FF):
  (FE) 16 = (254) 10 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2
  磁头号:(254) 10
  扇区号:(11 1111) 2 = (63) 10
  柱面号:(11 1111 1111) 2 = (1023) 10
  但这是不准确的,原因同上。
  5.(FE A3 5D 00):
  反向,(00 5D A3 FE) 16 = (6136830) 10.
这一项非常重要,它定位了E盘分区表所在扇区。其值为E盘分区表所在扇区号与扩展分区起始扇区号之差。所以,E盘分区表所在扇区号为:
  8193150 + 6136830 = 14329980。即(892柱面,0磁头,1扇区)。
  6.(21 88 56 00):
  反向,(00 56 88 21) 16 = (5670945)
10.表示E盘共有11807775个扇区。通过上面得到的起点和分区的大小,可以推导出E
盘的结束位置:14329980 + 5670945 = 20000925号扇区,即(1244
柱面,254磁头,63扇区)。三.查找E盘分区表
根据上面的信息,第三个分区表,也即E盘分区表在(892柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下:
[00 01 C1 7C 0B FE FF FF 3F 00 00 00 E2 87 56 00] [ 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
该分区表第二项全为0,说明没有下一个分区表了。该分区表就是分区表链的最后一个节点。第一项:(00)(01
C1 7C)(0B)(FE FF FF)(3F 00 00 00 )(E2 87 56
00)该项与D盘分区表的第二项描述的都是E盘的情况,但它们在某些细节上又有所区别。
1.(00):表示E盘不是活动分区。 2.(01 C1 7C):
  (01) 16 = (1) 10 (C1) 16 = (1100 0001) 2 (7C) 16 = (0111 1100) 2.
  磁头号:(1) 10
  扇区号:(00 0001) 2 = (1) 10
  柱面号:(11 0111 1100) 2 = (892) 10
  故E盘起始扇区为(892柱面,1磁头,1扇区)。
  3.(0B):表示E盘的文件系统为FAT32。
  4.(FE FF FF):
  (FE) 16 = (254) 10 。 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111)
2. 磁头号:(254) 10;
  扇区号:(11 1111) 2 = (63) 10.
  柱面号:(11 1111 1111) 2 = (1023) 10
  但这是不准确的,原因同上。
  5.(3F 00 00 00):
  反向,(00 00 00 3F) 16 = (63)
10.这一项与D盘分区表相应项有所不同.为E盘起始逻辑扇区号(892柱面,1磁头,1扇区)与(892柱面,0磁头,1扇区)之差。表示E盘前面已有63个扇区,
这63个扇区为系统隐藏扇区。操作系统无法对这些扇区进行读写,所以可以把自己的秘密信息写在这里.
  6. (E2 87 56 00):
  反向,(00 56 87 E2) 16 = (5670882)
10。表明E盘有5670882个扇区。而D盘分区表相应项为5670945. 5670945 -
5670882 = 63.
正好等于63个隐藏扇区.这是因为D盘分区表描述的是(892柱面,0磁头,1扇区) 到
(1244 柱面,254磁头,63扇区) 之间的扇区数。而E盘分区表描述的是(892柱面,
1磁头,1扇区) 到 (1244 柱面,254磁头,63扇区)
之间的扇区数。四.结束语至此,我们已经打通了整个分区表链.以后在某个链节点数据受损时,也可以根据上下节点的信息而手工定位并修复之。修复工具可采用可读写磁盘的Winhex.

FAT32文件系统

Windows95 OSR2和Windows 98开始支持FAT32
文件系统,它是对早期DOS的FAT16文件系统的增强,由于文件系统的核心--
文件分配表FAT由16位扩充为32位,所以称为FAT32文件系统。在一逻辑盘(硬盘的一分区)超过512
兆字节时使用这种格式,会更高效地存储数据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此是使用大容量硬盘存储文件的极有效的系统。本人对Windows
98下的FAT32
文件系统做了分析实验,总体上与FAT16文件系统变化不大,现将有关变化部分简介如下:(一)FAT32
文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后
还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。
  (三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过FAT实现的,
FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和
回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。
  从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据
区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),
允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇
号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。
  每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体
为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这
样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8
个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。
  (四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,
可以用一簇对应16个扇区,依此类推。FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇
对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法使用。显
然,对于容量大于512MB的逻辑盘,采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。
  但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用
空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。
  另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘
容量设为1100M(稍大于1024M),则使用时其有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用FDISK
等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有的系统将1MB理解为1000000B,1000KB等),及每个分区
需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。
  (五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文
件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件系统的
根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。
  (六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、
长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义,全部32字节的定义如下:
(1) 0 7字节文件正名
(1) 0-- 7字节文件正名。
(2) 8--10字节文件扩展名。
(3)
11字节文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。
(4)
11--13字节仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。
(5)
13--15字节24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
(6)
16--17字节16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
(7) 18--19字节16位二进制的文件最新访问日期,定义同(6)。 (8)
20--21字节起始簇号的高16位。 (9)
22--23字节16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
(10)24--25字节16位二进制的文件最新修改日期,定义同(6)。
(11)26--27字节起始簇号的低16位。
(12)28--31字节32位的文件字节长度。其中第(4)至(8)项为以后陆续定义的。对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32
系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。(七)以前版本的Windows
和DOS与FAT32 不兼容,不能识别FAT32分区,有些程序也依赖于FAT16
文件系统,不能和FAT32
驱动器一道工作。将硬盘转换为FAT32,就不能再用双引导运行以前版本的Windows(Windows
95 [Version 4.00.950]、Windows NT 3.x、 Windows NT 4.0 和Windows
3.x)。硬盘数据恢复知识数据恢复一直以来都是我们关注的问题,因为你的电脑数据每天都在受着诸如病毒、恶意代码、黑客、误操作等的威胁!那么如何才能恢复你的数据呢?希望本文能对你有所帮助!
一、理论篇
要深入学习数据恢复,并非是一件容易的事,要想成为一个数据恢复专家,没有深厚的理论知识是不可能的,你必须了十分了解磁盘的逻
辑结构,就让我们来看看需要学习的理论知识吧。
当我们对文件进行访问时,你有没有想过,操作系统是如何对文件进行操作的呢?这些文件又是如何存放在磁盘当中的呢?先来看看硬盘
的总体结构,在介绍硬盘总体结构之前有必要介绍一下硬盘的参数,硬盘是以磁头(Heads),柱面(Cylinders),扇区(Sectors)进行访
问的。其中: 磁头数(Heads)表示硬盘总共有几个磁头,也就是有几面盘片,
最大为255 (用8 个二进制位存储); 柱面数(Cylinders)
表示硬盘每一面盘片上有几条磁道,最大为1023 (用10 个二进制位存储);
扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为63 (用6
个二进制位存储).
每个扇区一般是512个字节,学习过汇编语言的朋友可能想到了,BIOS中断13H的入口参数中,CH是磁道号其值为0H~FEH(最多255个磁道),CL中低6位为扇区号,其值为1H~3FH(最多63个扇区),DH为磁头号的低位,CL中的高2位为磁头号的高位,也就是说,磁头号最多由10位二进制数表示,(1111111111)2=(1023)10,也就是说最多可以表示的磁头数为1024个。请大家记住这些在我们以后的学习中还会用到的,由此可以看出基于这种访问方式我们最大能访问的磁盘容量为:
255 * 1023 * 63 * 512字节=8414461440/1048576=8024.66M
只有大约8G的空间,这是因为早期磁盘还很小,想想当年你拥有一块200M硬盘时的喜悦心情吧!就好象当年的科学家们以为1K内存已经很
大了一样,让电脑用户很长一段时间都为配置DOS下的内存而烦恼。而今,你肯定拥有一块大于8G的硬盘了,你能够用她,应该多亏了一
种较新的硬盘访问技术——扩展Int13H 技术。采用线性寻址方式存取硬盘,
所以突破了8 G的限制,
而且还加入了对可拆卸介质(如活动硬盘)的支持,因为是谈数据恢复不是谈编程,关于扩展INT13H技术我在此就不详述了。硬盘数据(基于FAT结构)总体结构如下:
1、主引导扇区(Master boot sector) (占用一个扇区)
2、第一个分区的引导扇区(Boot sector)(占用一个扇区)
3、第一个分区的FAT1 (占用空间由磁盘大小和FAT类型来定)
4、第一个分区的FAT2 (占用空间由磁盘大小和FAT类型来定)
5、第一个分区的根目录区
5、第个分区的根目录区
6、第一个分区数据区(用来存放各种文件的数据)
7、扩展分区表(占用一个扇区)
8、第二个分区的引导扇区(Boot sector)(占用一个扇区)
9、第二个分区的FAT1 (占用空间由磁盘大小和FAT类型来定)
10、第二个分区的FAT2 (占用空间由磁盘大小和FAT类型来定)
11、第二个分区的根目录区
12、第二个分区数据区(用来存放各种文件的数据)
13、扩展分区表
. . .
注意:当你的硬盘没有扩展分区的时候,你就没有扩展分区表了;当你只有一个硬盘分区的时候你的硬盘结构到6就完了。
(一)主引导扇区(Master boot sector)的结构:
它是硬盘的第一个扇区, 由主引导程序(MasterBoot
Record简称MBR),硬盘分区表(Disk Partition
Table简称DPT )和结束标识三部分组成。其结构如下: 1、偏移0H~1BDH
主引导程序(占446个字节,但实际可能并没有到这么多的字节)
2、偏移1BEH~1FDH
硬盘分区表(占64个字节,每个分区项占16个字节,最多可容纳4个分区项)
3、偏移1FEH~1FFH 结束标识(占2个字节,结束标志,总为55H
AAH)主引导程序我在此就不分析了,需要注意的是在主引导程序中有一些出错信息,一些引导型病毒往往会覆盖这些信息来将自己嵌入到主引导程序中去,并将主引导程序开始的几个字节改为一条跳转指令,通过观察主引导程序的变化,往往可以让我们看出自己的电脑是否有引导型病毒,一旦发现异常,我们可以用FDISK/MBR命令来覆盖原有的MBR。结束标识的两个字节总是55H
AAH,该标识只是用于判断这个扇区是否是有效的主引导扇区,如果主引导程序发现没有这个结束标识,将会认为操作系统丢失,并显示"Missing
Operating System"。硬盘分区表:
从偏移1BEH~1FDH的64个字节存放的是硬盘分区表,其中最多包含4个分区项,每个分区项由16个字节构成,其结构如下:
1、1BEH~1CDH 分区项1
2、1CEH~1DDH 分区项2
3、1DBH~1EDH 分区项3
4、1EFH~1FDH 分区项4
注意:没有用到的分区项上的记录总是16个十六进制码00H
我们再来看看每个分区项的详细含义,假设我们的一个分区占用的16个字节被标为00H~0FH,其结构如下:
00H
引导标识字节,其值只能为00H或80H,为00H时表示该分区不可引导,为80H时表示该分区可用于引导。在许多诸如BOOT
MAGIC之类的软件都是利用了这一原理,实现多操作系统引导的,了解了这一原理,你也可以写出你自己的多操作系统引导程序了。
01H 分区起始磁头号 02H
其高2位为分区起始柱面号的高位,底6位为分区起始扇区号 03H
分区起始柱面号的低位 04H
分区系统标志,当该值为00H时,表示此分区为不可识别的系统;为04H时该分区为FAT16分区;为05H或0FH该分区为扩展分区;为0B
时该分区为FAT32分区;为83H时表示该分区为Linux分区,
为07时该分区为NTFS分区等等。一些如PQMAGIC磁盘软件在隐藏分区操作时就是将此字节的内容保存后在把它改为00H。
05H 分区结束磁头号 06H
其高2位为分区结束柱面号的高位,底6位为分区结束扇区号 07H
分区结束柱面号的低位 08H~0BH
此4个字节为在线性寻址方式下的分区的扇区地址。当分区大于8G时,扩展INT13H是通过该信息进行寻址的,我们可以发现在这种方式下寻址最多可访问的空间为:FFFFFFFFH扇*512B/
扇=2048G,也就是说我们用扩展INT13H最大可以访问的空间为2048G,这个数字现在对我们来说是非常大的,但谁都不能想象计算机的发展之快,到时到底要如何来突破这个限制呢?现在谁也不知道。注意:此4个字节
是从高位到低位排列的!例如我的分区表第一个分区项此4字节的内容为"3FH 00H
00H
00H",它代表该分区是从0000003FH开始的,也就是从线性地址63扇开始的(线性地址把硬盘的第一个扇记为0H扇)
0CH~0FH
此4个字节为以扇区为单位的该分区大小(总扇区数),此4个字节同样是从高位到低位排列的!
(二)引导扇区(Boot
sector)的结构:当主引导程序找到了带有引导标识为80H的分区后,就会将该分区的引导扇区读入到内存地址为0000:7C00
处,并把控制权交给引导扇区中的引导程序,让我们来看看其中一些需要了解的地方:
1、0H~02H 一条跳转指令,指针指向后面的引导程序 2、03H~0AH
厂商名和系统版本 3、0BH~0CH 每扇字节数,一般为512字节
4、0DH
每簇扇区数(有关簇的概念我们在后面会详细介绍),对于FAT32的磁盘该字节一般为08H,既每簇为8H*512B=4K。
5、0EH~0FH 保留扇区数 6、10H 磁盘FAT的个数,一般为2个
7、11H~12H
对于FAT16的磁盘为根目录的最大目录项,对于FAT32的磁盘该值总为"00H 00H"
8、13H~14H
对于软盘或早期小硬盘该处为分区总扇区数,对于硬盘一般此值为"00H 00H"
9、15H 介质描述,对于1.44软盘此处长为"F0H",对于硬盘此处长为"F8H"
10、16H~17H
对于软盘或早期小硬盘该处为每个FAT占用的扇区数,对于硬盘一般此值为"00H
00H" 11、18H~19H 每道扇区数,一般为"3FH 00H",即每道有63个扇区
12、1AH~1BH 磁头数,一般为"FFH 00H",即每个柱面有255个磁头 13、1CH~1FH
隐含扇区数 14、20H~23H 对于大硬盘来说该处存放的是该分区占用的扇区数
15、24H~27H 对于大硬盘来说该处存放的是每个FAT占用的扇区数 16、40H
该处为磁盘BIOS信息,第一块硬盘为"80H",一般软盘为"00H" 17、47H~51H
用户设置的卷标,如果没有卷标此处常为字符串"NO NAME " 18、52H~59H
文件系统,对于FAT32文件系统此处常为"FAT32 " 19、1FEH~1FFH
结束标识,和上文提到的主引导区的结束标识一样为"55H AAH"
以上是引导扇区的一些信息,在上面我们可以获得一些有用的信息,我们也可以想象一下为什么当我们在分区上单击右键在分区属性中可以看到一些分区信息,比如分区大小,文件系统等等,知道原理,你也可以直接调用这些参数了。

(三)磁盘文件分配表(FAT)
在介绍FAT之前,我们要先了解有关簇的概念,簇(Cluster)是文件数据区被划分成的具有大小相等的区域用于磁盘文件的计量分配单
位。一个簇可能有1、2、4、8、16、32、64或128(必须是2的幂)个扇区构成,但对于一种磁盘系统是其值往往是一定的,比如FAT16中
每簇一般为32K(占64个扇),FAT32中每簇一般为4K(占8个扇)。
要理解操作系统为什么要用簇对磁盘进行管理,还是得学习FAT,FAT32磁盘中在系统引导区之后有一些保留未用的扇区,再后面有一个以
F8H FFH FFH 0FH 开始的FAT表,(对于FAT16是以F8H
FFH开始的),每个FAT项占32位(4个字节),FAT16的每个FAT项占16位(2个字节),不同的FAT值有不同的含义:
FAT12的表项值FAT16的表项值FAT32的表项值值的含义
000H 0000H 00000000H 未用的空簇
001H~FEFH 0001H~FFEFH 00000001H~0FFFFFEFH 文件已使用的簇
FF0H~FF6H FFF0H~FFF6H 0FFFFFF0H~0FFFFFF6H 系统保留簇
FF7H FFF7H 0FFFFFF7H 坏簇
FFF8H~FFFH FFF8H~FFFFH 0FFFFFF8H~0FFFFFFFH 文件的最后一簇
注意:在FAT表项中的16进制码总是从高向底排列的。
我们再来看看系统是如何利用FAT表来管理和访问文件的。系统在创建一个新文件时,逐一扫描FAT,跳过已经分配的簇,将该簇分给文
件,其簇号作为该文件的起始簇号被放在该文件的文件目录项中(关于文件目录项我们将在后面详谈),如果此文件的大小只需要一个簇
就可以放下的话,在该簇对应的FAT项中将放文件最后一簇的标志(一般是FFH
FFH FFH
F0H,即其值为0FFFFFFFH),如果文件大小一个簇放不下,系统就会在继续寻找FAT表中未用的簇,找到后将该簇的簇号写到上一簇对应的FAT项中,如果此时已经可以存下该文件的数据,系统就会在此簇对应的FAT中记上最后簇的标志,否则就继续找下一空簇......
也就是说FAT和簇是一一对应的关系,对于FAT32的FAT来说每4个字节为1个FAT项(对于FAT16的FAT每2个字节为一个FAT项),从0~N个FAT
项分别对应0~N个簇,在我们对文件进行访问时,总是先访问文件的目录项,找到首簇簇号,再找到该簇号对应的FAT项,在其中找到下一
簇的簇号,再在下一簇对应的FAT项中找到再下一簇的簇号......一直到在FAT项中找到有文件最后一簇的标志,我们对该文件的查找才结
束。(当然也可能在首簇对应的FAT中该文件就结束了)这样就形成了一个链,我们把它称为盘簇链。
简要介绍一下FAT12系统,FAT12现在只用于软盘,因为是每个FAT占12位所以是每2个字节含有3个FAT项,我们来看看FAT12系统在寻找簇
链的过程:将10进制簇号*1.5并取整,该值为FAT相对位移,在该处存放的是下一簇的簇号,以此类推。
一个问题:到底每簇占多少扇区合适?文件所占簇数为:
文件占用的簇数=[文件长度/每簇所占空间]取整+1
文件在最后一个簇存放的时候不可能刚好放满,没有放满的空间就浪费了(就好象我们打电话不可能每个电话都打到X分59.99秒,即使你
通话时间为X分1秒你也要付出X+1分的电话费),我们可以来计算一下你的FAT系统磁盘空间浪费的大小:
浪费的空间大小=文件个数/2*每簇字节数(平均每个文件浪费半个簇的空间)
这样看来好象簇越小浪费的空间也越小,但是有个矛盾的地方是簇越小FAT所用的空间就会越大,同时簇小了,簇链就越长,访问文件的
时间就会加长,这又是一种资源上的浪费,因此,簇的大小应该是以提高文件的访问时间和充分利用磁盘空间为原则的。
(三)目录项的结构
在第2个FAT表(系统一般有两个同样的FAT表)后我们可以找到该分区的根目录区,在上面有许多目录项(注意:目录项并非根目录才
有),让我们先来复习一下FAT16的目录项各个字节的含义:
由32个字节构成:
00H~07H 文件的文件名,其中00H为以下值时有些特定含义:
00H 表项为空表项
E5H 文件已被删除
05H 实际该字节为的值为E5H
08H~0AH 文件的扩展名
0BH 文件属性8位文件属性字节含义如下:
B7~B6 未用
B5 归档位
B4 子目录(代表该文件是一个目录或叫文件夹)
B3 卷标(卷标也解释为一种特殊的文件)
B2 系统文件
B1 隐藏文件
B0 只读文件
0CH~15H FAT16系统保留未用
16H~17H 系统最后修改时间,其中:
16H字节的0~4位是以2秒为增量的秒
16H字节的5~7位和17H字节的0~2位是分钟
17H字节的3~7位是小时
18H~19H 文件最后修改的日期,其中:
18H字节0~4位是天号
18H字节5~7位和19H字节0位是月份
19H字节的1~7位为年号,0~119分别代表1980~2099
1AH~1BH 文件的起始簇号(我们在之前已经介绍了)
1CH~1FH 文件的长度(单位为字节)
我们知道用在FAT16系统下的文件名有一些弊端,如:文件名最多只能有8个字符(或4个汉字),扩展名最多有3个字符,不分大小写,不
能用一些特殊字符等。在FAT32系统这些问题已经得到解决,我们来看看FAT32系统是如何解决长文件名问题的。假如在你的电脑中有一个
文件名为abcdefghijklmnopqrstuvwxyz111111.txt的文件名,那么该文件在磁盘目录中就占用了4个已32字节为单位的目录项,其中有3个目
录项是用来描述长文件名的,有1个目录项是用来兼容老的FAT系统的,我们来看看例子中前3个用于描述长文件名的目录项:
43H 31H 00H 31H 00H 31H 00H 31H 00H 31H 00H 0FH 00H 27H 31H 00H
2EH 00H 74H 00H 78H 00H 74H 00H 00H 00H 00H 00H FFH FFH FFH FFH
02H 6EH 00H 6FH 00H 70H 00H 71H 00H 72H 00H 0FH 00H 27H 73H 00H
74H 00H 75H 00H 76H 00H 77H 00H 78H 00H 00H 00H 79H 00H 7AH 00H
01H 61H 00H 62H 00H 63H 00H 64H 00H 65H 00H 0FH 00H 27H 66H 00H
67H 00H 68H 00H 69H 00H 6AH 00H 6BH 00H 00H 00H 6CH 00H 6DH 00H
不难看出描述长文件名的目录项中的一些规则:
在每个目录项的32个字节中,(1)、偏移0H处:代表了长文件描述目录项的序号,其中高4位如果为0100则表示此项为最后一个目录项,低
4位表示此长文件名的目录项的序号。如果此长文件名描述目录只用到了1个目录项,则此值为41H,如果此值为E5H代表此文件已被删除;
(2)、偏移0BH~0CH处:其值总为0FH
00H;(3)、偏移0D处:该长文件目录项的标号,同一个长文件目录的不同目录项该值总相同(比如本例中3个目录项该值都为27H);(4)、偏移1AH~1BH处:该值总为00H
00H;(5)从偏移01H~1FH跳过前4项提到的字节,总是一个文件名的
ASCII码接一个00H排列的,如果文件名的ASCII码在一个目录项还未写完,则会接到下一个目录项(实际上这些目录项都是从高到低排列的)同样的位置继续写,如果已经写完,则系统会在最后一个ACSII码后写00H,最多写3个00H,如果3个00H写完后,目录项还有空余位
置,则系统会把这些位置全部写上FFH。
同时FAT32系统还有一个类似与FAT16的目录项(紧接着长文件名的目录的后面),同样占32个字节:
00H~07H 文件的文件名
08H~0AH 文件的扩展名
0BH 文件属性
0CH 保留未用
0EH~0FH 文件创建时间
10H~11H 文件最后访问日期
12H~13H 文件创建日期
14H~15H 文件起始簇号的高16位
16H~17H 系统最后修改时间,其中:
16H字节的0~4位是以2秒为增量的秒
16H字节的5~7位和17H字节的0~2位是分钟
17H字节的3~7位是小时
18H~19H 文件最后修改的日期,其中:
18H字节0~4位是天号
18H字节5~7位和19H字节0位是月份
19H字节的1~7位为年号,0~119分别代表1980~2099
1AH~1BH 文件的起始簇号的低16位
1CH~1FH 文件的长度(单位为字节)
注意:其中文件名为DOS兼容文件名,比如上例中在DOS下的文件名为ABCDEF~1.TXT;其首字节含义同FAT16系统;文件属性字节含义同
FAT16系统;在FAT32系统中增加了最后访问日期和文件创建时间日期,其计算原理同FAT16中的最后修改的时间和日期。
  其中第(4)至(8)项为以后陆续定义的。对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32
系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部
是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字
节为校验和,26--27字节为零
(四)扩展分区表
我们已经学习了在主引导扇区中的分区表的偏移04H,是分区系统标志,当该值为05H或0FH表示该分区为扩展分区,其实它并非一个真正
意义上的分区项,此分区项只是指向一个扩展分区表,这样做是为了解决分区表中最多只能有4个分区项的问题,扩展分区表也是从扩展
分区表所在的扇区偏移1BEH~偏移1FD,该扇区0H~1BDH一般为1BEH个00H,同样要以结束标志55H
AAH结束。同样,在扩展分区表中也可能存在指向下一个扩展分区表的分区项。

硬盘的文件系统结构

  初买来一块硬盘,我们是没有办法使用的,你需要将它分区、格式化,然后再安装上操作系统才可以使用。我们一般要将硬盘分成主引导扇区、操作系统引导扇区、FAT表、DIR目录区和Data数据区等五部分。我们通常所说的主引导扇区MBR在一个硬盘中是是唯一的,MBR区的内容只有在硬盘启动时才读取其内容,然后驻留内存。其它几项内容随你的硬盘分区数的多少而异。

  1、主引导扇区(MBR)

  主引导扇区位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main
Boot Record)和分区表DPT(Disk Partition
Table)。其中主引导记录的作用就是检查分区表是否正确以及判别哪个分区为可引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。

  2、分区表(DPT)

  在主引导区中,从地址BE开始,到FD结束为止的64个字节中的内容就是通常所说的分区表。分区表以80H或00H为开始标志,以55AAH为结束标志,每个分区占用16个字节,一个硬盘最多只能分成四个主分区,其中扩展分区也是一个主分区。随着硬盘容量的迅速扩大,引入的扩展分区可以不受四个主分区的限制,把硬盘分区数扩展到"Z"。

  值得一提的是,MBR是由分区程序(例如DOS的Fdisk.exe)产生的,不同的操作系统可能这个扇区的内容代码是不相同,但是实现的功能只有一个,使其中的一个活动分区获得控制区,正常启动系统。

  主分区是一个比较单纯的分区,通常位于硬盘的最前面一块区域中,构成逻辑C磁盘。在主分区中,不允许再建立其它逻辑磁盘。也可以通过分区软件,在分区的最后建立主分区,或在磁盘的中部建立主分区。

  扩展分区的概念则比较复杂,也是造成分区和逻辑磁盘混淆的主要原因。由于硬盘仅仅为分区表保留了64个字节的存储空间,而每个分区的参数占据16个字节,故主引导扇区中总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据,如果说逻辑磁盘就是分区,则系统最多只允许4个逻辑磁盘。对于具体的应用,4个逻辑磁盘往往不能满足实际需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念。

  所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。

  需要特别注意的是,由于主分区之后的各个分区是通过一种单向链表的结构来实现链接的,因此,若单向链表发生问题,将导致逻辑磁盘的丢失。这就是当硬盘被CIH病毒破坏后,我们可以通过KV3000的F10功能来找到丢失的D,E及以后的逻辑分区的原因。

  3、操作系统引导扇区(OBR)

  OBR(OS Boot
Record)即操作系统引导扇区,通常位于硬盘的0磁道1柱面1扇区(这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/
扩展分区的第一个扇区),是操作系统可直接访问的第一个扇区,它也包括一个引导程序和一个被称为BPB(BIOS
Parameter
Block)的本分区参数记录表。其实每个逻辑分区都有一个OBR,其参数视分区的大小、操作系统的类别而有所不同。

  引导程序的主要任务在当根目录中寻找系统文件IO.SYS,MSDOS.SYS和WINBOOT.SYS三个文件,如果存在,就把IO.SYS文件读入内存,并移交控制权予该文件。在WIN98的系统中,没有MSDOS.sys文件,系统能够正常启动,但是无法进入桌面;如果没有COMMAND.COM文件,能够正常启动到桌面,但是无法进入DOS字符方式。

  BPB参数块:记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数、分配单元(Allocation
Unit,以前也称之为簇)的大小等重要参数。OBR由高级格式化程序产生(例如DOS
的Format.com)。

  4、文件分配表(FAT)

  FAT(File Allocation
Table)即文件分配表,是DOS/Win9x系统的文件寻址系统。为了防止意外损坏,FAT一般做两个(也可以设置为一个),第二FAT为第一FAT的备份,FAT区紧接在OBR之后(对于FAT32格式,位置是从引导扇区开始的第32个扇区就是第一个FAT表的位置),其大小由这个分区的空间大小及文件分配单元的大小决定。

  随着硬盘容量的迅速发展,Microsoft
的DOS及Windows也先后采用我们所熟悉的FAT12、FAT16和FAT32格式。不过Windows
NT、OS/2、UNIX/Linux、Novell等都有自己的文件管理方式,不同于FAT文件格式。

  FAT12是使用12BIT来表示簇的位置,最大容量32M,FAT16是使用两个字节16BIT位来表示簇的位置,分区最大容量2G,而FAT32采用4个字节来表示簇的位置,分区最大容量65G。

  5、目录区(DIR)

  DIR是Directory即根目录区的简写,在FAT12和FAT16格式中,DIR紧接在第二FAT表之后,而在FAT32格式中,根目录区的位置可以在分区中的任意位置,其起始位置是由引导扇区给出的。单有FAT表还不能确定文件在磁盘中的具体位置,只有FAT表和DIR区配合使用,才能准确定位文件的确切位置。

  DIR记录着每个文件(目录)的文件名,扩展名,是否支持长文件各,起始单元(这是最重要的)、文件的属性,大小,创建日期,修改日期等住处内容。操作系统在读写文件时,根据DIR中的起始单元,结合FAT表就可以知道文件在磁盘的具体位置,然后顺序读取每个簇的内容就可以了。

  6、数据区(DATA)

  在DIR区之后,才是真正意义上的数据存储区,即DATA区。

  DATA虽然占据了硬盘的绝大部分空间,但没有了前面的各部分,它对于我们来说,也只能是一些枯燥的二进制代码,没有任何意义。

  注意:我们通常所说的格式化程序(指高级格式化,例如DOS下的Format程序),并没有把DATA区的数据清除,只是重写了FAT表而已,除非你使用了"Format
X: /U"命令,强制对每一扇区写"F6"。

  至于硬盘分区,也只是修改了MBR和OBR,绝大部分的DATA区的数据并没有被改变,这也是许多硬盘数据能够得以修复的原因。但即便如此,MBR,OBR,FAT,DIR之一被破坏的话,我们的数据也无法正常读取。

Windows和Linux之间压缩包中文乱码的解决

在linux与windows平台间交换压缩包文件,如果文件名中含有中文,有时候就会遇到乱码问题,给平台间的文件交换带来麻烦。7zip和rar会对文件名编码进行转换,内部文件名编码使用unicode.
解决方法:
如果使用linux+utf8系统,压缩中文文件时最好使用7z,以免无法在windows正常解压。
7z a dir.7z dir/

2009年2月2日星期一

一篇犀利的金牛座人性分析

十二星座中与恋人分手时大吵大闹的人永远不会是金牛座,但金牛座却博得了一个GG最无情MM最绝情的名声。其实一哭二闹或者海誓山盟这两样很极端的事金牛座都做不来。
  搞不懂金牛座的人建议你再去看看《花样年华》和《西西里的美丽传说》,影片中那似有却无、挥之不去的情愫可曾说出口过一个"爱"字吗?所谓大音希声、大象无形,看似没有味道,其实却包含了一切味道。
  金牛座的人无论男女,都是表面上若无其事,暗地里柔肠百转,人又骄傲自负,心里有苦也说不出来。无论你是亲密爱人还是青梅竹马,他们心里总有你的位置。其实十二星座中最放不下情这个字的就是金牛座,他们最记得你的好、你的美,到老都不会忘。
  那些山崩地裂、火山喷发式的情感发泄完了也就厌了,终将被丢弃。唯独金牛座总是将那些好的、坏的、不好不坏的情感一一收藏起来,甚至你在清晨滴落的每一颗冰凉的泪珠,他都会小心地合入掌心加入自己的体温,炼化成一颗颗无暇的珍珠,放在自己的心上默默地背着,也许就这么背上一辈子。
  不能说金牛座是最懂得爱情的星座,但他们的确能够领略到爱的真实。善于计算利害得失的金牛座偏偏在感情上会投入很长的时间,这对他们来说是相当奢侈的。"情到深处情转淡",看似很淡,但却伤得很深。
  那不着痕迹的退隐,那毅然潇洒地转身,都是在表达爱与不爱、取与舍之间的最高境界。像樱花一般多少繁华烂漫瞬间飘落,无声无息归于尘土。
  情之一字在金牛座身上体现出巨大的张力和无限的遐想空间,使其神秘含蓄的特质发挥得淋漓尽致。金牛座凭借其特有的悟性和耐力攀上"情"山的顶峰,放眼看到的是天地合一,万籁俱寂,上天对世间万物苍生垂下无尽的哀怜!
  所以无论是无情的还是绝情的都是在用转身这个动作警示你"亲爱的,路到尽头了,好回头了。旧爱已成往事,不要令你自己更伤心,也不要让我更难堪。"
  当你看着那转身离去的背影、听到电话里传来"嘟嘟"的忙音,别难过,无言不代表无话可说。其实每一个放弃旧爱的金牛座都明白这样一句话"尽管在一起是我没有对你说过我爱你,但我将终其一生把你的笑语欢颜刻在我的心上,这是我的宿命:永不忘你青春年少的模样。"爱不是生命的全部,能做到这样也已足够了吧?放手让它去,任多少旧爱随风,任惆怅旧欢如梦。留一点尊严给那个樱花树下伤心不已的自己,这样可以使你看上去更高贵洒脱,动人心魄!

  能和金牛座谈一场恋爱,无论结局幸与不幸,你都会变成个中高手,更容易把握住真正属于你的幸福。因为在追求与放弃之间,金牛座总能带你学会什么是生活。
  当年与金牛座初初相遇时,你笑妍如花、少不更事,并不懂得什么叫爱情。当你深明世事、人情练达,终于懂得什么是生活的时候,你却再也没有那般纯真的爱了!历尽情殇、劫后余生的你已经学会脸上带着从容淡定的微笑,把眼泪和忧伤埋在心底,坐看风起云涌、潮涨潮息,手指漫天云霞,却轻轻对自己身边的爱人道一句"天凉好个秋"。

金牛座的人确实是寡言少语,不过,这并不代表没有思想、没有见解。
恰恰相反,金牛座的人大多都是很有思想和内涵的,
只是有时候他们不屑于无谓的争辩或是和无聊的人争辩,
他们心里都很蔑视那些喳喳呼呼而有毫无水准的人。
他们也不喜欢十分喧闹的场合(虽然他们并不是不能疯)
通常选择的都是自娱自乐;做事比较低调不自信,
其实心里都有一种一鸣惊人的欲望,而通常他们确实又都具备这个能力。
高傲和自卑这对双生姐妹在金牛座身上体现得特别明显。
金牛座的人通常对吃的要求很高,但这并不代表他们就是贪吃。
他们喜欢的是精美可口的食物而并非仅仅是填报肚子,
对垃圾食物他们一般是不屑一顾的。
因为他们对味觉比常人较敏感,所以他们把吃也当作是一种欣赏品位的过程。
而金牛座对事物的鉴赏能力也是很出名的。
另外,美食还可以减轻金牛座常常产生的焦躁不安情绪
以及莫名其妙的低落心情。
而这种情绪是常常会在金牛座的身上出现的,也就是所谓的低潮期。
金牛座的人有很重的浪漫情怀,感情细腻也很激烈,
但由于他们不善于表达,所以总给人一种冷漠无情的错觉,
其实金牛座的人对感情是很认真的,也愿意为爱人赴汤蹈火,
但是一旦受到伤害,他就回用封锁一切的态度来面对感情。
表面上他可能装作毫不在乎(通常牛儿们都是这样做的)
其实心里在乎的要命。
他们相信爱情,但是对爱情的结果通常抱以悲观的看法。

归根到底,金牛座是彻彻底底的悲观主义者。
但是他们的行为不完全消极,反而给人一种积极向上的感觉,
他们对名利、金钱虽然看的很透彻,但仍怀有或强或弱的欲望,
这就是为什么金牛座的人喜欢拼命赚钱但是绝不拜金,
他们是不屑于做金钱的奴隶的。
他们淡泊名利但不出世。如果有必要他们也会不顾一切向上爬,
但这种动机和目的跟其他单纯出自欲望的人们是截然不同的,
他们这样做绝对有非做不可的理由。
他们不会局限于物质方面的追求,其实他们关注更多的是精神层面的东西,
所以金牛座的人通常是物质精神两不误。

金牛座的人大多是很有主见的,当然这一点有时候过分了就成了固执了。
他们有独创的意见和启发他人的能力,
这种才能会不会表现出来当然还得看他们乐不乐意。
他们也很富有叛逆精神,但通常不会做出太越轨的事,
因为他们在这方面还是较为懒散的,但一旦刺激了他们这根神经,
他们肯定会作出一些离经叛道的惊人之举,
小心被逼得没有后路的他们是最危险的。
金牛座在某些方面有着惊人的领悟力,或是数学、或是哲学、
更多的是音乐和艺术方面。在这些领域他们可堪称天才。
虽然他们表面温温吞吞的,但其行事乖张不下于双子,
而平常人根本猜不透他们毫无表情的外表下到底在想些什么,
他们也不会喜欢跟人粘得腻腻歪歪的,
保持距离是他们的处世哲学,虽然这并不代表冷漠。
所以爱上金牛座的人是很折磨人的一件事。
金牛座的人直率但不过火,真诚但不是什么话都跟人说,
他们很会替他人着想,他们很能体会人间疾苦,
即使是那些从小在温室中长大的牛儿们也极具同情心。
但是当金牛座的人受到严重打击时,
他们是会比任何人都更加冷酷无情和不择手段的。
他们懂得如何善良,同时也懂得如何邪恶。
总之,金牛座的人是非常富有魅力的。
特别是和他深入接触了之后,
他们广博的知识和幽默的谈吐以及个性的作风使人欣赏。
当然他们外表也会散发出一股独特的气质,
通常不是遭人异常的厌恶就是使人深深的被吸引。

2009年2月1日星期日

地铁奇遇记

今天,新年第一天上班,却和去年一样,到快八点了才下班。拖着疲惫的身躯,我走进了地铁。在地铁口买了一个煎饼,暂时填充一下肚皮。八点钟,五号线,崇文门站,这个时间车上人是不会太多的,我上了车,找了很空的一排座位,在中间位置坐下,啃了几口煎饼。

很快车到东单了,像往常一样,涌进来一大群人,我的右边坐下了两个小伙子,左边有四个女孩子同时挤着坐了下来,都比较苗条,因此勉强挤下了,于是这一排六个座位坐了七个人。不过这么一挤,我的手臂就被固定住了,几乎没法吃煎饼了,我于是转头看了一眼左边的女孩子。

她大概二十出头的样子,马尾辫,皮肤很白,下巴尖尖的,眼睛大大的,笑起来有点像李冰冰,很好看,她穿着黄色的羽绒服,紧身牛仔裤。看到我很郁闷的拿着煎饼,手臂没法动,就低头抿嘴笑了一下,然后很调皮的眨眨眼睛,对我说:"你看我也没法吃啊!"这是我才看到她手里还拿着一个牛皮纸袋的麦当劳产品。

嗯,我当时的感觉,不知道怎么形容了,每天坐地铁,遇见美女是很正常的,有时候也恨不得上去搭个讪,只不过一直都是有贼心没贼胆。这次是第一次有美女主动跟我说话,当时紧张得不得了,其实浑身都很不自在,却还要装作一副毫不在乎的样子,当时好像我就嘟嘟囔囔的回了一句"没事,不挤"。

从东单开始,一路上,我一直都没静下心来,每次假装东张西望,然后趁机往左边看她,却总是意外的和她的眼光正面碰撞,然后她就会笑着眨眨眼睛看我,我就很不好意思的把头扭开,也不知道该说什么好。磕磕碰碰的把煎饼吃完了,车到张自忠路了,我习惯都是吃完东西吃口香糖,就自己倒了两颗,然后把罐子给她示意,她又笑了笑说:"不用啦!"我又假装很镇定的没话找话的说,"你怎么不吃东西啊?"她又是一笑,说,"我不饿啊!"然后我又无语,作满不在乎的东张西望状。

吃完煎饼我没事干了,有个美女依偎在身边,却不知道怎么跟人搭话。脑海里面一幕幕的放过曾经在水木各个版面学过的搭讪方法。但是瞅着车厢里一车陌生人,我跟她搭讪要联系方式会不会被人笑话啊?给她递个名片呢,俺的名片上印着这么多头衔,看起来像不像传销的骗子,早知道低调一点好了不要印这么多头衔。直接开口问她?没勇气啊!我就这样一直偷偷地看她,她似乎也没有静下来过,也是一样的东张西望,不时的拿出手机来看时间。要是我问她要联系方式,她直接回答我她有男朋友了,多丢人!她是不是希望我跟她搭讪呢?她是不是以为我有女朋友了所以不想跟她搭讪呢?

雍和宫快到了,这个站上下车的人很多,她也有可能在这里下车。我打定主意了,虽然我不是这站下,但是如果她下车我就提前跟着下车,到时候不像车厢里面这样众目睽睽,搭个话就容易多了,只要弄到联系方式,一切都好办。我在心里暗暗给自己打气,伦同学啊,你号称天生情圣,一世风流,上水木调戏过名媛无数,上qq群侃大山妙语连珠,如信手拈来探囊取物,怎么碰到机会真来了,就胆子这么小啊!

雍和宫到了。她没有下车,她旁边的两个女孩下车了,又坐了一个人下来,现在座位上坐6个人了,一下子松了很多,可是刚才美女还依偎在身边,现在就拉开距离了,有点不是滋味。忽然她又碰了碰我,说:"你坐过来一点啊,不挤了啊。"我就说:"谢谢。"稍微坐过去了一点,还是不敢碰她。我心里想,如果这个时候直接接一句"能问一下你手机号吗?"会不会很唐突?

她还是不停的掏手机看时间,然后嘴里好像在说些什么,我就小声问她:"你说什么?"她说:"哦,没什么,我在计算什么时候能到站。"我又无语了。然后她也深叹了一口气,闭上眼睛,做休息状。我壮着胆子仔细的看了看她。眉毛细细的,眼睛轻轻的闭着,没有化妆,鼻子很挺,脸很白,脸蛋的轮廓很柔美,抿着小嘴。然后她忽然睁开了眼睛,又把头转向左边窃笑。我很窘迫,赶紧把头转向右边。

怎么办呢,时间一分一秒的流逝,车就快到惠南了,我就要在惠南下车。她要是跟我一起下车那该多好,可是要是她不是这站下车呢,我是不是应该在下车前塞给她一张名片?还是干脆坐着不下车,等她一起下车,再搭讪?我的头脑中继续回放着各种经典搭讪画面,就是没有勇气开口。

"You are arriving at Huixinxijienankou Station."完蛋了,车到了,车门开了。我依依不舍的看着她,跟她说,"我到站了,拜拜。"她又对我笑了一笑,说:"嗯,拜拜。"走到车门,我回头看了她一眼,她对我轻轻挥了挥手,这一次没有笑,我不大敢看清楚她的脸,是不是她也有些不舍呢?

走到车外面,车门还迟迟没有关闭,然后"嘟嘟嘟"的关门铃响了,我是不是应该像电视剧里面演的那样,在这个电光火石的一刹冲进车厢里,坐回她身边,说"我不下车了,我想认识你"?当然这只是一个构思,我又不是电视剧的主角,我只是一个服务行业的从业人员,领着微薄的工资,每天来回要坐两个小时地铁上下班,还经常加班。明天还要上班,我看还是算了吧。

看着安全门关上,列车呼啸而去。我很惆怅,很失落的转身登上自动扶梯,上楼换乘十号线。列车很快开过来了,车厢还是很空,我坐上车,回想着刚才那一幕,有多少次可以搭讪的好机会啊。我的包里有笔有纸,完全可以写纸条递给她啊,比无聊的递名片不是浪漫多了。哦,我包里还有一本平时地铁上用来消遣的英文小书《Beedlethe Bard》,当时怎么忘了拿出来看,也许有共同语言,也许可以趁机借书给她,留电话,但是现在这一切,都太晚了!

列车吭哧吭哧的前进,我还在努力回忆那个女孩子的样子。假如,假如下次坐地铁还能遇见她,我一定勇敢的跟她搭讪,当然连续两次遇见陌生人的概率估计跟中500万有的一比了吧,哪里会再有这样的奇遇啊。又是一次错失良机,擦肩而过。

很快知春里站到了,我该下车了,走出车站,风是那么寒冷。仿佛把人带回现实世界,今天的这趟地铁之旅是多么的神奇。但是生活其实没什么神奇的,生活其实还是很无奈,我还是应该早点回家吃过晚饭睡觉,明天继续上班,努力赚钱攒够首付,然后买个小房子,然后上pielove大农贸市场插个草标把自己卖掉。那才是我等小市民应有的生活啊!生活!

谨以此文,纪念今天的地铁奇遇,感谢这位美丽大方的女孩给予我的微笑!

2009年1月31日星期六

Linux下gftp中文显示乱码的解决方法

默认设置下用gftp访问ftp站点时,有时会出现中文乱码,解决方法是在选项中,"General"里的"Remote Character Sets(远端字符集)"中添加 "gb2312;"即可正常访问。

彻底解决:

更改/usr/bin/gftp 第二行加入 export LANG=zh_CN.GBK 
后要 sudo locale-gen zh_CN 
sudo rm -rf ~/.gftp 

现在在命令行里面启动gftp中文显示就没问题了,如果在菜单里面启动gftp,还需要:
把“gFTP属性"”基本标签里的默然gftp-gtk %u“命令”改为gftp”.