¿Cómo puedo mover archivos de intercambio de memoria virtual a una unidad o partición diferente?

33

nota: Esta es una pregunta que hice en SuperUser hace un tiempo. Lo vuelvo a publicar aquí porque creo que pertenece aquí.

Por defecto, Mac OS X almacena sus archivos de intercambio /private/var/vm/. Me gustaría colocar los archivos de intercambio en una ubicación diferente. ¿Cómo puede hacerse esto?

e.James
fuente
Consideración adicional de /private/var/vm/sleepimageen Super Usuario: ¿Debo hacer un enlace simbólico mi / private / var / vm dir a otro volumen en OS X Lion? (2011-09-20): hay una respuesta que recomienda no usar el mismo volumen por separado tanto para archivos de intercambio externos como para sleepimage.
Graham Perrin
dynamicpagerwrapper ( fuente: dynamic_pager_wrapper ) - envoltura de rendimiento para / sbin / dynamic_pager en OSX
Graham Perrin

Respuestas:

23

nota: copiado de SuperUser:

Para versiones anteriores de OSX, vea este hilo en foros.macosxhints.com.

El crédito va a dblu por explicar el uso de plutil, ZILjr por introducir el wait4pathcomando, y ekl por simplificar todo eliminando la necesidad de un script de shell intermedio.

Solución completa:

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

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

2. Convierta el plist de binario a XML plano:

$ 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 wait4pathcomando de shell antes de iniciar dynamic_pager. Consulte la nota 1 para obtener detalles sobre por qué esto es necesario. En el siguiente ejemplo, se llama a mi partición Swap, y elegí poner los archivos de intercambio en un directorio oculto en esa partición, .vm asegurándome 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 nuevamente a binario:

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

7. Reinicie su 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 inicie, inicie la Terminal y verifique que los archivos de intercambio se hayan movido realmente:

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

Debería ver algo como esto:

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

9. Elimine los archivos de intercambio antiguos:

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

10. Beneficio!

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.

Excluir el camino de Time Machine

En OS X 10.7 y versiones posteriores, puede hacerlo con tmutil . Ejemplo:

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

Para ese ejemplo, para revisar el resultado:

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

Si el volumen utilizado para el intercambio no necesita ser indexado

Utiliza mdutil . Ejemplo, para apagar y luego borrar la tienda:

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

e.James
fuente
La próxima vez que solo enlace la pregunta / respuesta, hay un botón de "enlace" al lado de cada respuesta. ;)
Martin Marconcini
2
Hay un enlace a la pregunta SuperUser en la parte superior de esta pregunta. No vinculé directamente a "la" respuesta en SuperUser porque se ha construido a partir de partes de varias otras respuestas. Sin embargo, agregué enlaces a cada respuesta parcial (usando ese práctico botón de "enlace") en el segundo párrafo de esta respuesta. ¿Cuántos enlaces más quieres? ;)
e.James
2
Me gusta que esté aquí ... Lo hago referencia todo el tiempo ...
alex grey
Esto falla para mí en 10.10.3: no parece usar el plist.
aramis
2
Bajo El Capitán, la nueva Protección de integridad del sistema no permite tratar de borrar el intercambio. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: Operación no permitida mientras la Protección de integridad del sistema está activada <br> Inicie en la partición de recuperación y luego elija Configuración de seguridad en el menú Utilidades. Puede desmarcar Enforce System Integrity Protection, hacer clic en Aplicar configuración y reiniciar.
Meetai.com
4

No he podido establecer una solución de arranque del sistema permanente, ya que 10.10 ya no usa /etc/.rc en el arranque, y el método com.apple.dynamic_pager.plist ha fallado ... sin embargo ...

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

cambia el prefijo almacenado según lo informado por

sysctl vm

durante la sesión, y sobrevive al reinicio.

esto podría envolverse como un comando unix en un archivo de texto:

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

y ejecutar al iniciar sesión.

aramis
fuente
-1

Solución simple:

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

¡SwapRelocator 1.1.2 funciona muy bien en Maverick!

Use (por ejemplo) Tinker Tool System para permitir que los volúmenes se monten antes de iniciar sesión, eso resuelve el único problema que encontré.

(Gracias Filippo, finalmente puedo mover el intercambio del volumen de arranque reflejado a un volumen de caché rayado (todo SSD))

BKE
fuente