31

До сих пор я мог перемещать файлы подкачки виртуальной памяти 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/ &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

Когда все работает должным образом, вы можете увидеть вышеупомянутое сообщение только пару раз, и тогда больше не будет сообщений "Возобновление дросселирования". Это означает, что система должна была ждать загрузки раздела, но в итоге она прошла успешно.

8 ответов8

10

ПРИМЕЧАНИЕ . См. (Также) исправленный / улучшенный ответ в самом вопросе.


Следующее решение сработало для меня:

Откройте терминал и создайте резервную копию 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,}
3

просто вопрос: почему бы просто не отредактировать файл .plist , добавив wait4path вместо использования промежуточного dynamic_pager_init ?

что-то вроде этого:

РЕДАКТИРОВАТЬ: как объяснено в комментарии е.Джеймс и мой следующий комментарий, следующий за ним блок XML не годится, потому что есть ошибка (отсутствует &&) и потому, что только первый аргумент массива 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 означает, что command выполняется только в том случае, если wait4path заканчивается и завершается без ошибок, и это происходит только тогда, когда /path является доступным путем, поэтому мы можем смело сказать dynamic_pager использовать этот том для файлов подкачки

1) как написано на man- launchd.plist , ключи Program и ProgramArguments отображаются на вызов execvp , что означает, что все, кроме первой строки в массиве, рассматривается как аргумент для первой строки в массиве, запускаемой программы ;

2) как написано на man-странице 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 - первый аргумент, а строка в двойных кавычках - второй аргумент.

Я предполагаю, что оно должно работать точно так же, как ваше решение, без промежуточного скрипта: launchd запустит сервис, который будет ждать заданного пути, а затем запустит dynamic_pager .

Обратите внимание, что:
* строка, которую вы хотите выполнить, должна быть заключена в двойные кавычки, если вы запускаете bash -c в Терминале, но в файле plist это не двойные кавычки! (я думаю, потому что он уже объявлен как строка с соответствующим тегом)
* два & в строке должны быть изменены на &amp; в файле plist

PS: как всегда, действуйте на свой страх и риск, я не несу ответственности за проблемы, которые могут возникнуть при использовании этого параметра!

спасибо, что поделились с нами своей работой

3

Я принял эту идею и развил ее немного дальше, рассматривая стратегии роста и освоения.

Подробности на http://www.crypticide.com/dropsafe/article/3848 ; Я бы опубликовал ссылку на страницу проекта GoogleCode "dynamicpagerwrapper", но в блоге говорится, что у меня недостаточно репутационных очков ...

2

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

Я использовал вышеописанный трюк, чтобы переместить мои файлы подкачки на другой внутренний диск (мой загрузочный диск - SSD с микросхемами MLC, поэтому удаление vm может сохранить ожидаемый срок службы). В любом случае, после создания нового тома у меня был том Swap в Finder, который я никогда не собираюсь использовать в самом Finder, поэтому я решил сделать том невидимым для Finder. Вам нужно установить Apple Developer Toolkit. Затем введите:

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

… И замените /Volumes /Swap на то, что вы назвали своим томом. Перезапустите Finder и нажмите «Престо», больше не меняйте громкость в Finder!

1

Вы можете использовать wait4path для ожидания монтирования тома; в противном случае launchd будет перезапускать ваш скрипт dynamic_pager_init снова и снова, пока не произойдет ...

1

Скорее всего, это нежелательный ответ (так как я не могу комментировать после Diago), но почему вы действительно настаиваете, что это даст небольшой прирост производительности? Я прошел обсуждение на яблочных форумах и пришел к выводу, что это не очень хорошая идея. И я очень сопротивлялся, отказываясь от него. Не могли бы вы представить данные, доказывающие это хотя бы для себя, или это просто "чувство"?

С тех пор, как я использовал swap даже в Linux, 10 лет назад, а в настоящее время в Ubuntu, я никогда не видел улучшений в производительности. Моя причина этого была в том, чтобы предотвратить проблемы со свободным пространством в OSX и в Linux для возможности перехода в спящий режим. Это все обмен для меня.

Но я никогда не проводил более глубоких исследований ни самостоятельно, ни в сети.

1

Это не ответ, но, возможно, очень полезное дополнение. Apple предоставляет бесплатный редактор списков рассылки PlistEdit Pro. Это позволяет вам безопасно редактировать эти файлы. Похоже, вы могли бы просто изменить аргумент со значением /private/var/vm/swapfile на что-то вроде /Volumes/OtherDrive/vm/myswapfilename, чтобы переместить файлы подкачки куда-то еще ...

Опять я не проверял это...

1

Может быть, мы можем использовать Xupport, чтобы сделать эту грязную работу для нас :) http://www.applicorn.com/

Оптимизатор виртуальной памяти:

Изменение расположения файлов подкачки В Mac OS X информация о виртуальной памяти хранится в так называемых "файлах подкачки". Поскольку файлы подкачки являются наиболее интерактивными системными файлами, имеет смысл поместить их в отдельный раздел. Рекомендуется хранить файлы подкачки в первом разделе вашего самого быстрого внутреннего жесткого диска. Рекомендуемый минимальный размер раздела должен быть примерно в 3 или 4 раза больше размера физической встроенной памяти (например, 1 ГБ физической памяти = 4 ГБ раздела подкачки). Рекомендации и инструкции по оптимальной производительности системы:

1. Переразделите жесткий диск разделом подкачки как ПЕРВЫЙ раздел (используя установочный DVD Mac OS X). ВНИМАНИЕ: ПЕРЕЗАГРУЗКА ЖЕСТКОГО ДИСКА БУДЕТ УДАЛИТЬ ВСЕ ДАННЫЕ!

2. Восстановите ваши системные данные или установите новую систему в системный раздел.

3. Загрузитесь с системного раздела.

4. Если вы хотите, чтобы том подкачки был невидимым для Finder:• Запустите Xupport и выберите "Настройки" • Включите "Показать скрытые файлы и папки" и перезапустите Finder • Переименуйте том подкачки с "swap" на «.swap» ( точка делает его невидимым для Finder)• Отключите "Показать скрытые файлы и папки" и перезапустите Finder снова

5. Выберите новый раздел подкачки в разделе "Том хранилища подкачки". Затем нажмите кнопку "Установить", чтобы применить новые параметры расположения файла подкачки (требуется перезагрузка).

Кстати, это работает для меня. Snow Leopard 10.6.2 @ Macbook Pro 2,4 ГГц, 4 ГБ оперативной памяти, 500 ГБ HD

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .