[英]Mount disk from launch daemon on Mac OS X Yosemite
我正在尝试挂载/ private / tmp作为ram磁盘。 我有这个“ramfs.sh”脚本,我从互联网上找到:
#!/bin/bash
ramfs_size_mb=1024
mount_point=/private/tmp
ramfs_size_sectors=$((${ramfs_size_mb}*1024*1024/512))
ramdisk_dev=`hdid -nomount ram://${ramfs_size_sectors}`
newfs_hfs -v 'Volatile HD' ${ramdisk_dev}
mkdir -p ${mount_point}
mount -o noatime -t hfs ${ramdisk_dev} ${mount_point}
chown root:wheel ${mount_point}
chmod 1777 ${mount_point}
如果我从终端手动运行它 ,它工作正常。 但是我从LaunchDemon运行它有问题。 我在“/Library/LaunchDaemons/com.kalugin.ramfs-for-db.plist”文件中有这个内容:
<?xml version="1.0" encoding="UTF-8"?>
<!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>com.kalugin.ramfs-for-db</string>
<key>Program</key>
<string>/var/root/ramfs.sh</string>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/ramfs_for_db.log</string>
<key>StandardErrorPath</key>
<string>/var/log/ramfs_for_db_error.log</string>
<key>Debug</key>
<true/>
</dict>
</plist>
系统加载后我有:
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Volatile HD *1.1 GB disk1
但是“mount”没有显示挂载在disk1上的/ private / tmp。 日志仅显示:“初始化/ dev / rdisk1为1024 MB不区分大小写的HFS Plus卷”。
所以在系统启动期间肯定会执行脚本,但看起来像mount命令不起作用。 有任何想法吗? 谢谢。
编辑
我在脚本中添加了一些“echo”并使“mount”详细。 这是输出:
Creating ram disk...
Initialized /dev/rdisk1 as a 1024 MB case-insensitive HFS Plus volume
Mounting ram disk...
/dev/disk1 on /private/tmp (hfs, local, noatime)
Setting permissions...
所以看起来脚本做得很好,甚至挂载磁盘。 但看起来在启动“tmp”文件夹被覆盖?
EDIT2
看起来一切都很好,除了在系统启动时卸载我挂载的磁盘。 也有人注意到这种行为也链接 。
更新的答案
我注意到你正在尝试将你的RAMdisk挂载到/private/tmp
。 我不能指出任何具体的证据,但这不是一个好主意,因为/tmp
是一个系统目录。 我会在/tmp
下创建一个目录,比如/tmp/RAMdisk
,甚至是/RAMDisk
中的文件系统根目录。
原始答案
我认为问题是/sbin
不在你的PATH中,所以脚本找不到mount
。 尝试将其添加为脚本的第二行:
export PATH="/sbin:$PATH"
同样缺少TYPE
,这表示磁盘上没有创建文件系统,即news_hfs
无法运行,而且也位于/sbin
。
我通过以下plist文件解决了我的问题:
<?xml version="1.0" encoding="UTF-8"?>
<!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>com.local.ramdisk</string>
<key>Program</key>
<string>/usr/libexec/ramdisk.sh</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<dict>
<key>PathState</key>
<dict>
<key>/private/tmp/ram</key>
<false/>
</dict>
</dict>
<key>StandardOutPath</key>
<string>/var/log/ramdisk.log</string>
</dict>
</plist>
看起来像“RunAtLoad”是不够的,或者它不起作用,我不知道。 但是使用“KeepAlive”它可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.