Déplacement des fichiers d'échange vers une partition dédiée dans Snow Leopard


31

Jusqu'à maintenant, j'ai pu déplacer des fichiers d'échange de mémoire virtuelle d'Apple vers une partition dédiée sur mon disque dur. La technique que j'utilise est décrite dans un fil de discussion sur forums.macosxhints.com.

Cependant, avec l'aperçu 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é la réponse de dblu comme acceptée même si cela n'a pas tout à fait fonctionné car il a donné d'excellentes instructions détaillées et parce que sa suggestion d'utilisation plutilm'a finalement orienté dans la bonne direction. La solution complète et fonctionnelle est publiée ici dans la question car je n'ai pas assez de réputation pour modifier la réponse acceptée.

Mise à jour # 2: modification de la procédure pour illustrer la technique d'ekl , ce qui simplifie considérablement le tout en éliminant le besoin d'un script shell intermédiaire:

Solution complète:

1. Ouvrez Terminal et faites une copie de sauvegarde du fichier dynamic_pager.plist par défaut d'Apple:

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

2. Convertissez le plist de binaire en XML simple:

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

3. Ouvrez le plist converti avec votre éditeur de texte de choix. (J'utilise pico, voir la réponse de dblu pour un exemple d'utilisation vim):

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

Il devrait ressembler à ceci:

<?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. Modifiez le tableau ProgramArguments (lignes 13 à 18) pour utiliser la commande shell wait4path (comme suggéré par ZILjr ) avant de lancer dynamic_pager. Voir la note # 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 placer les fichiers d'échange dans un répertoire caché sur cette partition, appelé «.vm», assurez-vous que le répertoire que vous spécifiez existe réellement . Le XML doit ressembler à ceci:

<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 liste et revenez à l'invite du terminal. En utilisant 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. Convertissez le plist modifié en binaire:

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

7.Redémarrez votre Mac. Si vous rencontrez des problèmes, passez en mode de démarrage détaillé en maintenant la commande-v enfoncée 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 des problèmes encore plus graves (c'est-à-dire que vous ne voyez jamais l'écran de connexion), maintenez enfoncée la touche Command-s à la place. Cela démarrera l'ordinateur en mode mono-utilisateur (pas d'interface graphique, juste une invite de commande) et vous permettra de restaurer la copie de sauvegarde de com.apple.dynamic_pager.plist que vous avez créée à l'étape 1.

8. Une fois l'ordinateur démarré, lancez Terminal et vérifiez que les fichiers d'échange ont bien é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. Supprimez les anciens fichiers d'échange:

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

10. Profit!

Note 1

