Mover los archivos de intercambio a una partición dedicada en Snow Leopard

31

Hasta ahora, he podido mover los archivos de intercambio de memoria virtual de Apple a una partición dedicada en mi disco duro. La técnica que he estado usando se describe en un hilo en foros.macosxhints.com.

Sin embargo, con la vista previa del desarrollador de Snow Leopard, este método ya no funciona. ¿Alguien sabe cómo podría hacerse con el nuevo sistema operativo?

Actualización: He marcado la respuesta de dblu como aceptada, aunque no funcionó porque dio instrucciones excelentes y detalladas y porque su sugerencia de uso plutilfinalmente me señaló en la dirección correcta. La solución completa y funcional se publica aquí en la pregunta porque no tengo suficiente reputación para editar la respuesta aceptada.

Actualización n. ° 2: se modificó el procedimiento para ilustrar la técnica de ekl , que simplifica enormemente todo al eliminar la necesidad de un script de shell intermedio:

Solución completa:

1. Abra el Terminal y haga una copia de seguridad del valor predeterminado dynamic_pager.plist de Apple:

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

2. Convierta el plist de binario a XML simple:

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

3. Abra el plist convertido con el editor de texto de su elección. (Yo uso pico, vea la respuesta de dblu para un ejemplo usando vim):

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

Debería verse de la siguiente manera:

<?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. Modifique la matriz ProgramArguments (líneas 13 a 18) para usar el comando de shell wait4path (como lo sugiere ZILjr ) antes de lanzar dynamic_pager. Consulte la nota 1 para obtener detalles sobre por qué esto es necesario. En el siguiente ejemplo, mi partición se llama 'Swap', y elegí poner los archivos de intercambio en un directorio oculto en esa partición, llamado '.vm', asegúrese de que el directorio que especifique realmente exista . El XML debería tener el siguiente aspecto:

<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. Guarde el plist y regrese al indicador de terminal. Usando pico, los comandos serían:

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

6. Convierta el plist modificado de nuevo a binario:

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

7.Reinicia tu Mac. Si tiene problemas, cambie al modo de inicio detallado manteniendo presionada la tecla Comando-v inmediatamente después del timbre de inicio. Esto le permitirá ver todos los mensajes de inicio que aparecen durante el inicio. Si se encuentra con problemas aún peores (es decir, nunca ve la pantalla de inicio de sesión), mantenga presionados los Comandos-s. Esto iniciará la computadora en modo de usuario único (sin interfaz gráfica de usuario, solo un símbolo del sistema) y le permitirá restaurar la copia de seguridad de com.apple.dynamic_pager.plist que realizó en el paso 1.

8. Una vez que la computadora se inicia, enciende la Terminal y verifica que los archivos de intercambio se hayan movido:

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

Debería ver algo como esto:

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

9. Eliminar los archivos de intercambio antiguos:

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

10. ¡Lucro!

Nota 1

Modificar los argumentos a dynamic_pager en el plist sin usar wait4pathno siempre funciona, y cuando falla, lo hace de una manera espectacularmente silenciosa. El problema se debe al hecho de que dynamic_pager se inicia muy temprano en el proceso de inicio. Si su partición de intercambio aún no se ha montado cuando se carga dynamic_pager por primera vez (en mi experiencia, esto sucede el 99% del tiempo), entonces el sistema se abrirá paso. Creará un enlace simbólico en su directorio / Volumes que tiene el mismo nombre que su partición de intercambio, pero apunta de nuevo a la ubicación predeterminada del archivo de intercambio (/ private / var / vm). Luego, cuando se monte su partición de intercambio real, se le dará el nombre Swap 1(o YourDriveName 1). Puede ver el problema abriendo Terminal y enumerando el contenido de su directorio / Volumes:

$ cd /Volumes
$ ls -l

Verás algo como esto:

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

Tenga en cuenta que esta falla puede ser muy difícil de detectar. Si revisara los archivos de intercambio como lo muestro en el paso 12, ¡todavía los vería ! El enlace simbólico daría la impresión de que sus archivos de intercambio se han movido, incluso si en realidad están almacenados en la ubicación predeterminada.

Nota 2

Originalmente no pude hacer que esto funcionara en Snow Leopard porque com.apple.dynamic_pager.plist estaba almacenado en formato binario. Hice una copia del archivo original y lo abrí con el Editor de listas de propiedades de Apple (disponible con Xcode) para realizar cambios, pero este proceso agregó algunos atributos extendidos al archivo plist que causaron que el sistema lo ignorara y solo usara los valores predeterminados . Como señaló dblu, usar plutilpara convertir el archivo a XML simple funciona de maravilla .

Nota 3

Puede consultar la aplicación Consola para ver los mensajes que dynamic_pager_init echos a la pantalla. Si ve las siguientes líneas repetidas una y otra vez, hay un problema con la configuración. Me encontré con estos mensajes porque olvidé crear el directorio '.vm' que especifiqué en 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

