【问题标题】:Mount disk from launch daemon on Mac OS X Yosemite从 Mac OS X Yosemite 上的启动守护程序挂载磁盘
【发布时间】:2015-06-16 08:27:09
【问题描述】:

我正在尝试将 /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 上。日志仅显示:“将 /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

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

【问题讨论】:

    标签: macos osx-yosemite mount launchd tmp


    【解决方案1】:

    更新答案

    我注意到您正在尝试将 RAMdisk 挂载到 /private/tmp。我无法指出任何具体的证据,但这不是一个好主意,因为/tmp 是一个 system 目录。我会在/tmp 下创建一个目录,例如/tmp/RAMdisk,甚至在/RAMDisk 的文件系统根目录下。

    原答案

    我认为问题在于/sbin 不在您的PATH 中,因此脚本找不到mount。尝试将其添加为脚本的第二行:

    export PATH="/sbin:$PATH"
    

    同样,TYPE 丢失了,这表明您的磁盘上没有创建文件系统,即news_hfs 运行失败,并且它也位于/sbin

    【讨论】:

    • 这有帮助!谢谢你。系统启动和用户登录时“PATH”是否不同?我的意思是“sbin”已经在我的“PATH”中,当我登录时,我没有在 .bash_profile 中输入它。
    • 是的,通常每个用户的 PATH 都不同,而且通常对于交互式和非交互式 shell 也是如此。还要记住,来自/Library 的启动守护程序作为 system 服务而不是作为您的用户运行,因此它们不会执行您的配置文件。
    • 谢谢,但对我来说很奇怪,“sbin”(必须是系统二进制文件)不在 $PATH 中用于启动进程。
    • sbin 用于在系统启动期间需要的静态链接二进制文件,然后其他尚未安装的文件系统上的动态库可用。我不知道为什么 /sbin 不在 launchd 的路径中 - 我想这是因为您可以在需要时自行添加它们。
    • 奇怪,但它不再起作用了。我什么都没做,但现在它停止工作了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多