लिनक्स सिस्टम पर जल्दी से एक बड़ी फाइल बनाएं


438

मैं कैसे कर सकते हैं जल्दी से एक लिनक्स (पर एक बड़ी फ़ाइल बनाने के रेड हैट लिनक्स ) प्रणाली?

dd काम करेगा, लेकिन /dev/zeroड्राइव से पढ़ना और लिखना आपको एक लंबा समय लग सकता है जब आपको परीक्षण के लिए आकार में कई सैकड़ों GB की फ़ाइल चाहिए ... यदि आपको बार-बार ऐसा करने की आवश्यकता है, तो समय वास्तव में बढ़ जाता है।

मैं फ़ाइल की सामग्री के बारे में परवाह नहीं करता, मैं बस इसे जल्दी से बनाना चाहता हूं। यह कैसे किया जा सकता है?

एक विरल फ़ाइल का उपयोग इसके लिए काम नहीं करेगा। मुझे डिस्क स्थान आवंटित करने के लिए फ़ाइल की आवश्यकता है।


1
एक्सट 4 में बहुत बेहतर फ़ाइल आवंटन प्रदर्शन है, क्योंकि 100 एमबी तक के पूरे ब्लॉक एक ही बार में आवंटित किए जा सकते हैं।
मार्टिनेस

5
'ट्रंकट' कमांड एक विरल फ़ाइल बनाता है, वैसे। उदा। En.wikipedia.org/wiki/Sparse_file
जेसन ड्रू

2
लोगों को लगता है कि उनकी छटपटाहट और dd नीचे की तलाश के साथ "विरल फ़ाइल इस से काम नहीं चलेगी" को अनदेखा कर रही है।
hpavc

1
आपको परिभाषित करना चाहिए कि "परीक्षण के लिए" से आपका क्या मतलब है। अपनी हार्ड डिस्क की लेखन गति का परीक्षण? परीक्षण क्या dfरिपोर्ट करेगा? एक ऐप का परीक्षण करना जो कुछ विशेष करता है। उत्तर इस बात पर निर्भर करता है कि आप क्या परीक्षण करना चाहते हैं। वैसे भी मुझे थोड़ी देर हो गई है - अब मैं देख रहा हूं कि आपके प्रश्न के कई साल हो चुके हैं :-)
ndemou

1
बस अगर आप एक पूर्ण विभाजन का अनुकरण करने का एक तरीका ढूंढ रहे हैं, जैसे मैं था, तो / देव / पूर्ण
जूलियन

जवाबों:


509

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

उदाहरण के लिए:

fallocate -l 10G gentoo_root.img

5
क्या यह संभव है कि dd आंतरिक रूप से पहले से ही उपयोग कर रहा है? अगर मैं 3.0.0 कर्नेल पर 'dd if = = dev / शून्य = zerofile bs = 1G count = 1' करता हूं, तो लेखन 2 सेकंड में समाप्त हो जाता है, जिसमें 500 मेगाबाइट प्रति सेकंड से अधिक की डेटा दर होती है। 2.5 "लैपटॉप हार्डड्राइव पर यह स्पष्ट रूप से असंभव है।
lxgr

21
fallocateवास्तव में मैं क्या देख रहा था।
एबी

7
यह ( fallocate) लिनक्स ZFS फाइलसिस्टम पर भी काम नहीं करेगा - github.com/zfsonlinux/zfs/issues/326
Joe

5
fallocate ext3 द्वारा समर्थित नहीं है। Bugzilla.redhat.com/show_bug.cgi?id=563492
एडी

3
डेबियन GNU / लिनक्स पैकेज fallocateका हिस्सा है util-linux। यह टूल रेडहैट से करेल ज़क द्वारा लिखा गया था और स्रोत कोड यहां पाया जा सकता है: k गिरी
Franta

295

यह एक सामान्य प्रश्न है - विशेष रूप से आज के आभासी वातावरण में। दुर्भाग्य से, उत्तर उतना सीधा नहीं है जितना कि कोई मान सकता है।

