作業系統 - Win7 x64 下使用 ImDisk 當作RamDisk的小小心得與改良方法 - 電腦

前往內容


Win7 x64 下使用 ImDisk 當作RamDisk的小小心得與改良方法

使用RamDisk與否,一直存在網友間的論戰。對我來說,使用RamDisk至少可以降低硬碟機或SSD的讀寫頻率,以提高其壽命,所以我將 TEMP 目錄,IE / Firefox Temp 目錄,Pagefile,以及虛擬機器的無重要資料的虛擬磁碟檔案等等都放到RamDisk中。日常應用中,舉凡壓縮解壓縮或光碟映像檔處理等等,都先以RamDisk為暫存空間,所以算是RamDisk的中或重度使用者。

其中,Pagefile on RamDisk 是最常引發使用與否的論戰之一。對我而言,挖了一大塊記憶體來當作RamDisk後,自然會擔心剩下的記憶體偶而會不夠應用程式使用,所以在RamDisk中設定一個初始容量很小,但可隨系統需要自行長大的Pagefile,仍是一個很好的方案。

在過去的系統,可用的RamDisk軟體的選擇性較多,但在Win7又使用x64版本的條件下,若加上我自己需要的額外條件:免費、可設定為NTFS(便於放入大檔案)、可放入Pagefile等等條件,選擇性真的就不多了。而ImDisk 正好是一個可行的方案。

對於把 ImDisk 當作 RamDisk 來使用,網路上多有論述,例如01上的 超小巧效能強悍的窮人版 Ramdisk-ImDisk (含安裝與設定圖解說明@Windows 7 x64) 有基本且較詳細介紹。

ImDisk 是一個 open source 的 virtual disk driver,但作者的driver binary file 已經過數位簽章認證因而可以在 x64 環境下正常使用。不過由於該驅動程式的屬性,無法在Windows 下直接在控制台設定 Pagefile,幸好仍有一個工具程式 swapadd.exe 可以手動增加Pagefile在 RamDisk 中。ImDisk Installer 和 swapadd 都可以在官網上找到:http://www.ltr-data.se/opencode.html/

我的設定方法並不使用映像檔也不在關機時回存,而是使用startup script來設定之,關機後內容也不要了,這樣保留設定RamDisk大小的彈性,也略過了設定映像檔的繁瑣步驟。原始方法如下:
1.安裝 ImDisk
2.設定 ImDisk service 開機自動執行,方法是 裝置管理員 -> 檢視 -> 顯示隱藏裝置. 然後在 非隨插即用驅動程式 -> ImDisk Virtual Disk Driver 按右鍵 -> 內容 -> 驅動程式 -> 啟動 -> 類型 -> 自動。
3.建立一個工作目錄,我建立的是 C:\WBIN\RamDisk,將 swapadd.exe 放入該目錄,並建立一個 bproc.cmd 的 script file,設定的內涵是 7G大小的RamDisk在R: drive,而Pagefile大小為64MB~4096MB,其cmd file內容如下
C:\Windows\System32\imdisk -a -t vm -s 7G -m R: -p "/fs:ntfs /v:RamDisk /q /c /y"
C:\WBIN\RamDisk\swapadd r:\pagefile 64M 4096M
md R:\TEMP

4.接著指定開機時自動執行 bproc.cmd,方法是以 WinKey+R或Command Prompt 執行 gpedit,在 電腦設定 -> Windows 設定 -> 指令碼,然有 double click 啟動 -> 新增 -> 選取 C:\WBIN\RamDisk 下的 bproc.cmd 即可。
5.重新開機即可看到結果RamDisk R: 已存在。
6.接著可以開始轉移 TEMP,IE Temp 等等。

初步到此似乎是成功了,但是安裝防毒軟體後,發現重開機 RamDisk 不見了。原本單純以為是防毒軟體block startup script,經過長時間試驗各家的免費防毒軟體,狀況都相同。深入研究才發現原來安裝防毒軟體後延遲了 ImDisk driver 的載入,以致於 startup script 執行時,ImDisk driver竟還沒有運作。

為了解決這個問題,網路搜尋了半天不得要領,只好自己想辦法。幾經思索,想到一個不完善但卻可行,也實驗成功的方法,簡單說,就是在 startup script 一開始先檢查並等待 ImDisk driver 已載入才繼續 script。方法是利用 ImDisk 的 frontend config 程式 (也就是 imdisk.exe) 執行 enquiry 動作 (imdisk -l),根據傳回的訊息即可判斷 ImDisk driver 是否已載入。判斷的小程式 (chkmsg.c/exe) 如下:
int main(void)
{
char str[128];

scanf("%s",str);

printf("%s\n",str);
if(str[0] != 'N')// simply check 1st char only
{
Sleep(1000);// delay 1000ms = 1second
return(1);
}
return(0);
}


