Spostare i file di scambio in una partizione dedicata a Snow Leopard

Sono stato in grado di spostare i file swap di memory virtuale di Apple in una partizione dedicata sul disco rigido fino ad ora. La tecnica utilizzata è descritta in un thread su forums.macosxhints.com.

Tuttavia, con l'anteprima dello sviluppatore di Snow Leopard, questo metodo non funziona più. Qualcuno sa come potrebbe essere fatto con il nuovo sistema operativo?

Aggiornamento: Ho scritto la risposta di dblu come accettata anche se non funzionava affatto perché ha dato istruzioni eccellenti e dettagliate e perché il suo suggerimento per usare plutil ultima analisi mi ha indicato nella giusta direzione. La soluzione completa di lavoro è pubblicata qui nella domanda perché non ho abbastanza reputazione per modificare la risposta accettata.

Aggiornamento # 2: Modificato la procedura per illustrare la tecnica di ekl , che semplifica notevolmente l'intera cosa eliminando la necessità di uno script di shell intermedio:

Soluzione completa:

1. Apri Terminale e fai una copia di backup dell'impostazione predefinita di dynamic_pager.plist di Apple:

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

2. Convertire il plist da binario a semplice XML:

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

3. Apri il plist convertito con il tuo editor di text a scelta. (Uso pico , vedi risposta di dblu per un esempio usando vim ):

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

Dovrebbe apparire come segue:

 <?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> <arrays> <string>/sbin/dynamic_pager</string> <string>-F</string> <string>/private/var/vm/swapfile</string> </arrays> </dict> </plist> 

4. Modificare l'arrays Array Programmi (righe da 13 a 18) per utilizzare il command shell shell di wait4path (come suggerito da ZILjr ) prima di lanciare dynamic_pager. Vedere la nota # 1 per i dettagli su come è necessario. Nell'esempio seguente, la mia partizione viene chiamata "Swap" e ho scelto di mettere i file di scambio in una directory nascosta su quella partizione, denominata '.vm', assicurarsi che la directory specificata esista effettivamente . L'XML dovrebbe essere il seguente:

 <key>ProgramArguments</key> <arrays> <string>/bin/bash</string> <string>-c</string> <string>/bin/wait4path /Volumes/Swap/ &amp;&amp; /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string> </arrays> 

5. Salvare il plist e tornare al prompt del terminal. Usando pico , i comandi sarebbero:

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

6. Convertire il plist modificato in binario:

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

7. Riavviare il Mac. Se si esegue problemi, passare alla modalità di avvio veloce tenendo premuto Command-v immediatamente dopo il chime di avvio. In questo modo verranno visualizzati tutti i messaggi di avvio che appaiono durante l'avvio. Se si esegue a problemi ancora peggiori (vale a dire non si vede mai la schermata di accesso), tenere premuti i comandi invece. Questo avvierà il computer in modalità utente singolo (senza interface grafica, solo un prompt dei comandi) e consente di ripristinare la copia di backup di com.apple.dynamic_pager.plist eseguita nel passaggio 1.

8. Una volta che il computer viene avviato, spegnere Terminale e verificare che i file di swap siano stati effettivamente spostati:

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

Dovresti vedere qualcosa di simile:

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

9. Eliminare i vecchi file di swap:

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

10. Profitto!

Nota 1

Modificare gli argomenti a dynamic_pager nel plist senza utilizzare wait4path non sempre funziona e, quando non riesce, lo fa in modo spettacolare silenzioso. Il problema deriva dal fatto che dynamic_pager viene avviato molto presto nel process di avvio. Se la partizione di swap non è ancora stata montata quando il file dinamico viene caricato per la prima volta (nella mia esperienza questo accade al 99% del tempo), allora il sistema finirà. Creerà un collegamento simbolico nella directory / volumi che ha lo stesso nome della partizione di swap, ma indica nuovamente la posizione predefinita di swap (/ private / var / vm). Quindi, quando la partizione di swap effettiva viene YourDriveName 1 , verrà assegnato il nome Swap 1 (o YourDriveName 1 ). È ansible visualizzare il problema aprendo Terminale e elencando il contenuto della directory / volumi:

 $ cd /Volumes $ ls -l 

Vednetworking qualcosa di simile:

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

Si noti che questo errore può essere molto difficile da individuare. Se wheressi controllare i file di scambio come mostro al passaggio 12, li vedrai ancora ! Il collegamento simbolico sembrerebbe come se i file di swap siano stati spostati, anche se sono stati effettivamente memorizzati nella posizione predefinita.

