将交换文件移动到Snow Leopard中的专用分区


31

到目前为止,我已经能够将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/ &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”消息。这意味着系统确实必须等待分区加载,但是最后成功了。


我真的很好奇你为什么要这么做?
BinaryMisfit

对于较小的性能提升。我喜欢根据使用情况对硬盘进行分区。我为操作系统和应用程序提供了一个分区,为用户文件夹提供了一个分区,为文档提供了一个分区,为媒体(音乐,电影等)提供了一个分区,为交换文件提供了一个分区。以我的经验,将交换文件与系统的其余部分分开会使磁盘碎片少。我的首选是在专用驱动器上进行交换,但是另一个分区通常就足够了。
e.James

4
足够公平-但是,同一驱动器上的分区实际上会为驱动器本身带来更多工作,但是不同驱动器上的分区会提高性能。当跨单个驱动器上的分区跳转时,硬盘驱动器必须做更多的工作。我只问一下,因为开箱使用将近2年后,我的Mac上仍未出现碎片和性能问题,当我看到这些帖子时,我就很感兴趣。
BinaryMisfit

1
我不确定为什么我不能发布答案101代表,如果我记得我的数学,它超过了受保护国家要求的10wait4path,但是由于Applicorn的帮助,我发现了一个非解决方案Xupport为我修改了。一旦确定了方法,我将发布完整的答案,但是它的不足是将最后一个程序参数更改为新路径(例如<string>/Volumes/swap/.vm/swapfile</string>),将OnDemand键更改为<true/>,并在StartOnMount键的末尾添加一个值的<true/>PS此解决方案在Lion中可以正常工作(至少对我而言)。
Slipp D. Thompson 2012年

1
@Slipp Douglas:在我看来合法。的StartOnMount:根据在10.5的溶液中加入标志mactech.com/articles/mactech/Vol.25/25.10/...
e.James

Answers:


10

注意:请参阅(也)问题本身的更正/改进答案。


以下解决方案为我工作:

打开一个终端并备份com.apple.dynamic_pager.plist,您将在一秒钟内对其进行更改:

$ cd /系统/库/启动守护程序
$ 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>

在第17行中,修改/ private / var / vm / swapfile(例如/ Volumes / partition2 / swapfile),保存并关闭编辑器(“:x”在vim中都起作用)。

将plist文件转换回二进制文件:

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

重新启动Mac后,您应该在指定的目录中找到交换文件。

如果遇到任何问题,可以使用以下方法还原在第一步中创建的备份:

$ cd /系统/库/启动守护程序
$ sudo cp com.apple.dynamic_pager.plist {_bak,}

您确定交换文件实际上是通过此设置移动到分区的吗?最初尝试此方法时,dynamic_pager将在挂载辅助分区之前加载。该系统将通过在/ Volumes目录中创建一个指向partition2的符号链接来伪造其方式,该链接仅指向/ private / var / vm。您可以通过在/ Volumes目录中执行ls -al来识别故障,在该目录中您将同时看到“ partition2”(符号链接)和“ partition2 1”(您的实际分区)。
e.James 2009年

无论哪种方式,+1都是将plist文件转换为二进制格式或从二进制格式转换的技术。com.apple.dynamic_pager.plist是10.5.x的纯文本格式,但从10.6开始为二进制格式。这是我的问题的一部分。我一直在使用Xcode附带的Property List Editor应用程序修改plist文件,也许这就是为什么事情不起作用的原因。我将尝试使用plutil,看看是否能进一步解决问题。
e.James 2009年

目前,我无法在另一个分区上对其进行测试,但是在测试期间,我使用上述技术使dynamic_pager在thumbdrive上创建了swapfile。
dblu

多亏您的建议,我才得以使原始技术发挥作用plutil。我在问题中张贴了完整的解决方案(因为我没有足够的代表将其添加到您的答案中)。有关仅修改plist时遇到的问题的详细说明,请参见我的注释#1。
e.James

无论如何,谢谢您的回答。您整理了一套出色的说明,并为我指出了正确的方向,因此我已将其标记为接受。干杯! :)
e.James

