如何固定 Dataram RAMDisk (虛擬磁碟) 的磁碟代號

[Note: We have an English version for this post. Please read here]

RAMDisk

Dataram RAMDisk 是一個非常流行的免費 RAMDisk (虛擬磁碟,即將一部分記憶體分隔出來當成普通磁碟機使用。) 軟件。它與特色包括免費,最高可以設定 4GB 容量的虛擬磁碟(足夠應付大部分用途,收費版本可設定 4GB 以上的容量),免費版還同時支持 32 Bit 和 64Bit (某些競爭對手只有 32Bit 是免費,64Bit要收費),而且在各項測試中性能表現甚佳。如果您使用的是 32 Bit的 Windows 系統的話,Dataram RAMDisk 還可以突破系統4GB 記憶體的限制,讓您將 4GB 以外的記憶體設定為虛擬磁碟,不致浪費了寶貴的記憶體資源。我自己則從升級到 Win7 系統開始就使用 Dataram RAMDisk 至今已經有好長時間,對於它的性能和穩定性完全沒有任何問題。

唯獨…

我對這個軟件的唯一投訴就是,軟件本身無法將虛擬磁碟的磁碟代號進行固定,而是每次啟動時按最後的磁碟代號自動設置,這就為用家帶來很大的不便了。舉個例子,今天我開啟電腦後,我的虛擬磁碟是 K:,我將我的 Firefox 緩存檔設定在 K:\Cache 目錄下。第二天,我在啟動電腦前插上了一個 USB 磁碟,電腦開啟後,會自動將這個USB磁碟設定為 K: ,然後虛擬磁碟就順序使用了 L: 作為磁碟代號。這下可好了,當我打開 Firefox 的時候,它會將所有緩存資料儲存在 K:\Cache,也就是儲存在我的 USB 磁碟中,而不是虛擬磁碟中。當然,沒有一個用戶希望發生這樣的事情。用戶需要一個固定不變的磁碟代號。

官方解決方案

Dataram 也意識到這個問題,於是在軟件的用戶手冊中提出了一個解決方案,我稱之為官方解決方案。方案如下:先啟動軟件,設定好虛擬磁碟,並在控制台中將虛擬磁碟的代號設定為想要的代號,然後將虛擬磁碟的內容儲存成硬碟中的一個映像檔,然後每次啟動軟件的時候,自動載入這個映像檔,(有點像電腦遊戲中的“儲存”和“載入”的功能),那麼就可以每次都恢復相同的設定,包括磁碟代號。

但是,這個官方解決方案有兩個弊端,使得我個人認為比不用還好。

  1. 這個方案需要在磁碟機中建立一個與虛擬磁碟大小相同的映像檔。(雖然最新版本可以對映像檔進行壓縮,但是每次執行都要進行解壓縮,是用時間來空間,與使用 RAMDisk 的意願不符)
  2. 每次啟動軟件時,都需要載入這麼大的映像檔,既費時,又增加硬碟讀寫消耗,與RAMDisk 使用的意願不符。

我的方案:使用 DOS Batch 程序

為此,我專門寫了一個小小的 DOS Batch 程序,(如不計算程序中的註解的話,真正的程式碼只有三行)。這個程式使用了 Dataram RAMDisk 的一個特性功能:允許用戶指定磁碟機名稱(Drive Label),磁碟機名稱與磁碟機代號不同。對於系統而言,是使用磁碟機代號(C:, D:, E: …)來代表不同的磁碟機,但對於用戶而言,我們可以使用磁碟機名稱(“SystemDisk”, “MediaDisk” …)來表示不同的磁碟機。在Dataram RAMDisk,用戶可以為虛擬磁碟指定一個每次啟動都保持不變的磁碟機名稱。我的方案原理就是:每次啟動時,以指定的磁碟機名稱找出磁碟機代號(動態分配的代號,如 K:),然後建立另一個指定代號(如R:)的磁碟,將這個動態分配的代號(K:)與指定的代號(R:)進行關聯。那麼,無論我們打 “K:\Cache” 還是 “R:\Cache”,系統都會連到相同的目錄。

詳細步驟

為了將事情簡單化,我在這裡列出每一步步驟。

1. 建立一個 DOS Batch 檔案

用“記事本”建立一個文字檔案,敲入以下的程式碼,然後儲存為 C:\StartUp.bat(當然您可以使用其他名稱或儲存在其他地方)。由於“斷行”在 DOS Batch 檔案中是代表程式碼完結,故此,千萬不要隨意在這些程式碼中間加入“斷行”,否則可能會造成程式不能執行。

@rem assign the key variables.
SET _label=RAMDISK
SET _ramdrive=R:

@rem Below is the magic happens : Find the drive letter which has volume name set as _label, and mount it to _ramdrive
FOR /F "skip=1 tokens=1 delims=: " %%a IN ('wmic logicaldisk where "VOLUMENAME='%_label%'" get caption') DO ( subst %_ramdrive% %%a:\ )

@rem if you want to copy some files or mount your cache folders, do it after this line.

