全面剖析Windows磁碟掃描功能(轉)

RegisterForBlog發表於2007-08-10
全面剖析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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章