在 macOS 系統上創建、掛載 Ramdisk(aka: RamFS、tmpfs)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM