在 Mac OS X Yosemite 上从启动守护程序挂载磁盘

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" 不显示 /private/tmp 已安装在 disk1 上。日志仅显示:"Initialized /dev/rdisk1 as a 1024 MB case-insensitive HFS Plus volume"。

所以系统启动时肯定会执行脚本,但看起来 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

看起来一切都很好,除了在系统启动时卸载了我安装的磁盘。 也有人注意到了这种行为 link.

更新答案

我注意到您正在尝试将 RAMdisk 安装在 /private/tmp。我无法指出任何具体证据,但这不是一个好主意,因为 /tmp 是一个 system 目录。我会在 /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" 它工作正常。