web-dev-qa-db-fra.com

Déplacer les swapfiles à une partition dédiée dans le léopard des neiges

J'ai été capable de déplacer les swapfiles de mémoire virtuelle d'Apple à une partition dédiée sur mon disque dur jusqu'à présent. La technique que j'ai utilisée est décrite dans un thread sur forums.macosxhints.com.

Cependant, avec l'aperçu du développeur de Snow Leopard, cette méthode ne fonctionne plus. Est-ce que quelqu'un sait comment cela pourrait être fait avec le nouveau système d'exploitation?

Mise à jour: J'ai marqué Réponse de DBL comme accepté même s'il ne fonctionnait pas bien, car il a donné d'excellentes instructions détaillées et Parce que sa suggestion d'utiliser plutil m'a finalement signalé que dans la bonne direction. La solution de travail complète est affichée ici dans la question car je n'ai pas assez de réputation pour éditer la réponse acceptée.

Mise à jour n ° 2: Modification de la procédure décrite Technique de EKL , ce qui simplifie grandement le tout en éliminant le besoin d'un intermédiaire Script Shell:

Solution complète:

1. Ouvrir la terminal et effectuez une copie de sauvegarde de dynamic_pager.plist par défaut d'Apple:

$ cd /System/Library/LaunchDaemons
$ Sudo cp com.Apple.dynamic_pager.plist{,_bak}

2. Convertissez le plat de Binary en XML uni:

$ Sudo plutil -convert xml1 com.Apple.dynamic_pager.plist