Nota 2

In origine non sono riuscito a farlo funzionare a Snow Leopard perché com.apple.dynamic_pager.plist è stato memorizzato in formato binario. Ho fatto una copia del file originale e l'ho aperto con l'editor di properties; di Apple (disponibile con Xcode) per apportre modifiche, ma questo process ha aggiunto alcuni attributi estesi al file plist che ha causato il sistema di ignorarlo e solo utilizzare i valori predefiniti . Come ha sottolineato dblu, utilizzando plutil per convertire il file in XML semplice funziona come un fascino.

Nota 3

È ansible controllare l'applicazione Console per visualizzare tutti i messaggi che dynamic_pager_init echos sullo schermo. Se le righe riportte di seguito si ripetono più volte, c'è un problema con l'installazione. Mi sono imbattuto in questi messaggi perché ho dimenticato di creare la directory '.vm' che ho specificato in 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 

Quando tutto funziona correttamente, puoi vedere il messaggio sopra un paio di volte, e poi non più dei messaggi "Throttling respawn". Ciò significa che il sistema whereva aspettare la partizione da caricare, ma alla fine ha avuto successo.

NOTA : Vedi anche (anche) una risposta corretta / migliorata nella domanda stessa.


La seguente soluzione ha funzionato per me:

Aprire un terminal e il backup com.apple.dynamic_pager.plist che si intende cambiare in un secondo:

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

convertire il plist binario in xml:

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

e aprirlo con il tuo editor di text preferito

  $ sudo vim com.apple.dynamic_pager.plist 

sembrerà qualcosa di simile:

  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 <arrays> 15 <string>/sbin/dynamic_pager</string> 16 <string>-F</string> 17 <string>/private/var/vm/swapfile</string> 18 </arrays> 19 </dict> 20 </plist> 

Nella row 17 modificare / private / var / vm / swapfile (es. / Volumi / partizione2 / swapfile), salvare e chiudere il tuo editor (": x" farà entrambi in vim).

convertire il file plist a binario:

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

Dopo il riavvio del Mac, dovresti trovare i file di swap nella directory specificata.

Se si esegue problemi, è ansible ripristinare il backup creato nel primo passaggio con:

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

Ho adottato questa idea e ho preso un po 'più avanti affrontando le strategie di crescita e bonifica.

Dettagli a http://www.crypticide.com/dropsafe/article/3848 ; Vorrei inserire un link alla pagina del progetto GoogleCode "dynamicpagerwrapper", ma il blog mi dice che non ho punti di reputazione sufficienti …

solo una domanda: perché non solo modificare il file .plist aggiungendo wait4path , invece di utilizzare l'intermediario dynamic_pager_init ?

qualcosa come questo:

EDIT: come spiegato nel commento di e.James e il mio commento seguente, il block XML immediatamente successivo non è buono, sia perché esiste un errore (mancante &&) e perché solo il primo argomento dell'arrays ProgramArguments viene analizzato come programma per correre!

ma .. (scorri verso il basso)

  ... 13 <key>ProgramArguments</key> 14 <arrays> 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 </arrays> ... 

fine del block xml sbagliato


questo block XML dovrebbe funzionare invece:

  ... 13 <key>ProgramArguments</key> 14 <arrays> 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 </arrays> ... 

tenere a mente che non ho ancora avuto abbastanza tempo per provare con sicurezza questa impostazione, ma ho cercato di eseguire diversi altri comandi di shell lanciati allo stesso modo e tutto dovrebbe funzionare come previsto

Come funziona:

base: l' esecuzione di wait4path /path && command indica che il command viene eseguito solo se wait4path termina e esce senza errori e questo avviene solo quando il /path è un path disponibile, quindi possiamo tranquillamente dire a dynamic_pager di utilizzare quel volume per i file swap

1) come scritto in manpage launchd.plist , i Program chiave Program e ProgramArguments sono mappati a una chiamata execvp , il che significa che tutto tranne la prima string nell'arrays viene trattato come un argomento per la prima string nell'arrays, il programma da eseguire ;

2) come scritto nella man page di bash , esiste un'opzione bash -c <string> per eseguire la string passata come comandi

1 + 2 = 3) cosa succede utilizzando questa linea di command in un lancio launchd?

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

/bin/bash è il programma da eseguire, -c è il primo argomento e la string double citata è il secondo argomento

Suppongo che dovrebbe funzionare esattamente come la tua soluzione, senza lo script intermedio: launchd avvia il servizio, che aspetterà il path dato e quindi lancerà dynamic_pager ..

