Как я могу переместить файлы подкачки виртуальной памяти на другой диск или раздел?

примечание: это вопрос , который я задал на SuperUser некоторое время назад. Я повторно публикую это здесь, потому что я думаю, что это место здесь.

По умолчанию Mac OS X хранит файлы подкачки в формате /private/var/vm/. Я хотел бы разместить файлы подкачки в другом месте. Как это сделать?

Дополнительное рассмотрение /private/var/vm/sleepimageв Super User: должен ли я символически связывать мой каталог /private/var/vm с другим томом в OS X Lion? (2011-09-20) - есть ответ, в котором рекомендуется не использовать один и тот же отдельный том как для внешних файлов подкачки, так и для сна.
dynamicpagerwrapper ( источник: dynamic_pager_wrapper ) — обертка производительности для /sbin/dynamic_pager в OSX

Ответы (3)

примечание: скопировано из SuperUser:

Для более старых версий OSX см. эту ветку на forums.macosxhints.com.

Благодарность принадлежит dblu за объяснение использования plutil, ZILjr за введение wait4pathкоманды и ekl за упрощение всего этого за счет устранения необходимости в промежуточном сценарии оболочки.

Полное решение:

1. Откройте Терминал и сделайте резервную копию стандартного файла dynamic_pager.plist от Apple:

$ 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. Измените массив ProgramArguments (строки с 13 по 18), чтобы использовать команду wait4pathоболочки перед запуском 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. Это загрузит компьютер в однопользовательском режиме (без графического интерфейса, только командная строка) и позволит вам восстановить резервную копию com.apple.dynamic_pager.plist, которую вы сделали на шаге 1.

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

Изменение аргументов для dynamic_pager в plist без использования wait4pathне всегда работает, а в случае сбоя происходит эффектно бесшумно. Проблема связана с тем, что 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

Первоначально мне не удалось заставить это работать в Snow Leopard, потому что com.apple.dynamic_pager.plist хранился в двоичном формате. Я сделал копию исходного файла и открыл его с помощью редактора списка свойств Apple (доступного с Xcode), чтобы внести изменения, но этот процесс добавил некоторые расширенные атрибуты в файл plist, из-за чего система проигнорировала его и просто использовала значения по умолчанию. . Как указал dblu, использование plutilдля преобразования файла в простой XML работает как шарм.

Заметка 3

Вы можете проверить консольное приложение, чтобы увидеть любые сообщения, которые dynamic_pager_init выводит на экран. Если вы видите, что следующие строки повторяются снова и снова, значит, возникла проблема с настройкой. Я столкнулся с этими сообщениями, потому что забыл создать каталог '.vm', который я указал в dynamic_pager_init.

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

Если том, используемый для подкачки, не нужно индексировать

Используйте мдутил . Пример, чтобы выключить, а затем стереть магазин:

sudo mdutil -i off /Volumes/Swap && sudo mdutil -E /Volumes/Swap

В следующий раз просто свяжите вопрос/ответ, рядом с каждым ответом есть кнопка «связать». ;)
В самом верху этого вопроса есть ссылка на вопрос SuperUser. Я не ссылался напрямую на «ответ» на SuperUser, потому что он был построен из частей нескольких других ответов. Однако я добавил ссылки на каждый частичный ответ (используя эту удобную кнопку «ссылка») во втором абзаце этого ответа. Сколько еще ссылок вы хотите?;)
Мне нравится, что это здесь… Я постоянно на это ссылаюсь..
Это не работает для меня под 10.10.3 - похоже, он не использует plist.
В El Capitan попытка очистить подкачку не разрешена новой системой защиты целостности системы. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: Операция не разрешена, пока включена защита целостности системы <br> Загрузитесь в раздел восстановления и выберите «Конфигурация безопасности» в меню «Утилиты». Вы можете снять флажок Enforce System Integrity Protection, нажать Apply Configuration и перезапустить.
В Mojave SIP также мешает и предотвращает как изменения в каталоге /System/Library/LaunchDaemons, так и вызов dynamic_pager с флагом -F. Я получаю это сообщение об ошибке:sandboxd: [com.apple.sandbox.reporting:violation] Sandbox: dynamic_pager(157) System Policy: deny(1) sysctl-write vm.swapfileprefix
Также проверка из Мохаве, редактирование plist работает после отключения SIP. Хотя шаги 2-6 можно заменить двумя командами PlistBuddy (8) , преобразование в xml и обратно излишне запутано.

Мне не удалось установить постоянное решение для загрузки системы, так как 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

и запустить при входе в систему.

Простое решение:

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

SwapRelocator 1.1.2 отлично работает на Maverick!

Используйте (например) Tinker Tool System, чтобы разрешить монтирование томов перед входом в систему, что решает единственную проблему, с которой я столкнулся.

(Спасибо, Филиппо, наконец-то я могу перенести своп с зеркального загрузочного тома на чередующийся том кэша (все SSD))