Posso colocar / tmp e / var / log em um ramdisk no OS X?

20

Para sistemas Linux não críticos, geralmente movo coisas como / tmp e / var / log para tmpfs para economizar em alguma gravação de disco. Eu venho fazendo isso há um ano ou mais e, se algum dia precisar dos logs nas reinicializações, apenas comente uma linha no / etc / fstab e inicio a depuração.

De qualquer forma, eu gostaria de fazer a mesma coisa no OS X. Vi posts sobre a criação de um ramdisk para o OS X, mas estou procurando uma solução mais permanente que funcione em cada inicialização. Eu sempre quero / tmp e / var / log montados em um ramdisk, com a capacidade de desativar isso com um pouco de edição de linha de comando no vi, se for necessário.

kbyrd
fonte
Isso soa como otimização prematura para mim. Você está realmente enfrentando muitas situações em que está vinculado à E / S de disco e precisa salvar gravações em disco sempre que puder?
Spiff
Admito abertamente que isso provavelmente não é uma otimização enorme. Originalmente, eu o fazia em sistemas Linux, onde inicializava com um pen drive barato e tentava evitar gravá-lo o máximo possível, enquanto ainda fornecia o espaço de log e tmp que muitos processos desejam. A ideia ficou emperrada e senti o que estava desistindo (não consigo ver os logs para rastrear um problema que notei APÓS o ocorrido, a menos que eu consiga reproduzir) valeu a pena. Para um sistema "não-consertador", eu não faria isso. Meu laptop OS X se enquadra na categoria funileiro.
kbyrd
6
Outra justificativa ^ D ^ D ^ D ... err ... racionalização: Meu macbook tem um SSD e se eu posso impedir gravações aleatórias para coisas com as quais não me importo muito, todo o sistema está melhor. Que tal isso?
kbyrd

Respostas:

6

Aqui está um script para criar ramdisks no OS X. Desculpe, mas não responde à sua pergunta. Você pode usar isso para criar algo que é executado na inicialização e depois monta / tmp e / var / log.

#!/bin/bash  
ramfs_size_mb=1024  
mount_point=~/volatile  

ramfs_size_sectors=$((${ramfs_size_mb}*1024*1024/512))  
ramdisk_dev=`hdid -nomount ram://${ramfs_size_sectors}`  
newfs_hfs -v 'Volatile' ${ramdisk_dev}  
mkdir -p ${mount_point}  
mount -o noatime -t hfs ${ramdisk_dev} ${mount_point}  

echo "remove with:"  
echo "umount ${mount_point}"  
echo "diskutil eject ${ramdisk_dev}"  

De @salvatore http://pastie.textmate.org/pastes/1417478/text?key=igcxuzqqvlmlbavxooj2uw

xer0x
fonte
Muito obrigado, este script é muito útil para criar discos de RAM no Mac OS X
hanxue
6

Edição: Eu só vou aceitar a minha própria resposta, pois resolveu uma parte do problema para mim. Se alguém postar algo mais parecido com --bind no Linux, eu aceitarei essa resposta.

Em um esforço para estimular mais respostas, começarei a responder minha própria pergunta com o que descobri.

O passo 1 é montar um ramdisk na inicialização sempre. Para fazer isso, crio um script bash e, em seguida, uma entrada launchd para chamar o script bash na inicialização.

Escreva um script bash como este:

RD=ramdisk
if [ ! -e "/Volumes/$RD" ];  then
    diskutil erasevolume HFS+ "$RD" `hdiutil attach -nomount`
fi

mkdir -p /Volumes/$RD/private/tmp
mkdir -p /Volumes/$RD/private/var/log
mkdir -p /Volumes/$RD/private/var/tmp

Em seguida, chame-o na inicialização, adicionando-o ao launchd, criando um arquivo chamado /Library/LaunchDaemons/com.my.ramdisk.plist com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.my.ramdisk</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/sbin/ramdisk.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Onde estou preso é uma maneira de vincular ou montar diretórios dentro do ramdisk em / tmp, / var / log e / var / tmp. Esses três diretórios estão todos vinculados no meu sistema a / private / tmp, / private / var / log e / private / var / tmp. Quando alterei os links simbólicos para apontar para / Volumes / ramdisk / ..., o sistema não inicializa. Espero que isso aconteça porque, no momento da inicialização, algo quer / tmp e / var / log ANTES do script my com.my.ramdisk montar o ramdisk. Eu preciso de uma maneira de montar o ramdisk logo após a montagem do root, antes que qualquer outra coisa seja executada.

Nota Se você montar / var / log (kernel, daemon e outros logs críticos do espaço do usuário) no espaço temporário, perderá seu conteúdo na próxima reinicialização. Isso pode inibir sua capacidade de diagnosticar.

kbyrd
fonte
As chances são boas de que você não será capaz de fazer isso e, mesmo que possa, absolutamente não valerá o tempo gasto. Toda a documentação pública sobre o ciclo de inicialização está disponível aqui se você está realmente empenhado em tentar: bit.ly/d1kAPd
Hasaan Pique
@NSD: Obrigado pelo link. Cara, eu realmente quero - montagem obrigatória.
kbyrd
Você provavelmente poderia redirecionar a saída do criador de logs sem escrever uma extensão do kernel, mas nunca tentei.
precisa
2
Sei que esse é um problema antigo e não consigo postar uma resposta adequada, mas aparece com destaque nas pesquisas. Para responder à pergunta, você deseja hdik -drivekey system-image=yes -nomount ram://262144criar um disco ram de 128 MB, newfs_hfsformatá-lo e usar mount -o union,nobrowse,noatimepara montar o volume /tmp. Dessa forma, os arquivos existentes /tmpsão intocados, mas os novos arquivos vão para o seu disco ram.
Haravikk
11
Meu único outro comentário é que você deve ter cuidado ao fazer isso; Considerando tmpfsque usará swap, se necessário, um disco de RAM não, então você perderá um pouco da RAM ativa; isso significa que você deve mantê-lo pequeno; no entanto, algumas tarefas /tmppodem exigir mais memória e falharão; cuidado com o que você executa, caso precise de mais espaço do que você aloca.
Haravikk