dd स्पष्ट पहली पसंद है, लेकिन dd अनिवार्य रूप से एक प्रति है और यह आपको डेटा के प्रत्येक ब्लॉक को लिखने के लिए मजबूर करता है (इस प्रकार, फ़ाइल सामग्री को इनिशियलाइज़ करता है) ... और यह कि इनिशियलाइज़ेशन में कितना I / O समय लगता है। (इसे और भी अधिक समय लेना चाहते हैं? / Dev / शून्य के बजाय / dev / random का उपयोग करें ! तब आप CPU के साथ-साथ / O समय का भी उपयोग करेंगे!) हालांकि, अंत में dd एक खराब विकल्प है (हालाँकि अनिवार्य रूप से) VM "डिफ़ॉल्ट" GUIs द्वारा उपयोग किया जाता है। उदाहरण के लिए:

dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G

truncate एक और विकल्प है - और संभवतः सबसे तेज़ है ... लेकिन ऐसा इसलिए है क्योंकि यह एक "विरल फ़ाइल" बनाता है। अनिवार्य रूप से, एक विरल फ़ाइल डिस्क का एक भाग होता है जिसमें बहुत सारे समान डेटा होते हैं, और अंतर्निहित फाइल सिस्टम वास्तव में सभी डेटा को संग्रहीत नहीं करता है, लेकिन सिर्फ "दिखावा" करता है कि यह सब वहां है। इस प्रकार, जब आप अपने वीएम के लिए 20 जीबी ड्राइव बनाने के लिए ट्रंकट का उपयोग करते हैं, तो फाइलसिस्टम वास्तव में 20 जीबी आवंटित नहीं करता है, लेकिन यह धोखा देता है और कहता है कि वहां 20 जीबी शून्य हैं, भले ही डिस्क पर एक ट्रैक जितना कम हो वास्तव में (वास्तव में) उपयोग में हो सकता है। उदाहरण के लिए:

 truncate -s 10G gentoo_root.img

