Comment déplacer des fichiers d'échange de mémoire virtuelle vers un autre lecteur ou une autre partition?

33

note: C'est une question que j'ai posée sur SuperUser il y a un moment. Je le republie ici parce que je pense qu'il appartient ici.

Par défaut, Mac OS X stocke ses fichiers d'échange dans /private/var/vm/. Je voudrais placer les fichiers d'échange dans un emplacement différent. Comment ceci peut être fait?

e.James
la source
Considérations supplémentaires /private/var/vm/sleepimagedans Super User: Dois-je créer un lien symbolique entre mon répertoire / private / var / vm et un autre volume dans OS X Lion? (2011-09-20) - il y a une réponse qui recommande de ne pas utiliser le même volume séparé pour les fichiers d'échange externes et sleepimage.
Graham Perrin
dynamicpagerwrapper ( source: dynamic_pager_wrapper ) - wrapper de performance pour / sbin / dynamic_pager sur OSX
Graham Perrin

Réponses:

23

note: copié depuis SuperUser:

Pour les anciennes versions d'OSX, consultez ce fil sur forums.macosxhints.com.

Le crédit va à dblu pour expliquer l'utilisation de plutil, ZILjr pour introduire la wait4pathcommande, et ekl pour simplifier le tout en éliminant la nécessité 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 l'éditeur de texte de votre 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 wait4pathcommande shell 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 est appelée Swapet 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 le plist 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.

Exclure le chemin d'accès de Time Machine

Dans OS X 10.7 et versions ultérieures, vous pouvez le faire avec tmutil . Exemple:

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

Pour cet exemple, pour revoir le résultat:

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

Si le volume utilisé pour l'échange n'a pas besoin d'être indexé

Utilisez mdutil . Exemple, pour éteindre puis effacer la boutique:

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

e.James
la source
La prochaine fois, il suffit de lier la question / réponse, il y a un bouton «lien» à côté de chaque réponse. ;)
Martin Marconcini
2
Il y a un lien vers la question SuperUtilisateur tout en haut de cette question. Je n'ai pas lié directement à "la" réponse sur SuperUser car il a été construit à partir de parties de plusieurs autres réponses. J'ai cependant ajouté des liens à chaque réponse partielle (en utilisant ce bouton "lien" pratique) dans le deuxième paragraphe de cette réponse. Combien de liens supplémentaires voulez-vous? ;)
e.James
2
J'aime que ce soit ici… je le référence tout le temps ..
alex grey
Cela échoue pour moi sous 10.10.3 - il ne semble pas utiliser le plist.
aramis
2
Sous El Capitan, la suppression de l'échange n'est pas autorisée par la nouvelle protection de l'intégrité du système. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: opération non autorisée lorsque la protection de l'intégrité du système est engagée <br> démarrez dans la partition de récupération, puis choisissez Configuration de la sécurité dans le menu Utilitaires. Vous pouvez décocher la case Appliquer la protection de l'intégrité du système, cliquer sur Appliquer la configuration et redémarrer.
Meetai.com
4

Je n'ai pas pu établir de solution de démarrage système permanente, car 10.10 n'utilise plus /etc/.rc au démarrage et la méthode com.apple.dynamic_pager.plist a échoué .... cependant ...

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

ne change le préfixe stocké comme indiqué par

sysctl vm

pour la durée de la session, et il survit au redémarrage.

cela pourrait être encapsulé comme une commande unix dans un fichier texte:

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

et exécutez à la connexion.

aramis
la source
-1

Solution simple:

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

SwapRelocator 1.1.2 fonctionne très bien sur Maverick!

Utilisez (par exemple) Tinker Tool System pour laisser les volumes monter avant la connexion, ce qui résout le seul problème que j'ai rencontré.

(Merci Filippo, je peux enfin déplacer le swap du volume de démarrage en miroir vers un volume de cache rayé (tous les SSD))

BKE
la source