[Mac] 在 OS X Yosemite 上建立 RAM disk 給 P2P 軟體暫存用
很久沒用 P2P 軟體來抓東西了,
一個原因是 I/O 太重,對硬碟蠻傷的…
不過偶爾還是會想要用 P2P 抓個東西,有什麼好方法呢?
(最近是在 Mac 上裝了 uTorrent,還不錯用)
一個方法是建立 RAM disk,把下載下來的東西儲存在 RAM disk 裡面,
等抓完了之後,再複製到硬碟上面~
當然這方法有個風險,要是電腦突然當機或是重開了,RAM disk 裡的東西就沒了…
參考資料:How to Create a 4GB/s RAM Disk in Mac OS X
1. 建立 RAM disk
要在 Yosemite 上建立 RAM disk 相當的簡單,在 terminal 裡執行下面的指令就行了:
diskutil erasevolume HFS+ RamDisk $(hdiutil attach -nomount ram://$((2*1024*2048)))
這邊的 2 代表的是 2GB,想要調整的話可以設成 4 代表 4GB。
執行後結果如下:
testuser@localhost ~ $ diskutil erasevolume HFS+ RamDisk $(hdiutil attach -nomount ram://$((2*1024*2048))) Started erase on disk3 Unmounting disk Erasing Initialized /dev/rdisk3 as a 2 GB case-insensitive HFS Plus volume Mounting disk Finished erase on disk3 RamDisk
這邊事實上是兩個動作,
先用 hdiutil attach 建立一個 RAM 的 device (本例中是回傳了 /dev/disk2),
再用 diskutil 將這裝置掛載到 /Volumes/RamDisk 這個目錄~
因此如果執行 hdiutil info 的話,可以看到這個裝置:
testuser@localhost ~ $ hdiutil info framework : 389.1 driver : 10.10v389.1 ================================================ image-path : ram://4194304 shadow-path : <none> icon-path : /System/Library/PrivateFrameworks/DiskImages.framework/Resources/CDiskImage.icns image-type : read/write system-image : false blockcount : 4194304 blocksize : 512 writeable : TRUE autodiskmount : false removable : TRUE image-encrypted : false mounting user : testuser mounting mode : <unknown> process ID : 4281 /dev/disk2 /Volumes/RamDisk
而執行 mount 也可以看到 /dev/disk2 被掛載到 /Volumes/RamDisk:
testuser@localhost ~ $ mount /dev/disk1 on / (hfs, local, journaled) devfs on /dev (devfs, local, nobrowse) map -hosts on /net (autofs, nosuid, automounted, nobrowse) map auto_home on /home (autofs, automounted, nobrowse) /dev/disk2 on /Volumes/RamDisk (hfs, local, nodev, nosuid, noowners, mounted by testuser)
2. 設定 P2P 軟體的暫存目錄
RAM disk 掛載好之後,開啟 P2P 軟體將暫存目錄設定到 RamDisk 這個裝置,
下例是開啟 uTorrent > Preferences > Directories,
將 Put downloading files in 設定成 RamDisk 這個裝置:
3. 關閉 RAM disk
當 P2P 下載完成後,就可以關掉這個 RAM disk~
可以去 Finder 那邊找到 RamDisk 這個裝置卸載,或是執行下面的指令:
hdiutil detach /Volumes/RamDisk
這邊要特別注意,不能用 umount /Volumes/RamDisk 這個指令卸載,
因為 umount 並不會移掉 hdiutil attach 建立出來的 device (如本例中的 /dev/disk2),
這會導致反覆 mount/unmount 之後,就無法再 mount 了…
這時候就得用 hdiutil info 將所有的 device 列出來,一個個用 hdiutil detach 卸載了~
為了簡化上面的流程,我寫了一個簡單的 shell script,
只要執行 mount_ramdisk.sh 就會建立一個 2GB 的 RAM disk,
執行 mount_ramdisk.sh 4 就會建立一個 4GB 的 RAM disk,
執行 mount_ramdisk.sh -u 就可以卸載掉 RAM disk:
#!/bin/sh RAM_DISK_GB=2 RAM_DISK_NAME=RamDisk MOUNTED_RAM_DISK_FOLDER="/Volumes/${RAM_DISK_NAME}" # Unmount RAM disk if [ "$1" = "-u" ]; then if [ -e "${MOUNTED_RAM_DISK_FOLDER}" ]; then hdiutil detach "${MOUNTED_RAM_DISK_FOLDER}" else echo "RAM disk is not mounted yet." fi exit fi # Get RAM disk size from parameter if [ "$1" != "" ]; then RAM_DISK_GB="$1" fi if [ -e "${MOUNTED_RAM_DISK_FOLDER}" ]; then echo "RAM disk is already mounted on ${MOUNTED_RAM_DISK_FOLDER}." else diskutil erasevolume HFS+ "${RAM_DISK_NAME}" $(hdiutil attach -nomount ram://$((RAM_DISK_GB*1024*2048))) fi
希望這樣用之後,硬碟可以活久一點囉~:P