全面剖析Windows磁盘扫描功能(转)[@more@]
Windows2000/XP 系统磁盘扫描已经升级到卷的高度,不再是简单的 SCANDISK。卷被定义为包含文件系 统的分区,它可以用驱动器号/卷安装点或全局唯一标识符(GUID) 来寻址。我们可以在系统运行时强制进行卷 检查,或安排在重新启动时进行卷
检查,如果使用脚本还可以更准确地控制何时在卷上进行文件系统检查。要掌握磁盘扫描特点,需要灵活使用下面相互关联的3个工具:Chkdsk.exe、 Chkntfs.exe 以及Autochk.exe。让我们先来简单认识一下他们。
chkdsk.exe
检查硬盘驱动器的完整性,检查磁盘和修复文件系统就靠它了。chkdsk.exe 同时可以恢复文件系统错误, 并可以试图恢复坏扇区,如果无法修复就标记坏扇区,以避免文件被误写入导致丢失。
Chkntfs.exe
显示文件系统类型、文件系统“脏字位”状态,以及手工安排启动时运行 Chkdsk进行卷检查,或取消所 有安排的检查项目等。
Autochk.exe
查找每个卷上的“脏字位”,以及 Chkdsk /F 和 Chkntfs /X 或 /C 所作的注册表设置,决定是检查卷, 还是跳过检查。它可以区分是手工安排的卷检查,还是由于文件系统发现卷处于“脏”状态而自动进行卷检查 ,并会把相应的消息写入应用程序事件日志。该命令不能在 WIN32 模式下运行。
一、在系统运行时强制进行卷检查
安装 Windows2000/XP 后,“系统工具”文件夹中不显示磁盘扫描命令。不是没有了,具体这样做:
双击我的电脑,然后右键单击要检查的硬盘驱动器。
单击属性,然后单击工具。
在查错下,单击开始检查。
这样就可以在 Windows 中检查硬盘驱动器的完整性了。
或者到命令提示符下执行CHKDSK /X 命令。
/X 是一个新的命令参数,它运行 Chkdsk /F,并强制执行卷卸除,关闭非系统卷上打开的文件句柄,以 便立即对卷进行检查。这样,要运行 Chkdsk 并修复卷,就不必重新启动。
二、安排在下一次重新启动时进行卷检查
Autochk 通过有2个因素控制是否进行卷检查或跳过检查。一个是当文件系统检测到问题时,系统自己设置 的“脏字位”,设置脏字位的的目的就是为了在下次启动时对卷进行检查。 另一个是人工安排,既用 Chkdsk /F 和 Chkntfs /X 或 /C 所作的注册表设置。通过 Chkntfs volume:命令可以查询文件系统类型、文件系统 “字位”状态,以及是否已手工安排启动时运行 Chkdsk 进行卷检查等信息。
Autochk 在确定启动时检查哪些卷所使用的注册表项为:
Hkey_local_machineSystemCurrentControlSetControlSession ManagerBootExecute:REG_MULTI_SZ: autocheck autochk *
这是 Autochk 的默认设置,也是使用 Chkntfs /d 安排启动时检查所有卷所得到的结果。
下面通过设置或重设注册表,来控制 Autochk。
命令 BootExecute键植
Chkdsk C: /F autochk /p ??C:
Chkdsk C:mountpoint /F Autocheck autochk /p ??VOLUME{GUID}
Chkntfs D: E: /X Autocheck autochk /k:D /k:E *
Chkntfs G: /C Autocheck autochk /m ??G:
注解:
/P ??Volume: 安排 Chkdsk 无条件地运行来检查卷。
/p ??VOLUME{GUID} 安排 Chkdsk 无条件地运行来检查卷安装点。
/k:Volume * 不对卷执行 Chkdsk 检查。
/m ??Volume: 让 Autochk 仅查找卷上的脏字位,如果已设置脏字位,则运行 Chkdsk。
另外,Chkntfs /T:time: 在默认情况下,开机时扫描每个分区前会等待10秒钟,用户此时可以按任意键 跳过扫描继续启动。该参数就是用来设置等待时间的,即将Autochk 超时值改为指定时间(秒数),如果没有指定时间,则显示当前设置。系统在注册表项 key_local_machineSystemCurrentControlSetControlSessionManager下增加一个键:AutoChkTimeOut,类型为 REG_DWORD,数值为当前设置的超时值。
三、用脚本从程序中安排卷的修复日程
由于可以通过设置或重设注册表,来控制 Autochk,因此可使用脚本,从程序中安排卷的修复日程。
在记事本程序中,使用.VBS文件扩展名存储相应文件(例如:MyScript.vbs)。同时,建议您在一个公共文 件夹(例如:C:Scripts)中保存这些脚本。打开命令行窗口。如果需要,使用cd命令切换到用以存储脚本的 文件夹中。在命令行窗口中,输入csript 命令并在其后跟随脚本名称。
例如:
cscript myscript.vbs
1、修改 AutoChk 的 Timeout 值
为 Autochk.exe 设定自动延迟时间为 30 秒。适用于 Windows XP 或 Windows 2003 Server。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & " ootcimv2")
Set colAutoChkSettings = objWMIService.ExecQuery _
("Select * from Win32_AutochkSetting")
For Each objAutoChkSetting in colAutoChkSettings
objAutoChkSetting.UserInputDelay = 30
objAutoChkSetting.Put_
Next
2、防止 AutoChk 在开机时自动运行
即使电脑下次开机时,就算 C盘的 "字位" 已被设定, Autochk 也不会对C磁盘执行检查。适用于 Windows XP 或 Windows 2003 Server。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & " ootcimv2")
Set objDisk = objWMIService.Get("Win32_LogicalDisk")
errReturn = objDisk.ExcludeFromAutoChk(Array("C:"))
Wscript.Echo errReturn
3、执行 ChkDsk
对电脑的D盘执行ChkDks.exe。适用于 Windows XP 或 Windows 2003 Server。
Const FIX_ERRORS = True
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & " ootcimv2")
Set objDisk = objService.Get("Win32_LogicalDisk.DeviceID='D:'")
errReturn = objDisk.ChkDsk(FIX_ERRORS)
Wscript.Echo errReturn
4、安排在电脑下一次重新启动时,对 C 盘执行 Autochk.exe。适用于 Windows XP 或
Windows 2003 Server 。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & " ootcimv2")
Set objDisk = objWMIService.Get("Win32_LogicalDisk")
errReturn = objDisk.ScheduleAutoChk(Array("C:"))
Wscript.Echo errReturn
四、几点重要说明
1、开机时按下某个键跳过 Autochk
如果安排 Chkdsk 在启动时运行以检查某个卷,但实际启动时决定按下某个键跳过Autochk,则 Autochk 将 不会检查该卷,并删除相应的注册表项,在以后,Autochk也不会检查该卷。
2、Autochk应用程序事件日志
当 Autochk 在启动时运行检查某个卷时,它会输出记录到一个称为 Bootex.log 的文件中,该文件放在被 检查卷的根目录下。随后,Winlogon 服务将每个 Bootex.log文件的内容移到“应用程序事件日志”中。每个 被检查卷的事件日志消息按以下方式:
记录:
事件 ID:1001
源:Winlogon
说明:它包括文件系统类型、驱动器号或 GUID 及卷名称或序列号,可以帮助确定Chkdsk 检查的是哪个卷。此外还包括,Chkdsk 是因为用户的安排而运行的呢,还是因为已设置了脏字位而运行的等信息。
3、以只读方式运行的 Chkdsk 未检测到 NTFS 卷上的损坏
当只读模式对一个使用 NTFS 文件系统的磁盘卷运行 Chkdsk 时,Chkdsk 可能检测不到磁盘结构的损坏。原因是如果主文件表中的 $logfile 数据区被破坏,则可能会出现这一现象。解决方案是若要解决这一问题, 请在运行 Chkdsk 时使用 /f 选项,以便重新初始化 $logfile 数据区并修复损坏问题。
在命令提示符下键入下面的命令,然后按 ENTER 键
chkdsk volume_label :/v /f
其中, volume_label是您要对其运行 Chkdsk 的磁盘卷标。
4、在Microsoft Windows 2000 Server SP3上,在还原或复制大量的数据后 Chkdsk 找到不正确的安全 ID在您还原或复制大量的数据和与这些数据关联的 NTFS 文件系统安全信息时,Chkdsk.exe 可能会报告此分 区有错误。即使您把数据还原或复制到一个已知无错误的分区中时也会发生此问题。Chkdsk 可能会报告类似如 下内容的错误消息:
CHKDSK is verifying security descriptors (stage 3 of 3)...
Repairing the security file record segment.
Deleting an index entry with Id 8447 from index $SII of file 9.
Deleting an index entry with Id 31126 from index $SII of file 9.
Deleting an index entry with Id 50636 from index $SII of file 9.
Deleting an index entry with Id 3
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10763080/viewspace-942559/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10763080/viewspace-942559/