Modifier les arguments de dynamic_pager dans le plist sans utiliser wait4pathne fonctionne pas toujours, et lorsqu'il échoue, il le fait de manière spectaculairement silencieuse. Le problème vient du fait que dynamic_pager est lancé très tôt dans le processus de démarrage. Si votre partition de swap n'a pas encore été montée lors du premier chargement de dynamic_pager (d'après mon expérience, cela se produit 99% du temps), alors le système truquera son chemin. Il créera un lien symbolique dans votre répertoire / Volumes qui porte le même nom que votre partition de swap, mais renvoie à l'emplacement par défaut du fichier de swap (/ private / var / vm). Ensuite, lorsque votre partition d'échange réelle sera montée, elle recevra le nom Swap 1(ou YourDriveName 1). Vous pouvez voir le problème en ouvrant Terminal et en listant 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 cet échec peut être très difficile à repérer. Si vous deviez vérifier les fichiers d'échange comme je le montre à l'étape 12, vous les verriez toujours ! Le lien symbolique donnerait l'impression que vos fichiers d'échange ont été déplacés, même s'ils étaient en fait stockés à l'emplacement par défaut.

Note 2

À l'origine, je n'ai pas pu faire fonctionner cela dans Snow Leopard car com.apple.dynamic_pager.plist était stocké au format binaire. J'ai fait une copie du fichier d'origine et l'ai ouvert avec l'éditeur de liste de propriétés d'Apple (disponible avec Xcode) afin d'apporter des modifications, mais ce processus a ajouté des attributs étendus au fichier plist, ce qui a amené le système à l'ignorer et à utiliser simplement les valeurs par défaut . Comme l'a souligné dblu, utiliser plutilpour convertir le fichier en XML brut fonctionne comme un charme.

Note 3

Vous pouvez vérifier l'application Console pour voir tous les messages qui font écho à dynamic_pager_init à 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 plusieurs fois seulement, puis plus de messages "Throttling respawn". Cela signifie que le système a dû attendre le chargement de la partition, mais finalement il a réussi.


Je suis vraiment curieux de savoir pourquoi vous voudriez faire ça?
BinaryMisfit

Pour les petits gains de performances. J'aime garder mes disques durs partitionnés en fonction de leur utilisation. J'ai une partition pour le système d'exploitation et les applications, une pour le dossier des utilisateurs, une pour les documents, une pour les médias (musique, films, etc.) et une pour les fichiers d'échange. D'après mon expérience, garder les fichiers d'échange séparés du reste du système réduit la fragmentation du disque. Ma préférence serait d'avoir un swap sur un disque dédié, mais une autre partition suffira généralement.
e.James

4
Assez juste - Cependant, les partitions sur le même lecteur entraînent en fait plus de travail pour le lecteur lui-même, mais les partitions sur différents lecteurs offrent un gain de performances. Le disque dur doit faire plus de travail lors du saut à travers les partitions sur un seul disque. Je demande seulement parce que je n'ai pas encore eu de problèmes de fragmentation et de performances sur mon Mac après presque 2 ans d'utilisation prêts à l'emploi, et quand je vois ces messages, ils m'intéressent.
BinaryMisfit

1
Je ne sais pas pourquoi je ne peux pas poster de réponse ( 101 rep, qui - si je me souviens bien de mes calculs - est plus que le 10wait4path requis par l'état protégé) , mais j'ai trouvé une non- solution, grâce à ce qu'Applicorn a Xupport modifié pour moi. Je posterai une réponse complète une fois que j'aurai compris comment, mais le plus court est de changer le dernier argument du programme en juste le nouveau chemin (par exemple <string>/Volumes/swap/.vm/swapfile</string>), changer la OnDemandclé en <true/>et ajouter une StartOnMountclé à la fin avec une valeur de <true/>. PS Cette solution fonctionne très bien dans Lion (pour moi, au moins).
Slipp D. Thompson

1
@Slipp Douglas: Ça me semble légitime. Le StartOnMountdrapeau a été ajouté en 10.5 selon: mactech.com/articles/mactech/Vol.25/25.10/…
e.James

Réponses:


10

REMARQUE : Voir (également) une réponse corrigée / améliorée dans la question elle-même.


La solution suivante a fonctionné pour moi:

Ouvrez un terminal et sauvegardez com.apple.dynamic_pager.plist que vous allez changer en une seconde:

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

convertir une liste 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

cela ressemblera à ceci:

 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>

À la ligne 17, modifiez / private / var / vm / swapfile (par exemple / Volumes / partition2 / swapfile), enregistrez et fermez votre éditeur (": x" fera les deux dans vim).

reconvertissez le fichier plist en binaire:

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

Après avoir redémarré votre Mac, vous devriez trouver les fichiers d'échange 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 à la première étape avec:

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

Êtes-vous certain que le fichier d'échange est réellement déplacé vers la partition avec cette configuration? Lorsque j'ai essayé cette approche à l'origine, dynamic_pager se chargeait avant le montage des partitions secondaires. Le système se frayait un chemin en créant un lien symbolique vers partition2 dans le répertoire / Volumes qui pointait simplement vers / private / var / vm. Vous pouvez identifier l'échec en faisant ls -al dans le répertoire / Volumes, où vous verrez à la fois "partition2" (le lien symbolique) et "partition2 1" (votre partition réelle).
e.James

Dans les deux cas, +1 pour la technique de conversion des fichiers plist vers et depuis le format binaire. com.apple.dynamic_pager.plist était au format texte brut dans 10.5.x, mais au format binaire à partir de 10.6. Ce qui fait partie de mon problème. J'ai modifié des fichiers plist à l'aide de l'application Property List Editor fournie avec Xcode, et c'est peut-être pour cela que les choses n'ont pas fonctionné. Je vais essayer plutil et voir si cela m'amène plus loin.
e.James

Je ne peux pas le tester avec une autre partition pour le moment, cependant lors de mes tests, j'ai créé dynamic_pager en créant des fichiers d'échange sur une clé USB en utilisant la technique ci-dessus.
dblu

J'ai pu faire fonctionner la technique d'origine, grâce à votre suggestion d'utilisation plutilpour les conversions. J'ai posté la solution complète dans la question (car je n'ai pas assez de représentant pour l'ajouter à votre réponse). Voir ma note # 1 pour une description détaillée des problèmes que j'ai rencontrés en modifiant simplement le plist.
e.James

Quoi qu'il en soit, merci pour la réponse. Vous avez préparé un excellent ensemble d'instructions et vous m'avez indiqué la bonne direction, je l'ai donc marqué comme accepté. À votre santé! :)
e.James

3

J'ai adopté cette idée et je l'ai poussée un peu plus loin en abordant les stratégies de croissance et de remise en état.

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


1
+1 Grands trucs! J'essaye en ce moment. Voici le lien vers le projet GoogleCode
e.James

assurez-vous que vous utilisez au moins la révision 8 du script: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/…

3

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

quelque chose comme ça:

EDIT: comme expliqué dans le commentaire de e.James et mon commentaire suivant, le bloc XML immédiatement suivant n'est pas bon, à la fois parce qu'il y a une erreur (manquant &&) et parce que seul le premier argument du tableau ProgramArguments est analysé comme programme à exécuter !

mais .. (faites 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 plutôt fonctionner:

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

veuillez garder à l'esprit que je n'avais toujours pas assez de temps pour essayer ce paramètre en toute sécurité, mais j'ai essayé d'exécuter diverses autres commandes shell lancées de la même manière, et tout devrait fonctionner comme prévu

Comment ça marche:

base: l' exécution wait4path /path && commandsignifie que commandn'est exécuté que si wait4pathse termine et se termine sans erreur, et cela ne se produit que lorsqu'un /pathchemin est disponible, nous pouvons donc dire en toute sécurité dynamic_pagerd'utiliser ce volume pour les fichiers d'échange

1) comme écrit dans la launchd.plistpage de manuel, les clés Programet ProgramArgumentssont mappées à un execvpappel, ce qui signifie que tout sauf la première chaîne du tableau est traité comme un argument pour la première chaîne du tableau, le programme à exécuter;

2) comme écrit dans la bashpage de manuel, il existe une bash -c <string>option pour exécuter la chaîne passée en tant que commandes

