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

33

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

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

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

Ответы:

23

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

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

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

Комплексное решение:

1. Откройте Терминал и создайте резервную копию стандартного динамического Apple_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. Откройте преобразованный список с помощью вашего текстового редактора. (Я использую 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. Сохраните список и вернитесь к терминалу. Используя 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

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

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

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

e.James
источник
В следующий раз просто свяжите вопрос / ответ, рядом с каждым ответом будет кнопка «ссылка». ;)
Мартин Маркончини
2
В самом верху этого вопроса есть ссылка на вопрос SuperUser. Я не связывался напрямую с «ответом» на SuperUser, потому что он был построен из частей нескольких других ответов. Однако я добавил ссылки на каждый частичный ответ (используя эту удобную кнопку «ссылка») во втором абзаце этого ответа. Сколько еще ссылок вы хотите? ;)
e.James,
2
Мне нравится, что это здесь ... Я все время
Алекс
Это не работает для меня в 10.10.3 - похоже, он не использует plist.
Арамис
2
При El Capitan попытка очистки свопа не разрешена новой Системой защиты целостности. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: Операция запрещена, когда включена защита целостности системы. Загрузитесь в раздел восстановления, а затем выберите «Конфигурация безопасности» в меню «Служебные программы». Вы можете снять флажок Принудительно осуществлять защиту целостности системы, нажать Применить конфигурацию и перезапустить.
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, чтобы разрешить монтирование томов перед входом в систему, что решает единственную проблему, с которой я столкнулся.

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

БКА
источник