क्या मैं ओएस एक्स पर रैमडिस्क में / tmp और / var / लॉग डाल सकता हूं?


20

गैर-महत्वपूर्ण लिनक्स सिस्टम के लिए, मैं अक्सर कुछ डिस्क लेखन को बचाने के लिए / tmp और / var / log to tmpfs जैसी चीजों को स्थानांतरित करता हूं। मैं एक या एक साल से ऐसा कर रहा हूं और अगर मुझे कभी रिबूट के दौरान लॉग की आवश्यकता होती है, तो मैं बस एक लाइन में / etc / fstab टिप्पणी करता हूं और फिर डीबग करना शुरू करता हूं।

किसी भी मामले में, मैं ओएस एक्स पर एक ही काम करना चाहूंगा। मैंने ओएस एक्स के लिए एक रैमडिस्क बनाने पर पोस्ट देखी है, लेकिन मैं एक अधिक स्थायी समाधान की तलाश कर रहा हूं जो हर बूट पर काम करता है। मैं हमेशा चाहता हूँ / tmp और / var / log एक रैमडिस्क में मुहिम शुरू की, अगर मुझे करना है तो vi में थोड़ी सी कमांड-लाइन एडिटिंग के साथ बंद करने की क्षमता है।


यह मुझे समय से पहले अनुकूलन की तरह लगता है। क्या आप वास्तव में बहुत सी स्थितियों में भाग रहे हैं, जहां आप डिस्क I / O- बाउंड होते हैं, इसलिए जब भी आप कर सकते हैं, तो आपको डिस्क को सहेजने की आवश्यकता होती है?
स्पाइफ

मैं खुले तौर पर स्वीकार करूंगा कि यह बहुत बड़ा अनुकूलन नहीं है। मैंने इसे मूल रूप से एक लिनक्स सिस्टम पर किया था, जहां मैं एक सस्ते यूएसबी स्टिक से बूट कर रहा था और इसे लिखने से बचने की कोशिश कर रहा था, जबकि अभी भी लॉग और tmp स्पेस प्रदान करना चाहते हैं। विचार अटक गया और मैंने महसूस किया कि मैं क्या दे रहा था (लॉग्स को एक समस्या का पता लगाने के लिए नहीं देख सकता है कि मैंने देखा कि जब तक मैं पुन: पेश नहीं कर सकता) तब तक इस छेड़छाड़ के लायक था। "गैर-टिंकर" प्रणाली के लिए, मैं ऐसा नहीं करूंगा। मेरा OS X लैपटॉप टिंकर श्रेणी में आता है।
kbyrd

6
एक और न्यायसंगत ^ डी ^ डी ^ डी ... गलत ... युक्तिकरण: मेरी मैकबुक में एक एसएसडी है और अगर मैं उन चीजों के लिए यादृच्छिक लेखन को रोक सकता हूं जो मुझे ज्यादा परवाह नहीं हैं, तो पूरी प्रणाली बेहतर बंद है। उस के बारे में कैसा है?
kbyrd

जवाबों:


6

यहाँ OS X पर ramdisks बनाने की स्क्रिप्ट है। क्षमा करें, यह आपके प्रश्न का उत्तर नहीं देता है। आप इसका उपयोग बूट पर चलने वाली किसी चीज़ को बनाने के लिए कर सकते हैं और फिर 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/pasting/1417478/text?key=igcxuzqqvlmlbavxooj2uw


बहुत बहुत धन्यवाद, यह स्क्रिप्ट OS X पर राम डिस्क बनाने के लिए बहुत उपयोगी है
hanxue

6

संपादित करें: मैं सिर्फ अपना जवाब स्वीकार करने जा रहा हूं, क्योंकि इसने मेरे लिए समस्या का एक हिस्सा हल कर दिया है। अगर कोई व्यक्ति कुछ और पोस्ट करता है जैसे - लिनक्स में, तो मैं उस उत्तर को स्वीकार करूंगा।

अधिक उत्तर देने के प्रयास में, मैंने अपने स्वयं के प्रश्न का उत्तर देना शुरू कर दिया है जो मुझे पता चला है।

