Snow Leopardの専用パーティションにスワップファイルを移動する


31

これまで、Appleの仮想メモリスワップファイルをハードドライブの専用パーティションに移動することができました。私が使用している手法は、forums.macosxhints.comのスレッドで説明されています

ただし、Snow Leopardの開発者プレビューでは、この方法は機能しなくなりました。誰もが新しいOSでそれをどのように行うことができるか知っていますか?

更新:dbluの答えは受け入れられたとマークしましたが、うまく機能しませんでしたが、優れた詳細な指示を与え、plutil最終的に使用する提案が正しい方向を示したためです。受け入れられた答えを編集するのに十分な評判がないので、完全で実用的なソリューションが質問にここに掲載されています。

更新#2:eklの手法を説明する手順を変更しました。これにより、中間シェルスクリプトが不要になり、全体が大幅に簡素化されます。

完全なソリューション:

1. ターミナルを開き、Appleのデフォルトの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シェル・コマンドを使用するProgramArgumentsアレイ(ライン18を介して13)を変更ZILjr)前dynamic_pagerを起動します。これが必要な理由の詳細については、注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を押し続けます。これにより、コンピューターがシングルユーザーモード(グラフィカルUIなし、コマンドプロンプトなし)で起動し、手順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

使用wait4pathせずにplistのdynamic_pagerの引数を変更しても、常に機能するとは限りません。失敗した場合は、非常に静かな方法で変更します。この問題は、起動プロセスの非常に早い段階でdynamic_pagerが起動されるという事実に起因しています。dynamic_pagerが最初にロードされたときにスワップパーティションがまだマウントされていない場合(私の経験では、これは99%の時間で発生します)、システムは偽装します。/ Volumesディレクトリに、スワップパーティションと同じ名前のシンボリックリンクを作成しますが、デフォルトのスワップファイルの場所(/ private / var / vm)を指します。次に、実際のスワップパーティションがマウントされると、名前Swap 1(またはYourDriveName 1)が付けられます。ターミナルを開いて/ 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

com.apple.dynamic_pager.plistがバイナリ形式で保存されていたため、私はもともとこれをSnow Leopardで動作させることができませんでした。元のファイルのコピーを作成し、変更を加えるために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

すべてが正常に機能している場合、上記のメッセージが数回表示されるだけで、「スロットルの再スポーン」メッセージが表示されなくなる場合があります。つまり、システムはパーティションがロードされるのを待つ必要がありましたが、最終的には成功しました。


なぜあなたがこれをしたいのか、本当に興味がありますか?
BinaryMisfit

わずかなパフォーマンス向上のため。使用状況に応じてハードドライブをパーティション分割するのが好きです。OSとアプリケーション用の1つのパーティション、ユーザーフォルダー用、ドキュメント用、メディア(音楽、映画など)用、スワップファイル用に1つのパーティションがあります。私の経験では、スワップファイルをシステムの他の部分から分離しておくと、ディスクの断片化が少なくなります。私の好みは専用ドライブでスワップすることですが、通常は別のパーティションで十分です。
e。ジェームズ2009

4
十分に公平-ただし、同じドライブ上のパーティションは実際にはドライブ自体により多くの作業を引き起こしますが、異なるドライブ上のパーティションはパフォーマンスの向上をもたらします。ハードドライブは、単一のドライブ上のパーティション間をジャンプするときに、より多くの作業を行う必要があります。私が尋ねるのは、ほぼ2年間使用してからMacで断片化とパフォーマンスの問題がまだ発生していないためです。これらの投稿を見ると興味があります。
BinaryMisfit

1
なぜ回答を投稿できないのかわかりません101担当者-私の数学を覚えていれば- 保護国が要求する10を超えています)がwait4pathApplicornのおかげで解決策が見つかりませんでしたXupportが変更されました。方法がわかれば完全な回答を投稿しますが、最後のプログラム引数を新しいパス(例:)<string>/Volumes/swap/.vm/swapfile</string>に変更し、OnDemandキーを<true/>に変更StartOnMountし、値のあるキーを最後に追加するだけですの<true/>PSこのソリューションは、Lionで正常に機能します(少なくとも私にとっては)。
スリップD.トンプソン

1
@Slipp Douglas:私には合法的に見えます。StartOnMount:フラグに応じて10.5に加えmactech.com/articles/mactech/Vol.25/25.10/...
e.James

回答:


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>

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、}

この設定でスワップファイルが実際にパーティションに移動されていることを確認していますか?元々このアプローチを試みたとき、dynamic_pagerはセカンダリパーティションがマウントされる前にロードされました。システムは、単に/ private / var / vmを指すように/ Volumesディレクトリにpartition2へのシンボリックリンクを作成することにより、その方法を偽装します。/ Volumesディレクトリでls -alを実行すると、「partition2」(シンボリックリンク)と「partition2 1」(実際のパーティション)の両方が表示され、障害を特定できます。
e。ジェームズ

