Posso inserire / tmp e / var / log in un ramdisk su OS X?


20

Per i sistemi Linux non critici, spesso sposto cose come / tmp e / var / log su tmpfs per salvare su alcune scritture su disco. Lo sto facendo da circa un anno e se mai avrò bisogno dei log per i riavvii, commenterò una riga in / etc / fstab e inizierò il debug.

In ogni caso, vorrei fare la stessa cosa su OS X. Ho visto post sulla creazione di un ramdisk per OS X, ma sto cercando una soluzione più permanente che funzioni ad ogni avvio. Voglio sempre / tmp e / var / log montati in un ramdisk, con la possibilità di disattivarlo con un po 'di modifica della riga di comando in vi, se necessario.


Mi sembra un'ottimizzazione prematura. Ti stai davvero imbattendo in molte situazioni in cui sei associato a I / O del disco, quindi devi salvare le scritture del disco ogni volta che puoi?
Spiff

Devo ammettere apertamente che questa non è probabilmente un'enorme ottimizzazione. Inizialmente l'ho fatto su un sistema Linux in cui mi stavo avviando da una chiavetta USB economica e cercavo di evitare di scriverlo il più possibile, fornendo allo stesso tempo lo spazio di log e tmp che molti processi vogliono. L'idea è rimasta bloccata e ho sentito quello a cui mi stavo arrendendo (non riesco a visualizzare i registri per rintracciare un problema che ho notato DOPO che fosse successo a meno che non potessi riprodurlo) valeva la pena armeggiare. Per un sistema "non armeggiare", non lo farei. Il mio laptop OS X rientra nella categoria armeggiare.
kbyrd,

6
Un'altra giustificazione ^ D ^ D ^ D ... err ... razionalizzazione: il mio macbook ha un SSD e se posso evitare scritture casuali per cose di cui non mi interessa molto, l'intero sistema sta meglio. Che ne dici di quello?
kbyrd,

Risposte:


6

Ecco uno script per creare ramdisk su OS X. Spiacenti, non risponde alla tua domanda. Puoi usarlo per creare qualcosa che gira all'avvio e poi 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}"  

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


Grazie mille, questo script è molto utile per creare dischi ram su OS X
hanxue,

6

EDIT: Accetterò solo la mia risposta, poiché ha risolto una parte del problema per me. Se qualcuno pubblica qualcosa di più simile a --bind in Linux, accetterò quella risposta.

Nel tentativo di stimolare più risposte, inizierò a rispondere alla mia domanda con quello che ho scoperto.

Il passo 1 è far montare un ramdisk all'avvio ogni volta. Per fare ciò, creo uno script bash e quindi una voce launchd per chiamare lo script bash all'avvio.

Scrivi uno script bash come questo:

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

Quindi chiamalo all'avvio aggiungendolo a launchd creando un file chiamato /Library/LaunchDaemons/com.my.ramdisk.plist con i seguenti contenuti:

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

Dove sono bloccato è un modo per collegare in modo simbolico o montare directory all'interno del ramdisk in / tmp, / var / log e / var / tmp. Queste tre directory sono tutte collegate simbolicamente sul mio sistema a / private / tmp, / private / var / log e / private / var / tmp. Quando ho cambiato i collegamenti simbolici per puntare in / Volumes / ramdisk / ..., il sistema non si avvia. Mi aspetto che ciò avvenga perché all'avvio, qualcosa vuole / tmp e / var / log PRIMA che lo script my com.my.ramdisk monti il ​​ramdisk. Ho bisogno di un modo per montare il ramdisk subito dopo il montaggio di root, prima che tutto funzioni.

Nota Se si monta / var / log (kernel, demone e altri log di spazio utente critico) nello spazio temporaneo, al successivo riavvio si perderà il contenuto. Ciò potrebbe inibire la tua capacità di diagnosi.


Le probabilità sono buone che non sarai in grado di farlo, e anche se puoi, non varrà assolutamente la pena spendere il tempo. Tutta la documentazione pubblica sul ciclo di avvio è disponibile qui se sei davvero intenzionato a provare: bit.ly/d1kAPd
Hasaan Chop

@NSD: grazie per il link. Amico, voglio davvero ... legare il montaggio.
kbyrd,

Probabilmente potresti reindirizzare l'output del logger senza scrivere un'estensione del kernel, ma in realtà non ci ho mai provato.
Hasaan Chop,

2
Mi rendo conto che si tratta di un vecchio problema e non riesco a pubblicare una risposta corretta, ma emerge in modo evidente nelle ricerche. Per rispondere alla domanda, si desidera utilizzare hdik -drivekey system-image=yes -nomount ram://262144per creare un ram-disk 128mb, quindi newfs_hfsformattarlo, quindi utilizzare mount -o union,nobrowse,noatimeper montare il volume /tmp. In questo modo, i file esistenti /tmpnon vengono toccati, ma i nuovi file vanno sul disco RAM.
Haravikk,

1
Il mio unico altro commento è che dovresti stare attento a farlo; mentre tmpfslo swap verrà utilizzato, se necessario, un disco RAM no, quindi perderai un pezzo di RAM attiva, questo significa che vorrai mantenerlo piccolo, tuttavia alcune attività /tmppotrebbero richiedere più memoria e falliranno, quindi fai attenzione a ciò che esegui nel caso in cui abbia bisogno di più spazio di quello che assegni.
Haravikk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.