चरण 1 में हर बार बूट पर एक रैमडिस्क लगाया जाना है। ऐसा करने के लिए, मैं बूट स्क्रिप्ट बनाता हूं और फिर बूट पर बैश स्क्रिप्ट को कॉल करने के लिए एक लॉन्च प्रविष्टि।

इस तरह एक बैश स्क्रिप्ट लिखें:

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>

जहां मैं फंस गया हूं वह रैमडिस्क के अंदर / tmp, / var / log, और / var / tmp पर निर्देशिकाओं को सिमिलिंक या माउंट करने का एक तरीका है। इन तीन निर्देशिकाओं को मेरे सिस्टम पर / निजी / tmp, / private / var / log और / private / var / tmp पर सहानुभूति दी गई है। जब मैंने / वॉल्यूम्स / रैमडिस्क / ... में इंगित करने के लिए सिम्लिंक्स को बदल दिया, तो सिस्टम बूट नहीं होगा। मुझे उम्मीद है कि क्योंकि बूट समय पर, कुछ चाहता है / tmp और / var / log से पहले मेरे com.my.ramdisk स्क्रिप्ट में रैमडिस्क की गणना करता है। मुझे रूटडिस्क के ठीक बाद रैमडिस्क को माउंट करने का एक तरीका चाहिए, इससे पहले कि कुछ और चले।

नोट यदि आप अस्थायी स्थान पर / var / log (कर्नेल, डेमन और अन्य महत्वपूर्ण उपयोगकर्ता-स्थान लॉग) माउंट करते हैं, तो आप अगले रिबूट में इसकी सामग्री खो देंगे। यह निदान करने की आपकी क्षमता को बाधित कर सकता है।


ऑड्स अच्छे हैं कि आप ऐसा करने में सक्षम नहीं हैं, और यहां तक ​​कि अगर आप कर सकते हैं, तो यह पूरी तरह से खर्च किए गए समय के लायक नहीं होगा। यदि आप वास्तव में प्रयास करने पर तुले हुए हैं, तो बूट चक्र पर सभी सार्वजनिक दस्तावेज यहां उपलब्ध हैं: bit.ly/d1kAPd
हसन चोप

@NSD: लिंक के लिए धन्यवाद। यार, मैं वास्तव में चाहता हूं - बढ़ते बढ़ते।
kbyrd

आप शायद कर्नेल एक्सटेंशन को लिखे बिना लकड़हारा के आउटपुट को पुनर्निर्देशित कर सकते हैं , लेकिन मैंने वास्तव में कभी कोशिश नहीं की है।
हसन चोप

2
मुझे लगता है कि यह एक पुराना मुद्दा है, और मैं एक उचित उत्तर पोस्ट नहीं कर सकता, लेकिन यह खोजों में प्रमुखता से आता है। प्रश्न का उत्तर देने के लिए, आप hdik -drivekey system-image=yes -nomount ram://262144128mb रैम-डिस्क बनाने के लिए उपयोग करना चाहते हैं , फिर newfs_hfsइसे प्रारूपित करने के लिए, फिर mount -o union,nobrowse,noatimeवॉल्यूम को माउंट करने के लिए उपयोग करें /tmp। इस तरह, मौजूदा फाइलें /tmpअछूती हैं, लेकिन नई फाइलें आपकी रैम डिस्क पर जाती हैं।
हरविकांक

1
मेरी केवल अन्य टिप्पणी यह ​​है कि आपको ऐसा करने से सावधान रहना चाहिए; जबकि tmpfsयदि आवश्यक हो तो स्वैप का उपयोग करेगा, रैम डिस्क नहीं है, तो आप सक्रिय रैम का एक हिस्सा खो देंगे होगा, इसका मतलब है आप यह छोटे रखना चाहेंगे, फिर भी कुछ कार्यों में /tmpअधिक स्मृति की आवश्यकता हो सकती है और असफल हो जायेगी, तो हो सकता है ध्यान रखें कि आपके द्वारा आवंटित किए जाने से अधिक स्थान की आवश्यकता है।
हरविकांक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.