Cuando todo funciona correctamente, puede ver el mensaje anterior solo un par de veces, y luego no más de los mensajes de "Reactivación de aceleración". Esto significa que el sistema tuvo que esperar a que se cargara la partición, pero al final tuvo éxito.

e.James
fuente
Tengo curiosidad por saber por qué querrías hacer esto.
BinaryMisfit
Por las pequeñas ganancias de rendimiento. Me gusta mantener mis discos duros particionados de acuerdo con el uso. Tengo una partición para el sistema operativo y las aplicaciones, una para la carpeta de usuarios, otra para documentos, otra para medios (música, películas, etc.) y otra para archivos de intercambio. En mi experiencia, mantener los archivos de intercambio separados del resto del sistema mantiene baja la fragmentación del disco. Preferiría tener un intercambio en una unidad dedicada, pero normalmente bastará con otra partición.
e.James
44
Lo suficientemente justo: sin embargo, las particiones en la misma unidad en realidad causan más trabajo para la unidad en sí, sin embargo, las particiones en diferentes unidades proporcionan una ganancia de rendimiento. El disco duro tiene que hacer más trabajo al saltar a través de particiones en un solo disco. Solo pregunto porque aún tengo problemas de fragmentación y rendimiento en mi Mac después de casi 2 años de uso inmediato, y cuando veo estas publicaciones me interesan.
BinaryMisfit
1
No estoy seguro de por qué no puedo publicar una respuesta ( 101 rep, que, si puedo recordar mis matemáticas, es más que las 10 que requiere el estado protegido) , pero encontré una falta de wait4pathsolución, gracias a lo que Applicorn's Xupport modificado para mí. Publicaré una respuesta completa una vez que descubra cómo hacerlo, pero lo más breve es cambiar el último argumento del programa solo a la nueva ruta (por ejemplo <string>/Volumes/swap/.vm/swapfile</string>), cambiar la OnDemandclave <true/>y agregar una StartOnMountclave al final con un valor de <true/>. PD: esta solución funciona bien en Lion (para mí, al menos).
Slipp D. Thompson
1
@Slipp Douglas: me parece legítimo. La StartOnMountbandera se agregó en 10.5 de acuerdo con: mactech.com/articles/mactech/Vol.25/25.10/…
e.James

Respuestas:

10

NOTA : Vea (también) una respuesta corregida / mejorada en la pregunta misma.


La siguiente solución funcionó para mí:

Abra una terminal y haga una copia de seguridad de com.apple.dynamic_pager.plist que cambiará en un segundo:

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

convertir plist binario a xml:

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

y ábrelo con tu editor de texto favorito

$ sudo vim com.apple.dynamic_pager.plist

se verá más o menos así:

 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>

En la línea 17, modifique / private / var / vm / swapfile (por ejemplo, / Volumes / division2 / swapfile), guarde y cierre su editor (": x" hará ambas cosas en vim).

convertir el archivo plist de nuevo a binario:

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

Después de reiniciar su Mac, debe encontrar los archivos de intercambio en el directorio que especificó.

Si tiene algún problema, puede restaurar la copia de seguridad que creó en el primer paso con:

$ cd / System / Library / LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist {_bak,}
dblu
fuente
¿Está seguro de que el archivo de intercambio se está moviendo realmente a la partición con esta configuración? Cuando probé este enfoque originalmente, dynamic_pager se cargaría antes de que se montasen las particiones secundarias. El sistema se abriría paso creando un enlace simbólico a la partición2 en el directorio / Volumes que simplemente apuntaba a / private / var / vm. Puede identificar la falla haciendo ls -al en el directorio / Volumes, donde verá tanto "partición2" (el enlace simbólico) como "partición2 1" (su partición real).
e.James
De cualquier manera, +1 para la técnica para convertir archivos plist a y desde formato binario. com.apple.dynamic_pager.plist estaba en formato de texto plano en 10.5.x, pero en formato binario a partir de 10.6. Lo cual es parte de mi problema. He estado modificando archivos plist usando la aplicación Property List Editor que viene con Xcode, y tal vez por eso las cosas no funcionaron. Voy a probar plutil y ver si me lleva más lejos.
e.James
No puedo probarlo con otra partición en este momento, sin embargo, durante mis pruebas hice dynamic_pager creando swapfiles en una memoria USB usando la técnica anterior.
dblu
Pude hacer que la técnica original funcionara, gracias a su sugerencia de usar plutilpara las conversiones. Publiqué la solución completa en la pregunta (ya que no tengo suficiente representante para agregarla a su respuesta). Consulte mi nota n. ° 1 para obtener una descripción detallada de los problemas que tuve al modificar el plist.
e.James
De todos modos, gracias por la respuesta. Recopiló un excelente conjunto de instrucciones y me señaló en la dirección correcta, así que lo marqué como aceptado. ¡Aclamaciones! :)
e.James
3