改良後方法如下:
1.安裝 ImDisk
2.設定 ImDisk service 開機自動執行,方法是 裝置管理員 -> 檢視 -> 顯示隱藏裝置. 然後在 非隨插即用驅動程式 -> ImDisk Virtual Disk Driver 按右鍵 -> 內容 -> 驅動程式 -> 啟動 -> 類型 -> 自動。
3.建立一個工作目錄,我建立的是 C:\WBIN\RamDisk,將 swapadd.exe / chkmsg.exe / bproc.cmd / waitim.cmd等置入該目錄。
4.接著指定開機時自動執行 bproc.cmd,方法是以 WinKey+R或Command Prompt 執行 gpedit,在 電腦設定 -> Windows 設定 -> 指令碼,然有 double click 啟動 -> 新增 -> 選取 C:\WBIN\RamDisk 下的 bproc.cmd 即可。
5.重新開機即可看到結果RamDisk R: 已存在。
6.接著可以開始轉移 TEMP,IE Temp 等等。

請注意,若工作目錄或 Windows 安裝目錄不同,請自行對應修改 bproc.cmd 和 waitim.cmd。另外,由於不熟悉batch script 的高階用法,waitim.cmd用plain的方式執行最多9次檢查動作,每次間隔1秒,有興趣請自行修改。最後,附件附上 bproc.cmd / waitim.cmd / chkmsg.exe 的 zip 檔。

附加壓縮檔: 201106/mobile01-48f1d12956f7d4739da3d4e2118d6895.zip

----------------2011/6/13更新--------------------
繞了一圈,卻發現忘了最基本的方法,只要在 bproc.cmd 一開始就啟動 imdisk service 即可,這樣連步驟2也可省去,也不需要 waitim.cmd / chkmsg.exe 了。bproc.cmd file內容更新如下
net start imdisk
C:\Windows\System32\imdisk -a -t vm -s 7G -m R: -p "/fs:ntfs /v:RamDisk /q /c /y"
C:\WBIN\RamDisk\swapadd r:\pagefile 64M 4096M
md R:\TEMP

對了,原本附件的bproc.cmd未更新,請自行修改之。

----------------2011/11/22更新--------------------
又發現原本的內容有問題, 經過網路搜尋研究, 應該還須再修正. 不過目前沒有完美的方案.

簡單說, 原先看到許多教學提到的類似命令
imdisk -a -t vm -s 7G -m R: -p "/fs:ntfs /v:RamDisk /q /y"
所建立的 RamDisk (應該是 Virtual Disk), 其實並不能拿來放 pagefile. 原因是這個命令是由 System Virtual memory 來配置記憶體, 而這些 virtual memory 本身是可能被 swap out to pagefile 的. 這樣造成衝突, 結果就是當機.

正確建立於 physical memory 的 RamDisk 應該使用以下命令.

net start awealloc
net start imdisk
C:\Windows\System32\imdisk -a -s 3G -f \\.\awealloc -m R: -p "/fs:ntfs /v:RamDisk /q /y"
C:\WBIN\RamDisk\swapadd r:\pagefile 64M 2048M

先載入imdisk隨附的 awealloc.sys 這個專門用來配置physical memory as file 的 driver. 再讓 imdisk 使用 driver file \\.\awealloc 來真正配置不會被 swap out 的 memory. 很可惜目前這個 awealloc.sys 不能處理 4G 或以上的記憶體, 這樣限制了單一 RamDisk 的大小了.

----------------2011/11/23更新--------------------
感謝 ultras 及 kamuy 網友提醒, 原來新版本 imdisk 1.5.3 已經解決了 awealloc 的 4GB bug 了.

pcfree wrote:
使用RamDisk與...(恕刪)


爬了三天終於找到大大的文章, 感激!

可惜我的Win7是家用版, 嘗試自行加入幾個DLL但"找不到入口點", 請問大大, 除了gpedit還可有其他方法把bproc.cmd加入到啟動? 本人學淺愚問, 但望賜教指點.


積極研究的精神,很值得鼓勵,不過經過這些"複雜"的設定後,最多只能說"優化"了系統,能增加的效率或是便利性,真的不如直接換一顆SSD來得實際且明顯,不想再引起無謂論戰,請勿回應無法認同的言論。


pg007 wrote:
爬了三天終於找到大大...(恕刪)


不知道您要做的東西的細節,對於 batch file (script file) ,也就是 .bat / .cmd 之類的檔案,我知道的入口點可以有以下幾種:
1.Group Policy (群組原則) 的電腦設定 (啟動/關閉)。
2.Group Policy (群組原則) 的使用者設定 (登入/登出)。
3.由Registry的許多Run / RunOnce 切入。
4.由開始功能表的啟動群組。
5.其他? 我不清楚,由網友補充。
我所用的是第1項,也是我認為最好的位置,1~4項裡面應該只有第1項是以系統管理員身分執行,而且執行的時機也最早。
kkgo2 wrote:
積極研究的精神,...(恕刪)


是很複雜沒錯, 但是先不論 temp 資料
在 SSD 當中讀寫跟 RamDisk 當中讀寫的效率差別吧 ...

小弟已有 SSD 當系統碟, 同時也使用 RamDisk 來當作 temp 區,
原因就是希望能盡量延長 SSD 的使用壽命,
既然您覺得 RamDisk 沒有必要性,
或許對於延長 SSD 使用壽命有些心得,
是否可以指教 ?

