如何将虚拟内存交换文件移动到其他驱动器或分区?


33

注意:这是我前几天在SuperUser上问的一个问题。我将其重新发布在这里,因为我认为它属于此处。

默认情况下,Mac OS X将其交换文件存储在中/private/var/vm/。我想将交换文件放在其他位置。怎么做到呢?


/private/var/vm/sleepimage超级用户中的其他考虑:我应该将我的/ private / var / vm目录链接到OS X Lion中的另一个卷吗?(2011-09-20)–有一个建议建议不要对外部交换文件和sleepimage使用相同的单独卷。
Graham Perrin

dynamicpagerwrapper来源:dynamic_pager_wrapper)– OSX上/ sbin / dynamic_pager的性能包装器
Graham Perrin

Answers:


23

注意:从超级用户复制:

对于OSX的旧版本,请参阅forums.macosxhints.com上的该线程

值得一提的dblu来解释使用plutilZILjr来引入wait4path命令,而ekl则通过消除中间shell脚本来简化整个过程。

完整的解决方案:

1. 打开终端,并备份苹果默认的dynamic_pager.plist:

$ cd /System/Library/LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist{,_bak}

2. 将plist从二进制转换为纯XML:

$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist

3. 使用您选择的文本编辑器打开转换后的plist。(我使用pico,有关使用的示例,请参见dblu的答案vim):

$ sudo pico -w com.apple.dynamic_pager.plist

它应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs$
<plist version="1.0">
<dict>
    <key>EnableTransactions</key>
    <true/>
    <key>HopefullyExitsLast</key>
    <true/>
    <key>Label</key>
    <string>com.apple.dynamic_pager</string>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/dynamic_pager</string>
        <string>-F</string>
        <string>/private/var/vm/swapfile</string>
    </array>
</dict>
</plist>

4.wait4path在启动dynamic_pager之前, 修改ProgramArguments数组(第13至18行)以使用shell命令。有关为何需要这样做的详细信息,请参见注释1。在以下示例中,我的分区称为Swap,我选择将交换文件放在该分区上的隐藏目录中,请.vm 确保您指定的目录实际存在。XML应该如下所示:

<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>/bin/wait4path /Volumes/Swap/ &amp;&amp;
/sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
</array>

5. 保存plist,然后返回到终端提示符。使用pico,命令为:

<ctrl+o> to save the file
<enter>  to accept the same filename (com.apple.dynamic_pager.plist)
<ctrl+x> to exit

6. 将修改后的plist转换回二进制文件:

$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist

7.重新启动Mac。如果遇到麻烦,请在启动提示音后立即按住Command-v切换到详细启动模式。这将使您看到启动期间出现的所有启动消息。如果遇到更严重的麻烦(即您从未看到登录屏幕),请按住Command-s。这将以单用户模式(没有图形用户界面,只有命令提示符)引导计算机,并允许您还原在步骤1中创建的com.apple.dynamic_pager.plist的备份副本。

8.计算机启动后,启动终端并验证交换文件是否已实际移动:

$ cd /Volumes/Swap/.vm
$ ls -l

您应该会看到以下内容:

-rw-------  1 someUser  staff  67108864 18 Sep 12:02 swapfile0

9.删除旧的交换文件:

$ cd /private/var/vm
$ sudo rm swapfile*

10.利润!

注1

在不使用plist的情况下修改p_dynamic_pager的参数wait4path并不总是有效,当失败时,它会以一种非常安静的方式进行修改。问题源于在启动过程中很早就启动了dynamic_pager的事实。如果在首次加载dynamic_pager时尚未安装交换分区(根据我的经验,这种情况发生在99%的时间),那么系统将伪造其通过方式。它将在/ Volumes目录中创建一个符号链接,该链接与交换分区的名称相同,但指向默认的交换文件位置(/ private / var / vm)。然后,当您实际的交换分区挂载时,将为其指定名称Swap 1(或YourDriveName 1)。您可以通过打开Terminal并列出/ Volumes目录的内容来查看问题:

$ cd /Volumes
$ ls -l

您将看到如下内容:

