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

12149
kbyrd

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

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

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

2 ответа на вопрос

7
kbyrd

РЕДАКТИРОВАТЬ: Я просто собираюсь принять свой собственный ответ, так как он решил одну часть проблемы для меня. Если кто-то напишет что-то более похожее на --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 (ядро, демон и другие важные журналы пользовательского пространства) во временном пространстве, вы потеряете его содержимое при следующей перезагрузке. Это может помешать вашей способности диагностировать.

Скорее всего, вы не сможете это сделать, и даже если вы сможете, это абсолютно не будет стоить потраченного времени. Вся общедоступная документация по циклу загрузки доступна здесь, если вы действительно хотите попробовать: http://bit.ly/d1kAPd Hasaan Chop 14 лет назад 0
@NSD: Спасибо за ссылку. Чувак, я действительно хочу - привязать монтаж. kbyrd 14 лет назад 0
Вы могли бы * вероятно * перенаправить вывод логгера без написания расширения ядра, но я никогда не пробовал. Hasaan Chop 14 лет назад 0
Несколько редакторов сказали, что вы должны иметь / var / log в постоянном хранилище. Это не правда Отсутствие его сохранения после перезагрузки затрудняет отладку некоторых вещей. Это компромисс. Если вы прочитали мой оригинальный вопрос, я упомянул об этом. Для критически важного сервера я бы никогда этого не сделал. Для персональной машины я бы повозился, я бы. kbyrd 10 лет назад 0
Я понимаю, что это старая проблема, и я не могу опубликовать правильный ответ, но он часто встречается в поисках. Чтобы ответить на вопрос, вы хотите использовать `hdik -drivekey system-image = yes -nomount ram: // 262144` для создания ram-диска объемом 128 МБ, затем` newfs_hfs` для его форматирования, а затем использовать `mount -o union, nobrowse, noatime` для монтирования громкости над `/ tmp`. Таким образом, существующие файлы в `/ tmp` не затрагиваются, но новые файлы попадают на ваш RAM-диск. Haravikk 10 лет назад 1
Единственный мой комментарий: вы должны быть осторожны с этим; в то время как `tmpfs` будет использовать swap в случае необходимости, а диск RAM не будет, поэтому вы потеряете часть активной памяти, это означает, что вы захотите сохранить ее небольшим, однако для некоторых задач в` / tmp` может потребоваться больше памяти и выйдет из строя, поэтому будьте осторожны с тем, что вы запускаете на случай, если потребуется больше места, чем вы выделите. Haravikk 10 лет назад 0
5
xer0x

Here is a script to create ramdisks on OS X. Sorry, it doesn't answer your question. You could use this to build up something that runs on boot and then mounts /tmp and /var/log.

#!/bin/bash ramfs_size_mb=1024 mount_point=~/volatile ramfs_size_sectors=$(($*1024*1024/512)) ramdisk_dev=`hdid -nomount ram://$` newfs_hfs -v 'Volatile' $ mkdir -p $ mount -o noatime -t hfs $ $ echo "remove with:" echo "umount $" echo "diskutil eject $" 

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

Большое спасибо, этот скрипт очень полезен для создания RAM-дисков на OS X hanxue 10 лет назад 0

Похожие вопросы