Si prega di notare che:
* la string che si desidera eseguire deve essere quotata doppio se si esegue bash -c in Terminal, ma non è doppio citato nel file plist! (credo perché è già dichiarata come una string con il tag appropriato)
* i due & nella string devono essere modificati in &amp; nel file plist

PS: come sempre, procedi a proprio rischio, non assumo alcuna responsabilità per i problemi che puoi usare con questa impostazione!

grazie per aver condiviso il tuo lavoro con noi

So che è passato un po 'perché questo articolo è stato scritto ma ho pensato di aggiungere il mio piccolo articolo qui per per coloro che vogliono farlo anche questo …

Ho usato il trucco sopra per spostare i miei file di swap su un'altra unità interna (l'unità di avvio è SSD con chip MLC, in modo da spostare il vm off può risparmiare l'aspettativa di vita). Comunque, dopo aver creato il nuovo volume ho avuto un volume di scambio in Finder che non ho mai usato nel Finder stesso, quindi ho deciso di rendere invisibile il volume a Finder. Hai installato Apple's Developer Toolkit. Quindi digitare:

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

… e sostituisci / volumi / scambia con qualsiasi nome del tuo volume. Riavvia il Finder e presto, non più il volume di scambio nel Finder!

È ansible utilizzare wait4path per attendere il assembly del volume; altrimenti, launchd riavvierà il tuo script dinamico_pager_init più e più volte finché non funziona …

Forse possiamo usare Xupport per fare quelle cose sporche per noi 🙂 http://www.applicorn.com/

Strumento di ottimizzazione della memory virtuale:

Modifica della posizione dei file di swap In Mac OS X le informazioni sulla memory virtuale vengono memorizzate nei cosiddetti "File di scambio". Poiché i file swap sono i file di sistema più interattivi, è opportuno metterli su una partizione separata. Si raccomanda di memorizzare i file di swap sulla prima partizione del disco rigido interno più veloce. La dimensione della partizione consigliata dovrebbe essere di circa 3 o 4 volte maggiore rispetto alla dimensione fisica di memory incorporata (es. 1 GB di memory fisica = 4 GB di partizione di swap). Raccomandazioni e istruzioni per una prestazione ottimale del sistema:

1. Ripartisca il disco rigido con un volume di swap come partizione PRIMA (utilizzando il DVD di installazione di Mac OS X). AVVERTENZA: LA RIPARZAZIONE DI UN HARD DISK EREASE TUTTI I DATI ESISTENTI!

2. Ripristinare i dati del sistema o installare nuovo sistema nella partizione di sistema.

3. Avviare dalla partizione di sistema.

4. Se si desidera che il volume di swap sia invisibile al Finder: • Avvia Xupport e scegli "Impostazioni" • Abilita "Mostra file e cartelle nascosti" e riavvia il Finder • Rinomina il volume di swap da "swap" a ".swap" (Il punto lo rende invisibile al Finder) • Disabilita "Mostra file e cartelle nascosti" e riavvia nuovamente il Finder

5. Selezionare la nuova partizione di swap sotto "Volume di memorizzazione di scambio". Quindi, premere il button "Imposta" per applicare le nuove impostazioni di posizione del file di swap (riavvio necessario).

BTW, funziona per me. Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz, 4 GB Ram, 500 GB HD

Questo è probabilmente una risposta indesiderata (dato che non posso commentare dopo Diago), ma perché davvero insisti che questo darà piccoli guadagni di performance? Ho passato una discussione sui forum di mela e la conclusione è che questa non è una buona idea a tutti. E ero molto resistente all'abbandono. Potresti trovare dati che dimostrino che alless per te, o è solo una "sensazione"?

Da each volta che ho usato swap anche su Linux, 10 anni fa, e oggi su ubuntu, non ho mai potuto vedere miglioramenti sulle performance. Il mio motivo per volerlo era quello di impedire problemi con spazio libero su OSX e, su linux, per essere in grado di sbernare. Questo è tutto lo swap per me.

Ma non ho mai realmente effettuato una ricerca più profonda, da solo o da interwebs.

Questa non è una risposta, ma forse un supplemento di follow-up molto utile. Apple fornisce un editor di plist gratis qui PlistEdit Pro . Permette di modificare questi file in modo sicuro. Sembra che si possa cambiare l'argomento con il valore / private / var / vm / swapfile a qualcosa di simile / Volumes / OtherDrive / vm / myswapfilename per spostare i file di swap altrove …

Ancora non ho testato questo