OS X下实现Ramdisk – 高级篇

之前已经在Mac OS X下使用脚本实现了Ramdisk:

在Mac OS X上利用脚本实现RAM Disk

其中提到了在用户注销时自动打包dmg镜像对整个ramdisk进行数据备份的方法. 该方法配合asr restore命令可以非常方便地实现备份与恢复. 并且在数台机子上测试均能正常工作.

然而近日, 在研究如何将桌面以及Finder中碍眼的Ramdisk磁盘图标隐藏时, 发现了一些纠结的问题:

1. 要实现对ramdisk磁盘图标的隐藏, 则必须使用hdiutil mount命令加上-nobrowse参数进行挂载. 如果使用diskutil命令, 虽然方便, 但在ramdisk创建完成之后便自动进行了挂载. 这样, 也就没有办法对其指定挂载参数实现隐藏了.

2. 若使用hdiutil进行挂载, 则还有一个限制: ramdisk所在的虚拟磁盘必须进行分区方可正常挂载.

3. 即使上面两个问题都得以解决, 开机时使用asr restore的恢复备份操作同样会在恢复结束时自动挂载ramdisk, 导致隐藏失效.

针对上述问题, 下面给出解决方案:

首先, 关于ramdisk的创建, 有两种方法, 在Mac OS X上利用脚本实现RAM Disk 一文中所使用的是较新的一种方法(使用diskutil命令), 但无法实现ramdisk隐藏. 因此, 如有这方面需要, 则必须使用较老的方法来创建ramdisk. 关于两种方法之间的区别请见osxdaily上的这篇文章:

Create a RAM Disk in Mac OS X

改写后的ramdisk创建及恢复数据脚本(LoginHook):

#!/bin/sh

# 设置内存盘的名称
DISK_NAME=RamDisk
MOUNT_PATH=/Volumes/$DISK_NAME
# 设置备份文件的保存路径, 注意修改下面路径中的用户名称
BAK_PATH=/Users/delta/$DISK_NAME.tar.gz
# 设置分配给内存盘的空间大小(MB)
DISK_SPACE=2048

if [ ! -e $MOUNT_PATH ]; then
    dev=`hdid -nomount ram://$(($DISK_SPACE*1024*2)) | cut -d' ' -f1`
    partition=${dev}s1
    rdev=`echo $dev | sed -e 's/disk/rdisk/'`
    rpartition=`echo $partition | sed -e 's/disk/rdisk/'`
    echo y | fdisk -ia hfs $dev
    newfs_hfs -v $DISK_NAME $partition
    hdiutil mount -nobrowse $rdev
    hdiutil mount -nobrowse $rpartition
fi

if [ -s $BAK_PATH ]; then
    tar -zxf $BAK_PATH -C $MOUNT_PATH
fi

可以看到, 脚本中在最后从备份的tar.gz压缩包中解压数据恢复至ramdisk. 相应地, 在LogoutHook中, 将ramdisk中的内容打包成了tar.gz压缩包保存至硬盘. 另外, 实现ramdisk隐藏的实现思路来自一位台湾朋友的blog, 一时没有找到原地址…找到了再补上吧哈~
改写后的LogoutHook脚本如下:

#!/bin/sh

DISK_NAME=RamDisk
MOUNT_PATH=/Volumes/$DISK_NAME
BAK_PATH=~/$DISK_NAME.tar.gz

if [ -e $MOUNT_PATH ] ; then
	cd $MOUNT_PATH
	tar -czf $BAK_PATH .
fi

脚本的使用方法请参考在Mac OS X上利用脚本实现RAM Disk.

使用修改后的脚本之后, 桌面及Finder中便不会出现创建的ramdisk图标了. 此时若要访问ramdisk怎么办呢?  —-可以使用终端进行访问, 也可以在Finder中打开隐藏文件显示后, 进入/Volumes, 便能够看到创建的ramdisk图标并进行操作了. 这样, 一来避免了平时对于ramdisk的误操作(如不小心选择了eject…), 而来, 桌面和Finder中也显得美观多了.

如果有错误之处或是更好的实现方法, 请留言交流, 共同学习!