drwxrwxrwx  11 yourUser  staff   442 16 Sep 12:13 Swap -> private/var/vm
drwxrwxrwx  14 yourUser  staff     5 16 Sep 12:13 Swap 1 
lrwxr-xr-x   1 root      admin     1 17 Sep 12:01 System -> /

请注意,这种故障可能是非常难以发现。如果要检查步骤12中显示的交换文件,您仍然会看到它们!该符号链接将使交换文件看起来已被移动,即使它们实际上已存储在默认位置。

笔记2

我最初无法在Snow Leopard中使用它,因为com.apple.dynamic_pager.plist以二进制格式存储。我制作了一个原始文件的副本,并使用Apple的Property List Editor(Xcode可用)将其打开以进行更改,但是此过程向plist文件添加了一些扩展属性,导致系统将其忽略,仅使用默认值。正如dblu指出的那样,使用plutil将文件转换为纯XML的方法就像一种魅力。

注3

您可以检查控制台应用程序以查看dynamic_pager_init回显到屏幕的任何消息。如果您看到以下几行一遍又一遍,则说明安装存在问题。我遇到了这些消息,因为我忘记创建在dynamic_pager_init中指定的“ .vm”目录。

com.apple.launchd[1]  (com.apple.dynamic_pager[176]) Exited with exit code: 1
com.apple.launchd[1]  (com.apple.dynamic_pager) Throttling respawn: Will start in 10 seconds

当一切正常运行时,您可能只会看到几次上述消息,然后再也看不到“ Throttling respawn”消息。这意味着系统确实必须等待分区加载,但是最后成功了。

从Time Machine中排除路径

在OS X 10.7及更高版本中,您可以使用tmutil进行此操作。例:

sudo tmutil addexclusion -p /Volumes/Swap/.vm

对于该示例,查看结果:

tmutil isexcluded /Volumes/Swap && tmutil isexcluded /Volumes/Swap/.vm

如果用于交换的卷不需要索引

使用mdutil。例如,要关闭然后清除存储:

sudo mdutil -i off /Volumes/Swap && sudo mdutil -E /Volumes/Swap


下次仅链接问题/答案时,每个答案旁边都有一个“链接”按钮。;)
Martin Marconcini 2010年

2
在该问题的最顶部有一个指向SuperUser问题的链接。我没有直接链接到SuperUser上的“ the”答案,因为它是由其他几个答案的一部分构成的。但是,我确实在此答案的第二段中添加了指向每个部分答案的链接(使用该便捷的“链接”按钮)。您还想要多少个链接?;)
e.James 2010年

2
我喜欢它在这里…我一直都在引用它
。–亚历克斯·格雷

这对我来说在10.10.3下失败了-它似乎不使用plist。
aramis 2015年

2
在El Capitan下,新的系统完整性保护不允许尝试清除交换。/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist:启用系统完整性保护后,不允许进行操作<br>引导到恢复分区,然后从“实用程序”菜单中选择“安全配置”。您可以取消选中“强制系统完整性保护”,单击“应用配置”,然后重新启动。
Meetai.com '16

4

我无法建立永久性的系统启动解决方案,因为10.10在启动时不再使用/etc/.rc,并且com.apple.dynamic_pager.plist方法失败了。

sudo mkdir /Volumes/Swap/s
sudo chmod 755 /Volumes/Swap/s
sudo sysctl vm.swapfileprefix=/Volumes/Swap/s

确实更改了由报告的存储前缀

sysctl vm

在会话期间,它在重新启动后仍然有效。

这可以作为unix命令包装到文本文件中:

$/bin/sh
sysctl vm.swapfileprefix=/Volumes/Swap/s

并在登录时运行。


-1

简单的解决方案:

http://www.macupdate.com/app/mac/10771/swap-relocator

SwapRelocator 1.1.2在Maverick上效果很好!

使用(例如)Tinker Tool System使卷在登录之前挂载,这解决了我遇到的唯一问题。

(感谢Filippo,我终于可以将交换从镜像启动卷移动到条带化缓存卷(所有SSD))

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.