Como mover arquivos de troca de memória virtual para uma unidade ou partição diferente?

33

Nota: Essa é uma pergunta que eu fiz no SuperUser há pouco tempo. Estou postando novamente aqui porque acho que pertence aqui.

Por padrão, o Mac OS X armazena seus arquivos de permuta /private/var/vm/. Eu gostaria de colocar os arquivos de troca em um local diferente. Como pode ser feito?

e.James
fonte
Considerações adicionais /private/var/vm/sleepimageno Superusuário: Devo vincular meu diretório / private / var / vm a outro volume no OS X Lion? (20/09/2011) - há uma resposta que recomenda não usar o mesmo volume separado para arquivos de troca externos e imagem de sono.
Graham Perrin
dynamicpagerwrapper ( fonte: dynamic_pager_wrapper ) - invólucro de desempenho para / sbin / dynamic_pager no OSX
Graham Perrin

Respostas:

23

Nota: copiado do SuperUser:

Para versões mais antigas do OSX, consulte este tópico em forums.macosxhints.com.

O crédito é atribuído ao dblu por explicar o uso de plutil, ZILjr por introduzir o wait4pathcomando e ekl por simplificar tudo, eliminando a necessidade de um shell script intermediário.

Solução completa:

1. Abra o Terminal e faça uma cópia de backup do dynamic_pager.plist padrão da Apple:

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

2. Converta o plist de XML binário em XML simples:

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

3. Abra o plist convertido com o seu editor de texto de sua escolha. (Eu uso pico, veja a resposta do dblu para um exemplo usando vim):

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

Deve ter a seguinte aparência:

<?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 a matriz ProgramArguments (linhas 13 a 18) para usar o wait4pathcomando shell antes de iniciar o dynamic_pager. Veja a nota 1 para detalhes sobre por que isso é necessário. No exemplo a seguir, minha partição é chamada Swape eu escolhi colocar os arquivos de troca em um diretório oculto nessa partição, chamada .vm certifique-se de que o diretório que você especificar realmente exista . O XML deve ter a seguinte aparência:

<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. Salve o plist e retorne ao prompt do terminal. Usando pico, os comandos seriam:

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

6. Converta o plist modificado novamente em binário:

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

7. Reinicie o Mac. Se você tiver problemas, alterne para o modo de inicialização detalhado, mantendo pressionada a tecla Command-v imediatamente após o toque da inicialização. Isso permitirá que você veja todas as mensagens de inicialização que aparecem durante a inicialização. Se você tiver problemas ainda piores (ou seja, nunca verá a tela de login), mantenha pressionada a tecla Command-s. Isso inicializará o computador no modo de usuário único (sem interface gráfica do usuário, apenas um prompt de comando) e permitirá restaurar a cópia de backup de com.apple.dynamic_pager.plist que você fez na etapa 1.

8. Depois que o computador inicializar, inicie o Terminal e verifique se os arquivos de troca foram realmente movidos:

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

Você deve ver algo assim:

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

9. Exclua os arquivos de troca antigos:

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

10. Lucro!

Nota 1

Modificar os argumentos para dynamic_pager no plist sem usar wait4pathnem sempre funciona e, quando falha, ocorre de maneira espetacularmente silenciosa. O problema decorre do fato de o dynamic_pager ser iniciado muito cedo no processo de inicialização. Se sua partição de troca ainda não foi montada quando o dynamic_pager é carregado pela primeira vez (na minha experiência, isso acontece 99% do tempo), o sistema irá falsificar seu caminho. Ele criará um link simbólico no diretório / Volumes que tem o mesmo nome que sua partição de troca, mas aponta para o local padrão do arquivo de troca (/ private / var / vm). Então, quando sua partição de troca real for montada, ele receberá o nome Swap 1(ou YourDriveName 1). Você pode ver o problema abrindo o Terminal e listando o conteúdo do seu diretório / Volumes:

$ cd /Volumes
$ ls -l

Você verá algo assim:

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

Observe que essa falha pode ser muito difícil de detectar. Se você fosse procurar os arquivos de troca como mostro na etapa 12, ainda os veria ! O link simbólico faria parecer que seus arquivos de troca foram movidos, mesmo que eles estivessem realmente sendo armazenados no local padrão.

Nota 2

Inicialmente, não consegui fazer isso funcionar no Snow Leopard porque o com.apple.dynamic_pager.plist estava armazenado em formato binário. Fiz uma cópia do arquivo original e abri-o com o Editor de lista de propriedades da Apple (disponível com o Xcode) para fazer alterações, mas esse processo adicionou alguns atributos estendidos ao arquivo plist, o que fez com que o sistema o ignorasse e apenas usasse os padrões . Como o dblu apontou, usar plutilpara converter o arquivo em XML simples funciona como um encanto.

Nota 3

Você pode verificar o aplicativo Console para ver as mensagens que dynamic_pager_init ecoam na tela. Se você vir as seguintes linhas repetidas vezes sem conta, há um problema com a instalação. Encontrei essas mensagens porque esqueci de criar o diretório '.vm' especificado em 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

Quando tudo estiver funcionando corretamente, você poderá ver a mensagem acima apenas algumas vezes e, em seguida, não haverá mais as mensagens "Aceleração do reaparecimento". Isso significa que o sistema precisou esperar o carregamento da partição, mas no final foi bem-sucedida.

Excluir o caminho do Time Machine

No OS X 10.7 e posterior, você pode fazer isso com o tmutil . Exemplo:

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

Para esse exemplo, para revisar o resultado:

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

Se o volume usado para troca não precisar ser indexado

Use mdutil . Exemplo, para desligar e apagar a loja:

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

e.James
fonte
Da próxima vez, basta vincular a pergunta / resposta, há um botão "link" ao lado de cada resposta. ;)
Martin Marconcini
2
Há um link para a pergunta do superusuário no topo desta pergunta. Eu não vinculei diretamente à resposta "the" no SuperUser porque foi construída a partir de partes de várias outras respostas. No entanto, adicionei links a cada resposta parcial (usando o prático botão "link") no segundo parágrafo desta resposta. Quantos links você deseja? ;)
e.James
2
Eu gosto que ele está aqui ... Eu referência a ela o tempo todo ..
Alex Gray
Isso falha para mim sob 10.10.3 - parece não usar o plist.
Aramis
2
Sob El Capitan, tentar limpar a troca não é permitido pelo novo System Integrity Protection. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: operação não permitida enquanto o System Integrity Protection está ativado <br> Inicialize na partição de recuperação e escolha Security Configuration no menu Utilities. Você pode desmarcar a opção Aplicar força à integridade do sistema, clicar em Aplicar configuração e reiniciar.
Meetai.com
4

Não consegui estabelecer uma solução permanente de inicialização do sistema, pois a 10.10 não usa mais o /etc/.rc na inicialização e o método com.apple.dynamic_pager.plist falhou .... no entanto ...

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

altera o prefixo armazenado conforme relatado por

sysctl vm

pela duração da sessão e ela sobrevive à reinicialização.

isso pode ser agrupado como um comando unix em um arquivo de texto:

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

e execute no login.

aramis
fonte
-1

Solução simples:

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

SwapRelocator 1.1.2 funciona muito bem no Maverick!

Use (por exemplo) o Tinker Tool System para permitir a montagem de volumes antes do login, que resolve o único problema que encontrei.

(Obrigado Filippo, finalmente posso mover a troca do volume de inicialização espelhado para um volume de cache distribuído (todo SSD))

BKE
fonte