Переміщення свопфілів на спеціалізований розділ у Snow Leopard


31

Я міг перенести свопфілі віртуальної пам’яті Apple на спеціальний розділ на своєму жорсткому диску до цього часу. Метод, який я використовую, описаний у темі на forums.macosxhints.com.

Однак із попереднім попереднім переглядом Snow Leopard цей метод більше не працює. Хтось знає, як це можна зробити з новою ОС?

Оновлення: я відзначив відповідь dblu як прийняту, хоча це не дуже спрацювало, тому що він дав чудові, детальні вказівки і тому, що його пропозиція використовувати в plutilкінцевому підсумку вказала на мене в правильному напрямку. Повне, робоче рішення розміщене тут у запитанні, оскільки мені не вистачає репутації, щоб редагувати прийняту відповідь.

Оновлення №2: Змінено процедуру ілюстрації техніки ekl , яка значно спрощує все, усуваючи необхідність проміжного сценарію оболонки:

Повне рішення:

1. Відкрийте термінал і зробіть резервну копію за замовчуванням Apple_mager.plist Apple:

$ cd /System/Library/LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist{,_bak}

2. Перетворіть список із бінарного в звичайний 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), щоб використовувати команду shell4path shell (як запропонував ZILjr ) перед запуском динамического_pager. Детальну інформацію про те, чому це необхідно, див. У примітці №1. У наступному прикладі мій розділ називається "Зміна", і я вирішив помістити свопфіли в приховану папку на цьому розділі під назвою ".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. Перетворити модифікований пліст назад у двійковий:

$ 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

Змінювати аргументи на динамичний_pager у плісті без використання wait4pathне завжди працює, а коли він не працює, це робить ефектно безшумно. Проблема випливає з того, що dynam_pager запускається дуже рано в процесі запуску. Якщо ваш розділ swap ще не змонтований під час першого завантаження динамичного_пагера (на мій досвід, це трапляється 99% часу), тоді система пройде підробку. Це створить символічне посилання у вашому каталозі / Volumes, яке має те саме ім’я, що і ваш розділ swap, але вказує на розташування swapfile за замовчуванням (/ private / var / vm). Потім, коли ваш фактичний swap-розділ змонтується, йому буде надано ім’я Swap 1(або YourDriveName 1). Проблему можна побачити, відкривши термінал і перерахувавши вміст каталогу / томів:

$ 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), щоб внести зміни, але цей процес додав до розширеного файлу деякі розширені атрибути, завдяки чому система ігнорувала його та просто використовувала параметри за замовчуванням. . Як зазначав dblu, використання plutilдля перетворення файлу в звичайний XML працює як шарм.

Примітка 3

Ви можете перевірити додаток Console, щоб побачити будь-які повідомлення, які в динамічному звуку перегукуються на екран. Якщо ви бачите, що наступні рядки повторюються знову і знову, виникає проблема з налаштуванням. Я наткнувся на ці повідомлення, тому що забув створити каталог ".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

Якщо все працює належним чином, ви можете побачити вищезгадане повідомлення лише кілька разів, а потім більше не буде повідомлень про "Throttling respawn". Це означає, що системі довелося чекати завантаження розділу, але врешті-решт це було успішно.


Мені справді цікаво, чому ти хотів би це зробити?
BinaryMisfit

Для невеликих підвищення продуктивності. Мені подобається тримати свій жорсткий диск (-и) відповідно до використання. У мене є один розділ для ОС та додатків, один для папки користувачів, один для документів, один для медіа (музика, фільми тощо) і один для свопфілів. На мій досвід, зберігання файлів swap окремо від решти системи забезпечує низьку фрагментацію диска. Моїм перевагою було б мати заміну на спеціальному диску, але іншого розділу зазвичай вистачить.
e.James

