注意:这是我前几天在SuperUser上问的一个问题。我将其重新发布在这里,因为我认为它属于此处。
默认情况下,Mac OS X将其交换文件存储在中/private/var/vm/
。我想将交换文件放在其他位置。怎么做到呢?
注意:这是我前几天在SuperUser上问的一个问题。我将其重新发布在这里,因为我认为它属于此处。
默认情况下,Mac OS X将其交换文件存储在中/private/var/vm/
。我想将交换文件放在其他位置。怎么做到呢?
Answers:
注意:从超级用户复制:
对于OSX的旧版本,请参阅forums.macosxhints.com上的该线程。
值得一提的是dblu来解释使用plutil
,ZILjr来引入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/ &&
/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”消息。这意味着系统确实必须等待分区加载,但是最后成功了。
在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
;)
我无法建立永久性的系统启动解决方案,因为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
并在登录时运行。
简单的解决方案:
http://www.macupdate.com/app/mac/10771/swap-relocator
SwapRelocator 1.1.2在Maverick上效果很好!
使用(例如)Tinker Tool System使卷在登录之前挂载,这解决了我遇到的唯一问题。
(感谢Filippo,我终于可以将交换从镜像启动卷移动到条带化缓存卷(所有SSD))
/private/var/vm/sleepimage
超级用户中的其他考虑:我应该将我的/ private / var / vm目录链接到OS X Lion中的另一个卷吗?(2011-09-20)–有一个建议建议不要对外部交换文件和sleepimage使用相同的单独卷。