¿Puedo poner / tmp y / var / log en un disco RAM en OS X?


20

Para sistemas Linux no críticos, a menudo muevo cosas como / tmp y / var / log a tmpfs para guardar en alguna escritura en disco. He estado haciendo esto durante un año más o menos y si alguna vez necesito los registros a través de reinicios, simplemente comento una línea en / etc / fstab y luego empiezo a depurar.

En cualquier caso, me gustaría hacer lo mismo en OS X. He visto publicaciones sobre la creación de un disco RAM para OS X, pero estoy buscando una solución más permanente que funcione en cada arranque. Siempre quiero / tmp y / var / log montados en un disco RAM, con la capacidad de desactivarlo con un poco de edición de línea de comandos en vi si es necesario.


Esto me parece una optimización prematura. ¿Realmente se encuentra con muchas situaciones en las que está vinculado a E / S de disco, por lo que debe guardar las escrituras de disco siempre que pueda?
Spiff

Admitiré abiertamente que esto no es una gran optimización. Originalmente lo hice en un sistema Linux en el que estaba arrancando desde una memoria USB barata y estaba tratando de evitar escribir lo más posible al mismo tiempo que proporcionaba el espacio de registro y tmp que muchos procesos desean. La idea se mantuvo y sentí que lo que estaba renunciando (no puedo ver los registros para rastrear un problema que noté DESPUÉS de que sucedió a menos que pueda reproducir) valió la pena este retoque. Para un sistema "sin retoques", no haría esto. Mi computadora portátil OS X cae en la categoría de tinker.
kbyrd

66
Otra justificación ^ D ^ D ^ D ... err ... racionalización: mi macbook tiene un SSD y si puedo evitar escrituras aleatorias para cosas que no me importan mucho, todo el sistema está mejor. ¿Qué hay sobre eso?
kbyrd

Respuestas:


6

Aquí hay un script para crear ramdisks en OS X. Lo sentimos, no responde a su pregunta. Podría usar esto para construir algo que se ejecute en el arranque y luego monte / tmp y / 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


Muchas gracias, este script es muy útil para crear discos RAM en OS X
hanxue

6

EDITAR: Solo voy a aceptar mi propia respuesta, ya que resolvió una parte del problema para mí. Si alguien publica algo más como --bind en Linux, aceptaré esa respuesta.

En un esfuerzo por estimular más respuestas, comenzaré a responder mi propia pregunta con lo que he descubierto.

El primer paso es instalar un ramdisk en el arranque cada vez. Para hacer esto, creo un script bash y luego una entrada launchd para llamar al script bash en el arranque.

Escribe un 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

Luego, inícielo en el arranque agregándolo a launchd creando un archivo llamado /Library/LaunchDaemons/com.my.ramdisk.plist con el siguiente contenido:

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

Donde estoy atascado es una forma de crear enlaces simbólicos o montar directorios dentro del ramdisk en / tmp, / var / log y / var / tmp. Estos tres directorios están todos enlazados en mi sistema a / private / tmp, / private / var / log y / private / var / tmp. Cuando cambié los enlaces simbólicos para apuntar a / Volumes / ramdisk / ..., el sistema no se iniciará. Espero que esto se deba a que en el momento del arranque, algo quiere / tmp y / var / log ANTES de que el script my com.my.ramdisk monte el ramdisk. Necesito una forma de montar el ramdisk justo después de que se monte la raíz, antes de que se ejecute cualquier otra cosa.

Nota Si monta / var / log (kernel, daemon y otros registros críticos de espacio de usuario) en espacio temporal, perderá su contenido en el próximo reinicio. Esto podría inhibir su capacidad de diagnosticar.


Las probabilidades son buenas de que no puedas hacer esto, e incluso si puedes, no valdrá la pena el tiempo invertido. Toda la documentación pública sobre el ciclo de arranque está disponible aquí si realmente está empeñado en probar: bit.ly/d1kAPd
Hasaan Chop el

@NSD: Gracias por el enlace. Hombre, realmente quiero ... montaje atado.
kbyrd

Se podría probablemente redirigir la salida del registrador sin escribir una extensión del kernel, pero en realidad nunca ha intentado.
Hasaan Chop

2
Me doy cuenta de que este es un problema antiguo, y parece que no puedo publicar una respuesta adecuada, pero aparece de manera prominente en las búsquedas. Para responder a la pregunta, desea usar hdik -drivekey system-image=yes -nomount ram://262144para crear un disco RAM de 128 MB, luego newfs_hfsformatearlo y luego usar mount -o union,nobrowse,noatimepara montar el volumen /tmp. De esta manera, los archivos existentes /tmpquedan intactos, pero los archivos nuevos van a su disco RAM.
Haravikk

1
Mi único otro comentario es que debes tener cuidado al hacer esto; mientras tmpfsque usará el intercambio si es necesario, un disco RAM no lo hará, por lo que perderá una porción de RAM activa, esto significa que querrá mantenerlo pequeño, sin embargo, algunas tareas /tmppueden requerir más memoria y fallarán, así que tenga cuidado con lo que ejecuta en caso de que necesite más espacio del que asigna.
Haravikk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.