在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
權限設定成可執行:
然後將以下程式碼複製:
<!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了~
最後來測一下速度:
對上現在新的有SLC快取的SSD似乎是沒啥勝算,不過對於一台2013的機器來說,速度已經很快了~