Чи можу я поставити / tmp та / var / log у рамковий диск на OS X?


20

Для некритичних систем Linux я часто переміщую такі речі, як / tmp та / var / log, до tmpfs, щоб зберегти на деяких записах на диску. Я роблю це протягом року або близько того, і якщо мені колись потрібні журнали через перезавантаження, я просто коментую рядок у / etc / fstab і потім починаю налагоджувати.

У будь-якому випадку, я хотів би зробити те ж саме в OS X. Я бачив повідомлення про створення ramdisk для OS X, але шукаю більш постійне рішення, яке працює на кожному завантаженні. Я завжди хочу / tmp та / var / log встановити в ramdisk, з можливістю вимкнути це за допомогою трохи редагування командного рядка in vi, якщо доведеться.


Це звучить як передчасна оптимізація. Чи справді ви стикаєтеся з безліччю ситуацій, коли ви пов'язані з диском вводу / виводу, тому вам потрібно зберігати записи на диску, коли ви можете?
Spiff

Я відкрито визнаю, що це, мабуть, не є величезною оптимізацією. Спочатку я робив це в системах Linux, де я завантажувався з дешевої USB-накопичувача і намагався уникати запису на неї якомога більше, все одно надаючи простір для журналу та tmp, який хочуть багато процесів. Ідея застрягла, і я відчув, що я відмовлявся (не можу переглянути журнали, щоб простежити проблему, яку я помітив ПІСЛЯ, як це сталося, якщо я не можу відтворити) варто було цього роздумувати. Що стосується системи "без роздумів", я б цього не робив. Мій ноутбук OS X потрапляє в категорію поворотів.
kbyrd

6
Ще одне виправдане ^ D ^ D ^ D ... помилка ... раціоналізація: У моїй книжці macbook є SSD, і якщо я можу запобігти випадковим записам для речей, про які я не дуже переймаюся, все краще система. Як про те, що?
kbyrd

Відповіді:


6

Ось сценарій для створення ramdisks на OS X. Вибачте, він не відповідає на ваше запитання. Ви можете використовувати це для створення чогось, що працює на завантаженні, а потім mounts / tmp та / 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}"  

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


Дякую вам, цей сценарій дуже корисний для створення оперативні диски на ОС X
hanxue

6

EDIT: Я просто прийму власну відповідь, оскільки це вирішило одну частину проблеми для мене. Якщо хтось розмістить щось на кшталт --bind в Linux, я прийму цю відповідь.

Прагнучи підштовхнути більше відповідей, я почну відповідати на власне запитання з того, що з’ясував.

Крок 1 - отримувати рамковий диск, встановлений під час завантаження. Для цього я створюю скрипт bash, а потім запущений запис, щоб викликати скрипт bash під час завантаження.

Напишіть сценарій bash таким чином:

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

Потім закликайте його до завантаження, додавши його до запуску, створивши файл під назвою /Library/LaunchDaemons/com.my.ramdisk.plist із таким вмістом:

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

Там, де я застряг - це спосіб посилання або встановлення каталогів всередині ramdisk в / tmp, / var / log та / var / tmp. Ці три каталоги в моїй системі посилаються на / private / tmp, / private / var / log та / private / var / tmp. Коли я змінив посилання на вказівку на / Volumes / ramdisk / ..., система не завантажиться. Я думаю, це тому, що під час завантаження щось хоче / tmp та / var / log перед тим, як мій скрипт com.my.ramdisk монтує ramdisk. Мені потрібен спосіб встановити ramdisk відразу після встановлення root, перш ніж все інше запуститься.

Примітка Якщо ви змонтуєте / var / log (ядро, демон та інші журнали критичного простору користувача) у тимчасовому просторі, ви втратите його вміст у наступному перезавантаженні. Це може гальмувати вашу здатність до діагностики.


Шанси хороші, що ви цього не зможете зробити, і навіть якщо зможете, це абсолютно не вартує витраченого часу. Вся публічна документація про цикл завантаження доступна тут, якщо ви дійсно намагаєтеся спробувати: bit.ly/d1kAPd
Hasaan Chop

@NSD: Дякую за посилання. Людина, я дуже хочу - пов'язати монтаж.
kbyrd

Ви, ймовірно, можете перенаправити висновки журналу, не записуючи розширення ядра, але я ніколи не намагався.
Hasaan Chop

2
Я усвідомлюю, що це давнє питання, і я не можу опублікувати належної відповіді, але це важливе місце в пошуку. Щоб відповісти на запитання, ви хочете hdik -drivekey system-image=yes -nomount ram://262144створити рамковий диск на 128 Мб, потім newfs_hfsвідформатувати його, а потім використовувати mount -o union,nobrowse,noatimeдля монтажу гучності /tmp. Таким чином, існуючі файли в /tmpне торкаються, але нові файли переходять на ваш оперативний диск.
Харавік

1
Мій єдиний коментар - ви повинні насторожено робити це; тоді як tmpfsпри необхідності використовувати swap, RAM-диск не буде, тому ви втратите шматок активної оперативної пам’яті, це означає, що ви хочете залишити її невеликою, однак для деяких завдань /tmpможе знадобитися більше пам’яті і не вдасться, тому будьте стежте за тим, що ви запускаєте, якщо йому потрібно більше місця, ніж ви виділяєте.
Харавік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.