Kann ich unter OS X / tmp und / var / log auf einer Ramdisk ablegen?

20

Bei nicht kritischen Linux-Systemen verschiebe ich häufig Dinge wie / tmp und / var / log nach tmpfs, um beim Schreiben auf einer Festplatte zu sparen. Ich mache das seit ungefähr einem Jahr und wenn ich jemals die Protokolle für Neustarts benötige, kommentiere ich einfach eine Zeile in / etc / fstab aus und beginne dann mit dem Debuggen.

Auf jeden Fall möchte ich unter OS X dasselbe tun. Ich habe Beiträge zum Erstellen einer Ramdisk für OS X gelesen, suche aber nach einer dauerhafteren Lösung, die bei jedem Start funktioniert. Ich möchte immer, dass / tmp und / var / log auf einer Ramdisk gemountet werden, mit der Möglichkeit, das mit ein bisschen Kommandozeilenbearbeitung in vi auszuschalten, wenn ich muss.

kbyrd
quelle
Das klingt für mich nach vorzeitiger Optimierung. Stoßen Sie wirklich auf viele Situationen, in denen Sie festplatteneingangs- und -ausgangsgebunden sind, sodass Sie Schreibvorgänge auf der Festplatte speichern müssen, wann immer Sie können?
Spiff
Ich gebe offen zu, dass dies wahrscheinlich keine große Optimierung ist. Ich habe es ursprünglich auf einem Linux-System gemacht, bei dem ich von einem billigen USB-Stick gebootet habe und versucht habe, das Schreiben so weit wie möglich zu vermeiden, während ich immer noch den Protokoll- und TMP-Speicherplatz zur Verfügung gestellt habe, den viele Prozesse benötigen. Die Idee blieb hängen und ich fühlte, was ich aufgab (ich kann die Protokolle nicht einsehen, um ein Problem aufzuspüren, das mir aufgefallen ist, NACHDEM es passiert ist, wenn ich es nicht reproduzieren kann), war dieses Basteln wert. Für ein "Nicht-Bastel" -System würde ich das nicht tun. Mein OS X-Laptop fällt in die Kategorie Basteln.
kbyrd
6
Eine weitere berechtigte Erklärung: Mein MacBook verfügt über eine SSD. Wenn ich willkürliche Schreibvorgänge für Dinge verhindern kann, die mir nicht viel bedeuten, ist das gesamte System besser dran. Wie ist es damit?
kbyrd

Antworten:

6

Hier ist ein Skript zum Erstellen von RAM-Disks unter OS X. Ihre Frage wird leider nicht beantwortet. Sie können dies verwenden, um etwas aufzubauen, das beim Booten ausgeführt wird und dann / tmp und / var / log mountet.

#!/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}"  

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

xer0x
quelle
Vielen Dank, dieses Skript ist sehr nützlich, um RAM-Datenträger unter OS X zu erstellen
hanxue
6

EDIT: Ich werde nur meine eigene Antwort akzeptieren, da dies einen Teil des Problems für mich gelöst hat. Wenn jemand etwas Ähnliches wie --bind in Linux veröffentlicht, werde ich diese Antwort akzeptieren.

Um mehr Antworten zu erhalten, beantworte ich meine eigene Frage mit dem, was ich herausgefunden habe.

Schritt 1 ist, jedes Mal beim Booten eine Ramdisk zu laden. Dazu erstelle ich ein Bash-Skript und dann einen launchd-Eintrag, um das Bash-Skript beim Booten aufzurufen.

Schreiben Sie ein Bash-Skript wie folgt:

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

Rufen Sie es dann beim Booten auf, indem Sie es zu launchd hinzufügen, indem Sie eine Datei mit dem Namen /Library/LaunchDaemons/com.my.ramdisk.plist mit folgendem Inhalt erstellen:

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

Wenn ich nicht weiterkomme, können Sie Verzeichnisse auf der Ramdisk unter / tmp, / var / log und / var / tmp verknüpfen oder mounten. Diese drei Verzeichnisse sind auf meinem System alle mit / private / tmp, / private / var / log und / private / var / tmp verknüpft. Wenn ich die Symlinks in / Volumes / ramdisk / ... änderte, bootete das System nicht. Ich gehe davon aus, dass dies daran liegt, dass beim Booten etwas / tmp und / var / log benötigt, BEVOR das Skript my.my.ramdisk die Ramdisk einbindet. Ich brauche eine Möglichkeit, die Ramdisk direkt nach dem Einhängen von root einzubinden, bevor etwas anderes ausgeführt wird.

Hinweis Wenn Sie / var / log (Kernel, Daemon und andere wichtige Benutzerbereichsprotokolle) im temporären Bereich bereitstellen, wird der Inhalt beim nächsten Neustart gelöscht. Dies kann Ihre Diagnosefähigkeit beeinträchtigen.

kbyrd
quelle
Die Chancen stehen gut, dass Sie dies nicht können, und selbst wenn Sie es können, wird es die aufgewendete Zeit absolut nicht wert sein. Die gesamte öffentliche Dokumentation zum Bootzyklus finden
Hasaan Chop
@NSD: Danke für den Link. Mann, ich möchte wirklich - binden Montage.
kbyrd
Sie könnten wahrscheinlich die Ausgabe des Loggers umleiten, ohne eine Kernel-Erweiterung zu schreiben, aber ich habe es nie wirklich versucht.
Hasaan Chop
2
Mir ist klar, dass dies ein altes Problem ist, und ich kann anscheinend keine richtige Antwort veröffentlichen, aber es tritt bei der Suche ganz oben auf. Um die Frage zu beantworten, möchten Sie hdik -drivekey system-image=yes -nomount ram://262144eine 128-MB-RAM-Disk erstellen newfs_hfs, formatieren und dann mount -o union,nobrowse,noatimedas Volume erneut laden /tmp. Auf diese Weise /tmpbleiben vorhandene Dateien in erhalten, aber neue Dateien werden auf Ihrer RAM-Festplatte gespeichert.
Haravikk
1
Meine einzige andere Bemerkung ist, dass Sie sich davor hüten sollten, dies zu tun. Während tmpfsbei Bedarf ein Swap verwendet wird, ein RAM-Datenträger dies nicht tut, geht ein Teil des aktiven RAM verloren. Dies bedeutet, dass Sie ihn klein halten möchten. Einige Aufgaben /tmperfordern jedoch möglicherweise mehr Arbeitsspeicher und schlagen fehl Achten Sie darauf, was Sie ausführen, falls mehr Speicherplatz benötigt wird, als Sie zuweisen.
Haravikk