Jak mogę przenieść pliki wymiany pamięci wirtualnej na inny dysk lub partycję?

33

Uwaga: To pytanie zadałem SuperUser jakiś czas temu. Ponownie zamieszczam tutaj, ponieważ myślę, że należy tutaj.

Domyślnie Mac OS X przechowuje pliki wymiany /private/var/vm/. Chciałbym umieścić pliki wymiany w innym miejscu. Jak można to zrobić?

e.James
źródło
Dodatkowe uwagi na temat /private/var/vm/sleepimageSuper User: Czy powinienem dowiązać mój katalog / private / var / vm do innego tomu w OS X Lion? (2011-09-20) - istnieje odpowiedź, która zaleca, aby nie używać tego samego oddzielnego woluminu zarówno dla zewnętrznych plików wymiany, jak i sleepimage.
Graham Perrin
dynamicpagerwrapper ( źródło: dynamic_pager_wrapper ) - opakowanie wydajności dla / sbin / dynamic_pager w OSX
Graham Perrin

Odpowiedzi:

23

Uwaga: skopiowane z SuperUser:

W przypadku starszych wersji OSX zobacz ten wątek na forums.macosxhints.com.

Zasługa dblu wyjaśniający użycie plutil, ZILjr do wprowadzania wait4pathpoleceń, a EKL uproszczenia całość eliminując potrzebę pośredniego skrypcie.

Kompletne rozwiązanie:

1. Otwórz Terminal i zrób kopię zapasową domyślnej listy Apple dynamic_pager.plist:

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

2. Konwertuj plist z binarnego na zwykły XML:

$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist

3. Otwórz przekonwertowany plist w dowolnym edytorze tekstu. (Używam pico, patrz odpowiedź dblu na przykład przy użyciu vim):

$ sudo pico -w com.apple.dynamic_pager.plist

Powinno to wyglądać następująco:

<?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. Zmodyfikuj tablicę ProgramArguments (wiersze od 13 do 18), aby użyć wait4pathpolecenia powłoki przed uruchomieniem programu dynamic_pager. Zobacz notatkę nr 1, aby dowiedzieć się, dlaczego jest to konieczne. W poniższym przykładzie moja partycja jest wywoływana Swapi zdecydowałem się umieścić pliki wymiany w ukrytym katalogu na tej partycji, nazywając .vm się, aby upewnić się, że określony katalog faktycznie istnieje . XML powinien wyglądać następująco:

<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. Zapisz listę i wróć do monitu terminala. Za picopomocą poleceń będzie:

<ctrl+o> to save the file
<enter>  to accept the same filename (com.apple.dynamic_pager.plist)
<ctrl+x> to exit

6. Konwertuj zmodyfikowany plist z powrotem na binarny:

$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist

7. Uruchom ponownie komputer Mac. Jeśli napotkasz problemy, przełącz się na pełny tryb uruchamiania, przytrzymując Command-v natychmiast po gongu uruchamiania. Dzięki temu zobaczysz wszystkie komunikaty startowe, które pojawiają się podczas uruchamiania. Jeśli napotkasz jeszcze gorsze problemy (tzn. Nigdy nie widzisz ekranu logowania), zamiast tego przytrzymaj klawisze Command-s. Spowoduje to uruchomienie komputera w trybie pojedynczego użytkownika (bez graficznego interfejsu użytkownika, tylko wiersz polecenia) i umożliwi przywrócenie kopii zapasowej com.apple.dynamic_pager.plist utworzonej w kroku 1.

8. Po uruchomieniu komputera uruchom Terminal i sprawdź, czy pliki wymiany zostały faktycznie przeniesione:

$ cd /Volumes/Swap/.vm
$ ls -l

Powinieneś zobaczyć coś takiego:

-rw-------  1 someUser  staff  67108864 18 Sep 12:02 swapfile0

9. Usuń stare pliki wymiany:

$ cd /private/var/vm
$ sudo rm swapfile*

10. Zysk!

Notatka 1

Modyfikowanie argumentów na dynamic_pager w plist bez użycia wait4pathnie zawsze działa, a gdy zawiedzie, robi to w spektakularnie cichy sposób. Problem wynika z faktu, że dynamic_pager jest uruchamiany bardzo wcześnie w procesie uruchamiania. Jeśli twoja partycja wymiany nie została jeszcze zamontowana, gdy ładowany jest dynamiczny pager (z mojego doświadczenia wynika, że ​​zdarza się to w 99% przypadków), wtedy system przejdzie pomyślnie. Stworzy symboliczne łącze w twoim katalogu / Volumes, które ma taką samą nazwę jak twoja partycja wymiany, ale wskazuje na domyślną lokalizację pliku wymiany (/ private / var / vm). Następnie, gdy twoja rzeczywista partycja wymiany zostanie zamontowana, otrzyma nazwę Swap 1(lub YourDriveName 1). Możesz zobaczyć problem, otwierając Terminal i wyświetlając zawartość katalogu / Volumes:

