web-dev-qa-db-ja.com

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

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

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

更新:私は dblu's answer を受け入れたとマークしました。 plutilを使用するという彼の提案が最終的に正しい方向に私を向けたからです。承認された回答を編集するための十分な評判がないため、完全な実用的なソリューションが質問のここに投稿されています。

Update#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を使用しています。vimを使用した例については、dbluの回答を参照してください):

$ 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を起動する前に( ZILjr で推奨される)wait4pathシェルコマンドを使用するようにProgramArguments配列(13〜18行目)を変更します。これが必要な理由の詳細については、注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を押したままにします。これにより、コンピューターがシングルユーザーモード(グラフィカル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のプロパティリストエディター(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

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

31
e.James

[〜#〜] note [〜#〜]:質問自体の修正/改善された回答も(また)参照してください。


次の解決策は私のために働きました:

ターミナルを開いて、すぐに変更する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、}
10
dblu

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

このようなもの:

EDIT:e.Jamesによるコメントと私の次のコメントで説明されているように、エラーがある(&&がない)と、配列の最初の引数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>
     ...

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

使い方:

base:wait4path /path && commandを実行すると、commandwait4pathがエラーなしで終了して終了する場合にのみ実行され、/pathが利用可能なパス。これにより、dynamic_pagerにそのボリュームをスワップファイルに使用するように安全に指示できます。

1)launchd.plistのマンページに記載されているように、キーProgramおよびProgramArgumentsexecvp呼び出しにマップされます。ただし、配列の最初の文字列は、実行するプログラムである配列の最初の文字列の引数として扱われます。

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ファイルではnot二重引用符です! (私はそれが適切なタグを持つ文字列としてすでに宣言されているためと思います)
*文字列内の2つの&は、plistファイル内で&amp;に変更する必要があります

PS:いつものように、あなた自身の責任で進めてください、私はあなたがこの設定を使用しているかもしれない問題について責任を負いません!

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

3
ekl

私はこのアイデアを採用し、成長と再生の戦略に取り組むことで少し考えました。

詳細は http://www.crypticide.com/dropsafe/article/3848 ;私は「dynamicpagerwrapper」GoogleCodeプロジェクトページへのリンクを投稿しますが、ブログには十分な評判ポイントがないことが示されています...

3
Alec Muffett

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

上記のトリックを使用して、スワップファイルを別の内部ドライブに移動しました(ブートドライブはMLCチップを搭載したSSDなので、vmをオフにすると寿命を延ばすことができます)。とにかく、新しいボリュームを作成した後、Finderでスワップボリュームを使用しましたが、Finder自体では使用しないので、ボリュームをFinderから見えないようにすることにしました。 AppleのDeveloper Toolkitをインストールする必要があります。次に、次のように入力します。

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

…そして/ Volumes/Swapをボリュームに付けた名前に置き換えます。 Finderを再起動してプレストし、Finderでボリュームを交換する必要はもうありません!

2

Wait4pathを使用して、ボリュームがマウントされるのを待つことができます。それ以外の場合、launchdはdynamic_pager_initスクリプトを再起動し、再起動するまで何度も繰り返します...

1
ZILjr

これは望ましくない答えである可能性が高いです(私がDiagoの後にコメントを付けることができないため)。私は Appleフォーラム についての議論を経て、これはまったく良い考えではないという結論に至りました。そして私はそれを放棄することに非常に抵抗しました。少なくとも自分自身のためにそれを証明するデータを考え出しますか、それとも単なる「感情」ですか?

Linuxでさえスワップを使用したときから、10年前、そして今日ではubuntuで、パフォーマンスの改善は見られませんでした。 OSXとLinuxでは休止状態にできるようにするための空き領域の問題を防ぐために、それが必要だった私の理由は。それは私にとってすべてのスワップです。

しかし、私は自分自身で、またはインターネット間で、より深い研究をしたことはありません。

1
cregox

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

もう一度私はこれをテストしていません...

1
Jesse

たぶん、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.4 GHz、4 GB RAM、500 GB HD

1
UooU