4
Досить справедливо - однак розділи на одному приводі фактично спричиняють більше роботи для самого диска, проте розділи на різних дисках забезпечують підвищення продуктивності. Жорсткий диск повинен робити більше роботи при переході через розділи на одному диску. Я прошу лише тому, що у мене ще немає проблем з фрагментацією та продуктивністю на моєму Mac після майже двох років використання поза межами коробки, і коли я бачу ці пости, вони мене цікавлять.
BinaryMisfit

1
Я не впевнений, чому я не можу розмістити відповідь ( 101 повтор, що - якщо я можу запам'ятати свою математику - перевищує 10, яких вимагає захищений стан) , але я знайшов не wait4pathрішення, завдяки тому, що заявляє Xupport для мене модифікований. Я опублікую повну відповідь, як тільки зрозумію, як це зробити, але недолік цього - змінити останній аргумент програми на новий шлях (наприклад <string>/Volumes/swap/.vm/swapfile</string>), змінити OnDemandключ <true/>і додати StartOnMountключ до кінця зі значенням з <true/>. PS Це рішення відмінно працює у Леві (як мінімум, для мене).
Сліпп Д. Томпсон

1
@Slipp Douglas: Мені виглядає законно. StartOnMountПрапор був доданий відповідно до 10.5: mactech.com/articles/mactech/Vol.25/25.10 / ...
e.James

Відповіді:


10

ПРИМІТКА : Дивіться (також) виправлену / покращену відповідь у самому запитанні.


Наступне рішення працювало для мене:

Відкрийте термінал і створіть резервну копію com.apple.dynamic_pager.plist, яку ви збираєтеся змінити за секунду:

$ cd / Система / Бібліотека / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {, _ бак}

конвертувати бінарний пліст у xml:

$ sudo plutil -конвертувати 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" зробить обоє in vim).

конвертувати файл плісту назад у бінарний:

$ sudo plutil -конвертувати binary1 com.apple.dynamic_pager.plist

Після перезавантаження вашого Mac ви повинні знайти свопфайли у вказаному вами каталозі.

Якщо у вас виникли проблеми, ви можете відновити створену резервну копію на першому кроці за допомогою:

$ cd / Система / Бібліотека / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {_bak,}

Ви впевнені, що swapfile насправді переміщується до розділу за допомогою цієї установки? Коли я спробував цей підхід спочатку, динамічний_пагер завантажиться до монтажу вторинних розділів. Система підробила свій шлях, створивши символічне посилання на partition2 в каталозі / Volumes, який просто вказував назад на / private / var / vm. Ви можете ідентифікувати збій, виконавши ls -al в каталозі / Volumes, де ви побачили б "partition2" (символічне посилання) та "partition2 1" (ваш фактичний розділ).
e.James

У будь-якому випадку +1 для техніки перетворення файлів плістів у & з двійкового формату. com.apple.dynamic_pager.plist був у простому текстовому форматі 10.5.x, але у двійковому форматі станом на 10.6. Що є частиною моєї проблеми. Я змінював файли плістів за допомогою програми «Редактор списку властивостей», що постачається з Xcode, і, можливо, тому все не вийшло. Я спробую плютіл і побачу, чи не отримає він мене далі.
e.James

На даний момент я не можу протестувати його з іншим розділом, проте під час моїх тестів я створив dinamiльний_пагер, створюючи swapfiles на thumbdrive, використовуючи описану вище техніку.
dblu

Мені вдалося змусити оригінальну техніку працювати, завдяки вашій пропозиції використовувати plutilдля конверсій. Я розмістив повне рішення у питанні (оскільки мені не вистачає реп., Щоб додати його до вашої відповіді). Дивіться мою записку №1 для детального опису проблем, з якими я зіткнувся із простою зміною списку.
e.James

У будь-якому випадку, дякую за відповідь. Ви зібрали чудовий набір інструкцій, і ви вказали мені в правильному напрямку, щоб я позначив це як прийняте. Ура! :)
e.James

3

