लिनक्स पर एक राम डिस्क बनाना


70

मेरे पास 62GB रैम के साथ एक मशीन है, और एक ट्रंक है जो केवल 7GB है, इसलिए मैंने सोचा कि मैं एक रैम डिस्क बनाऊंगा और वहां संकलन करूंगा। मैं लिनक्स विशेषज्ञ नहीं हूं। मुझे रैम डिस्क बनाने के लिए इंटरनेट पर निर्देश मिले:

mkfs -q /dev/ram1 8192

लेकिन मैंने 16 जीबी रैम डिस्क आवंटित करने के प्रयास में 8192 से 16777216 बदल दिया।

मुझे निम्नलिखित त्रुटि मिली:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

जिस बिंदु पर मुझे मिला और जमानत मिली।

sudo dmidecode --type 17 | grep Size

दिखाता है

8x8192MB + 2048MB = 67584 MB

लेकिन duपर /devदेता है 804K

क्या यह समस्या है? क्या मैं उस /devआकार को दूर कर सकता हूं ?


15
क्या आपने tmpfs की कोशिश की? यह RAM में एक फाइलसिस्टम है, ext2 की कोई आवश्यकता नहीं है। mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

वह काम किया! धन्यवाद! लेकिन अब तक, बहुत अधिक गति नहीं: मुझे लगता है कि मैं जो उपकरण बनाने का उपयोग कर रहा हूं, वे अभी भी नियमित डिस्क का उपयोग कर रहे हैं। मैं राम डिस्क पर अधिक सामान रखूँगा।
फ्रैंक

3
खुद को रैमडिस्क पर रखने से ज्यादा फर्क नहीं पड़ना चाहिए क्योंकि कर्नेल उन्हें किसी भी तरह से कैश करेगा।
t-8ch

1
@goldilocks यह एक महत्वपूर्ण साक्ष्य है, लेकिन जब मावेन के साथ हमारे जावा प्रोजेक्ट्स को संकलित करते हैं, तो रैमडिस्क का उपयोग करते समय एक महत्वपूर्ण गति होती है। मुझे लगता है कि यह समय पढ़ने की तुलना में समय की तलाश के कारण अधिक है।
स्पेलिंग डी

1
/ देव / शम, वास्तव में / रन / शम , का उपयोग किया जा सकता है; यह लगभग हमेशा होता है।
केमिली गौडेय्यून

जवाबों:


78

लिनक्स पर राम डिस्क बनाने का सबसे अच्छा तरीका tmpfs है। यह RAM में रहने वाला एक फाइल सिस्टम है, इसलिए ext2 की कोई आवश्यकता नहीं है। आप के साथ 16 जीबी आकार का एक tmpfs बना सकते हैं:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
मेरे सिस्टम पर, इन / mnt में कुछ भी नहीं है, यह कहता है: ls: एक्सेस नहीं कर सकता / mnt / tmpfs: ऐसी कोई फ़ाइल या निर्देशिका माउंट नहीं है: माउंट पॉइंट / mnt / tmpfs मौजूद नहीं है। क्या यह चिंता करने वाली बात है? अगर मैं बस mkdir / mnt / tmpfs करता हूं, तो क्या वह उद्देश्य को हराता है (नियमित डिस्क पर tmpfs बनाकर - कृपया कोई ज्वाला नहीं है, मैं यहां एक शुरुआत कर रहा हूं)।
फ्रैंक

9
आपको लक्ष्य के रूप में एक माउंटपॉइंट (निर्देशिका) की आवश्यकता है, इसलिए इस निर्देशिका को बनाने के बाद (आप किसी भी निर्देशिका का उपयोग कर सकते हैं, मौजूदा सामग्री छायांकित हैं) आप इसे उत्तर से आदेश के साथ माउंट कर सकते हैं।
t-8ch

1
tmpfsस्वैप का उपयोग कर सकते हैं, जिसे आप शायद शुद्ध रैम डिस्क में नहीं चाहते हैं।
पाल्सविम

2
@ रोमनसुनी tmpfs फ़िलाटाइप (बाद में -t) पास है। "कोई नहीं" बैकिंग डिवाइस ("डिस्क") है जो tmpfs के लिए मौजूद नहीं है
t-8ch