也用了一陣子
但發現有個缺點
像有的軟體的暫存目錄沒法更改
就只能直接將ramdisk掛成那個暫存目錄來使用
可是免費的好像沒辦法直接掛
只能先設好存成img
開機時再將img掛上
國外有高手解決了家用版不能開啟GPEDIT.msc

可參考 http://jwils876.deviantart.com/art/Add-GPEDIT-msc-215792914


注意 若系統使用者目錄 非預設C:\Users 可能無法使用

早先安裝系統時用指令改D:\Users 結果安裝時 導致複製不完整...
開啟GPEDIT.msc後會顯示 MMC 無法建立嵌入式管理單元 搞很久才發現是用戶目錄路徑的問題

最好先換GPEDIT.msc 再手動逐一改目錄位置


剛測了下發現 啟動加入執行程式 無效 不會自動運行.....


或許得改用工作排程 得再研究@_@
工作排程似乎無法設定關機執行程式



pcfree wrote:
使用RamDisk與...(恕刪)

感謝您分享寶貴的經驗...

能否向您請教...

我想用和你一樣的方式在開機的再創造一個新的 RAMDISK
然後再 RAMDISK 建立完成後再用複製軟體進行 RAMDISK 的資料的載入與備份
因為用 LOAD IMG 的方式比較耗時間, RAM 的空間也會被綁死



現在遇到的問題是,有沒有甚麼方式能夠確認 RAMDISK 已經順利被建立且已完成格式化可以正常寫入檔案


等確認完成後再進行自動備份載入的動作


目前想嘗試用 FASTCOPY 來執行,但是中間卡一個無法確認 RAMDISK 的問題

沒想到這篇文章又被翻出來, 先前使用上發現一些問題, 趁這次修正一下內容. 不過目前沒有完美的方案, 這也是遲遲沒有更新內容的原因.

簡單說, 原先看到許多教學提到的類似命令
imdisk -a -t vm -s 7G -m R: -p "/fs:ntfs /v:RamDisk /q /y"
所建立的 RamDisk (應該是 Virtual Disk), 其實並不能拿來放 pagefile. 原因是這個命令是由 System Virtual memory 來配置記憶體, 而這些 virtual memory 本身是可能被 swap out to pagefile 的. 這樣造成衝突, 結果就是當機.

正確建立於 physical memory 的 RamDisk 應該使用以下命令.

net start awealloc
net start imdisk
C:\Windows\System32\imdisk -a -s 3G -f \\.\awealloc -m R: -p "/fs:ntfs /v:RamDisk /q /y"
C:\WBIN\RamDisk\swapadd r:\pagefile 64M 2048M

先載入imdisk隨附的 awealloc.sys 這個專門用來配置physical memory as file 的 driver. 再讓 imdisk 使用 driver file \\.\awealloc 來真正配置不會被 swap out 的 memory. 很可惜目前這個 awealloc.sys 不能處理 4G 或以上的記憶體, 這樣限制了單一 RamDisk 的大小了.

-------------------------------------------------------------------------
另外回答 daywalkerN1,

其實我也是用 copy 的方式還原資料, 我只是在 bproc.cmd 後面繼續加上 copy 或 xcopy 命令即可, 基本上 startup script - bproc.cmd 是循序執行的, 前面load driver, 執行的 format 完成後, 後面的 swapadd, md R:\TEMP, copy 等等, 都會等前面執行完才運作, 故一切正常.

pcfree wrote:
沒想到這篇文章又被翻...(恕刪)


剛看完您的文章之後,我找了一些資料。

http://www.billsway.com/notes_public/WinXP_Tweaks/WinXP-2K_Pagefile/
http://www.pcdvd.com.tw/showthread.php?t=920389
我找到上述的軟體,可以用來檢視 pagefile 的使用量


用 google chrome 開了 1x 頁面,然後播放動作片
檢視結果如下

-----------------------------------------------
2011/11/23 下午 09:12:55
Pagefile Physical Location: C:\pagefile.sys
Current Pagefile Usage: 0 MB
Session Peak Usage: 0 MB
Current Pagefile Size: 32 MB
Pagefile Physical Location: r:\pagefile
Current Pagefile Usage: 0 MB
Session Peak Usage: 0 MB
Current Pagefile Size: 64 MB
------------------------------------------------
根本沒用到 @@


我系統設定 page file 32, R 為 ramdisk,採用您原先的方法建立的 64m 4096m
實體記憶體 12g

我在想,是否真的有需要把 pagafile 掛在 ramdisk 上嗎 ?




至於資料備份的部分,目前打算採 7.zip 無壓縮封裝,看看效率會不會比用 xcopy 快


備份
path C:\Program Files\7-Zip\
7z.exe a -mx0 c:\RamDisk\temp.7z r:\temp

回存
path C:\Program Files\7-Zip>
7z x c:\ramdisk\temp.7z -or:\

還在測試階段,您可以參考看看



1頁 (共2頁)

前往




此文章的引用連結