我可以将 /tmp 和 /var/log 放在 OS X 上的 ramdisk 中吗?

kby*_*yrd 23 mac ramdisk tmpfs macos

对于非关键的 Linux 系统,我经常将 /tmp 和 /var/log 之类的内容移动到 tmpfs 以节省一些磁盘写入。我已经这样做了一年左右,如果我在重新启动时需要日志,我只需在 /etc/fstab 中注释掉一行,然后开始调试。

无论如何,我想在 OS X 上做同样的事情。我看过有关为 OS X 创建 ramdisk 的帖子,但我正在寻找一个更持久的解决方案,适用于每次启动。我总是希望 /tmp 和 /var/log 安装在 ramdisk 中,如果需要,可以在 vi 中通过一些命令行编辑将其关闭。

xer*_*r0x 7

这是在 OS X 上创建 ramdisks 的脚本。抱歉,它不能回答您的问题。您可以使用它来构建在启动时运行的东西,然后挂载 /tmp 和 /var/log。

#!/bin/bash  
ramfs_size_mb=1024  
mount_point=~/volatile  

ramfs_size_sectors=$((${ramfs_size_mb}*1024*1024/512))  
ramdisk_dev=`hdid -nomount ram://${ramfs_size_sectors}`  
newfs_hfs -v 'Volatile' ${ramdisk_dev}  
mkdir -p ${mount_point}  
mount -o noatime -t hfs ${ramdisk_dev} ${mount_point}  

echo "remove with:"  
echo "umount ${mount_point}"  
echo "diskutil eject ${ramdisk_dev}"  
Run Code Online (Sandbox Code Playgroud)

来自@salvatore http://pastie.textmate.org/pastes/1417478/text?key=igcxuzqqvlmlbavxooj2uw


kby*_*yrd 6

编辑:我只是要接受我自己的答案,因为它确实为我解决了问题的一部分。如果有人在 Linux 中发布更像 --bind 的内容,我会接受这个答案。

为了激发更多的答案,我将开始用我发现的东西来回答我自己的问题。

第 1 步是在每次启动时安装一个 ramdisk。为此,我创建了一个 bash 脚本,然后创建了一个 launchd 条目以在启动时调用 bash 脚本。

像这样编写一个 bash 脚本:

RD=ramdisk
if [ ! -e "/Volumes/$RD" ];  then
    diskutil erasevolume HFS+ "$RD" `hdiutil attach -nomount`
fi

mkdir -p /Volumes/$RD/private/tmp
mkdir -p /Volumes/$RD/private/var/log
mkdir -p /Volumes/$RD/private/var/tmp
Run Code Online (Sandbox Code Playgroud)

然后通过创建一个名为 /Library/LaunchDaemons/com.my.ramdisk.plist 的文件将其添加到 launchd 并在启动时调用它,该文件包含以下内容:

<?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.my.ramdisk</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/sbin/ramdisk.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

我被卡住的地方是一种在 /tmp、/var/log 和 /var/tmp 的 ramdisk 内符号链接或挂载目录的方法。这三个目录在我的系统上都符号链接到 /private/tmp、/private/var/log 和 /private/var/tmp。当我将符号链接更改为指向 /Volumes/ramdisk/... 时,系统将无法启动。我希望这是因为在启动时,在我的 com.my.ramdisk 脚本安装 ramdisk 之前,有些东西需要 /tmp 和 /var/log。我需要一种在安装 root 之后立即安装 ramdisk 的方法,然后再运行其他任何东西。

注意如果您在临时空间中挂载 /var/log(内核、守护程序和其他关键用户空间日志),您将在下次重新启动时丢失其内容。这可能会抑制您的诊断能力。

  • 我意识到这是一个老问题,我似乎无法发布正确的答案,但它在搜索中很突出。要回答这个问题,您想使用`hdik -drivekey system-image=yes -nomount ram://262144` 创建一个128mb ram-disk,然后使用`newfs_hfs` 对其进行格式化,然后使用`mount -o union, nobrowse,noatime` 将卷挂载到 `/tmp`。这样,`/tmp` 中的现有文件不会受到影响,但新文件会进入您的 ram 磁盘。 (2认同)
  • 我唯一的其他评论是,你应该谨慎这样做;而“tmpfs”将在必要时使用交换,而 RAM 磁盘则不会,因此您将丢失一大块活动 RAM,这意味着您希望保持较小的容量,但是“/tmp”中的某些任务可能需要更多内存并且会失败,所以要小心你运行的内容,以防它需要比你分配的空间更多的空间。 (2认同)