Adopté esta idea y la llevé un poco más lejos al abordar las estrategias de crecimiento y recuperación.

Detalles en http://www.crypticide.com/dropsafe/article/3848 ; Publicaría un enlace a la página del proyecto "Dynamicpagerwrapper" GoogleCode, pero el blog me dice que no tengo suficientes puntos de reputación ...


fuente
1
+1 ¡Grandes cosas! Lo estoy probando ahora mismo. Aquí está el enlace al proyecto GoogleCode
e.James
asegúrese de estar utilizando al menos la revisión 8 del script: code.google.com/p/dynamicpagerwrapper/source/browse/trunk/…
3

solo una pregunta: ¿por qué no simplemente editar el archivo .plist agregando wait4path, en lugar de usar el intermedio dynamic_pager_init?

algo como esto:

EDITAR: como se explica en el comentario de e.James y mi siguiente comentario, el bloque XML inmediatamente siguiente no es bueno, tanto porque hay un error (falta &&) como porque solo el primer argumento de la matriz ProgramArguments se analiza como el programa a ejecutar !

pero .. (desplazarse hacia abajo)

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

final del bloque xml incorrecto


este bloque XML debería funcionar en su lugar:

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

tenga en cuenta que todavía no tuve suficiente tiempo para probar esta configuración de forma segura, pero intenté ejecutar varios otros comandos de shell iniciados de la misma manera, y todo debería funcionar como se esperaba

Cómo funciona:

base: ejecutar wait4path /path && commandsignifica que commandse ejecuta solo si wait4pathfinaliza y sale sin errores, y esto ocurre solo cuando /pathhay una ruta disponible, por lo que podemos decirle dynamic_pagercon seguridad que use ese volumen para archivos de intercambio

1) como está escrito en la página de launchd.plistmanual, las teclas Programy ProgramArgumentsse asignan a una execvpllamada, eso significa que todo menos la primera cadena de la matriz se trata como un argumento para la primera cadena de la matriz, el programa que se ejecuta;

2) como está escrito en la página de bashmanual, hay una bash -c <string>opción para ejecutar la cadena pasada como comandos

1 + 2 = 3) ¿qué sucede usando esta línea de comando en una lista de lanzamiento?

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

/bin/bashes el programa a ejecutar, -ces el primer argumento y la cadena entre comillas dobles es el segundo argumento

Supongo que debería funcionar exactamente como su solución, sin el script intermedio: launchdiniciará el servicio, esperará la ruta dada y luego se iniciará dynamic_pager.

Tenga en cuenta que:
* la cadena que desea ejecutar debe ser citado doble si se ejecuta bash -cen el terminal, pero es sin comillas dobles en el archivo plist! (supongo que porque ya está declarado como una cadena con la etiqueta adecuada)
* los dos &en la cadena deben cambiarse &amp;en el archivo plist

PD: como siempre, proceda bajo su propio riesgo, no me hago responsable de los problemas que pueda tener al usar esta configuración.

Gracias por compartir tu trabajo con nosotros

ekl
fuente
Esa es una idea interesante. No estoy seguro de si es "legal" poner más de un programa en la ProgramArgumentsmatriz, pero ciertamente vale la pena intentarlo. ¿Lo ha probado?
e.James
Lo siento, hay un error en mi publicación anterior, mi idea era ejecutar la siguiente línea de comando (tenga en cuenta el && que faltaba): wait4path / Volumes / Swap / && / sbin / dynamic_pager -F /Volumes/Swap/.vm/swapfile si alguien encuentra una forma de "formatear" esa línea para que a launchd le guste, supongo que debería funcionar (estoy pensando en ello, ¿tal vez llamar a / bin / bash y pasar el resto como argumentos?); hay más explicaciones sobre los campos Program y ProgramArguments disponibles en la página de manual de launchd.plist, y eso conducirá a la página de manual de execvp (3). Estoy leyendo y pensando, si alguien es más rápido, por favor publique :)
ekl
Edité la publicación anterior con una solución que debería funcionar, por favor comente si ve algún tipo de error o lo que sea que no funcione correctamente, ¡gracias!
ekl
Lo probé en mi computadora portátil y parece funcionar. Lo vigilaré durante un par de días para estar seguro, ¡pero parece que ha simplificado enormemente todo el proceso! Buen trabajo:)
e.James
Su método simplificado funciona como un encanto en mi computadora portátil. ¡Gracias! Actualizaré la pregunta principal para incorporar su solución.
e.James
2

Sé que ha pasado un tiempo desde que se escribió este artículo, pero pensé que agregaría mi propio pequeño artículo aquí para aquellos que también quieren hacer esto ...

