到目前为止,我已经能够将Apple的虚拟内存交换文件移至硬盘驱动器上的专用分区。我所使用的技术在forums.macosxhints.com上的一个线程中进行了描述。
但是,在开发人员预览Snow Leopard的情况下,此方法不再起作用。有谁知道如何用新的操作系统来完成它?
更新:我已经将dblu的答案标记为已接受,尽管它并不太奏效,因为dblu提供了出色而详尽的说明,并且因为他的使用建议plutil
最终使我朝着正确的方向发展。完整,有效的解决方案已发布在问题中,因为我没有足够的声誉来编辑接受的答案。
更新#2:更改了说明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.
在启动dynamic_pager之前, 修改ProgramArguments数组(第13至18行)以使用wait4path shell命令(如ZILjr所建议)。有关为何需要这样做的详细信息,请参见注释1。在以下示例中,我的分区称为“交换”,我选择将交换文件放在该分区的隐藏目录中,称为“ .vm”,请确保您指定的目录确实存在。XML应该如下所示:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>/bin/wait4path /Volumes/Swap/ &&
/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”消息。这意味着系统确实必须等待分区加载,但是最后成功了。
wait4path
倍),但是由于Applicorn的帮助,我发现了一个非解决方案Xupport为我修改了。一旦确定了方法,我将发布完整的答案,但是它的不足是将最后一个程序参数更改为新路径(例如<string>/Volumes/swap/.vm/swapfile</string>
),将OnDemand
键更改为<true/>
,并在StartOnMount
键的末尾添加一个值的<true/>
。PS此解决方案在Lion中可以正常工作(至少对我而言)。
StartOnMount
:根据在10.5的溶液中加入标志mactech.com/articles/mactech/Vol.25/25.10/...