Я прийняв цю ідею і взяв її трохи далі, розглядаючи стратегії зростання та рекультивації.

Деталі на http://www.crypticide.com/dropsafe/article/3848 ; Я б опублікував посилання на сторінку проекту "dynamicpagerwrapper" GoogleCode, але в блозі йдеться про те, що мені не вистачає репутаційних балів ...


1
+1 Чудові речі! Я зараз його пробую. Ось посилання на проект GoogleCode: code.google.com/p/dynamicpagerwrapper
e.James

переконайтеся, що ви використовуєте принаймні версію 8 сценарію: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/…

3

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

щось на зразок цього:

EDIT: як пояснено у коментарі e.James та моєму наступному коментарі, одразу наступний блок 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використовувати цей об'єм для swapfiles

1) як написано на launchd.plistmanpage, клавіші Programі ProgramArgumentsвідображаються на execvpвиклик, це означає, що все, крім першої рядки в масиві, трактується як аргумент для першого рядка в масиві, для запуску програми;

2) як написано на bashmanpage, є bash -c <string>можливість запустити рядок, переданий як команди

1 + 2 = 3) що відбувається за допомогою цього командного рядка у запущеному списку ??

/bin/bash -c "wait4path /Volumes/Swap/ && /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile"

/bin/bashце програма, яку потрібно запустити, -cце перший аргумент, а рядок із подвійним цитуванням - другий аргумент

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

Зверніть увагу, що:
* рядок, який ви хочете виконати, повинен бути подвійним цитуванням, якщо ви працюєте bash -cв Terminal, але це не подвійне цитування у файлі plist! (я здогадуюсь, тому що це вже оголошено як рядок із належним тегом)
* два &в рядку потрібно змінити на &amp;файл plist

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

Дякуємо, що поділилися з нами своєю роботою


Це цікава ідея. Я не впевнений, чи «законно» розміщувати в програмі більше однієї програми ProgramArguments, але це, безумовно, варто зняти. Ви спробували це?
e.James

Вибачення якщо хтось знайде спосіб "відформатувати" цей рядок так, що запуску сподобається, я думаю, він повинен спрацювати (я думаю про це, можливо, називаю / bin / bash передаючи решту як аргументи?); більше пояснень про поля Програми та Програмного аргументу можна отримати на сторінці запуску.plist, і це призведе до сторінки execvp (3). Я читаю і думаю, якщо хтось швидший, будь ласка, опублікуйте :)
ekl

я відредагував попереднє повідомлення з рішенням, яке повинно працювати, будь ласка, прокоментуйте, якщо ви бачите будь-яку помилку або що-небудь може не працювати належним чином, дякую!
ekl

Я спробував це на своєму ноутбуці, і, здається, працює. Я буду стежити за цим пару днів, щоб бути впевненим, але, схоже, ви надзвичайно спростили весь процес! Приємна робота:)
e.James

Ваш спрощений метод працює як шарм на моєму ноутбуці. Дякую! Я оновлю головне питання, щоб включити ваше рішення.
e.James

2

Я знаю, що минув час, коли ця стаття була написана, але я думав, що я додам сюди свій власний маленький предмет для тих, хто хоче це зробити ...

Вищеописаний трюк я використовував для переміщення файлів свопінгу на інший внутрішній диск (мій завантажувач - це SSD з мікросхемами MLC, тому переміщення vm off може врятувати тривалість життя). У будь-якому випадку, після створення нового тома у мене було розміщено обмінний об'єм у Finder, який я ніколи не збираюся використовувати в самому Finder, тому я вирішив зробити об'єм Finder невидимим. Вам потрібно встановити інструментарій для розробників Apple. Потім введіть:

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

… І замініть / Томи / Поміняйте на те, що ви назвали томом. Перезавантажте Finder і presto, більше не поміняйте об’єм у Finder!


1

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


