1. 計算扇區數(Sectors)
扇區這個概念是從機械硬盤時代有的,后來為了保證向前兼容,在目前早已沒有扇區的 SSD、優盤上仍舊保留了邏輯上的「扇區」概念。
一個扇區是 512 字節(bytes),所以 64MiB 的 RamFS,扇區數就是:
64MiB * 1024KiB/MiB * 1024B/KiB / 512B/sector = 131072(sectors)
2. 創建基於內存的設備文件
在 OS X 10.4 以上的操作系統中,對於儲存類設備文件的管理已經交由 hdiutil 這個基於 DiskImages 框架的命令行工具進行管理類。[1]
所以我們的這個 RamFS 的設備文件的創建也不例外。先打開 Terminal,執行如下命令:
$hdiutil attach -nomount ram://131072
然后終端上會顯示出創建的設備文件
/dev/disk2
命令中:131072 即為扇區數。nomount 表示不要掛載,待會兒我們創建完文件系統再手動掛載。
3. 創建文件系統
光有了基於內存的設備還不夠,我們還需要在其之上創建文件系統。就像買了一張軟盤,買回來之后我們還需要格式化才能使用一樣。(這里舉例沒有使用優盤、硬盤的例子是因為這些相對「現代」的存儲設備一般在出廠前都預先格式化過了。而大部分的軟盤出廠前是沒有格式化的,當然后期的軟盤會格式化啦)這里我們創建 HFS+ 格式的文件系統,卷標為「Ram Disk」:
$newfs_hfs -v 'Ramdisk' /dev/disk2
然后終端上會回顯信息:
Initialized /dev/rdisk2 as a 64 MB case-insensitive HFS Plus volume
其中帶「r」的「/dev/rdisk2」是 /dev/disk2 的原始設備。
4. 掛載 Ramdisk
這里就很常規了,我們可以使用 UNIX 上傳統的 mount 命令,把 /dev/disk2 掛在到任意目錄。比如:編譯時候的中間目錄、瀏覽器緩存、Web 服務需要大量 IO 的目錄,等等。
$mkdir -p ~/Ramdisk $mount -o noatime -t hfs /dev/disk2 ~/Ramdisk
5. 搞定了
上一步其實就完成了,我們可以在 Finder 中個人 Home 文件夾下找到 Ramdisk 並打開了,在左側也能看到被掛載的 Ramdisk。
其中 mount 命令中 noatime 選項是為了讓文件系統不更新訪問時間,以減少磁盤 IO,進而提高性能[2](注:參考文獻是針對 Linux 的)。不過實際效果可能很有限。
Finder 中展示 Ramdisk
在 Finder 中顯示已掛載好的 Ramdisk
6. 接下來。。。
可能會有些擔憂,畢竟在 Finder 中左側 Navbar 中直接展示出 Ramdisk 中感覺會比較顯眼,可能不知道什么時候就給隨手 eject 出去了。
所以,我們把他隱藏起來。這里可以 UNIX 上傳統的 mount 命令(在 -o 選項中加入 nobrowse 參數)或者,也可以使用來自 Apple 的 hdiutil 工具。方法是在用 hdiutil 掛載時,使用 -nobrowse 開關。
$hdiutil mount -nobrowse /dev/disk2
注:如果已經掛載了,記得先用 umount /dev/disk2 命令卸載。
終端會回顯:
/dev/disk2 /Volumes/Ramdisk
然后,在 Finder 中就不會出現了。
7. 再接下來。。。
我們可以設置開機自啟動,雖然自從用了 macOS 重啟的次數幾乎很少了。
7.1. 創建腳本
以下以替換系統的臨時目錄(/private/tmp)為例:
保存文件為 ramdisk.sh 到 root 的 Home 文件夾(/var/root)中(需要 root 權限),當然其他地方也可以,但要注意修改之后步驟的路徑:
#!/bin/bash ramdisk_size_in_mb=64 mount_point=/private/tmp ramdisk_size_in_sectors=$((${ramdisk_size_in_mb}*1024*1024/512)) ramdisk_dev_file=`hdid -nomount ram://${ramdisk_size_in_sectors}` newfs_hfs -v 'Ramdisk' ${ramdisk_dev_file} mkdir -p ${mount_point} mount -o rw,noatime,nobrowse -t hfs ${ramdisk_dev_file} ${mount_point} chown root:wheel ${mount_point} chmod 1777 ${mount_point}
執行「sudo chmod +x /var/root/ramdisk.sh」,加上執行權限。
7.2 再接下來。。。
創建文件 com.emitial.ramdisk.plist 到 /Library/LaunchDaemons/ 中:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 3 "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 4 <plist version="1.0"> 5 <dict> 6 <key>Label</key> 7 <string>com.emitial.ramdisk</string> 8 <key>ProgramArguments</key> 9 <array> 10 <string>/var/root/ramdisk.sh</string> 11 </array> 12 <key>RunAtLoad</key> 13 <true/> 14 </dict> 15 </plist>
8. Finally
至此,結束。
fin.
Note:
[1] hdiutil(1) Mac OS X Manual Page
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/hdiutil.1.html
[2] Securing and Optimizing Linux: RedHat Edition -A Hands on Guide
http://www.tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap6sec73.html
Bibliography:
[1] hdiutil(1) Mac OS X Manual Page
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/hdiutil.1.html