|
声明:本文内容代表作者本人的技术水平及观点,错讹之处概不负责,并谢绝篡改。
现在很多的电脑使用者已经不再关心卷标了,然而实际上,小小的卷标曾有着漫长的历史和有趣的经历。在DOS时代,大家曾经用卷标来防止误删分区;在Windows 95引入长文件名的时候,卷标也曾引起非凡的争议;在大家崇尚用GHOST备份系统的时候,又引出了关于卷标的种种讨论。今天,就让我们来看看卷标的整个传记历史。(本文所指卷标为Microsoft的DOS/Windows系统下的卷标)
【卷标的家】
卷标产生于DOS2.0(或1.0,记不确了,需要回去查)时代,那时还没有硬盘。为了不致混淆手头的几十张软盘,人们需要一种给软盘启名字的手段,这就是卷标。这样,在使用“DIR”命令列出该软盘上的文件时,会先出现这张盘的卷标。在电脑的远古时代,经常使用卷标功能来检查是否放入了编号正确的磁盘。卷标功能在后来出现的硬盘里得到了继承,并在硬盘被分成多个区时起到了标识各分区的功效。
卷标最早的家在磁盘(包括软盘和硬盘)的“根目录”区里,也就是和那些“A:\”和“C:\”下的文件在一起,卷标的格式和普通文件名完全一样,只是属性被置了一个特殊的“位”。下图是本人D盘根目录的十六进制显示(左侧)和ASCII显示(右侧),请大家注意其中第一行第十二字节的“28”。

DOS/Windows系统使用每32个字节(上图中的两行)来记录一个文件的文件名,其中前8个字节是文件名,然后3个字节是文件名的扩展名。再后边还有文件建立的日期、时间以及文件第一数据块在硬盘上的位置和文件的长度等等信息。卷标由一个称为“文件属性”的字节来进行说明,该字节在扩展名的后面,如我刚才指出的那个“28”。这个“28”不能够念做“二十八”,因为它代表的是十六进制,应该念做“二八”。十六进制的“二八”化为二进制就是“00101000”。其中的第三位(倒数第四个位称为“第三位”)被置为了“1”,说明该记录项不是“文件”,而是记录了一个“卷标”。换言之,本人的D盘的卷标是“DOCUMENT”。文件属性字节的各个位的含义标明在下表中:
|
第七位 |
第六位 |
第五位 |
第四位 |
第三位 |
第二位 |
第一位 |
第○位 |
|
未用 |
未用 |
归档 |
目录 |
卷标 |
系统 |
隐含 |
只读 |
因为卷标不是文件,不必分文件名和扩展名,所以卷标的长度是文件名的8个字符加上扩展名的3个字符,可以最长设置为11个字符。
上文中所指的“目录”,即是在Windows图形操作系统中所谓的“文件夹”。
【卷标胡乱改】
在DOS下,设置卷标需要使用LABEL的外部命令(你现在还可以在Windows 9x里找到它)。而且设置的卷标永远都是大写的,而且不可以使用诸如“\”和“:”等系统有特殊解释意义的符号。但是如果我们使用直接写磁盘的工具来改动,又如何呢?比如,我们使用DISKEDIT将卷标改为了小写字母。这样,在使用FDISK分区删除该分区时,就会因为卷标的不匹配而无法删除这一分区。虽然解决此问题的办法只需先对此分区格式化然后再删分区即可,可也毕竟难倒了一堆菜鸟。
卷标在目录项里是没有文件长度的,大家从上图中可以看出,DOCUMENT卷标的第二行后4个字节全是“0”。如果我们手工在这4个字节里填入一些信息,就可以利用这些信息来检查是否有人格式化了磁盘。因为即使他设成同样的卷标,这4个字节的信息也不会恢复。
卷标的属性是很有意思的事情,我提出这样一个问题:如果有一个文件项,其属性被置为了既是卷标又是目录(二进制的00011000,十六进制18),那么系统拿它当目录还是当卷标?如果将这个属性字节设置成既是只读又是隐含又是系统又是卷标(二进制00001111,十六进制0F),又该如何呢?
在DOS/Windows系统下,无论何时,只要卷标位被置为1,它就不会再被作为文件或目录对待。利用这一特性,可以隐含目录。属性置为18的目录将不再被系统列出,如果想隐含某一文件,则可以将其属性设为0F。Windows 95的“长文件名”技术,正是利用了0F这一功能,在记录原8.3文件名格式的同时,以0F属性记录该文件的长文件名。从上图中可以看出,有四个目录项存在长文件名(长文件名中字符以UNICODE格式保存,所以看起来不连续)。
【使人困惑的AP卷标】
在Windows 95刚流行的年代,大量的用户困惑于自己的卷标为何变成了“AP”,且无法进行修改,不论是在Windows 95下还是使用DOS方式的LABEL命令。这其实就是长文件名的0F属性所致。因为DOS/Windows系统在解释卷标时总是在根目录里从前往后寻找第一个标为卷标属性的目录项。如果用户格式完硬盘后并未设置卷标,那么安装完Windows 95之后,其Programe Files的长文件名目录项因为0F属性,将被作为卷标。而且因为同时具有“只读”、“系统”、“隐含”等属性,不可以被修改。如上图中,如果没有设置DOCUMENT的卷标项,我的D盘卷标就会变成不可更改的AM。
利用系统只识别一个卷标的特性,我们可以在目录区大做文章。AV95的杀病毒软件在最初推出的版本中限制使用次数,其所用的技巧中就使用了这一点。AV95在根目录区建立了一个属性为0F的文件用来存放自己的使用次数。为了担心别人识破,它给该文件启了一个类似于Windows 95系统文件的文件名。但是又害怕如果用户没有设置卷标这个文件名就会被作为卷标显示,所以又在这个文件名之前放置了另一个属性为0F的文件,这“另一个”的文件使用ASCII的255号字符作为文件名(255号字符和编号为32的空格一样,没有显示点阵)。但是如果我们在一个刚刚格式化过的硬盘上使用AV95,则一下子就可以看穿这个小把戏,实在是逗人的很。
【使用卷标来防止盗版?】
如果将卷标建在子目录下,该会如何呢?当然使用系统提供的方式是做不到这一点的,但是因为卷标和文件一样使用目录区,所以我们可以手工修改或者通过程序在子目录里建立卷标,这种卷标当然不会被做为卷标解读,但却可以提供我们对这一目录的监控,如果有人复制这一目录,这个卷标是不会被复制走的,所以可以用来防止盗版。
【卷标的新家】
从DOS 5.0(抑或是从4.0开始,记不清了)开始,DOS多了一个新家——在BOOT区里。如下图所示:

