在macOS (OSX)上建立APFS的高性能Ramdisk

我對Ramdisk的用途主要在轉移暫存檔案和一些不重要的零碎檔案,使用Ramdisk可以降低SSD讀寫次數,增加SSD磁碟壽命。再來Ramdisk也有關機後檔案即消失的特性,我可以不必費心每次都要定期刪除一些零碎檔案,保持資料夾乾淨整齊。(當然壞處是如果重要檔案放在Ramdisk重開機就救不回來了Orz)

當然,最重要的是Ramdisk驚人的小檔案讀寫速率,遠遠超過目前的任何固態硬碟,這點在處理大量密集小檔的程式碼特別有用,光是解壓縮一些程式碼Source Code包就有明顯地區別,而Compile的時候速度提升就更明顯(雖然以SSD做為系統碟情況下,大部分速度瓶頸都在CPU性能上)。

今天趁著有時間重弄了一下,程式碼參考來自於[1],[2],[3]。

先前的文章建立的Ramdisk磁碟格式都是HFS+。不是說不好,只是Apple最近推的APFS(蘋果檔案格式)磁碟格式是專為SSD設計的,讀寫速度又更快,更適合我們用來建立MAC Ramdisk的磁碟格式。

於是我就照著參考的幾篇文章的方法,把他寫成完整的Code,提供給大家參考用:

###設定Ramdisk大小,單位(MB)###
SIZE=2048
####磁碟名稱###
DISKNAME=Ramdisk
###取得Home資料夾路徑##
HOME_DIR=$(cd ~;pwd)
###要轉移到Ramdisk的資料夾清單###
declare -a PATH_LIST=('Library/Caches/Google' 'Library/Caches/Microsoft Edge Dev' \
"Library/Caches/Adobe Camera Raw 2" "Library/Caches/Homebrew" "Downloads")
###要建立的空資料夾清單###
declare -a EMPTY_PATH_LIST=('Picture' 'Screenshot' \
"Codes" "Documents" "Photo" "TEMP")

###當Ramdisk不存在時建立他###
if [[ ! -d /Volumes/${DISKNAME} ]]; then
	DISK_ID=`hdiutil attach -nomount ram://$(( ${SIZE} * 1024 * 1024 / 512 ))`
	diskutil partitionDisk $DISK_ID GPT APFS "${DISKNAME}" 0
fi
###把轉移資料夾的過程寫成function###
create_symbolic_link(){
	if [[ ! -d /Volumes/${DISKNAME}/${LINK_PATH} ]]; then
		echo "    Create /Volumes/${DISKNAME}/${LINK_PATH} Directory"
		mkdir -p "/Volumes/${DISKNAME}/${LINK_PATH}"
	fi
	if [[ -d ${HOME_DIR}/${LINK_PATH} ]] && [[ ! -h ${HOME_DIR}/${LINK_PATH} ]];then
		echo "    Delete ${HOME_DIR}/${LINK_PATH}"
		rm -rf "${HOME_DIR}/${LINK_PATH}"
	fi
	if [[ ! -h ${HOME_DIR}/${LINK_PATH} ]];then
		ln -s "/Volumes/${DISKNAME}/${LINK_PATH}" "${HOME_DIR}/${LINK_PATH}"
		echo "    ...finish linking ${LINK_PATH}\n"
	fi
}
###把建立空資料夾的過程寫成function###
create_empty_folder(){
	if [[ ! -d /Volumes/${DISKNAME}/${EMPTY_FOLDER} ]]; then
		echo "    Create /Volumes/${DISKNAME}/${EMPTY_FOLDER} Directory"
		mkdir -p "/Volumes/${DISKNAME}/${EMPTY_FOLDER}"
	fi
}

###移動到Ramdisk磁碟###
cd /Volumes/${DISKNAME}
###依照清單內容轉移資料夾###
for LINK_PATH in "${PATH_LIST[@]}";
do
	echo "linking ${LINK_PATH}"
	create_symbolic_link ${LINK_PATH}
done
echo ""
###依照清單內容建立空資料夾###
for EMPTY_FOLDER in "${EMPTY_PATH_LIST[@]}";
do
	echo "linking ${EMPTY_FOLDER}"
	create_empty_folder ${EMPTY_FOLDER}
done

如果要設定開機啟動的話先把上面的程式碼存成.sh檔案之後放到你想放的位置,例如說我是放到~/Library/Ramdisk/createRamdisk.sh

記得將createRamdisk.sh權限設定成可執行:

img

然後將以下程式碼複製:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>Label</key>
		<string>local.ramdisk</string>
		<key>ProgramArguments</key>
		<array>
            <string>/Users/${your_user_name}/Library/Ramdisk/createRamdisk.sh</string>
        </array>
		<key>RunAtLoad</key>
		<true/>
	</dict>
</plist>

儲存成local.ramdisk.plist,丟到~/Library/LaunchAgents/,然後修改檔案權限成644:

chmod 644 ~/Library/LaunchAgents/local.ramdisk.plist

然後增加到自動啟動項目:

launchctl load ~/Library/LaunchAgents/local.ramdisk.plist

啟動自動啟動項目:

launchctl start local.ramdisk

這樣就可以在開機自動啟動Ramdisk了~

img

最後來測一下速度:

img
img
img

對上現在新的有SLC快取的SSD似乎是沒啥勝算,不過對於一台2013的機器來說,速度已經很快了~