对于非关键 Linux 系统,我经常将 /tmp 和 /var/log 等内容移至 tmpfs,以节省一些磁盘写入。我这样做已经有一年左右了,如果我在重启后需要日志,我只需在 /etc/fstab 中注释掉一行,然后开始调试。
无论如何,我想在 OS X 上做同样的事情。我看过关于为 OS X 创建 ramdisk 的帖子,但我正在寻找一种更持久的解决方案,每次启动时都能正常工作。我总是希望将 /tmp 和 /var/log 安装在 ramdisk 中,并且能够在必要时通过 vi 中的一些命令行编辑将其关闭。
答案1
这是在 OS X 上创建 ramdisk 的脚本。抱歉,它没有回答您的问题。您可以使用它来构建在启动时运行然后挂载 /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}"
来自@salvatorehttp://pastie.textmate.org/pastes/1417478/text?key=igcxuzqqvlmlbavxooj2uw
答案2
编辑:我只会接受我自己的答案,因为它确实为我解决了部分问题。如果有人在 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
然后通过创建一个名为 /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>
我遇到的难题是,如何在 /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(内核、守护进程和其他关键用户空间日志)挂载到临时空间,则下次重新启动时您将丢失其内容。这可能会影响您的诊断能力。