1
यह ध्यान देने योग्य हो सकता है कि आकार निर्दिष्ट करना वैकल्पिक है। यह रैम के आधे हिस्से को डिफॉल्ट करता है। उच्च आकार निर्दिष्ट करने से कोई ओवरहेड नहीं है, यह सब एक टोपी सेट है, अपने आप को गलती से अपने सभी रैम का उपयोग करने और सिस्टम को मारने से बचाने के लिए।
sourcejedi

20

लिनक्स रैम का उपयोग करने में बहुत कुशल है। थोड़ा आश्चर्य होता है कि आप किसी भी स्पीडअप के साथ देखते हैं tmpfs। मेमोरी में पढ़ने के लिए सबसे बड़े टुकड़े (और इस तरह प्रक्रिया को धीमा करने में सक्षम) उपकरण (कंपाइलर, कोडांतरक, लिंकर) हैं, और एक लंबे समय में makeवे स्टार्टअप में मेमोरी में लोड हो जाएंगे और इसे कभी नहीं छोड़ेंगे। जो कुछ बचा है वह स्रोत में पढ़ रहा है (परिणामों से बाहर लेखन आपको धीमा नहीं करेगा, जब तक कि गंभीर रूप से स्मृति बाधित न हो)। फिर से, कॉमोन हेडर फाइलें आसपास रहेंगी, केवल उपयोगकर्ता के स्रोत को पढ़ने की आवश्यकता होगी। और यह कुछ मेगाबाइट से अधिक होने की संभावना नहीं है। एक बड़ी रैमडिस्क (या यहां तक ​​कि बहुत अधिक उपयोग tmpfs) बनाने से बहुत अच्छी तरह से चीजें धीमी हो सकती हैं (बिल्ड मेमोरी को बाधित करके, रैमडिस्क पर या उस पर फ़ाइलों को tmpfs नहीं बनाया जा सकता है) वहाँ से सीधे इस्तेमाल किया जा सकता है)।


1
क्या! उन्हें सीधे वहां से कैसे इस्तेमाल नहीं किया जा सकता है?
काज़ार्क

वे रैम में हैं, लेकिन एक प्रारूप में नहीं है जो सीधे उपयोग करने योग्य है।
वॉनब्रांड

2
वास्तव में! ऐसा कैसे? (मेरे
धीरज को

8
@Kazark, मेमोरी को निष्पादित करने के लिए विशेष डेटा संरचनाओं का उपयोग किया जाता है। चूंकि RAMDisks और tmpfsनिष्पादन योग्य वस्तुओं को संग्रहीत करने के लिए सामान्य उपयोग में नहीं हैं (RAMdisks अच्छे पुराने दिनों के उत्कृष्ट धीमी गति से फ्लॉपी डिस्क के अवशेष हैं और इस तरह, tmpfsसख्त अस्थायी डेटा के लिए है), किसी ने भी आवश्यक बदसूरत हैक को जोड़ने के लिए पर्याप्त महत्वपूर्ण नहीं माना है।
वॉनब्रांड

7
मैंने एक tmpfs (RAM) फाइल सिस्टम से अपना रेल कोड चलाने की कोशिश की है, और मुझे इससे कोई फ़र्क नहीं पड़ा। मैं वास्तव में एक ध्यान देने योग्य अंतर की उम्मीद कर रहा था लेकिन मैं इस बात से निराश था कि लिनक्स कितना शानदार है।
खाजा मिनहाजुद्दीन

6

समस्या यह है कि रैमडिस्क का अधिकतम आकार, विशेष रूप से मेमोरी के आकार का, जिसे रैमडिस्क ड्राइवर के माध्यम से एक्सेस किया जा सकता है, को कंपाइलटाइम में कॉन्फ़िगर किया गया है, बूटटाइम पर ओवरराइट किया जा सकता है, लेकिन कर्नेल मेमोरी में लोड होने के बाद निश्चित रहता है। डिफ़ॉल्ट मान शायद मेगाबाइट में मापा जाता है। अगर मुझे सही ढंग से याद है कि ड्राइवर के लोड होने पर रैमडिस्क के लिए मेमोरी सही आरक्षित है, तो सभी रैमडिस्क समान आकार के हैं और डिफ़ॉल्ट रूप से कुछ 16 रैमडिस्क हैं। तो आप भी नहीं चाहते 16g :-) का एक रैमडिस्क आकार

