在 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" 它工作正常。
我正在尝试将 /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" 它工作正常。