3

我采纳了这个想法,并通过解决增长和填海策略将其进一步发展。

有关详细信息,请访问http://www.crypticide.com/dropsafe/article/3848;我会发布一个指向“ dynamicpagerwrapper” GoogleCode项目页面的链接,但是博客告诉我,我的信誉点不足...


1
+1好东西!我正在尝试。这是GoogleCode项目的链接:code.google.com/p/dynamicpagerwrapper
e.James 2010年

确保你至少使用8版本的脚本: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/...

3

只是一个问题:为什么不编辑添加的.plist文件wait4path,而不使用中间文件dynamic_pager_init

像这样的东西:

编辑:如e.James的评论和我的后续评论所述,紧随其后的XML块并不好,不仅是因为存在错误(缺少&&),而且还因为仅将数组的第一个参数 ProgramArguments 解析为要运行的程序!

但是..(向下滚动)

 ...
13     <key>ProgramArguments</key>
14     <array>
15         <string>/bin/wait4path</string>
16         <string>/Volumes/Swap/</string>
17         <string>/sbin/dynamic_pager</string>
18         <string>-F</string>
19         <string>/Volumes/Swap/.vm/swapfile</string>
20     </array>
 ...

错误的xml块的结尾


此XML块改为:

   ...
    13     <key>ProgramArguments</key>
    14     <array>
    15         <string>/bin/bash</string>
    16         <string>-c</string>
    17         <string>/bin/wait4path /Volumes/Swap/ &amp;&amp; /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
    18     </array>
     ...

请记住,我仍然没有足够的时间来安全地尝试此设置,但是我尝试运行以相同方式启动的其他各种Shell命令,并且所有操作均应按预期进行

怎么运行的:

base:执行wait4path /path && command意味着command仅在wait4path结束且没有错误的情况下运行,并且仅在/path可用路径时才发生,因此我们可以安全地告诉dynamic_pager使用该卷作为交换文件

1)如手册launchd.plist页所述,键ProgramProgramArguments被映射到execvp调用,这意味着除数组中的第一个字符串以外的所有内容都将被视为要运行的程序中数组中的第一个字符串的参数;

2)bash联机帮助页中所述,有一个bash -c <string>选项可以运行作为命令传递的字符串

1 + 2 = 3)在启动的plist中使用此命令行会发生什么?

/bin/bash -c "wait4path /Volumes/Swap/ && /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile"

/bin/bash是要运行的程序,-c是第一个参数,双引号字符串是第二个参数

我猜它应该与您的解决方案完全一样,没有中间脚本:launchd将启动服务,将等待给定路径,然后启动dynamic_pager..

请注意:
*如果要bash -c在Terminal中运行,则要执行的字符串应加双引号,但在plist文件中则不会双引号!(我想是因为它已经使用适当的标签声明为字符串了)
* &字符串中的两个必须&amp;在plist文件中更改为

附注:一如既往,请您自担风险,对于使用此设置可能遇到的问题,我不承担任何责任!

感谢您与我们分享您的工作


那是一个有趣的想法。我不确定将多个程序放入ProgramArguments数组是否“合法” ,但是肯定值得一试。你有试过吗
e.James 2010年

抱歉,上一篇文章中有一个错误,我的想法是运行以下命令行(请注意缺少的&&):wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile如果有人找到一种方法来“格式化”该行,以便启动它会喜欢它,我想它应该可以工作(我正在考虑,也许叫/ bin / bash传递其余部分作为参数?);有关Program和ProgramArguments字段的更多说明,可以在launchd.plist联机帮助页中找到,这将导致execvp(3)联机帮助页。我正在阅读与思考,如果有人更快,请发布:)
ekl

我用一种应该有效的解决方案编辑了上一篇文章,如果您看到任何类型的错误或任何可能无法正常工作的内容,请发表评论,谢谢!
ekl

我在笔记本电脑上尝试了一下,它似乎可以正常工作。我肯定会注意几天,但是看来您已经大大简化了整个过程!尼斯的工作:)
e.James