जैसा कि अन्य उत्तर में कहा गया है, tmpfs वह है जिसका आप उपयोग करना चाहते हैं। इसके अलावा, आप अपने पूरे OS को रैमडिस्क / tmpfs में नहीं जीतेंगे। बस एक tmpfs के लिए अपने builddir कॉपी और फिर अपने संकलन करते हैं। आपको यह सुनिश्चित करना पड़ सकता है कि सभी अस्थायी परिणाम tmpfs में किसी स्थान पर लिखे गए हों।


वे वास्तव में किसी भी स्मृति का उपयोग नहीं करते हैं जब तक आप उन्हें चीजें नहीं लिखते हैं। बूट समय सीमा केवल सीमा है। एक भरने के बाद भी आप मेमोरी को वापस खाली कर सकते हैं blockdev --flushbufs
psusi

@psusi: क्या आप हमें उस पर अधिक जानकारी दे सकते हैं? मैं केवल उन बयानों का उल्लेख कर सकता हूं जो एक बार दावा किया जाता है कि रैमडिस्क मेमोरी कभी भी पुनः प्राप्त नहीं होती है, जैसे Documentation/blockdev/ramdisk.txtकर्नेल स्रोतों में। और मेरे जवाब पर: वह फ़ाइल यह भी कहती है कि रैमडिस्क बढ़ता है क्योंकि मेमोरी खपत होती है इसलिए यह एक बार में आवंटित नहीं किया जाता है।
बनगुंगिन

किस तरह की जानकारी? आप कमांड चलाते हैं और यह राम को मुक्त करता है, यह मानते हुए कि आपने अभी भी इसे किसी भी तरह से माउंट नहीं किया है।
Psusi

आप कैसे जानते हैं कि कमांड जो कहता है, वह करता है। इसका मैन पेज इस बात की पुष्टि नहीं करता है और कर्नेल सोर्स ट्री में प्रलेखन को आपकी जानकारी के विपरीत समझा जा सकता है।
बनंगुइन

6
मैंने स्रोत कोड पढ़ा, और इसे आज़माकर सत्यापित किया।
Psusi

3

बूट के बाद एक बड़ी रैम डिस्क बनाने के लिए, कर्नेल मापदंडों के साथ कोई गड़बड़ नहीं है, यह काम करने लगता है। Tmpfs का प्रयोग करें, एक फाइल बनाएं, इसे लूप के माध्यम से माउंट करें, और एक फाइल सिस्टम के माध्यम से माउंट करें:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

संभवतः कई अलग-अलग परतों के माध्यम से प्रदर्शन जुर्माना का एक सा ... लेकिन कम से कम यह काम करता है।


3

इसके अलावा tmpfsऔर ramfs, एक और विकल्प है /dev/ram0ब्लॉक युक्ति। हाल के उबंटू संस्करणों पर, यह डिवाइस डिफ़ॉल्ट रूप से मौजूद नहीं है, लेकिन इसके माध्यम से बनाया जा सकता है modprobe brd

यह दृष्टिकोण अधिक अनुमानित है क्योंकि यह एक वास्तविक ext4फाइल सिस्टम बनाता है और आपके द्वारा निर्दिष्ट सीमा से अधिक नहीं होता है। लेकिन यह स्थापित करने के लिए अधिक कदम उठाता है, और कम कुशलता से रैम का उपयोग करता है।

Brd कर्नेल मॉड्यूल का उपयोग करना (/ dev / ram0)

4GB RAM डिस्क बनाने और शुरू करने के लिए:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nrपैरामीटर निर्दिष्ट करता है कि कितने रैम डिस्क बनाने के लिए (डिफ़ॉल्ट रूप से, यह 16 बनाता है, यानी /dev/ram0के माध्यम से /dev/ram15)। rd_sizeपैरामीटर में आकार है किलोबाइट$(( ... ))वाक्य रचना आप खोल में गणित काम करने दिया।