いずれにせよ、plistファイルをバイナリ形式に変換したり、バイナリ形式から変換したりする技術については+1。com.apple.dynamic_pager.plistは10.5.xではプレーンテキスト形式でしたが、10.6ではバイナリ形式でした。これは私の問題の一部です。Xcodeに付属しているProperty List Editorアプリを使用してplistファイルを変更してきましたが、それがうまくいかなかったのかもしれません。plutilを試して、それがさらに先に進むかどうかを確認します。
e。ジェームズ

現時点では別のパーティションでテストすることはできませんが、テスト中に上記の手法を使用してdynamic_pagerでサムドライブにスワップファイルを作成しました。
dblu

plutil変換に使用するためのあなたの提案のおかげで、私は元のテクニックを機能させることができました。完全な解決策を質問に投稿しました(回答に追加するのに十分な担当者がいないため)。plistを変更するだけで遭遇した問題の詳細な説明については、注1を参照してください。
e。ジェームズ

とにかく、答えてくれてありがとう。あなたは優れた指示をまとめ、正しい方向に私を指し示したので、私はそれを受け入れられたものとしてマークしました。乾杯!:)
e。ジェームズ

3

私はこの考え方を採用し、成長戦略と再生戦略に取り組むことで、さらにそれを取り入れました。

http://www.crypticide.com/dropsafe/article/3848の詳細。「dynamicpagerwrapper」GoogleCodeプロジェクトページへのリンクを投稿しますが、ブログには評判ポイントが足りないと言われます...


1
+1すばらしいもの!私は今それを試しています。GoogleCodeプロジェクトへのリンクは次のとおりです。code.google.com
p

:スクリプトの少なくともリビジョン8を使用していることを確認してください code.google.com/p/dynamicpagerwrapper/source/browse/trunk/...

3

ただの質問:wait4path中間ファイルを使用する代わりに、.plistファイルを追加するだけで編集しないのはなぜdynamic_pager_initですか?

このようなもの:

編集:e.Jamesと私の次のコメントによるコメントで説明されているように、エラーがあり(&&がない)、 ProgramArguments 実行するプログラムとして解析された配列の最初の引数のみのため、直後のXMLブロックは良くありません

しかし..(下にスクロール)

 ...
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>
     ...

この設定を安全に試すのに十分な時間はまだありませんでしたが、同じ方法で起動された他のさまざまなシェルコマンドを実行しようとしましたが、すべてが期待どおりに動作するはずです

使い方:

base:実行wait4path /path && commandは、エラーなしで終了および終了するcommand場合にのみ実行されることを意味しwait4path、これ/pathは利用可能なパスがある場合にのみ発生dynamic_pagerするため、スワップボリュームにそのボリュームを使用するように安全に指示できます

1)launchd.plistマンページに書かれているように、キーProgramProgramArgumentsexecvp呼び出しにマップされます。つまり、配列の最初の文字列以外はすべて、配列の最初の文字列、実行するプログラムの引数として扱われます。

2)bashマンページに書かれbash -c <string>ているように、コマンドとして渡された文字列を実行するオプションがあります

1 + 2 = 3) launchd plistでこのコマンドラインを使用するとどうなりますか?

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

/bin/bash実行するプログラム-c、最初の引数、二重引用符で囲まれた文字列は2番目の引数

中間スクリプトなしであなたのソリューションとまったく同じように機能するはずです:launchdサービスを開始し、指定されたパスを待ってからdynamic_pager.. を起動します

注意:
* bash -cターミナルで実行する場合、実行する文字列二重引用符で囲む必要がありますが、plistファイルでは二重引用符ではありません!(適切なタグを持つ文字列として既に宣言されているためだと思います)
* &文字列の2つ&amp;はplistファイルで変更する必要があります

PS:いつものように、自分の責任で進めてください。この設定を使用しているときに発生する可能性のある問題については責任を負いません。

あなたの作品を私たちと共有してくれてありがとう


それは面白いアイデアです。複数のプログラムをProgramArguments配列に入れるのが「合法」かどうかはわかりませんが、一見の価値はあります。試しましたか?
e。ジェームズ

申し訳ありませんが、以前の投稿にエラーがありました。次のコマンドラインを実行することを考えていました(&&が欠落していることに注意してください):wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile誰かがその行を「フォーマット」する方法を見つけて、launchdがそれを気に入るなら、私はそれが機能するはずだと思います(おそらく、/ bin / bashを呼び出して残りを引数として渡す?); ProgramdおよびProgramArgumentsフィールドの詳細については、launchd.plistのマンページを参照してください。これにより、execvp(3)のマンページが表示されます。私は読んで考えています、誰かが速くなったら投稿してください:)
ekl

以前の投稿を機能するソリューションで編集しました。何らかのエラーが発生した場合や、正しく機能しない可能性がある場合はコメントしてください、ありがとう!
ekl