He utilizado el truco anterior para mover mis archivos de intercambio a otra unidad interna (mi unidad de arranque es SSD con chips MLC, por lo que mover vm off puede salvar la esperanza de vida). De todos modos, después de crear el nuevo volumen, tuve un volumen Swap en Finder que nunca voy a usar en Finder, así que decidí hacer el volumen invisible para Finder. Necesita el Kit de herramientas para desarrolladores de Apple instalado. Luego escriba:

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

... y reemplace / Volumes / Swap con lo que haya llamado su volumen. Reinicie Finder y listo, ¡no más Volumen de intercambio en Finder!

Michael Spurlock
fuente
1

Puede usar wait4path para esperar a que se monte el volumen; de lo contrario, launchd reiniciará su script dynamic_pager_init una y otra vez hasta que lo haga ...

ZILjr
fuente
¡Brillante! Utilicé en wait4pathlugar de la combinación if/ grep, y eso limpia las cosas bastante bien. Gracias por el consejo.
e.James
1

Tal vez podamos usar Xupport para hacer ese trabajo sucio por nosotros :) http://www.applicorn.com/

Optimizador de memoria virtual:

Cambiar la ubicación de los archivos de intercambio En Mac OS X, la información de la memoria virtual se almacena en los llamados "Archivos de intercambio". Debido a que los archivos de intercambio son los archivos de sistema más interactivos, tiene sentido colocarlos en una partición separada. Se recomienda almacenar los archivos de intercambio en la primera partición de su disco duro interno más rápido. El tamaño mínimo de partición recomendado debe ser aproximadamente 3 o 4 veces más largo que el tamaño de la memoria física incorporada (por ejemplo, 1 GB de memoria física = 4 GB de partición de intercambio). Recomendaciones e instrucciones para un rendimiento óptimo del sistema:

1. Vuelva a particionar su disco duro con un volumen de intercambio como PRIMERA partición (usando el DVD de instalación de Mac OS X). ADVERTENCIA: ¡REPARTIR UN DISCO DURO BORRARÁ TODOS LOS DATOS EXISTENTES!

2. Restaure los datos de su sistema o instale un nuevo sistema en la partición del sistema.

3. Arranque desde la partición del sistema.

4. Si desea que su volumen de intercambio sea invisible para el Finder: • Inicie Xupport y seleccione "Configuración" • Active "Mostrar archivos y carpetas ocultos" y reinicie el Finder • Cambie el nombre del volumen de intercambio de "swap" a ".swap" (El punto lo hace invisible para el Finder) • Desactive "Mostrar archivos y carpetas ocultos" y reinicie el Finder nuevamente

5. Seleccione la nueva partición de intercambio en "Volumen de almacenamiento de intercambio". Luego, presione el botón "Establecer" para aplicar la nueva configuración de ubicación del archivo de intercambio (se requiere reiniciar).

Por cierto, funciona para mí. Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz, 4GB Ram, 500GB HD


fuente
Parece prometedor. ¡Gracias por el enlace y las instrucciones detalladas!
e.James
applicorn.com - 404
pkoch
1

Esta es probablemente una respuesta no deseada (ya que no puedo comentar después de Diago), pero ¿por qué insiste realmente en que esto proporcionará pequeñas ganancias de rendimiento? He discutido en foros de Apple y la conclusión fue que no es una buena idea. Y fui muy resistente a abandonarlo. ¿Podría presentar datos que lo demuestren al menos para usted o es solo un "sentimiento"?

Desde cada vez que usé swap, incluso en Linux, hace 10 años, y hoy en día en ubuntu, nunca pude ver mejoras en el rendimiento. Mi razón para querer era evitar problemas con el espacio libre en OSX y, en Linux, para poder hibernar. Eso es todo intercambio para mí.

Pero nunca he hecho una investigación más profunda, ya sea solo o en las redes.

cregox
fuente
Esa es una crítica válida. No tengo datos para respaldar mis afirmaciones :)
e.James
Guay. Entonces, eventualmente, ¡también podrías renunciar a pasar por todos estos problemas! : P
cregox
1

Esta no es una respuesta, pero quizás sea un complemento de seguimiento muy útil. Apple proporciona un editor de plist gratuito aquí PlistEdit Pro . Le permite editar estos archivos de forma segura. Parece que podría cambiar el argumento con el valor / private / var / vm / swapfile a algo como / Volumes / OtherDrive / vm / myswapfilename para mover los archivos de intercambio a otro lugar ...

Nuevamente no he probado esto ...

Jesse
fuente
Es un buen pensamiento, y lo primero que comencé cuando bajé por esta ruta. El problema es que la partición de intercambio no siempre se monta en el momento en que se inicia el localizador dinámico. Consulte la nota n. ° 1 en la pregunta misma para obtener detalles sobre lo que quiero decir.
e.James