以下是關於這段程式碼的詳細說明,如果您對 DOS Batch 程式碼沒有興趣,絕對可以跳過這段,直接進行步驟2。

這一行:

wmic logicaldisk where "VOLUMENAME='RAMDISK'" get caption

是要根據磁碟機名稱 (VOLUMENAME) 找出磁碟機代號 (caption),執行結果如下:

Caption
K:

這個結果是以字串形式給出的,然後我們透過一個 for-loop ,逐行分拆這個結果,第一行 (caption) 可以跳過,第二行就是我們想要的東西。我們要將第二行用冒號 “:” 拆開,得出 “K” 和 “”(空字元) 兩個元素,按後將第一個元素 “K” 儲存到變量 %%a 之中。那麼我們就可以用 %%a 變量去代表這個動態分配的磁碟機代號了。

關於這個 for-loop 的解釋:

“skip=1” : 跳過第一行 (”Caption”)。第一行文字並沒有我們需要的東西。

“tokens=1” : 對於每一行文字,我們只取出以 “:” 分拆後的第一個元素。

“delims=:” : 使用冒號 “:” 來分拆每一行文字。

於是,最後我們取得動態分佈的磁碟機代號,並儲存在 %%a 變量中,然後在之後的 subst 程式碼中,我們實際上是執行這樣的指令:

subst R: K:\

這指令是讓系統知道,R: 就是 K: 的另一個名稱,以後無論是用 “R:” 還是 “K:”,兩者這實際都對應到 K: 的地方。

2. 指定虛擬磁碟機的名稱

打開 Dataram RAMDisk Configuration Utility (設定工具), 在 “Disk Label” 中打勾,並在下面輸入 “RAMDISK”

當然您也可以用其他名稱,但必須在上面的 DOS Batch 程式碼中作出修改:

SET _label=TheNewDriveLabel

3. 指定開機時執行上述程式碼

我們需要告訴電腦,在開機時自動執行步驟一的程式碼。

3.1 按 Win + R 組合鍵 (或在 “開始” 選單中按 “執行…”), 這時會出現一個 “執行…” 的對話框,輸入 “gpedit.msc” 並在結果中選擇 “gpedit” 。

注意:在某些Win7版本中(如 Win7 Home Edition),gpedit.msc 並沒有被納入系統中,在此情況下,我們需要使用 Windows 自帶的工作排程器(Task Scheduler)去讓Windows在啟動時自動執行上述的程式碼。關於工作排程器的詳細操作請見 http://windows.microsoft.com/zh-TW/windows7/schedule-a-task

3.2 在 “Group Policy Editor”(本機群組原則編輯器)中, 按 “Local Computer Policy”(本機電腦原則) -> “Windows Settings”(Windows 設定) -> “Scripts(Startup/Shutdown)” (指令碼(啟動/關機)),在編輯器右面,按兩下 “Startup” (啟動)

Startup script

3.3 在 “Scripts” (指令碼) 頁簽中,點擊 “Add…” (新增),然後將 “C:\StartUp.bat” (也就是步驟一建立的那個程式檔)加入到清單中,按 “OK” (確定) 完成。

4. 大功告成

現在,您可以重新開啟您的電腦,然後會發現“我的電腦”除了原來的虛擬磁碟機 (假設為K:)之外,還會多了一個 “R:”,打開 R: 磁碟機,內裡的內容與 K: 完全一樣。事實上,兩個代號其實都是指向相同的檔案,故此你在其中一個磁碟機中做的任何動作,在另一個磁碟機也會一樣改變。更重要的是,現在無論您的虛擬磁碟機是什麼代號,您的電腦中永遠都可以用 R: 來代表這個虛擬磁碟機了。

總結

這個方法雖然看上去好像很多步驟很繁複,但是實際上是比官方解決方案更加簡便。因為這個方法:

第一,只是三行程式碼,執行所需時間 0.000001 秒也不到,不會拖慢開啟速度,

第二,不會產生龐大的磁碟映像檔,因此可以減少對硬碟機的讀寫損耗,也不會被映像檔平白佔用了硬碟空間。

第三,也是最重要的,是以後開機不需載入龐大的映像檔,大大加快開啟的速度。

最後,這個方法也不是沒有缺點。由於程式是透過 subst 指令去將兩個磁碟機代號鏈接起來,故此,即使我們只需要 R: 來存取虛擬磁碟,但是虛擬磁碟的原來磁碟代號(K:)也會一併保留起來,故最後在我的電腦中您會看到有 R: 和 K: 同時並存。暫時我還是無法找出方法可以將 K: 隱藏起來。在本文章的英文版中,Merjin 讀者留言提出一個用  “diskpart” 取代 “subst” 指令的方法,那是直接將 K: 更改為 R:(而不是建立磁碟鏈接)。那是一個更好的方法,能夠解決上述兩個磁碟機並存的問題。我個人並沒有嘗試,有興趣的讀者可以去那篇文章中的讀者留言看看有關詳情。

歡迎各位讀者留言討論。

Fix the Dataram RAMDisk driver letter – with sample scripts

[Note: 我們另外為此文章撰寫了中文版本,請看這篇。]