10 thoughts on “OS X下实现Ramdisk – 高级篇

  1. Google Chrome 22.0.1229.94 Google Chrome 22.0.1229.94 Mac OS X  10.8.2 Mac OS X 10.8.2
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4

    這樣來實現Ramdisk隱藏太麻煩了.
    建議直接使用chflags
    diskutil erasevolume HFS+ “Ramdisk” `hdiutil attach -nomount ram://512000`
    chflags hidden /Volumes/Ramdisk

    1. Google Chrome 24.0.1297.0 Google Chrome 24.0.1297.0 Mac OS X  10.8.2 Mac OS X 10.8.2
      Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1297.0 Safari/537.16

      感谢!是个好方法

      1. Safari 6.0.3 Safari 6.0.3 Mac OS X  10.8.3 Mac OS X 10.8.3
        Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10 AppEngine-Google; (+http://code.google.com/appengine; appid: s~ljc-newapp2)

        请问使用该比较好的隐藏方法,该在原来的基础上怎么改呢。。?不好意思啦,我完全不懂,不过喜欢折腾一下。

  2. Google Chrome 22.0.1229.94 Google Chrome 22.0.1229.94 Mac OS X  10.8.2 Mac OS X 10.8.2
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4

    不用客氣, 我也是在學著寫一個適合自己的RamDisk小工具,
    剛剛用Applescript寫好了, 只做了一點簡單的測試, 還算可用, 大家互相交流學習:
    http://hop.tl/aJ7zTfuXFLrTQKk35a
    您需要打開 RamDisk.app/Contents/Resources/Scripts/main.scpt

    property user : “YourUsername”
    property passw : “YourPassword”
    更改為你的用戶名及密碼才可正常執行.

    第一次執行會自動建立一個默認大小為2G的RamDisk
    第二次執行會出現設置的dialog
    用Terminal執行 osascript /Applications/Ramdisk.app/Contents/Resources/Scripts/main.scpt 也可以啟動Ramdisk
    執行
    osascript /Applications/Ramdisk.app/Contents/Resources/Scripts/main.scp shutdown 為關閉RamDisk

    Ps:
    其中RamDisk.app/Contents/Resources/safari_cache 其实是一个空白的SQLite3文件, Ramdisk建立後會複製它並將Sarfarid的Cache指向Ramdisk得這個文件(如果你啟用了緩存功能)

    1. Google Chrome 22.0.1229.94 Google Chrome 22.0.1229.94 Mac OS X  10.8.2 Mac OS X 10.8.2
      Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4

      您可以隨便使用,修改,發佈這個小工具, 寫得很粗糙, 希望得到您的指正.

      1. Google Chrome 24.0.1312.5 Google Chrome 24.0.1312.5 Mac OS X  10.8.2 Mac OS X 10.8.2
        Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.5 Safari/537.17

        客气了,指正说不上,都是互相学习。抱歉最近正在忙一些别的东西,您的代码还没有来得及研究完呢,等忙完这阵子一定好好拜读!用apple script实现确实是个不错的方案,之前我有写过一个使用shell script的管理工具,但是不及您这个来得简单方便。
        另外,如果需要以root权限执行,可以尝试使用
        do shell script “YOUR_COMMAND” with administrator privileges 语句来实现。这样就避免了手动在script中输入用户名与密码。

  3. Google Chrome 23.0.1271.64 Google Chrome 23.0.1271.64 Mac OS X  10.8.2 Mac OS X 10.8.2
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

    請問要怎麼學習用Applescript寫腳本呢?有什麼教學網站嗎?
    我現在還能勉強看得懂程式碼得原因是我高中有學習C++,現在生上大一有很多時間可以學習,請問有什麼好的建議嗎?

    1. Google Chrome 24.0.1312.5 Google Chrome 24.0.1312.5 Mac OS X  10.8.2 Mac OS X 10.8.2
      Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.5 Safari/537.17

      你好!关于Applescript的话可以参考“AppleScript权威指南”这本书,相当全面和深入。

  4. Safari 6.0.3 Safari 6.0.3 Mac OS X  10.8.3 Mac OS X 10.8.3
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10 AppEngine-Google; (+http://code.google.com/appengine; appid: s~ljc-newapp1)

    首先感谢的文章。请问第二部分的最后一句“tar -czf $BAK_PATH .”中的黑点句号是必须的吗,还是你多写了。。还有我在终端执行loginhook的时候遇到了错误。。
    。。。
    > echo y | fdisk -ia hfs $dev
    > newfs_hfs -v $DISK_NAME $partition
    > hdiutil mount -nobrowse $rdev
    > hdiutil mount -nobrowse $rpartition
    > fi
    fdisk: could not open MBR file /usr/standalone/i386/boot0: No such file or directory

    —————————————————–
    —— ATTENTION – UPDATING MASTER BOOT RECORD ——
    —————————————————–

    Do you wish to write new MBR and partition table? [n] Initialized /dev/rdisk3s1 as a 2 GB HFS Plus volume
    hdiutil: mount failed – 无可装载的文件系统
    /dev/disk3s1 Apple_HFS /Volumes/MACRAM
    bash-3.2#
    。。。
    请问怎么办?

    1. Safari 6.0.3 Safari 6.0.3 Mac OS X  10.8.3 Mac OS X 10.8.3
      Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10 AppEngine-Google; (+http://code.google.com/appengine; appid: s~ljc-newapp4)

      经过多次尝试,成功了。。谢谢。。看来你的代码除了名字啥也不能动。。

Leave a Reply to Delta Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.