До сих пор я мог перемещать файлы подкачки виртуальной памяти Apple в выделенный раздел на моем жестком диске. Техника, которую я использовал, описана в теме на forums.macosxhints.com.
Однако с предварительной версией Snow Leopard для разработчиков этот метод больше не работает. Кто-нибудь знает, как это можно сделать с новой ОС?
Обновление: я отметил ответ dblu как принятый, хотя он не вполне сработал, потому что он дал превосходные подробные инструкции и потому, что его предложение использовать plutil
конечном итоге указало мне правильное направление. Полное, рабочее решение размещено здесь в вопросе, потому что у меня недостаточно репутации, чтобы редактировать принятый ответ.
Обновление № 2: Изменена процедура, чтобы проиллюстрировать технику ekl, что значительно упрощает все это, устраняя необходимость в промежуточном сценарии оболочки:
Комплексное решение:
1.
Откройте терминал и сделайте резервную копию динамического_пейджера 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 (как предложено ZILjr) до запуска dynamic_pager. См. Примечание № 1 для получения подробной информации о том, почему это необходимо. В следующем примере мой раздел называется «Swap», и я решил поместить файлы подкачки в скрытый каталог этого раздела с именем «.vm», чтобы убедиться, что указанный вами каталог действительно существует. XML должен выглядеть следующим образом:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>/bin/wait4path /Volumes/Swap/ &&
/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
Когда все работает должным образом, вы можете увидеть вышеупомянутое сообщение только пару раз, и тогда больше не будет сообщений "Возобновление дросселирования". Это означает, что система должна была ждать загрузки раздела, но в итоге она прошла успешно.