您使用的简化方法在笔记本电脑上像灵符一样工作。谢谢!我将更新主要问题以合并您的解决方案。
e.James 2010年

2

我知道自从写这篇文章以来已经有一段时间了,但是我想为那些也想这样做的人在这里添加我自己的小东西……

我已使用上述技巧将交换文件移至另一个内部驱动器(我的引导驱动器是具有MLC芯片的SSD,因此,移走vm可以节省预期寿命)。无论如何,在创建新卷后,我在Finder中有一个“交换”卷,而我将永远不会在Finder中使用它,因此我决定使该卷对Finder不可见。您需要安装Apple的Developer Toolkit。然后输入:

/Developer/Tools/SetFile -a V /Volumes/Swap/

…并用您命名的卷替换/ Volumes / Swap。重新启动Finder并保存,不再有Finder中的交换音量!


1

您可以使用wait4path等待卷挂载。否则,启动将一遍又一遍地重新启动您的dynamic_pager_init脚本,直到它执行为止。


辉煌!我用的wait4path不是if/ grep组合,这样可以很好地清理内容。谢谢你的提示。
e.James,

1

也许我们可以使用Xupport为我们完成那些肮脏的工作:)http://www.applicorn.com/

虚拟内存优化器:

更改交换文件的位置在Mac OS X中,虚拟内存信息存储在所谓的“交换文件”中。由于交换文件是交互性最高的系统文件,因此将它们放在单独的分区中是很有意义的。建议将交换文件存储在最快的内部硬盘的第一个分区上。建议的最小分区大小应为物理内置内存大小的大约3或4倍(例如1 GB物理内存= 4 GB交换分区)。有关最佳系统性能的建议和说明:

1.使用交换卷将硬盘重新分区为FIRST分区(使用Mac OS X安装DVD)。警告:重新打印硬盘将删除所有现有数据!

2.恢复系统数据或在系统分区上安装新系统。

3.从系统分区启动。

4.如果您希望交换卷对Finder不可见:•启动Xupport并选择“设置”•启用“显示隐藏的文件和文件夹”并重新启动Finder•将交换卷从“交换”重命名为“ .swap” (点使它对Finder不可见)•禁用“显示隐藏的文件和文件夹”,然后再次重新启动Finder。

5.在“交换存储卷”下选择新的交换分区。然后,按“设置”按钮以应用新的交换文件位置设置(需要重新启动)。

顺便说一句,它为我工作。雪豹10.6.2 @ Macbook Pro 2.4GHz,4GB Ram,500GB HD


看起来很有希望。感谢您的链接和详细说明!
e.James 2010年


1

这很可能是一个不需要的答案(因为在Diago之后我无法发表评论),但是为什么您真的坚持认为这样做只会带来很小的性能提升呢?我在苹果论坛上进行了讨论,得出的结论是,这根本不是一个好主意。而且我非常反对放弃它。您能否拿出至少证明自己的数据,还是仅仅是一种“感觉”?

从十年前甚至在linux上我甚至在linux上都使用swap以来,我再也看不到性能方面的改进。我想要它的原因是为了防止OSX上的可用空间问题,以及在Linux上能够休眠。这就是我的全部交换。

但是我从来没有真正自己或在网络上进行过更深入的研究。


这是一个有效的批评。我没有任何数据可以
证明

凉。因此,最终,您也可能会放弃所有这些麻烦!:P
cregox

1

这不是一个答案,但也许是一个非常有用的后续补充。Apple在此处PlistEdit Pro提供免费的plist编辑器。它允许您安全地编辑这些文件。好像您可以将参数/ private / var / vm / swapfile更改为/ Volumes / OtherDrive / vm / myswapfilename一样,将交换文件移动到其他位置...

再次,我没有测试过 ...


这是一个好主意,这是我沿着这条路走的第一件事。问题在于,在动态寻呼机启动时,交换分区并不总是安装在该时间点。有关我的意思的详细信息,请参见问题本身的注释#1。
e.James
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.