e.J*_*mes 31 mac swap osx-snow-leopard partitioning macos
到目前为止,我已经能够将 Apple 的虚拟内存交换文件移动到硬盘驱动器上的专用分区。我一直在使用的技术在 forums.macosxhints.com 上的一个线程中进行了描述。
但是,随着 Snow Leopard 的开发者预览版,此方法不再有效。有谁知道如何使用新的操作系统来完成?
更新:我已将dblu 的答案标记为已接受,尽管它并没有完全奏效,因为他给出了出色、详细的说明,并且因为他的使用建议plutil
最终为我指明了正确的方向。完整的工作解决方案发布在问题中,因为我没有足够的声誉来编辑接受的答案。
更新 #2:更改程序以说明ekl 的技术,通过消除对中间 shell 脚本的需要,大大简化了整个过程:
完整的解决方案:
1.
打开终端并备份 Apple 的默认 dynamic_pager.plist:
$ cd /System/Library/LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist{,_bak}
Run Code Online (Sandbox Code Playgroud)
2.
将 plist 从二进制转换为纯 XML:
$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist
Run Code Online (Sandbox Code Playgroud)
3.
使用您选择的文本编辑器打开转换后的 plist。(我使用pico
,请参阅 dblu 的答案以获取使用示例vim
):
$ sudo pico -w com.apple.dynamic_pager.plist
Run Code Online (Sandbox Code Playgroud)
它应该如下所示:
<?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>
Run Code Online (Sandbox Code Playgroud)
4.
在启动 dynamic_pager 之前, 修改 ProgramArguments 数组(第 13 行到第 18 行)以使用 wait4path shell 命令(如ZILjr建议的那样)。有关为什么需要这样做的详细信息,请参阅注释 #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>
Run Code Online (Sandbox Code Playgroud)
5.
保存 plist,并返回到终端提示。使用pico
,命令将是:
<ctrl+o> to save the file
<enter> to accept the same filename (com.apple.dynamic_pager.plist)
<ctrl+x> to exit
Run Code Online (Sandbox Code Playgroud)
6.
将修改后的 plist 转换回二进制:
$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist
Run Code Online (Sandbox Code Playgroud)
7.
重新启动您的 Mac。如果遇到问题,请在启动提示音后立即按住 Command-v 切换到详细启动模式。这将让您看到启动期间出现的所有启动消息。如果您遇到更严重的问题(即您从未看到登录屏幕),请按住 Command-s。这将以单用户模式(没有图形用户界面,只有命令提示符)启动计算机,并允许您恢复在步骤 1 中创建的 com.apple.dynamic_pager.plist 的备份副本。
8.
计算机启动后,启动终端并验证交换文件是否已实际移动:
$ cd /Volumes/Swap/.vm
$ ls -l
Run Code Online (Sandbox Code Playgroud)
您应该会看到如下内容:
-rw------- 1 someUser staff 67108864 18 Sep 12:02 swapfile0
Run Code Online (Sandbox Code Playgroud)
9.
删除旧的交换文件:
$ cd /private/var/vm
$ sudo rm swapfile*
Run Code Online (Sandbox Code Playgroud)
10.
利润!
注 1
在不使用的wait4path
情况下修改 plist 中 dynamic_pager 的参数并不总是有效,当它失败时,它会以一种非常安静的方式进行。问题源于 dynamic_pager 在启动过程中很早就启动的事实。如果第一次加载 dynamic_pager 时您的交换分区尚未安装(根据我的经验,这种情况发生的概率为 99%),那么系统将假装通过。它将在您的 /Volumes 目录中创建一个符号链接,该链接与您的交换分区同名,但指向默认的交换文件位置(/private/var/vm)。然后,当您的实际交换分区挂载时,它将被赋予名称Swap 1
(或YourDriveName 1
)。您可以通过打开终端并列出 /Volumes 目录的内容来查看问题:
$ cd /Volumes
$ ls -l
Run Code Online (Sandbox Code Playgroud)
你会看到这样的事情:
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 -> /
Run Code Online (Sandbox Code Playgroud)
请注意,这种故障可能是非常难以发现。如果您像我在第 12 步中展示的那样检查交换文件,您仍然会看到它们!符号链接会使您的交换文件看起来好像已被移动,即使它们实际上存储在默认位置。
笔记2
我最初无法在 Snow Leopard 中使用它,因为 com.apple.dynamic_pager.plist 是以二进制格式存储的。我制作了原始文件的副本并使用 Apple 的属性列表编辑器(可用于 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
Run Code Online (Sandbox Code Playgroud)
当一切正常时,您可能只会看到几次上述消息,然后就不会再看到“节流重生”消息了。这意味着系统确实必须等待分区加载,但最终还是成功了。
小智 10
注意:请参阅(另)问题本身中更正/改进的答案。
以下解决方案对我有用:
打开终端并备份 com.apple.dynamic_pager.plist ,您将在一秒钟内更改它:
$ cd /System/Library/LaunchDaemons $ sudo cp com.apple.dynamic_pager.plist{,_bak}
将二进制 plist 转换为 xml:
$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist
并使用您最喜欢的文本编辑器打开它
$ sudo vim com.apple.dynamic_pager.plist
它看起来像这样:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 <key>EnableTransactions</key>
6 <true/>
7 <key>HopefullyExitsLast</key>
8 <true/>
9 <key>Label</key>
10 <string>com.apple.dynamic_pager</string>
11 <key>OnDemand</key>
12 <false/>
13 <key>ProgramArguments</key>
14 <array>
15 <string>/sbin/dynamic_pager</string>
16 <string>-F</string>
17 <string>/private/var/vm/swapfile</string>
18 </array>
19 </dict>
20 </plist>
Run Code Online (Sandbox Code Playgroud)
在第 17 行修改 /private/var/vm/swapfile(例如 /Volumes/partition2/swapfile),保存并关闭您的编辑器(":x" 将在 vim 中执行这两项操作)。
将 plist 文件转换回二进制文件:
$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist
重新启动 Mac 后,您应该会在您指定的目录中找到交换文件。
如果遇到任何问题,您可以使用以下命令恢复您在第一步中创建的备份:
$ cd /System/Library/LaunchDaemons $ sudo cp com.apple.dynamic_pager.plist{_bak,}
归档时间: |
|
查看次数: |
27565 次 |
最近记录: |