1 + 2 = 3) que se passe-t-il en utilisant cette ligne de commande dans un plist launchd ??

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

/bin/bashest le programme à exécuter, -cest le premier argument et la chaîne entre guillemets doubles est le deuxième argument

Je suppose que cela devrait fonctionner exactement comme votre solution, sans le script intermédiaire: launchddémarrera le service, attendra le chemin donné puis se lancera dynamic_pager..

Veuillez noter que:
* la chaîne que vous souhaitez exécuter doit être entre guillemets si vous exécutez bash -cdans Terminal, mais elle n'est pas entre guillemets dans le fichier plist! (je suppose que c'est déjà déclaré comme une chaîne avec la balise appropriée)
* les deux &de la chaîne doivent être changés &amp;dans le fichier plist

PS: comme toujours, procédez à vos risques et périls, je ne prends aucune responsabilité pour les problèmes que vous pourriez avoir en utilisant ce paramètre!

Merci d'avoir partagé votre travail avec nous


C'est une idée intéressante. Je ne sais pas s'il est "légal" de mettre plus d'un programme dans le ProgramArgumentstableau, mais cela vaut certainement le coup. L'avez-vous essayé?
e.James

Désolé, il y a une erreur dans mon post précédent, mon idée était d'exécuter la ligne de commande suivante (notez le && qui manquait): wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile si quelqu'un trouve un moyen de "formater" cette ligne pour que launchd l'aime, je suppose que cela devrait fonctionner (j'y pense, peut-être en appelant / bin / bash et en passant le reste comme arguments?); plus d'explications sur les champs Program et ProgramArguments sont disponibles dans la page de manuel launchd.plist, et cela conduira à la page de manuel execvp (3). Je lis et je pense, si quelqu'un est plus rapide, veuillez poster :)
ekl

j'ai édité le post précédent avec une solution qui devrait fonctionner, veuillez commenter si vous voyez une erreur ou quoi que ce soit qui ne fonctionne pas correctement, merci!
ekl

Je l'ai essayé sur mon ordinateur portable et cela semble fonctionner. Je vais garder un œil dessus pendant quelques jours pour être sûr, mais il semble que vous ayez énormément simplifié tout le processus! Beau travail:)
e.James

Votre méthode simplifiée fonctionne comme un charme sur mon ordinateur portable. Merci! Je mettrai à jour la question principale pour intégrer votre solution.
e.James

2

Je sais que cela fait un moment que cet article n'a pas été écrit mais je pensais que j'ajouterais mon propre petit article ici pour ceux qui veulent le faire aussi…

