Czy mogę umieścić / tmp i / var / log w ramdysku na OS X?

20

W niekrytycznych systemach Linux często przenoszę rzeczy takie jak / tmp i / var / log do tmpfs, aby zaoszczędzić na zapisie na dysku. Robię to od około roku i jeśli kiedykolwiek będę potrzebować dzienników podczas ponownego uruchamiania, po prostu komentuję wiersz w / etc / fstab, a następnie zaczynam debugować.

W każdym razie chciałbym zrobić to samo na OS X. Widziałem posty na temat tworzenia ramdysku dla OS X, ale szukam bardziej trwałego rozwiązania, które działałoby przy każdym uruchomieniu. Zawsze chcę / tmp i / var / log zamontowane na ramdysku, z możliwością wyłączenia go przy pomocy edycji wiersza poleceń w vi, jeśli muszę.

kbyrd
źródło
Dla mnie to brzmi jak przedwczesna optymalizacja. Czy naprawdę napotykasz wiele sytuacji, w których jesteś związany dyskowymi operacjami we / wy, więc musisz zapisywać zapisy na dysku, kiedy tylko możesz?
Spiff
Przyznam otwarcie, że nie jest to prawdopodobnie duża optymalizacja. Zrobiłem to początkowo na systemach Linux, gdzie uruchamiałem się z taniego pendrive'a i starałem się unikać zapisywania na nim tak dużo, jak to możliwe, wciąż zapewniając miejsce na log i tmp, które wiele procesów chce. Pomysł utknął i poczułem, co rezygnuję (nie mogę przeglądać dzienników, aby prześledzić problem, który zauważyłem PO, gdy się to zdarzyło, chyba że będę mógł go odtworzyć) było warte tego majsterkowania. W przypadku systemu „nie majstrującego” nie zrobiłbym tego. Mój laptop z systemem OS X należy do kategorii majsterkowiczów.
kbyrd
6
Kolejna uzasadniona racjonalizacja ^ D ^ D ^ D ... err ...: Mój Macbook ma dysk SSD i jeśli mogę zapobiec przypadkowemu zapisywaniu rzeczy, na których mi nie zależy, cały system jest lepszy. Co ty na to?
kbyrd

Odpowiedzi:

6

Oto skrypt do tworzenia ramdysków w OS X. Przepraszamy, nie odpowiada na twoje pytanie. Możesz użyć tego, aby zbudować coś, co uruchamia się podczas rozruchu, a następnie montuje / tmp i / 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}"  

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

xer0x
źródło
Dziękuję bardzo, ten skrypt jest bardzo przydatny do tworzenia dysków RAM w systemie OS X
hanxue
6

EDYCJA: Po prostu zaakceptuję własną odpowiedź, ponieważ rozwiązała dla mnie jedną część problemu. Jeśli ktoś opublikuje coś podobnego - w Linuksie, zaakceptuję tę odpowiedź.

Aby uzyskać więcej odpowiedzi, zacznę odpowiadać na własne pytanie tym, czego się dowiedziałem.

Krok 1 polega na zamontowaniu ramdysku przy każdym uruchomieniu. Aby to zrobić, tworzę skrypt bash, a następnie uruchamiany wpis, aby wywoływać skrypt bash podczas rozruchu.

Napisz skrypt bash w następujący sposób:

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

Następnie wywołaj go przy uruchamianiu, dodając go do uruchomienia, tworząc plik o nazwie /Library/LaunchDaemons/com.my.ramdisk.plist o następującej treści:

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

Utknąłem w sposób umożliwiający dowiązanie symboliczne lub zamontowanie katalogów wewnątrz ramdysku w / tmp, / var / log i / var / tmp. Te trzy katalogi są symlinkowane w moim systemie z / private / tmp, / private / var / log i / private / var / tmp. Kiedy zmieniłem dowiązania symboliczne na / Volumes / ramdisk / ..., system nie chce się uruchomić. Spodziewam się, że dzieje się tak, ponieważ w czasie uruchamiania coś chce / tmp i / var / log PRZED moim skryptem com.my.ramdisk montuje ramdysk. Potrzebuję sposobu na zamontowanie ramdysku zaraz po zamontowaniu roota, zanim cokolwiek innego się uruchomi.

Uwaga: Jeśli zamontujesz / var / log (jądro, demon i inne krytyczne dzienniki przestrzeni użytkownika) w przestrzeni tymczasowej, utracisz jego zawartość przy następnym ponownym uruchomieniu. Może to ograniczać Twoją zdolność do diagnozowania.

kbyrd
źródło
Szanse są dobre, że nie będziesz w stanie tego zrobić, a nawet jeśli możesz, absolutnie nie będzie to warte czasu. Cała publiczna dokumentacja dotycząca cyklu rozruchu jest dostępna tutaj, jeśli naprawdę chcesz spróbować: bit.ly/d1kAPd
Hasaan Chop
@NSD: Dzięki za link. Człowieku, naprawdę chcę - związać.
kbyrd,
Prawdopodobnie możesz przekierować wyjście programu rejestrującego bez pisania rozszerzenia jądra, ale tak naprawdę nigdy nie próbowałem.
Hasaan Chop
2
Zdaję sobie sprawę, że jest to stary problem i wydaje się, że nie mogę opublikować prawidłowej odpowiedzi, ale pojawia się ona wyraźnie podczas wyszukiwania. Aby odpowiedzieć na pytanie, należy użyć hdik -drivekey system-image=yes -nomount ram://262144dysku RAM o pojemności 128 MB, a następnie newfs_hfssformatować go, a następnie użyć mount -o union,nobrowse,noatimedo zamontowania woluminu /tmp. W ten sposób istniejące pliki /tmppozostaną nietknięte, ale nowe pliki trafią na dysk RAM.
Haravikk,
1
Moim jedynym komentarzem jest to, że powinieneś być ostrożny; podczas gdy tmpfsużyje swap, jeśli to konieczne, dysk RAM nie, więc stracisz część aktywnej pamięci RAM, co oznacza, że ​​będziesz chciał utrzymać ją małą, jednak niektóre zadania /tmpmogą wymagać więcej pamięci i się nie powiedzie, więc bądź uważaj na to, co uruchamiasz, na wypadek gdyby potrzebowało więcej miejsca niż przeznaczasz.
Haravikk,