Блискуче! Я використовував wait4pathзамість if/ grepкомбінацію, і це досить добре очищає речі. Дякую за пораду.
e.James

1

Можливо, ми можемо використовувати Xupport, щоб зробити цю брудну роботу за нас :) http://www.applicorn.com/

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

Зміна місця розташування файлів підкачки У Mac OS X інформація віртуальної пам'яті зберігається у так званих "Swapfiles". Оскільки swapfiles - це найінтерактивніші системні файли, є сенс розмістити їх на окремому розділі. Рекомендується зберігати файли swap на першому розділі вашого найшвидшого внутрішнього жорсткого диска. Рекомендований мінімальний розмір розділу повинен бути приблизно в 3 або 4 рази більшим, ніж фізичний вбудований розмір пам'яті (наприклад, 1 Гб фізичної пам'яті = 4 Гб своп-розділу). Рекомендації та інструкції щодо оптимальної роботи системи:

1. Перерозділіть свій жорсткий диск із заміною гучності як ПЕРШИЙ розділ (використовуючи Mac OS X Install DVD). ПОПЕРЕДЖЕННЯ: ПЕРЕПАРТАЖЕННЯ ТВЕРДОГО ДИСКУ БУДЕ ЗБІЛЬШЕНО ВСІХ ІСНУЮХ ДАНИХ!

2. Відновіть ваші дані системи або встановіть нову систему на системний розділ.

3. Завантаження з системного розділу.

4. Якщо ви хочете, щоб ваш об'єм заміни був невидимим для Finder: • Запустіть Xupport і виберіть "Налаштування" • Увімкніть "Показати приховані файли та папки" та перезапустіть Finder. (Точка робить його невидимим для Finder) • Вимкнути "Показати приховані файли та папки" та знову перезапустити Finder

5. Виберіть новий розділ swap у розділі "Об'єм сховища". Потім натисніть кнопку «Встановити», щоб застосувати нові параметри розташування файлів підкачки (необхідний перезапуск).

До речі, це працює для мене. Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz, 4GB Ram, 500GB HD


Виглядає перспективно. Дякуємо за посилання та детальні інструкції!
e.James


1

Це, швидше за все, небажана відповідь (оскільки я не можу коментувати Діаго), але чому ви дійсно наполягаєте, що це призведе до невеликих прибутків? Я пройшов дискусію на яблучних форумах і дійшов висновку, що це зовсім не гарна ідея. І я був дуже стійкий до відмови від цього. Не могли б ви придумати дані, що підтверджують це хоча б для себе, чи це просто "почуття"?

З кожного разу, коли я використовував своп навіть на Linux, ще 10 років тому, і нині на ubuntu, я ніколи не міг побачити поліпшення продуктивності. Моя причина хотіла, щоб запобігти проблемам із вільним місцем на OSX та на Linux, щоб вони могли перезимувати. Це все для мене своп.

Але я ніколи насправді не займався глибшими дослідженнями ні власноруч, ні в інтервеї.


Це справедлива критика. У мене немає даних, які б підтверджували мої претензії :)
e.James

Класно. Тож, зрештою, ви можете відмовитися і від пережиття всієї цієї неприємності! : P
cregox

1

Це не відповідь, але, можливо, дуже корисна подальша інформація. Apple пропонує безкоштовний редактор плістів тут PlistEdit Pro . Це дозволяє безпечно редагувати ці файли. Схоже, ви можете просто змінити аргумент зі значенням / private / var / vm / swapfile на щось на кшталт / Volumes / OtherDrive / vm / myswapfilename, щоб перемістити файли swap кудись ще ...

Знову я цього не перевіряв ...


Це гарна думка, і перше, з чого я почав, коли спускався цим маршрутом. Проблема полягає в тому, що розділ swap не завжди встановлюється в момент часу, коли запускається динамічний пейджер. Детальну інформацію про те, що я маю на увазі, див. У примітці №1 до самого запитання.
e.James
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.