Background

Since I wrote the post of Fixing the drive letter for RAMDisk without saving and loading drive image – A solution for Dataram RAMDisk, I received more response than I expected. From all the response, I find it really hard to explain without real sample scripts. So now I’m try to solve it by showing a sample script.

This post is supposed to give supplementary information about the original post. If you want to know more about the idea and technical details, you’re highly recommended to read the original post.

In this post I provides two sample scripts, one for the PC startup and one for shut down. I use my own PC’s setting to demonstrate the idea. So in order to run the script in YOUR PC, you may either change your PC’s setting to fit mine or change the script to fit your PC.

Here is some important assumptions / PC settings that you may need to know before we start:

  1. It assumes the disk label for the Dataram RAMDisk is “RAMDISK” (case-sensitive)
  2. It fixes the RAMDisk drive letter as R: .
  3. It loads the files stored in C:\MyRAMDiskFiles to the R: automatically. These files are the programs that I want to run at RAMDisk for better performance. For example, I put my Firefox at C:\MyRAMDiskFiles\Programs\Firefox\Firefox.exe,  So after the script, I can always launch firefox in R:\Programs\Firefox\Firefox.exe
  4. I also have Google Chrome installed in C:\Program Files. However, Chrome will always stores its cache files in the location where it installed. This script will mount the cache folder in the Chrome’s installation path to the RAMDisk drive, i.e.  R:\TEMP\BrowserCache . This can reduce the harddisk I/O frequency, and after the PC shutdown, the cache files will be erased automatically.
  5. Since I may change the program settings over time (e.g. updating the firefox extensions), I want these changes being maintained every time I starts the PC. So I want SOME files in the RAMDisk drive be saved to harddisk when I shutdown the PC.
  6. Also, all my downloaded files are stored in RAMDisk (R:\Download), but I don’t want to lose these files after reboot. So this script will also copy the files in R:\Download to C:\Download during PC shutting down.

Let’s start

Step 1

Create the two scripts: StartUp.bat and ShutDown.bat, and store them in C:\ (or whatever you like, as you will specify the files in latter steps)

Note: Line-break has important meaning in DOS Batch script, so if you copy & paste the script from this post, you must check if there is any extra line-breaks added by the text editor. Instead, you may consider download the zipped scripts : RAMDisk fix drive letter - sample scripts (Download is recommended.)

Script 1: C:\StartUp.bat

@echo off

@rem assign the key variables, see assumption #1 & #2
SET _label=RAMDISK
SET _ramdrive=R:

@rem Find the drive letter which has volume name set as RAMDISK, and mount it to _ramdrive
FOR /F "skip=1 tokens=1 delims=: " %%a IN ('wmic logicaldisk where "VOLUMENAME='%_label%'" GET CAPTION') DO (
	subst %_ramdrive% %%a:\
)

@rem initialize the ramdisk - automatically copy the files in C:\MyRamDriveFiles to the ramdisk after the Windows starts. see assumption #3
mkdir %_ramdrive%\Programs
xcopy C:\MyRamDriveFiles\*.* %_ramdrive%\Programs\ /E/Q/Y/R

@rem link the google chrome cache folder to ramdisk. Remeber to replace [Your-Windows-user-name] with your own, see assumption #4
mkdir %_ramdrive%\TEMP\BrowserCache
mklink /j "C:\Users\[Your-Windows-user-name]\AppData\Local\Google\Chrome\User Data\Default\Cache" "%_ramdrive%\TEMP\BrowserCache"

@rem create a dir in ramdisk to stores the downloaded files, you will need to set up Firefox to store downloaded files in R:\Download, see assumption #6
mkdir %_ramdrive%\Download

@echo on

Script 2: C:\ShutDown.bat

@echo off

@rem see assumption #2
SET _ramdrive=R:

@rem copy all program files back to harddisk -  see assumption #5
xcopy %_ramdrive%\Programs\*.* C:\MyRamDriveFiles\ /Q/Y/R/S/D/C

@rem copy all downloaded files back to harddisk  -  see assumption #6
mkdir C:\Download
xcopy %RAMDISK%\Download\*.* C:\Download\ /S/D/Q/R/C

rem disconnect the google chrome cache folder linking -  see assumption #4
rmdir "C:\Users[Your-Windows-user-name]\AppData\Local\Google\Chrome\User Data\Default\Cache"

rem delete the drive mounting
subst %RAMDISK% /D

echo on

Step 2

Go read the original post and do step 3 in that post.

Step 3

Now you have added the StartUp.bat script to the “Group Policy Editor”, so go back to step 3.2 in the original post, repeat the step but click ok “ShutDown” instead of “StartUp”, and add the “C:\ShutDown.bat” to the list.

So now you have “C:\StartUp.bat” added to “Startup” and “C:\ShutDown.bat” added to “Shutdown”.

Startup script

Step 4

Make sure you have met the assumptions above, and check if you have all the “C:\MyRAMDiskFiles” and “C:\Download” folders created. Then restart your computer and enjoy the RAMDisk.

Comments are welcomed!