在Mac OS X Yosemite上通过启动守护进程挂载磁盘

3
我正在尝试将/private/tmp作为内存磁盘挂载。我有一个名为"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显示为已在磁盘1上挂载。日志只显示:“将/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”文件夹被覆盖了?

编辑2

看起来一切都很好,只是有东西在系统启动时卸载了我的挂载磁盘。 也有人注意到了这种行为,链接在这里

2个回答

1

更新的答案

我注意到您试图将RAM磁盘挂载到/private/tmp。我无法指出任何具体证据,但这不是一个好主意,因为/tmp是一个系统目录。我建议在/tmp下创建一个目录,如/tmp/RAMdisk,甚至可以在文件系统根目录/RAMDisk下。

原始答案

我认为问题在于您的PATH中没有/sbin,所以脚本找不到mount。尝试将以下内容作为脚本的第二行:

export PATH="/sbin:$PATH"

同样地,TYPE 丢失,这意味着在您的磁盘上未创建文件系统,即 news_hfs 运行失败,并且它也位于 /sbin

1
是的,通常每个用户的PATH都不同,而且交互式和非交互式shell的路径也经常不同。还要记住,来自/Library的启动守护进程作为系统服务运行,而不是作为您的用户执行,因此它们不会执行您的配置文件。 - Mark Setchell
sbin 是用于在其他尚未挂载的文件系统上动态库可用之前,在系统启动期间需要的静态链接二进制文件。我不知道为什么 /sbin 不在 launchd 的 PATH 中 - 我猜这是因为如果需要,你可以自己添加它们。 - Mark Setchell
奇怪的是,它不再起作用了。我什么都没改,但现在它停止工作了。 - Clickbeetle
我会尝试去做。我知道它是系统相关的,但它只是一个临时文件目录。 - Clickbeetle
我将其挂载在“/private/tmp/ramfs”中,但仍然是同样的情况。当我启动计算机时,在“/private/tmp”内有我的文件夹“ramfs”,但“mount”命令不将此文件夹显示为RAM磁盘,它只是普通文件夹。所以看起来mount命令不起作用。它是在工作,但其结果被阻止了吗? - Clickbeetle
显示剩余3条评论

0

我通过以下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" 就可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接