fallocate है और - अंतिम सबसे अच्छा - पसंद है, क्योंकि यह अनिवार्य रूप से "भंडार" (या "आबंटित करता है" अंतरिक्ष आप कर रहे हैं की मांग के सभी है, लेकिन यह कुछ भी लिखने के लिए परेशान नहीं करता है तो, वीएम डिस्क आवंटन साथ प्रयोग के लिए। जब आप 20 जीबी वर्चुअल ड्राइव स्पेस बनाने के लिए फालोकेट का उपयोग करते हैं, तो आपको वास्तव में एक 20 जीबी फ़ाइल मिलती है (न कि "स्पार्स फाइल", और आपने इसे कुछ भी लिखने के लिए परेशान नहीं किया होगा - जिसका अर्थ है कि वास्तव में कुछ भी हो सकता है। वहाँ - एक ब्रांड नई डिस्क की तरह!) जैसे:

fallocate -l 10G gentoo_root.img

4
truncateजेएफएस पर +1 कार्यात्मक है; fallocate, इतना नहीं। एक बिंदु: आप संख्या में एक दशमलव शामिल नहीं कर सकते, मुझे निर्दिष्ट करने की आवश्यकता है 1536G, नहीं 1.5T
कैल्रियन

1
मेरी के अनुसार fallocateआदमी पेज, यह केवल पर समर्थित है btrfs, ext4, ocfs2, और xfsफ़ाइल सिस्टम
नाथन एस वाटसन-हैग

नोट swaponदुर्भाग्य से पूर्व-आवंटित extents पर काम नहीं करता है, पिछले मैंने जाँच की थी। XFS मेलिंग सूची में कुछ चर्चा थी कि पुराने फ्रीस्पेस डेटा को उजागर करने के लिए एक फैलोकेट विकल्प होने के बारे में और उपदेश के रूप में चिह्नित सीमा नहीं है, इसलिए स्वैप काम करेगा। लेकिन मुझे नहीं लगता कि कभी कुछ किया गया था।
पीटर कॉर्ड्स

1
FYI करें, बहुत अधिक डेटा पढ़ने की कोशिश करने से /dev/randomपरिणामी डेटा बाहर निकल सकता है, और "जब एंट्रॉपी पूल खाली होता है, तब से / देव / यादृच्छिक से पढ़ता है जब तक अतिरिक्त पर्यावरणीय शोर इकट्ठा नहीं होता है" तो यह बहुत अधिक लग सकता है बहुत लंबे समय
Xen2050

154

लिनक्स और सभी फाइल सिस्टम

xfs_mkfile 10240m 10Gigfile

लिनक्स और कुछ filesystems (ext4, xfs, btrfs और ocfs2)

fallocate -l 10G 10Gigfile

ओएस एक्स, सोलारिस, सनोस और शायद अन्य यूनिक्स

mkfile 10240m 10Gigfile

HP-UX

prealloc 10Gigfile 10737418240

व्याख्या

mkfile <size>विकल्प के रूप में myfile का प्रयास करें dd। साथ -nविकल्प आकार का उल्लेख किया जाता है, लेकिन डिस्क ब्लॉक आवंटित नहीं किया जाता जब तक डेटा उन्हें लिखा है। -nविकल्प के बिना , स्थान शून्य-भरा है, जिसका अर्थ है डिस्क पर लिखना, जिसका अर्थ है समय लेना।

mkfile SunOS से ली गई है और हर जगह उपलब्ध नहीं है। अधिकांश लिनक्स सिस्टम में xfs_mkfileठीक उसी तरह से काम होता है, न कि नाम के बावजूद सिर्फ XFS फाइल सिस्टम पर। यह xfsprogs (डेबियन / उबंटू के लिए) या इसी तरह के नामित पैकेजों में शामिल है।

अधिकांश लिनक्स सिस्टम भी हैं fallocate , जो केवल कुछ फाइल सिस्टम (जैसे कि btrfs, ext4, ocfs2, और xfs) पर काम करता है, लेकिन यह सबसे तेज़ है, क्योंकि यह सभी फ़ाइल स्थान आवंटित करता है (गैर-छिद्रयुक्त फ़ाइलें बनाता है) लेकिन किसी भी फ़ाइल को प्रारंभ नहीं करता है इसका।


5
यह mkfile कहाँ है जो आप बोलते हैं, अजनबी? यह डिफ़ॉल्ट आरएचईएल इंस्टॉल में नहीं है।
पैक्सिडाब्लो

2
यह एक सोलारिस उपयोगिता है। यदि आप gpl mkfile के लिए खोज करते हैं तो आपको कुछ स्रोत कोड उदाहरण मिलेंगे।
मार्टिन बेकेट

5
OS X पर एक आकर्षण के रूप में काम करता है:mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
Volker Rose

2
xfs_mkfileUbuntu पर xfsprogs में शामिल है और मेरे ext3 fs पर एक आकर्षण की तरह काम करता है। :)
ग्रेग डबकी

97
truncate -s 10M output.file

तुरंत एक 10 M फ़ाइल बनाएगा (M 1024 * 1024 बाइट्स के लिए खड़ा है, MB 1000 * 1000 के लिए है - K, KB, G, GB ... के साथ)

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

इसलिए, ऐसा करते समय, आप फ़ाइल के एक्सेस तक भौतिक आवंटन को स्थगित कर देंगे। यदि आप इस फ़ाइल को मेमोरी में मैप कर रहे हैं, तो आपके पास अपेक्षित प्रदर्शन नहीं हो सकता है।

लेकिन यह जानना अभी भी एक उपयोगी आदेश है


1
यह कोशिश की, लेकिन यह उपलब्ध डिस्क स्थान को प्रभावित नहीं करता है। क्योंकि यह एक विरल फ़ाइल है जैसा कि पहले बताया गया है।
ग्रिंगो ने

7
यह शीर्ष उत्तर नहीं होना चाहिए क्योंकि यह समस्या को हल नहीं करता है, fallocateनीचे दिया गया उत्तर है।
ग्रिंगो ने 3