रैम डिस्क से निपटने के लिए, इसे अनमाउंट करें और brdकर्नेल मॉड्यूल को हटा दें :

umount /ramdisk
modprobe -r brd

अंदर एक ब्लॉक डिवाइस बनाना ramfs

वैकल्पिक रूप से, आप अंदर एक ब्लॉक डिवाइस बना सकते हैं ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncateआदेश पर मांग दिए गए आकार ऐसी है कि वह आरंभ नहीं हो जाता की एक खाली फ़ाइल (यानी खपत स्मृति) पैदा करता है।

रैम डिस्क से निपटने के लिए, इसे umount करें और डिस्क छवि को हटा दें:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

के साथ तुलना tmpfsऔरramfs

हालांकि tmpfsऔर ramfsएक ब्लॉक डिवाइस का उपयोग कर से अधिक प्रभावी हैं, कृपया नीचे उनकी कमियां हैं।

tmpfsडिस्क पर स्वैप कर सकते हैं। यह अधिक कुशल है, लेकिन ऐसा समय हो सकता है जब आप एक शुद्ध रैम डिस्क चाहते हैं:

  • आप जिन फ़ाइलों के साथ काम कर रहे हैं वे संवेदनशील हैं (जैसे एन्क्रिप्टेड पार्टीशन से फ़ाइलें)।
  • आप प्रदर्शन परीक्षण कर रहे हैं और आप डिस्क I / O को एक कारक नहीं बनाना चाहते हैं (SSD लिखना समय बहुत भिन्न हो सकता है)।
  • आप एक बड़ी फ़ाइल खोल रहे हैं और आप अपना SSD नहीं पहनना चाहते हैं।

ramfsसेट करना आसान है, फ़ाइलों को हटाने के बाद एक बार फिर से स्पेस दें और रैम का अधिक कुशलता से उपयोग करें (सिस्टम फ़ाइलों को बफर नहीं करता है क्योंकि यह जानता है कि वे रैम में हैं)। लेकिन इसके अपने डाउनसाइड्स और आश्चर्य हैं:

  • dfउपयोगिता स्थान उपयोग रिपोर्ट नहीं करता:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • कोई आकार सीमा पैरामीटर नहीं है। यदि आप रैमडिस्क में बहुत अधिक डालते हैं, तो आपका सिस्टम लटका रहेगा।

  • जब आप कम से कम इसकी उम्मीद करते हैं तो स्पार्स फाइलें असुरक्षित हो सकती हैं। आज सुबह, मैंने एक वीएम छवि (150 जी, लेकिन डिस्क पर उपयोग किए जाने वाले 49 जी) की नकल की ramfs(मेरे पास 128 जी रैम है)। वह काम किया। लेकिन जब मैं कॉपी किया सेramfs गंतव्य के लिए, अपने सिस्टम अनुत्तरदायी बन गया। cpउपयोगिता जाहिरा तौर पर छेद भरा पढ़ा है, लेकिन लिखने पर नहीं।

दोनों tmpfsऔर ramfsएक वास्तविक तुलना में अलग तरह व्यवहार कर सकता है ext4फाइल सिस्टम। रैम में एक ब्लॉक डिवाइस बनाना और इसे इससे ext4बचना।

अधिक गहराई से तुलना के लिए: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

ओपी की मात्रा एमबी में व्यक्त की जाती है। तो आप सभी को वहाँ प्रवेश करने की आवश्यकता है 16384. और फिर वॉइला आप व्यवसाय में होंगे।


1
नहीं। "यदि एफएस-आकार में एक प्रत्यय नहीं है, तो इसकी व्याख्या दो-दो किलोबाइट के रूप में की जाती है।" - मर्दmkfs.ext2
sourcejedi

1

आप एक ramfsफ़ाइल सिस्टम को माउंट कर सकते हैं , अपनी परियोजना को उसमें कॉपी कर सकते हैं और वहां से काम कर सकते हैं। यह गारंटी देता है कि आपकी इनपुट फ़ाइलें RAM में लोड की गई हैं, और वे बहुत धीमी डिस्क ड्राइव से फिर से नहीं पढ़ी जाएंगी। हालाँकि जैसा कि आपने खोजा, यह आमतौर पर एक उपयोगी रणनीति नहीं है। आपको पहले से ही सटीक लाभ मिलता है।