3. Ouvrez le plat converti avec votre éditeur de texte de choix. (J'utilise pico, voir la réponse de Dblu pour un exemple en utilisant vim):

$ Sudo pico -w com.Apple.dynamic_pager.plist

Il devrait être comme suit:

<?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. Modifier le tableau des programmeurs (lignes 13 à 18) pour utiliser la commande wait4Path Shell (comme suggéré par ziljr ) avant de lancer dynamic_pager. Voir la note n ° 1 pour plus de détails sur la raison pour laquelle cela est nécessaire. Dans l'exemple suivant, ma partition s'appelle "Swap", et j'ai choisi de mettre les swapfiles dans un répertoire masqué sur cette partition, appelé ".vm" assurez-vous que le répertoire que vous spécifiez réellement existe . Le XML devrait ressembler comme suit:

<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. Enregistrez la plis et revenez à l'invite du terminal. Utilisation pico, les commandes seraient:

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

6. Convertir le plis modifié en binaire:

$ Sudo plutil -convert binary1 com.Apple.dynamic_pager.plist

7. Redémarrez votre Mac. Si vous rencontrez des problèmes, passez au mode de démarrage verbose en maintenant la commande Down-V immédiatement après le carillon de démarrage. Cela vous permettra de voir tous les messages de démarrage qui apparaissent lors du démarrage. Si vous rencontrez un problème encore pire (c'est-à-dire que vous ne voyez jamais l'écran de connexion), maintenez-la à la place. Cela démarrera l'ordinateur en mode mono-utilisateur (sans UI graphique, juste une invite de commande) et vous permettra de restaurer la copie de sauvegarde de com.apple.dynamic_pager.plist que vous avez effectué à l'étape 1.

8. Une fois que l'ordinateur démarre, enfoncé le terminal et vérifiez que les fichiers de swap ont été déplacés:

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

Vous devriez voir quelque chose comme ceci:

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

9. Supprimer les anciens swapfiles:

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

10. Profit!

Note 1

Modification des arguments à Dynamic_Pager dans le plat sans utiliser wait4path ne fonctionne pas toujours et quand elle échoue, elle le fait de manière spectaculaire silencieuse. Le problème découle du fait que dynamic_pager est lancé très tôt dans le processus de démarrage. Si votre partition Swap n'a pas encore été montée lorsque Dynamic_Pager est chargé pour la première fois (dans mon expérience, cela se produit 99% du temps), puis le système va simuler. Il créera un lien symbolique dans votre répertoire/volumes qui possède le même nom que votre partition de swap, mais reportez-vous à l'emplacement SwapFile par défaut (/ privé/var/vm). Ensuite, lorsque votre partition d'échange réelle monte, il sera donné le nom Swap 1 (ou alors YourDriveName 1). Vous pouvez voir le problème en ouvrant le terminal et en répertoriant le contenu de votre répertoire/volumes:

$ cd /Volumes
$ ls -l

Vous verrez quelque chose comme ceci:

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

Notez que cette défaillance peut être très Difficile à repérer. Si vous deviez vérifier les swapfiles comme je l'affiche à l'étape 12, Vous les verriez toujours! Le lien symbolique ferait sembler comme si vos swapfiles avaient été déplacés, même s'ils étaient réellement stockés dans l'emplacement par défaut.

Note 2

J'étais à l'origine incapable d'obtenir cela pour travailler dans Snow Leopard parce que com.apple.dynamic_pager.plist a été stocké au format binaire. J'ai fait une copie du fichier d'origine et l'a ouvert avec l'éditeur de liste de propriétés d'Apple (disponible avec Xcode) afin de modifier, mais ce processus a ajouté des attributs étendus au fichier de piste qui a amené le système à l'ignorer et d'utiliser simplement les valeurs par défaut. . Comme DBLU l'a signalé, en utilisant plutil pour convertir le fichier en option de XML ordinaire comme un charme.

Note 3

Vous pouvez vérifier l'application de la console pour voir tous les messages dynamic_pager_init echos à l'écran. Si vous voyez les lignes suivantes répétées encore et encore, il y a un problème avec la configuration. J'ai rencontré ces messages car j'ai oublié de créer le répertoire ".vm" que j'ai spécifié dans 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

Lorsque tout fonctionne correctement, vous pouvez voir le message ci-dessus seulement plusieurs fois, puis plus de messages "Respawn" à l'étranglement ". Cela signifie que le système devait attendre que la partition se charge, mais à la fin, cela a été réussi.

31
e.James

[~ # ~] note [~ # ~ ~]: voir (aussi) une réponse corrigée/améliorée dans la question elle-même.


Suite suivante a fonctionné pour moi:

Ouvrez une borne et une sauvegarde com.apple.dynamic_pager.plist que vous allez changer dans une seconde:

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

conversion de plis binaire en XML:

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

et ouvrez-le avec votre éditeur de texte préféré

$ Sudo vim com.apple.dynamic_pager.plist

ça va chercher quelque chose comme ça:

 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>

Dans la ligne 17 Modifier/privé/var/vm/swapfile (par exemple/volumes/partition2/Swapfile), enregistrez et fermez votre éditeur (": X" fera à la fois dans Vim).

convertir le fichier de plis en binaire:

$ Sudo pluttil -convert binaire1 com.apple.dynamic_pager.plist

Après avoir redémarré votre Mac, vous devez trouver les swapfiles dans le répertoire que vous avez spécifié.

Si vous rencontrez des problèmes, vous pouvez restaurer la sauvegarde que vous avez créée dans la première étape avec:

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

juste une question: pourquoi ne pas simplement modifier le fichier .plist Ajouter wait4path, au lieu d'utiliser l'intermédiaire dynamic_pager_init?

quelque chose comme ça:

((( modifier: comme expliqué dans le commentaire par E.James et mon commentaire suivant, le bloc XML immédiatement suivant n'est pas bon, les deux parce qu'il y a une erreur (manquant &&) et car seulement Le premier argument du tableau ProgramArguments -( Il est analysé comme le programme à exécuter!

[.____] mais .. (défiler vers le bas)

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

fin du mauvais bloc XML


Ce bloc XML devrait fonctionner à la place :

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

N'oubliez pas que je n'avais toujours pas assez de temps pour essayer ce réglage en toute sécurité, mais j'ai essayé de lancer diverses autres commandes shell lancées de la même manière, et tout devrait fonctionner comme prévu

Comment ça fonctionne:

base : exécutant wait4path /path && command signifie que command est exécuté uniquement si wait4path prend fin et sort sans erreurs, et cela ne se produit que lorsque /path est un chemin disponible, afin que nous puissions dire en toute sécurité dynamic_pager Pour utiliser ce volume pour les swapfiles

1 comme écrit en launchd.plist Manpage, les touches Program et ProgramArguments sont mappés sur un appel execvp appel, cela signifie que tout sauf que la première chaîne de la matrice est traitée comme un argument pour le premier chaîne dans la matrice, le programme à exécuter;

2) comme écrit dans bash Manpage, il y a un bash -c <string> Option pour exécuter la chaîne passée sous forme de commandes

1 + 2 = 3) Que se passe-t-il à l'aide de cette ligne de commande dans un plis de lanceur ??

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

/bin/bash est le programme à courir, -c est le premier argument et la chaîne double citée est le deuxième argument

Je suppose que cela devrait fonctionner exactement comme votre solution, sans le script intermédiaire: launchd _ commencera le service, qui attendra le chemin donné puis lancé dynamic_pager ..

Veuillez noter que:
[.____] * La chaîne que vous souhaitez exécuter doit être cotée double si vous exécutez bash -c Dans le terminal, mais c'est non Double cité dans le fichier de plis! (Je suppose que parce que c'est déjà déclaré comme une chaîne avec la balise appropriée)
* les deux & Dans la chaîne doit être changé en &amp; Dans le fichier de plis

PS: Comme toujours, procédez à vos risques et responsables, je ne prends aucune responsabilité pour les problèmes que vous pouvez avoir l'utilisation de ce paramètre!

merci d'avoir partagé votre travail avec nous

3
ekl

J'ai adopté cette idée et j'ai pris un peu plus loin en abordant les stratégies de croissance et de récupération.

Détails à http://www.crypticide.com/dropsafe/article/3848 ; Je posterais un lien vers la page de projet GoogleCode "dynamicpagerwrapper", mais le blog me dit que je n'ai pas assez de points de réputation ...

3
Alec Muffett

Je sais que cela a été un moment depuis que cet article a été écrit mais je pensais ajouter mon propre petit objet ici pour ceux qui veulent faire cela aussi ...

J'ai utilisé le truc ci-dessus pour déplacer mes fichiers de swap sur un autre lecteur interne (mon lecteur de démarrage est SSD avec des puces MLC, il est donc possible de déplacer VM OFF peut sauver l'espérance de vie). Quoi qu'il en soit, après avoir créé le nouveau volume, j'ai eu un volume d'échange dans Finder que je ne vais jamais utiliser à Finder lui-même, j'ai donc décidé de rendre le volume invisible à Finder. Vous avez besoin d'installer la boîte à outils de développement d'Apple. Puis tapez:

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

... et remplacer/volumes/échange avec tout ce que vous avez nommé votre volume. Redémarrez Finder et Presto, plus de volume d'échange dans Finder!

2
Michael Spurlock

C'est probablement une réponse indésirable (puisque je ne peux pas commenter après le diagnostic), mais pourquoi j'insiste vraiment cela donnera des gains de faible performance? J'ai traversé une - Discussion sur Apple Forums et la conclusion était que ce n'est pas une bonne idée du tout. Et j'étais très résistant à l'abandonner. Pourriez-vous l'abandonner. proposez des données prouvant qu'au moins pour vous-même ou est-ce juste un "sentiment"?

À chaque fois que j'ai utilisé l'échange même sur Linux, en arrière il y a 10 ans et de nos jours sur Ubuntu, je ne pouvais jamais voir des améliorations sur la performance. Ma raison pour vouloir éviter de prévenir les problèmes avec l'espace libre sur OSX et, sous Linux, pour pouvoir hiberner. C'est tout échange est pour moi.

Mais je n'ai jamais vraiment fait des recherches plus profondes, que ce soit seule ni dans les interwebs.

1
cregox

Ce n'est pas une réponse, mais peut-être un supplément de suivi très utile. Apple Fournit un éditeur de plis gratuit ici Plistedit Pro . Il vous permet d'éditer ces fichiers en toute sécurité. Semble comme si vous pouviez simplement modifier l'argument avec la valeur /privé/var/vm/swapfile à quelque chose comme /volumes/autresDrive/vm/mySwapFileName Pour déplacer les fichiers de swap ailleurs ...

Encore Je n'ai pas testé ceci ...

1
Jesse

Peut-être que nous pouvons utiliser Xupport pour faire ce sale travail pour nous :) http://www.applicorn.com/

Optimiseur de mémoire virtuelle:

Modifiez l'emplacement des fichiers de swap dans Mac OS X Les informations de mémoire virtuelle sont stockées dans les "swapfiles" les plus appelés. Étant donné que les swapfiles sont les fichiers système les plus interactifs, il est logique de les mettre sur une partition séparée. Il est recommandé de stocker les fichiers de swap sur la première partition de votre disque dur interne le plus rapide. La taille de la partition minimale recommandée doit être d'environ 3 ou 4 fois la bière que la taille de la mémoire intégrée physique (E.g 1 Go de mémoire physique = 4 Go Swap Partition). Recommandations et instructions pour une performance optimale du système:

1. Re-partitionnez votre disque dur avec un volume de swap en tant que première partition (à l'aide du DVD d'installation de Mac OS X). AVERTISSEMENT: Re-partitionnement d'un disque dur s'éteindrea toutes les données existantes!

2. Restaurez vos données système ou installez un nouveau système sur la partition système.

3. Démarrez à partir de la partition système.

4. Si vous souhaitez que votre volume d'échange soit invisible au Finder: • Lancez Xupport et choisissez "Paramètres" • Activer "Afficher les fichiers cachés et les dossiers" et redémarrer le Finder • Renommez le volume d'échange de "Swap" sur ".swap" (Le point le rend invisible pour le Finder) • Désactiver "Afficher les fichiers cachés et les dossiers" et redémarrer le Finder

5. Sélectionnez la nouvelle partition de swap sous "Volume de stockage de swap". Ensuite, appuyez sur la touche "SET" pour appliquer les nouveaux paramètres de l'emplacement de fichier de swap (redémarrage requis).

BTW, ça marche pour moi. Snow Leopard 10.6.2 @ MacBook Pro 2.4GHz, RAM 4GB, 500 Go HD

1
UooU