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


20

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

无论如何,我都想在OS X上做同样的事情。我看到过为OS X创建虚拟磁盘的帖子,但是我正在寻找一种在每次启动时都可以使用的更永久的解决方案。我一直希望/ tmp和/ var / log安装在ramdisk中,如果需要的话,可以通过在vi中进行一些命令行编辑将其关闭。


对我来说,这听起来像是过早的优化。您是否真的遇到了很多情况,这些情况是磁盘I / O绑定的,所以您需要尽可能地保存磁盘写操作?
Spiff 2010年

我会公开承认这不太可能是一个巨大的优化。我最初是在Linux系统上执行此操作的,当时我是从便宜的USB闪存盘启动的,并试图尽可能避免写入,同时仍提供许多进程所需的日志和tmp空间。这个想法陷入了僵局,我感到自己在放弃(无法查看日志以跟踪出现的问题,除非我可以重现),这是值得的。对于“非修补”系统,我不会这样做。我的OS X笔记本电脑属于修补匠类别。
kbyrd

6
另一个合理的理由是:我的Macbook有一个SSD,如果我可以防止对我不太关心的事情进行随机写入,则整个系统会更好。那个怎么样?
kbyrd

Answers:


6

这是一个在OS X上创建虚拟磁盘的脚本。很抱歉,它无法回答您的问题。您可以使用它来构建在启动时运行的内容,然后挂载/ 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}"  

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


非常感谢您,此脚本在OS X上创建ram磁盘非常有用
hanxue 2014年

6

编辑:我将接受自己的回答,因为它确实为我解决了一部分问题。如果有人发布更多类似--bind在Linux中的内容,我将接受该答案。

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

步骤1是每次引导时都安装一个ramdisk。为此,我创建了一个bash脚本,然后创建了一个启动项以在启动时调用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的文件,将其添加到启动文件中,使其在启动时被调用,其内容如下:

<?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(内核,守护程序和其他重要的用户空间日志),则下次重新启动时将丢失其内容。这可能会抑制您的诊断能力。


很有可能您将无法做到这一点,即使可以,也绝对不值得花时间。如果您真的想尝试,可以在这里找到有关启动周期的所有公共文档:bit.ly/d1kAPd
Hasaan Chop 2010年

@NSD:感谢您的链接。伙计,我真的想要-绑定安装。
kbyrd

你可以大概重定向记录仪的输出,而无需编写内核扩展,但我从来没有真正尝试。
Hasaan Chop 2010年

2
我意识到这是一个老问题,而且我似乎无法发布正确的答案,但是在搜索中占主导地位。要回答该问题,您想使用hdik -drivekey system-image=yes -nomount ram://262144创建一个128mb的ram磁盘,然后对其newfs_hfs进行格式化,然后使用mount -o union,nobrowse,noatime将该卷挂载到/tmp。这样,现有文件/tmp将保持不变,但新文件将进入ram磁盘。
Haravikk 2014年

1
我唯一的其他评论是,您应该对此保持警惕。而tmpfs在必要时将使用swap,而不会使用RAM磁盘,因此您将丢失大量活动RAM,这意味着您希望将其保持较小,但是其中的某些任务/tmp可能需要更多的内存,并且会失败,因此小心您的运行,以防其需要的空间超过分配的空间。
Haravikk 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.