$ cd /Volumes
$ ls -l

Zobaczysz coś takiego:

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 -> /

Pamiętaj, że ta awaria może być bardzo trudna do wykrycia. Gdybyś sprawdził pliki wymiany, jak pokazałem w kroku 12, nadal byś je zobaczył ! Łącze symboliczne sprawiałoby wrażenie, jakby Twoje pliki wymiany zostały przeniesione, nawet jeśli faktycznie były przechowywane w domyślnej lokalizacji.

Uwaga 2

Początkowo nie mogłem tego uruchomić w systemie Snow Leopard, ponieważ com.apple.dynamic_pager.plist był przechowywany w formacie binarnym. Zrobiłem kopię oryginalnego pliku i otworzyłem go za pomocą edytora listy właściwości Apple (dostępnego z Xcode) w celu wprowadzenia zmian, ale proces ten dodał pewne rozszerzone atrybuty do pliku plist, co spowodowało, że system go zignorował i po prostu użył wartości domyślnych . Jak zauważył dblu, użycie plutildo konwersji pliku na zwykły XML działa jak urok.

Uwaga 3

Możesz sprawdzić aplikację konsoli, aby zobaczyć wszelkie komunikaty, które dynamiczny_pager_init odbijają się na ekranie. Jeśli widzisz następujące wiersze powtarzane w kółko, oznacza to problem z konfiguracją. Natknąłem się na te wiadomości, ponieważ zapomniałem utworzyć katalog „.vm”, który określiłem w pliku 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

Gdy wszystko działa poprawnie, powyższy komunikat może zostać wyświetlony tylko kilka razy, a następnie nie będzie już więcej komunikatów „Ograniczanie odradzania”. Oznacza to, że system musiał czekać na załadowanie partycji, ale ostatecznie się udało.

Wyklucz ścieżkę z Wehikułu Czasu

W OS X 10.7 i nowszych możesz to zrobić za pomocą tmutil . Przykład:

sudo tmutil addexclusion -p /Volumes/Swap/.vm

Na przykład, aby przejrzeć wynik:

tmutil isexcluded /Volumes/Swap && tmutil isexcluded /Volumes/Swap/.vm

Jeśli wolumin użyty do zamiany nie musi być indeksowany

Użyj mdutil . Przykład, aby wyłączyć, a następnie usunąć sklep:

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

e.James
źródło
Następnym razem po prostu połącz pytanie / odpowiedź, obok każdej odpowiedzi znajduje się przycisk „link”. ;)
Martin Marconcini,
2
Link do pytania SuperUser znajduje się na samej górze tego pytania. Nie podlinkowałem bezpośrednio do „odpowiedzi” na SuperUser, ponieważ została ona zbudowana z części kilku innych odpowiedzi. Dodałem jednak linki do każdej częściowej odpowiedzi (używając tego przydatnego przycisku „link”) w drugim akapicie tej odpowiedzi. Ile jeszcze linków chcesz? ;)
e.James
2
Podoba mi się, że tu jest ... Cały czas się o tym wspominam ...
Alex Grey
Nie udaje mi się to pod 10.10.3 - wydaje się, że nie używa plist.
aramis
2
W El Capitan próba wyczyszczenia wymiany nie jest dozwolona przez nową ochronę integralności systemu. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: Operacja jest niedozwolona, ​​gdy włączona jest ochrona integralności systemu. Uruchom system z partycji odzyskiwania, a następnie wybierz opcję Konfiguracja zabezpieczeń z menu Narzędzia. Możesz odznaczyć opcję Wymuszaj ochronę integralności systemu, kliknij Zastosuj konfigurację i uruchom ponownie.
Meetai.com
4

Nie udało mi się ustanowić trwałego rozwiązania rozruchowego systemu, ponieważ 10.10 nie używa już /etc/.rc podczas rozruchu, a metoda com.apple.dynamic_pager.plist zawiodła .... jednak ...

sudo mkdir /Volumes/Swap/s
sudo chmod 755 /Volumes/Swap/s
sudo sysctl vm.swapfileprefix=/Volumes/Swap/s

zmienia zapisany prefiks zgodnie z raportem

sysctl vm

na czas trwania sesji i przetrwa restart.

może to być spakowane jako polecenie unixowe do pliku tekstowego:

$/bin/sh
sysctl vm.swapfileprefix=/Volumes/Swap/s

i uruchom przy logowaniu.

aramis
źródło
-1

Proste rozwiązanie:

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

SwapRelocator 1.1.2 działa świetnie na Maverick!

Użyj (na przykład) Tinker Tool System, aby zezwolić na podłączenie woluminów przed zalogowaniem, co rozwiązuje jedyny napotkany problem.

(Dzięki Filippo, mogę w końcu przenieść swap z dublowanego woluminu rozruchowego na wolumin rozłożonej pamięci podręcznej (wszystkie dyski SSD))

BKE
źródło