仮想メモリスワップファイルを別のドライブまたはパーティションに移動するにはどうすればよいですか?


33

注:これは先ほどSuperUserで質問した質問です。ここに属していると思うので、ここに再投稿しています。

デフォルトでは、Mac OS Xはそのスワップファイルをに保存し/private/var/vm/ます。スワップファイルを別の場所に配置したいと思います。どうすればできますか?


/private/var/vm/sleepimageスーパーユーザーでの追加の考慮事項:OS X Lionの/ private / var / vm dirを別のボリュームにシンボリックリンクする必要がありますか?(2011-09-20)–外部スワップファイルとsleepimageの両方に同じ個別のボリュームを使用しないことを推奨する回答があります。
グラハムペリン

dynamicpagerwrapperソース:dynamic_pager_wrapper)– OSXの/ sbin / dynamic_pagerのパフォーマンスラッパー
グラハムペリン

回答:


23

注: SuperUserからコピー:

OSXの古いバージョンについては、forums.macosxhints.comでこのスレッドを参照してください。

クレジットは、コマンドの紹介にZILjrを、中間シェルスクリプトの必要性を排除して全体を単純化するeklの使用を説明するためにdbluに行きます。plutilwait4path

完全なソリューション:

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 dynamic_pagerを起動する前にシェルコマンド を使用するようにProgramArguments配列(行13〜18)を変更します。これが必要な理由の詳細については、注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

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

Time Machineからパスを除外する

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


次回質問/回答をリンクするだけで、各回答の横に「リンク」ボタンがあります。;)
マーティンマルコンチーニ

2
この質問の一番上には、スーパーユーザーの質問へのリンクがあります。SuperUserの「the」回答には直接リンクしませんでした。これは、他のいくつかの回答の一部から構築されているためです。ただし、この回答の2番目の段落で、各部分的な回答に(その便利な「リンク」ボタンを使用して)リンクを追加しました。さらにいくつのリンクが必要ですか?;)
e。ジェームズ

2
それがここにあることのように私は...私はそれをすべての時間を参照する...
アレックスグレー

これは10.10.3未満では失敗します-plistを使用していないようです。
アラミス

2
エルキャピタンでは、新しいシステム整合性保護によってスワップをクリアすることは許可されていません。/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist:システム整合性保護が有効になっている間は操作が許可されません<br>リカバリパーティションを起動し、[ユーティリティ]メニューから[セキュリティの構成]を選択します。[システム整合性保護の強制]のチェックを外し、[構成の適用]をクリックして再起動できます。
Meetai.com

4

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

ログイン時に実行します。


-1

簡単なソリューション:

http://www.macupdate.com/app/mac/10771/swap-relocator

SwapRelocator 1.1.2は、Maverickで最適に動作します!

(たとえば)Tinker Tool Systemを使用して、ログインする前にボリュームをマウントし、私が遭遇した唯一の問題を解決します。

(Filippoに感謝します。スワップをミラーブートボリュームからストライプキャッシュボリューム(すべてのSSD)に移動できます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.