रैमफ्स एक बहुत ही सरल फाइलसिस्टम है जो लिनक्स के डिस्क कैशिंग मैकेनिज्म (पेज कैशे और डेंट्री कैशे) को डायनामिक रूप से रिसाइबल रैम-आधारित फाइल सिस्टम के रूप में निर्यात करता है ।

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

आप पहले से ही भरोसा कर सकते हैं कि आपकी इनपुट फाइलें रैम में कैश्ड हैं, पहली बार जब वे पढ़े जाते हैं। आपकी आउटपुट फाइलें भी कैश की गई हैं, ताकि आप उन्हें डिस्क पर लिखे जाने का इंतजार न करें।

आप कितना कैश कर सकते हैं, इस पर कोई कृत्रिम सीमा नहीं है, यह कितनी देर तक कैश्ड रहता है, आदि जैसे ही आप रैम भरते हैं, तो कैश केवल गिराया जाना शुरू हो जाता है। किस कैश को सबसे पहले गिराया जाता है, इसे बहुत विस्तृत एल्गोरिदम द्वारा चुना जाता है। पहला सन्निकटन, क्या हम इसे कम से कम हाल ही में प्रयुक्त के रूप में वर्णित करते हैं। देखें क्या पेज प्रतिस्थापन एल्गोरिदम ओएस फ़ाइल कैश के लिए लिनक्स कर्नेल में उपयोग किया जाता है?

ध्यान दें कि आपका पाठ संपादक fsync()डिस्क पर फ़ाइलों को स्पष्ट रूप से सहेजेगा।

यदि आप किसी ऐसे प्रोग्राम का परीक्षण चलाते हैं fsync(), जिसमें फाइल सिस्टम में इन्हें चलाना जैसे ramfsगति प्रदान करता है। एक और रणनीति है / के fsync()साथ प्रयास करें और अक्षम करें ।eatmydatanosync.so

कुछ अन्य ऑपरेटिंग सिस्टम में विशिष्ट सीमाएँ हो सकती हैं, जिन्हें रैमडिस्क का उपयोग करके बाईपास किया जा सकता है। एक छोर पर, किसी भी फ़ाइल कैशिंग की कमी यही है कि डॉस पर रामदिस्क लोकप्रिय थे ।

tmpfs

tmpfsउसी के रूप में काम करता है ramfs, सिवाय इसके कि अगर आपके पास एक है तो यह स्वैप स्पेस का उपयोग कर सकता है। यानी अगर आपको किसी और चीज के लिए RAM की जरूरत है, तो Least हाल ही में उपयोग किए गए एल्गोरिदम tmpfs से डेटा ब्लॉक का चयन कर सकते हैं और उन्हें डिस्क पर स्वैप कर सकते हैं।

अधिकांश लोग इसके साथ चिपके रहते हैं tmpfs, क्योंकि यह आपको कुल आकार को सीमित करने देता है, और dfकमांड में सही ढंग से उपयोग की गई जगह दिखाता है । मुझे यकीन नहीं है कि यह अंतर क्यों मौजूद है। आकार की सीमा tmpfsआपको गलती से आपके पूरे रैम को भरने और मूल रूप से आपके सिस्टम को मारने से बचाती है। यह आपके रैम के आधे हिस्से को डिफॉल्ट करता है।

अन्य कारणों से लिखना धीमा हो सकता है

उपरोक्त एक सरलीकरण है जो आपके मामले के अनुरूप है। आपके मामले में फ़ाइलों को लिखने के लिए डिस्क की प्रतीक्षा करने की आवश्यकता नहीं होनी चाहिए। हालाँकि लिखने के कुछ मामले हैं जो करते हैं। उत्कृष्ट ब्लॉग पोस्ट देखें क्यों बफ़र किए गए लेखन कभी-कभी रुक जाते हैं । सबसे आश्चर्यचकित करने वाला मामला लिनक्स के लिए एक हालिया बदलाव है जिसे "स्थिर पृष्ठ लिखते हैं"।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.