注意第三行后五个字节和第四行前六个字节,是卷标。(WANGYUNTAO)
这样一来,多了很多问题:
如果两个地方(根目录下和BOOT区里)的卷标不一样,系统把哪个认为是卷标呢?
系统设置卷标的时候,是两个都改么?DOS下的LABEL命令也会两个都改么?
答案:无论何时,系统都只把卷标的第一个家,也就是根目录下的卷标作为系统卷标,而BOOT区里的新家,则无可奈何地成为了“陪房”,基本上不起任何作用。虽然这样,当系统更改卷标时,不论是图形界面下的操作还是LABLE命令,都会同时更改两处卷标。
然后奇怪的是,Windows NT 3.51和Windows NT 4.0却对BOOT区里的卷标充耳不闻,如果使用这两个操作系统更改卷标,只会更改根目录下的数据,BOOT区里卷标的位置上,永远都只是“NO NAME”。这个情况直到Windows NT 5.0,也就是Windows 2000时,才改为两处同时更新。
SYMANTEC的GHOST软件一问世,就受到了大家的热烈欢迎。在经历过无数次重装Windows 9x就必须重装所有的DRIVER,然后是WINZIP、OFFICE、ACDSEE、IME……等等之后,大家无不欢迎GHOST的备份做法。但是,面对越来越大的硬盘和越分越多的分区,GHOST里一步选错就将带来灾难的后果,大家纷纷把目光投在GHOST所列举出的各分区的卷标上。奇怪的是,为什么明明存在的卷标,GHOST里却说NO NAME?而且同样是NO NAME,还有大写的NO NAME和小写的no name之分!
GHOST并不象系统那样去辨认根目录下的卷标,它颇为省事儿地去BOOT区里(卷标的新家)那里去获得卷标。如果此处是大写的NO NAME(象NT 4.0那样),就会显示大写的NO NAME,如果此处空白,GHOST会显示小写的no name。这里面有一种危险,因为前面说过,BOOT区里的卷标有可能和根目录下的卷标是不一样的,如果正好有一个含有重要数据的分区(假设为C,根目录下卷标为DISK1而BOOT区里卷标为DISK2)和一需要重写的分区(假设为D,根目录下卷标为DISK2而BOOT区里卷标为DISK1),那么灾难将不可避免。
小小的卷标里有这些有趣的故事,看来电脑上的任一种技术都大有其研究空间。
联想电脑 王云涛 二○○一年三月十三日 版本 1.1
该文章知识产权属作者个人,请勿篡改!转载亦请保留作者姓名、单位、著作日期及版本。
作者授权任何人可以在任何时候做合法的非商业性转载并感谢您的传播,但务请告知作者。
|