MacOS X で RAMDISK(失敗)

新年初の技術ネタです。

MacOS X (私は Snow Leopard を使っています) は、最初のうちはストレス無く動作するのですが、
放置していると、/System/Library/Caches, /Library/Caches, /Users/hoge/Library/Caches, /var/folders などのキャッシュディレクトリが膨れあがって動作が遅くなってきます。

あんまり無茶な使い方をしなかったり、定期的にクリアすれば良いのでしょうけど・・・

そこで、これらをRAMDISKにしてしまおうとスクリプトをでっち上げました。

/Library/LaunchDaemons/local.ramdisk.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">


Label
local.ramdisk
ProgramArguments

/private/var/root/bin/ramdisk

RunAtLoad

Disabled

KeepAlive



/private/var/root/bin/ramdisk


#!/bin/sh
DISK_SZ=256
DISK_NM="Volatile HD"
MAIN_USER="hoge"
ARCHIVE_INTERVAL=`expr 300`


ramdisk_exists()
{
/sbin/mount | /usr/bin/grep "^/dev/disk[0-9]*s[0-9] on /Volumes/${DISK_NM} (.*)$" >/dev/null 2>&1
if [ $? -eq 0 ]; then
return 1
fi
/bin/rm -rf "/Volumes/${DISK_NM}"
return 0
}

ramdisk_create()
{
/bin/launchctl start com.apple.hdiejectd
while :
do
/bin/launchctl list | /usr/bin/grep "[0-9]* - com.apple.hdiejectd" >/dev/null 2>&1
if [ $? -eq 0 ]; then
break
else
sleep 1
fi
done
# DISK_SZ * 1024 * 1024 / 512
/usr/sbin/diskutil eraseDisk HFS+ "${DISK_NM}" `/usr/bin/hdid -nomount ram://$ ( ( ${DISK_SZ} * 1024 * 1024 / 512))`
if [ $? -eq 0 ]; then
/sbin/mount -uo noatime "/Volumes/${DISK_NM}"
/bin/mkdir -p "/Volumes/${DISK_NM}/"{tmp,private/var/tmp,private/var/folders,Library/Caches,Users/${MAIN_USER}/Library/Caches}
/bin/chmod 1777 "/Volumes/${DISK_NM}/tmp"
/bin/chmod -R 755 "/Volumes/${DISK_NM}/private"
/bin/chmod 1777 "/Volumes/${DISK_NM}/private/var/tmp"
/bin/chmod -R 755 "/Volumes/${DISK_NM}/Library"
/bin/chmod 1777 "/Volumes/${DISK_NM}/Library/Caches"
/bin/chmod -R 755 "/Volumes/${DISK_NM}/Users"
/usr/sbin/chown root:wheel "/Volumes/${DISK_NM}/tmp"
/usr/sbin/chown -R root:wheel "/Volumes/${DISK_NM}/private"
/usr/sbin/chown -R root:admin "/Volumes/${DISK_NM}/Library"
/usr/sbin/chown -R root:admin "/Volumes/${DISK_NM}/Users"
/usr/sbin/chown -R 501:staff "/Volumes/${DISK_NM}/Users/${MAIN_USER}"
fi
}

ramdisk_folder()
{
#for i in "/private/var/folders" "/Library/Caches" "/Users/${MAIN_USER}/Library/Caches"
for i in "/Library/Caches" "/Users/${MAIN_USER}/Library/Caches"
do
if [ -L ${i} ]; then
/bin/rm -f ${i}
fi
if [ -d ${i} ]; then
/bin/rm -rf ${i}
fi
/bin/ln -s "/Volumes/${DISK_NM}${i}" ${i}
done
#/bin/launchctl unload /System/Library/LaunchDaemons/com.apple.bsd.dirhelper.plist
#/bin/launchctl load /System/Library/LaunchDaemons/com.apple.bsd.dirhelper.plist
}

ramdisk_archive()
{
if [ -e /ramdisk.tar ]; then
/bin/mv /ramdisk.tar /ramdisk.bak.tar
fi
/usr/bin/tar cpf /ramdisk.tar "/Volumes/${DISK_NM}/"*
}

ramdisk_unarchive()
{
if [ -e /ramdisk.bak.tar ]; then
tar xpf /ramdisk.bak.tar
fi
if [ -e /ramdisk.tar ]; then
tar xpf /ramdisk.tar
fi
}

ramdisk_remove_archive()
{
if [ -e /ramdisk.bak.tar ]; then
rm -f /ramdisk.bak.tar
fi
if [ -e /ramdisk.tar ]; then
rm -f /ramdisk.tar
fi
}

count=`expr 1`
while :
do
ramdisk_exists
if [ $? -eq 0 ]; then
ramdisk_create
ramdisk_folder
ramdisk_unarchive
fi
/bin/sleep 1
if [ $count -lt $ARCHIVE_INTERVAL ]; then
count=`expr $count + 1`
else
ramdisk_archive
count=`expr 1`
fi
done

/private/var/root/bin/ramdisk を 755 にして再起動すると、きちんとデスクトップに Volatile HD という RAMDISK ができあがって、
SafariのキャッシュとかもRAMDISK上にできていていい感じ・・・だと思ったのですが、
これにしてからSpotlightのメール全文検索ができなかったり、微妙に調子悪くなりました;

何がいけないのだろうか(shスクリプトが美しくない以外に)

ちなみに、内部で ramdisk.tar を作っているのは、スリープすると Volatile HD がアンマウントされてしまって、
フォントキャッシュなどが無くなって、Dock が落っこちるの対策です。