私は自分のラップトップで試してみましたが、うまくいくようです。確かに数日間はこれに注目しますが、プロセス全体を非常に単純化したようです。良い仕事:)
-e.James

あなたの簡略化された方法は、私のラップトップで魅力のように機能しています。ありがとうございました!主な質問を更新して、ソリューションを組み込みます。
e。ジェームズ

2

この記事が書かれてからしばらく経ちましたが、これをやりたい人のために、ここに自分の小さなアイテムを追加すると思いました…

上記のトリックを使用して、スワップファイルを別の内部ドライブに移動しました(ブートドライブはMLCチップを備えたSSDであるため、vmを移動すると平均寿命を節約できます)。とにかく、新しいボリュームを作成した後、Finderでスワップボリュームを使用しましたが、これをFinder自体で使用することは決してないので、ボリュームをFinderで非表示にすることにしました。AppleのDeveloper Toolkitがインストールされている必要があります。次に入力:

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

…また、/ Volumes / Swapをボリュームの名前に置き換えます。Finderを再起動すると、Finderにボリュームをスワップする必要がなくなります。


1

wait4pathを使用して、ボリュームがマウントされるのを待つことができます。そうしないと、launchdはdynamic_pager_initスクリプトを何度も何度も再起動します。


ブリリアント!/の組み合わせのwait4path代わりに使用しました。これにより、非常にきれいになります。ヒントをありがとう。ifgrep
e。ジェームズ

1

Xupportを使ってこれらの汚い仕事をすることができるかもしれません:) http://www.applicorn.com/

仮想メモリオプティマイザー:

スワップファイルの場所を変更するMac OS Xでは、仮想メモリ情報はいわゆる「スワップファイル」に保存されます。スワップファイルは最もインタラクティブなシステムファイルであるため、別のパーティションに置くのが理にかなっています。最速の内蔵ハードディスクの最初のパーティションにスワップファイルを保存することをお勧めします。推奨される最小パーティションサイズは、物理的な組み込みメモリサイズの約3〜4倍大きい必要があります(たとえば、1 GBの物理メモリ= 4 GBのスワップパーティション)。最適なシステムパフォーマンスのための推奨事項と手順:

1.スワップボリュームを使用してハードディスクを最初のパーティションとして再パーティション化します(Mac OS XインストールDVDを使用)。警告:ハードディスクを再パーティションすると、既存のデータがすべて削除されます!

2.システムデータを復元するか、システムパーティションに新しいシステムをインストールします。

3.システムパーティションから起動します。

4. Finderでスワップボリュームを非表示にするには:•Xupportを起動して[設定]を選択します。•[非表示のファイルとフォルダーを表示]を有効にしてFinderを再起動します。 (ドットはFinderから見えなくなります)•「隠しファイルとフォルダを表示する」を無効にして、Finderを再起動します

5.「Swap Storage Volume」の下で新しいスワップパーティションを選択します。次に、[設定]ボタンを押して、新しいスワップファイルの場所の設定を適用します(再起動が必要です)。

ところで、それは私のために働く。Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz、4GB Ram、500GB HD


有望に見えます。リンクと詳細な指示をありがとう!
e。ジェームズ


1

これはおそらく望ましくない答えです(Diagoの後にコメントできないため)が、実際には、これによりパフォーマンスがわずかに向上すると主張するのはなぜですか?私はアップルのフォーラムで議論しましたが、結論はこれはまったく良い考えではないということでした。そして、私はそれを放棄することに非常に抵抗しました。少なくともあなた自身のためにそれを証明するデータを思いつくことができますか、それは単なる「感情」ですか?

10年前、Linuxでもスワップを使用するたびに、そして最近はUbuntuでスワップを使用するたびに、パフォーマンスの改善が見られませんでした。私がそれを望んだ理由は、OSXの空き容量とLinuxの休止状態に関する問題を防ぐためでした。それは私にすべてのスワップです。

しかし、私自身やインターウェブでより深い研究を行ったことはありません。


それは正当な批判です。自分の主張を裏付けるデータがありません:)
e.James

クール。だから、最終的には、あなたもこのすべてのトラブルを経験することをあきらめるかもしれません!:P
クレゴックス

1

これは答えではありませんが、おそらく非常に有用なフォローアップの補足です。AppleはPlistEdit Proで無料のplistエディターを提供しています。これらのファイルを安全に編集できます。値/ private / var / vm / swapfileの引数を/ Volumes / OtherDrive / vm / myswapfilenameのようなものに変更して、スワップファイルを別の場所に移動できるように見えます...

繰り返しますが、私はこれをテストしていません ...


それは良い考えであり、このルートを下ったときに最初に始めたものです。問題は、動的ページャーが起動する時点でスワップパーティションが常にマウントされるとは限らないことです。意味の詳細については、質問自体の注1を参照してください。
e。ジェームズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.