4
@GringoSuave लेकिन यह अभी भी कुछ लोगों के लिए उपयोगी है जिनके पास समान-लेकिन-थोड़ी-अलग समस्या हो सकती है।
AJMansfield

@GringoSuave: यह अनुरोध के रूप में एक बड़ी फ़ाइल बनाता है, यह समस्या का समाधान क्यों नहीं करता है? इसके अलावा फालोकेट जवाब के तहत नोट हैं कि यह ज्यादातर मामलों में भी काम नहीं करता है।
पावेल Paमरदा

1
जब उन्होंने कहा कि काम नहीं करेगा विरल फाइलें बनाने का सुझाव क्यों?
hpavc

44

जहाँ आप उस फ़ाइल का आकार चाहते हैं जो आप बाइट्स में चाहते हैं - 1।

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575

6
मुझे यह दृष्टिकोण पसंद है, लेकिन टिप्पणीकार किसी कारण से विरल फ़ाइल नहीं चाहता है। :(
महामहिम

3
dd if = / dev / zero of = 1GBfile bs = 1000 count = 1000000
डेमियन

7
dd if = / dev / zero of = 01GBfile bs = 1024 count = $ ((1024 * 1024))
जेवियर डेकोरेट

1
विरल फ़ाइलों के लिए, truncateबहुत बेहतर लगता है।
पावेल Paमेरदा

36

उदाहरण जहाँ आप चाहते हैं फ़ाइल का आकार बाइट्स में है

#kilobytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200K

#megabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200M

#gigabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200G

#terabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200T


Dd manpage से:

BLOCKS और BYTES का अनुसरण निम्न गुणात्मक प्रत्ययों द्वारा किया जा सकता है: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, GB = 1000/1000 * 1000, जी = 1024 * 1024 * 1024, और इतने पर टी, पी, ई, जेड, वाई।


यह n-1 तरीके से बहुत बेहतर है , इसलिए यह मूल रूप से इसके बराबर है truncate
पावेल Paमरदा


18

मुझे लिनक्स के बारे में पूरी जानकारी नहीं है, लेकिन यहां सी कोड मैंने कई साल पहले डीसी शेयर पर नकली बड़ी फाइलें लिखी थीं।

#include < stdio.h >
#include < stdlib.h >

int main() {
    int i;
    FILE *fp;

    fp=fopen("bigfakefile.txt","w");

    for(i=0;i<(1024*1024);i++) {
        fseek(fp,(1024*1024),SEEK_CUR);
        fprintf(fp,"C");
    }
}

सी। में बेहतर दृष्टिकोण होना चाहिए। आपको फ़ाइल बंद करने की भी आवश्यकता है। एक बार में 1 चार्ट लिखने पर एक लाख ...
ACV

10

आप "हाँ" कमांड का भी उपयोग कर सकते हैं। वाक्य रचना काफी सरल है:

#yes >> myfile

इसे रोकने के लिए "Ctrl + C" दबाएं, अन्यथा यह आपके सभी उपलब्ध स्थान को खा जाएगा।

इस फ़ाइल को चलाने के लिए साफ़ करें:

#>myfile

इस फ़ाइल को साफ करेगा।


7

मुझे नहीं लगता कि आप dd की तुलना में बहुत तेज़ हो रहे हैं। अड़चन डिस्क है; यह करने के लिए सैकड़ों GB डेटा लिखने से आपको कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं।

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

यदि आपके एप्लिकेशन को फ़ाइल को एक निश्चित आकार की आवश्यकता है, तो यह बाहरी प्रोग्राम पर निर्भर रहेगा कि "फाइल" में कहां है और "एंड" पहुंचने पर एक ईओएफ भेजें।


4

एक दृष्टिकोण: यदि आप असंबंधित अनुप्रयोगों की गारंटी दे सकते हैं तो वे परस्पर विरोधी तरीके से फ़ाइलों का उपयोग नहीं करेंगे, बस एक विशिष्ट निर्देशिका में अलग-अलग आकारों की फ़ाइलों का एक पूल बनाएं, फिर ज़रूरत पड़ने पर उनसे लिंक बनाएँ।

उदाहरण के लिए, फ़ाइलों का एक पूल है:

  • / घर / bigfiles / 512 एम-ए
  • / घर / bigfiles / 512 एम बी
  • / घर / bigfiles / 1024M-ए
  • / घर / bigfiles / 1024M-बी

फिर, यदि आपके पास एक एप्लिकेशन है जिसे 1G फ़ाइल की आवश्यकता है जिसे / home / oracle / logfile कहा जाता है, तो एक " ln /home/bigfiles/1024M-A /home/oracle/logfile" निष्पादित करें ।

यदि यह एक अलग फाइल सिस्टम पर है, तो आपको एक प्रतीकात्मक लिंक का उपयोग करना होगा।

ए / बी / आदि फ़ाइलों का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि असंबंधित अनुप्रयोगों के बीच कोई परस्पर विरोधी उपयोग नहीं है।

लिंक ऑपरेशन के बारे में उपवास के रूप में आप प्राप्त कर सकते हैं।


आपके पास एक छोटा पूल या बड़ा पूल हो सकता है, यह आपकी पसंद है। आपको वैसे भी कम से कम एक फ़ाइल की आवश्यकता होने वाली थी, क्योंकि प्रश्नकर्ता ने जो पूछा था। यदि आपके पूल में एक फ़ाइल है, तो आप कुछ भी नहीं खोते हैं। यदि आपके पास डिस्क के बकेटलोड हैं (और आपको इसकी कम कीमत दी जानी चाहिए), तो कोई समस्या नहीं है।
पैक्सडीब्लो

3

GPL mkfile dd के चारों ओर एक (ba) श स्क्रिप्ट आवरण है; बीएसडी का mkfile गैर-शून्य के साथ एक बफर को याद करता है और इसे बार-बार लिखता है। मैं उम्मीद नहीं करूंगा कि पूर्व में आउट-डी.डी. उत्तरार्द्ध dd को बाहर निकाल सकता है यदि = / dev / शून्य थोड़ा सा क्योंकि यह रीड्स को छोड़ देता है, लेकिन कुछ भी जो काफी बेहतर करता है वह शायद केवल एक विरल फ़ाइल बना रहा है।

एक सिस्टम कॉल को अनुपस्थित करें जो वास्तव में डेटा लिखे बिना फ़ाइल के लिए स्थान आवंटित करता है (और लिनक्स और बीएसडी के पास इसकी कमी है, शायद सोलारिस भी) आपको फ़ाइल का विस्तार करने के लिए ftrunc (2) / truncate (1) का उपयोग करके प्रदर्शन में एक छोटा सुधार मिल सकता है इच्छित आकार में, फ़ाइल को मेमोरी में मिमीप करें, फिर प्रत्येक डिस्क ब्लॉक के पहले बाइट्स में गैर-शून्य डेटा लिखें (डिस्क ब्लॉक आकार को खोजने के लिए fgetconf का उपयोग करें)।


4
बीएसडी और लिनक्स वास्तव में फैल गए हैं (संपादित करें: यह अब POSIX है और व्यापक रूप से उपलब्ध है)।
तोबू

3

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

Https://github.com/s5k6/otffs देखें ।


3

यह सबसे तेज है जो मैं कर सकता हूं (जो तेज नहीं है) निम्नलिखित बाधाओं के साथ:

  • बड़ी फ़ाइल का लक्ष्य एक डिस्क को भरना है, इसलिए इसे संपीड़ित नहीं किया जा सकता है।
  • Ext3 फाइलसिस्टम का उपयोग करना। ( fallocateउपलब्ध नहीं)

यह इसका सार है ...

// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
    buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
   fwrite(buf, sizeof(int32_t), 256, file);
}

हमारे मामले में यह एक एम्बेडेड लिनक्स सिस्टम के लिए है और यह काफी अच्छी तरह से काम करता है, लेकिन तेजी से कुछ पसंद करेगा।

FYI करें कमान dd if=/dev/urandom of=outputfile bs=1024 count = XXइतनी धीमी थी कि अनुपयोगी हो गई।

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