J'ai utilisé l'astuce ci-dessus pour déplacer mes fichiers d'échange vers un autre lecteur interne (mon lecteur de démarrage est SSD avec des puces MLC, donc le déplacement de VM peut économiser l'espérance de vie). Quoi qu'il en soit, après avoir créé le nouveau volume, j'avais un volume d'échange dans le Finder que je ne vais jamais utiliser dans le Finder lui-même, j'ai donc décidé de rendre le volume invisible pour le Finder. Vous devez installer le Developer Toolkit d'Apple. Tapez ensuite:

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

… Et remplacez / Volumes / Swap par ce que vous avez nommé votre volume. Redémarrez Finder et presto, plus de volume d'échange dans Finder!


1

Vous pouvez utiliser wait4path pour attendre que le volume monte; sinon, launchd redémarrera votre script dynamic_pager_init encore et encore jusqu'à ce qu'il le fasse ...


Brillant! J'ai utilisé à la wait4pathplace de la combinaison if/ grep, et cela nettoie très bien les choses. Merci pour le tuyau.
e.James

1

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

Optimiseur de mémoire virtuelle:

Modifier l'emplacement des fichiers d'échange Sous Mac OS X, les informations sur la mémoire virtuelle sont stockées dans ce que l'on appelle les «fichiers d'échange». Étant donné que les fichiers d'échange sont les fichiers système les plus interactifs, il est logique de les placer sur une partition distincte. Il est recommandé de stocker les fichiers d'échange sur la première partition de votre disque dur interne le plus rapide. La taille de partition minimale recommandée doit être environ 3 ou 4 fois plus importante que la taille de la mémoire physique intégrée (par exemple, 1 Go de mémoire physique = 4 Go de partition de swap). Recommandations et instructions pour des performances système optimales:

1. Re-partitionnez votre disque dur avec un volume d'échange en tant que PREMIÈRE partition (à l'aide du DVD d'installation de Mac OS X). AVERTISSEMENT: LA REPARTITION D'UN DISQUE DUR EFFACERA 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 voulez que votre volume de swap soit invisible pour le Finder: • Lancez Xupport et choisissez "Paramètres" • Activez "Afficher les fichiers et dossiers cachés" et redémarrez le Finder • Renommez le volume de swap de "swap" en ".swap" (Le point le rend invisible pour le Finder) • Désactivez "Afficher les fichiers et dossiers cachés" et redémarrez le Finder

5. Sélectionnez la nouvelle partition de swap sous "Swap Storage Volume". Ensuite, appuyez sur le bouton "Définir" pour appliquer les nouveaux paramètres d'emplacement du fichier d'échange (redémarrage requis).

BTW, cela fonctionne pour moi. Snow Leopard 10.6.2 @ Macbook Pro 2,4 GHz, 4 Go de RAM, 500 Go HD


Cela semble prometteur. Merci pour le lien et les instructions détaillées!
e.James


1

C'est probablement une réponse indésirable (car je ne peux pas commenter après Diago), mais pourquoi insistez-vous vraiment pour que cela donne de petits gains de performances? J'ai parcouru une discussion sur les forums Apple et j'ai conclu que ce n'était pas du tout une bonne idée. Et j'étais très réticent à l'abandonner. Pourriez-vous fournir des données qui le prouvent au moins pour vous-même, ou est-ce juste un "sentiment"?

Depuis chaque fois que j'utilisais swap même sur linux, il y a 10 ans, et de nos jours sur ubuntu, je n'ai jamais pu voir d'amélioration des performances. Ma raison de le vouloir était d'éviter les problèmes d'espace libre sur OSX et, sur linux, de pouvoir hiberner. C'est tout l'échange pour moi.

Mais je n'ai jamais vraiment fait de recherches plus approfondies, que ce soit seul ou dans les interwebs.


Voilà une critique valable. Je n'ai pas de données pour soutenir mes réclamations :)
e.James

Cool. Donc, finalement, vous pourriez également renoncer à traverser tous ces problèmes! : P
cregox

1

Ce n'est pas une réponse, mais peut-être un complément de suivi très utile. Apple fournit un éditeur de plist gratuit ici PlistEdit Pro . Il vous permet de modifier ces fichiers en toute sécurité. On dirait que vous pouvez simplement changer l'argument avec la valeur / private / var / vm / swapfile en quelque chose comme / Volumes / OtherDrive / vm / myswapfilename pour déplacer les fichiers d'échange ailleurs ...

Encore une fois je n'ai pas testé ça ...


C'est une bonne idée, et la première chose avec laquelle j'ai commencé quand j'ai emprunté cette voie. Le problème est que la partition de swap n'est pas toujours montée au moment où le pager dynamique se lance. Voir la note n ° 1 dans la question elle-même pour plus de détails sur ce que je veux dire.
e.James
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.