Могу ли я поместить / tmp и / var / log в виртуальный диск на OS X?

20

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

В любом случае, я хотел бы сделать то же самое на OS X. Я видел сообщения о создании виртуального диска для OS X, но я ищу более постоянное решение, которое работает при каждой загрузке. Я всегда хочу, чтобы / tmp и / var / log монтировались на виртуальном диске, с возможностью отключить это с помощью небольшого редактирования командной строки в vi, если это необходимо.

kbyrd
источник
Это звучит как преждевременная оптимизация для меня. Вы действительно сталкиваетесь с множеством ситуаций, когда вы ограничены дисковым вводом / выводом, поэтому вам нужно сохранять записи на диск, когда это возможно?
Spiff
Я открыто признаю, что это вряд ли является огромной оптимизацией. Первоначально я делал это в системах Linux, где я загружался с дешевого USB-накопителя, и старался избегать записи в него в максимально возможной степени, в то же время предоставляя журналы и пространство tmp, которые нужны многим процессам. Идея застряла, и я почувствовал, что то, от чего я отказался (не могу просмотреть журналы, чтобы отследить проблему, которую я заметил ПОСЛЕ того, как это произошло, если я не могу воспроизвести), стоило этой работы. Для системы "не тинкер" я бы этого не делал. Мой ноутбук OS X попадает в категорию повозиться.
kbyrd
6
Еще одно оправдание ^ D ^ D ^ D ... эээ ... рационализация: у моего macbook есть SSD, и если я могу предотвратить случайную запись для вещей, которые меня не волнуют, вся система в лучшем случае. Как насчет этого?
kbyrd

Ответы:

6

Вот скрипт для создания виртуальных дисков на OS X. Извините, он не отвечает на ваш вопрос. Вы можете использовать это для создания чего-то, что запускается при загрузке, а затем монтирует / 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

xer0x
источник
Большое спасибо, этот скрипт очень полезен для создания оперативных дисков на OS X
hanxue
6

РЕДАКТИРОВАТЬ: Я просто собираюсь принять свой собственный ответ, так как он решил одну часть проблемы для меня. Если кто-то напишет что-то более похожее на --bind в Linux, я приму этот ответ.

Стремясь побудить больше ответов, я начну отвечать на свой собственный вопрос с тем, что я узнал.

Шаг 1 - каждый раз подключать виртуальный диск при загрузке. Для этого я создаю сценарий bash, а затем запись launchd для вызова сценария 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

Затем вызовите его при загрузке, добавив его в launchd, создав файл /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>

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

Примечание. Если вы смонтируете / var / log (ядро, демон и другие важные журналы пользовательского пространства) во временном пространстве, вы потеряете его содержимое при следующей перезагрузке. Это может помешать вашей способности диагностировать.

kbyrd
источник
Скорее всего, вы не сможете это сделать, и даже если вы сможете, это абсолютно не будет стоить потраченного времени. Вся общедоступная документация по циклу загрузки доступна здесь, если вы действительно хотите попробовать: bit.ly/d1kAPd
Hasaan Chop
@NSD: Спасибо за ссылку. Чувак, я действительно хочу - привязать монтаж.
kbyrd
Можно , вероятно , перенаправить вывод РЕГИСТРАТОРА без написания расширения ядра, но я никогда на самом деле пробовал.
Хасаан Чоп
2
Я понимаю, что это старая проблема, и я не могу написать правильный ответ, но он часто встречается в поисках. Чтобы ответить на вопрос, вы хотите использовать hdik -drivekey system-image=yes -nomount ram://262144для создания ram-диска 128 МБ, затем newfs_hfsотформатировать его, а затем использовать mount -o union,nobrowse,noatimeдля монтирования тома /tmp. Таким образом, существующие файлы /tmpостаются нетронутыми, но новые файлы попадают на ваш RAM-диск.
Харавикк
1
Мое единственное другое замечание - вы должны быть осторожны с этим; в то время как tmpfsпри необходимости будет использоваться подкачка, диск с ОЗУ не будет, поэтому вы потеряете часть активной ОЗУ, это означает, что вы захотите сохранить ее небольшим, однако для некоторых задач /tmpможет потребоваться больше памяти и произойдет ошибка внимательно следите за тем, что вы выполняете, если вам нужно больше места, чем вы выделяете.
Харавикк