एसडी कार्ड पर क्या है (लेकिन मूल एक के रूप में कॉम्पैक्ट) से एक छवि (.img) कैसे बनाएं?


20

मैंने कोशिश की:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

यह 7.6 जीबी (कार्ड आकार, कार्ड में क्या है, इसकी एमबी 700 एमबी है) के साथ एक .img फ़ाइल बनाता है।

तथा:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

2.7 जीबी के साथ एक .gz फ़ाइल बनाता है।

मूल Raspbian ( डेबियन 7 से (खरखरा)) http://www.raspberrypi.org/downloads 494.44 MiB है।

एसडी कार्ड पर क्या है, मैं आकार में समान छवि कैसे बना सकता हूं?

(मैं उबंटू पर हूं।)


raspberrypi.stackexchange.com/questions/311/… यह मदद नहीं की
mf_

जवाबों:


18

आप RooTer के लिए एक टिप्पणी में उल्लेख करते हैं कि ए) आपने प्रारंभिक विभाजन आकार को कम कर दिया है gparted, लेकिन फिर ddभी पूरे कार्ड की प्रतिलिपि बनाता है, और बी) जिसे आप छवि में दोनों विभाजन शामिल करना चाहते हैं।

समस्या "ए" की व्याख्या करना आसान है: आप अभी भी पूरे कार्ड की नकल कर रहे हैं, क्योंकि यही /dev/mmcblk0संदर्भित है। व्यक्तिगत विभाजन निश्चित रूप से /dev/mmcblk0p1और हैं /dev/mmcblk0p2। यह "बी" समस्या में जटिलता है, लेकिन आप ddप्रत्येक विभाजन को बस नहीं कर सकते हैं और दो फाइलों को एक साथ जोड़ सकते हैं, क्योंकि विभाजन की शुरुआत में विभाजन की तालिका /dev/mmcblk0 और प्रत्येक विभाजन की लंबाई को अनुक्रमित करता है। उसके बिना, छवि अनुपयोगी होगी।

हालाँकि, आप प्रत्येक विभाजन की लंबाई प्राप्त कर सकते हैं fdisk -l, और इसका उपयोग करने के लिए कुछ मापदंडों को निर्धारित कर सकते हैं dd। उदाहरण के लिए:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

"स्टार्ट" और "एंड" इकाइयाँ सेक्टर हैं, और नोटिस करें कि सेक्टर का आकार दिया गया है, 512 बाइट्स। के लिए /dev/mmcblk0p2, 26746879 (पिछले क्षेत्र) - 122,880 (पहले सेक्टर) = 26623999/2 (kB प्रति 2 क्षेत्रों के लिए) / 1024 (एमबी प्रति kB) / 1024 (जीबी प्रति एमबी) = 12.69 है, जो मैं GParted का उपयोग कर विभाजन बढ़ी 12 जीबी तक, इसलिए यह सही लगता है (वास्तव में मुझे 1000 का उपयोग करना चाहिए और भंडारण के साथ भाजक के रूप में 1024 का नहीं होना चाहिए, जो कि 13.31 जीबी तक काम करता है, लेकिन मुझे संदेह है कि gparted है और कुछ अन्य उपकरण भी 1024 का उपयोग करते हैं)।

तो पहली बात यह है कि आप जांचना चाहते हैं कि आपका दूसरा विभाजन वास्तव में छोटा आकार है जिसे आपने इसे सेट किया है। अगला, बस उन नंबरों का उपयोग करें dd; मेरे लिए यह होगा:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

मुझे लगता है कि कैसे ddकाम करता है की एक गलतफहमी से बचने के लिए मुझे एक अतिरिक्त सेक्टर मिला है । यह जाँचने का एक सरल तरीका है कि क्या यह काम करता है:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

ध्यान दें कि यहां थोड़ी विसंगति है: "स्टार्ट" और "एंड" सेक्टर मूल विभाजन तालिका से मेल खाते हैं, लेकिन ऊपर दिए गए आंकड़ों में कुल आकार केवल 102 एमबी है! ऐसा इसलिए है क्योंकि मैंने वास्तव count=200000में परम के रूप में उपयोग किया है क्योंकि मैं वास्तव में dd12 जीबी कॉपी ("कुल 200000 क्षेत्रों" भी नोटिस) के साथ परेशान नहीं करना चाहता था। नीचे दी गई तालिका इसका कारण नहीं बताती है क्योंकि एसडी कार्ड की शुरुआत से छवि की शुरुआत में विभाजन डेटा की प्रतिलिपि बनाई गई डेटा से fdisk को इसकी जानकारी मिल रही है, जो कि, जैसा कि मैंने दूसरे पैराग्राफ में उल्लेख किया है, महत्वपूर्ण है बनाए रखने के लिए। यदि मैंने बाकी चीजों की नकल (ठीक से) की है, तो संख्या मैथुन होगी और छवि व्यवहार्य होगी।

कोशिश करो कि। :)


OSX पर, fdisk स्पष्ट रूप से बाइट्स में सेक्टर आकार को प्रिंट नहीं करता है। इसके बजाय "ज्यामिति: 966/255/63 [15523840 सेक्टर]" सिलेंडर / हेड / सेक्टर का प्रतिनिधित्व करता है। इस मामले में bs और count के कौन से मूल्यों का उपयोग किया जाना चाहिए?
आर्थर हेबर्ट

@ आर्थरहैबर्ट: कुल बाइट्स / कुल सेक्टर। यह ऊपर पहले मामले में उदाहरण के लिए 16138633216/31520768 = 512, में दूसरा +१०,२४,००,००० / 200000 = 512 होगा
गोल्डीलॉक्स

1
आप fdisk -l <device>इंटरेक्टिव मोड में जाए बिना टेबल का उपयोग कर सकते हैं और उसे प्रिंट करना चाहिए।
बर्टो

5

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

आसान समाधान, लेकिन कार्ड पर सभी खाली जगह को फिर से लिखना आवश्यक है। याद रखें कि एसडी कार्ड जीवनकाल पुनर्लेखन की संख्या द्वारा सीमित है, इसलिए यह पसंदीदा तरीका नहीं है।

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

अधिक सम्मिलित समाधान, क्योंकि आपको उस कंप्यूटर पर उस एसडी कार्ड का उपयोग नहीं करने वाले किसी अन्य कंप्यूटर पर ज़ोर्फ्री स्थापित करने की आवश्यकता है ।

zerofree /dev/mmcblk0p2

Http://intgat.tigress.co.uk/rmy/uml/index.html पर अधिक पढ़ने के लिए

आपको जो याद रखना है, वह यह है कि dd / dev / mmcblk0 आप संपूर्ण डिवाइस की प्रतिलिपि बनाते हैं, भले ही विभाजन छोटे हों। यदि आपने उपरोक्त विधियों में से एक को करने से पहले मुख्य विभाजन का विस्तार करने के लिए रस्सिपी-कॉन्फ़िगर का उपयोग किया है तो आप ठीक हो जाएंगे।

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


यह करने की कोशिश करने पर मेरी खोज के हिस्से के रूप में, मैंने sdcard विभाजन को कम करने के लिए gparted का उपयोग किया है केवल मेरे पास मौजूद डेटा को एनकोमोडेट करने के लिए, फिर मैंने dd ing की कोशिश की और परिणाम एक ही 7.6GB फ़ाइल हैं, partimage खिचड़ी भाषा को बचाने के विभाजन (/) बूट + /) 1 छवि में
mf_

शायद मैंने इसे पर्याप्त रूप से स्पष्ट नहीं किया था - जब आप इसे पहले gzip के साथ आज़मा चुके होते हैं, तो इसे कम कर देना चाहिए।
RooTer

इस तरह से कार्ड भरने से लिखने के चक्र का एक पूरा गुच्छा हो जाएगा और कार्ड के जीवनकाल को छोटा कर देगा। कोशिशdd bs=4M if=/dev/zero of=/root/junk
nc4pk

@ टैप-आउट thx, संपादित;)
RooTer

4

संक्षिप्त उत्तर - 2GB SD कार्ड का उपयोग करें।

लंबे उत्तर, ddयह पता नहीं है कि "अच्छा" डेटा कहां समाप्त होता है, आपको इसे किसी तरह बताना होगा।

दो तरीके हैं, 2 जीबी एसडी कार्ड का उपयोग करना सबसे आसान है, यह स्वचालित रूप से 2 जीबी से आगे की नकल करना बंद कर देगा और 500 एमबी संपीड़ित फ़ाइल का परिणाम देगा।

दूसरा तरीका, अधिक जटिल एक शामिल है, आपके विभाजन तालिका से सही डेटा आकार की गणना करना और ddकमांड के मापदंडों के रूप में इस सही आकार को निर्दिष्ट करना है । आप उस उद्देश्य के लिए bs=XXX(ब्लॉक आकार) और count=XXX(ब्लॉक गणना) मापदंडों का उपयोग कर सकते हैं । उदाहरण के लिए, आप bs=10M10 एमबी ब्लॉक आकार के लिए निर्दिष्ट कर सकते हैं (जो कि निश्चित रूप से आपके कमांड में उपयोग किए जाने वाले 4k ब्लॉक आकार की तुलना में बहुत तेज़ी से कॉपी करना होगा) और count=20010 एमबी * 200 = 2000 एमबी (2 जीबी) की प्रतिलिपि बनाने के लिए। आपको अपनी एसडी कार्ड विभाजन योजना के अनुसार ब्लॉक आकार और ब्लॉक गणना को समायोजित करने की आवश्यकता हो सकती है ।


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

@goldilocks क्या होगा अगर मैं sdcard का आकार बदलने के लिए अधिकतम संभव आकार (डेटा केवल) के लिए सभी विभाजनों को कम करने के लिए?
mf_

@goldilocks कृपया, प्रश्न और उत्तर को अधिक ध्यान से पढ़ें, मैं 8GB एसडी कार्ड पर 2GB विभाजन के बारे में बात कर रहा हूं, 8GB विभाजन पर 2GB डेटा के बारे में नहीं, जैसा कि आपकी जंगली कल्पना ने आपको किसी तरह बताया।
लेनिक

1
lenik: हाँ, मैं थोड़ा स्तब्ध हूँ मैंने आपको इस तरह से व्याख्या की, सभी क्षमायाचनाएँ - दुर्भाग्य से जब तक आप पोस्ट को संपादित नहीं करते तब तक मैं अपना पदावनत नहीं कर सकता: / हालाँकि मुझे अभी भी नहीं लगता कि यह उत्तर विशेष रूप से उपयोगी है (कोई अपराध नहीं - - क्योंकि यह बस एक विभाजन को dd'ing नहीं है , ऐसे कैसे करें, फिर से उपयोगी नहीं है पर निर्देश), लेकिन मैं ऐसा करूँगा। @mf_ हां, यह संभव है (? यह काम किया आप मेरा उत्तर पढ़ा जाएगा ...)
गोल्डीलॉक्स

@goldilocks मैं जवाब संपादित किया है। पता नहीं क्यों यह उपयोगी नहीं है, खासकर जब आपने सटीक विवरण दिया, बस अधिक विवरण के साथ।
लेनिक

1

dd - copy and convertआपके द्वारा अनुरोधित कार्य करने के लिए सही उपकरण नहीं है। यह एक निम्न स्तर है, सेक्टर कॉपी (और कन्वर्ट) टूल द्वारा सेक्टर है, जो बूट सेक्टर, फॉर्मेट डिवाइस और सभी प्रकार के निम्न स्तर के कार्यों की नकल करने के लिए बहुत अच्छा है। जब आप उपयोग ddकरते हैं तो आप छवि द्वारा सेक्टर-दर-क्षेत्र कॉपी कर रहे हैं, भले ही वह फाइल सिस्टम स्ट्रक्चर में शामिल न हो।

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

खाली क्षेत्रों की प्रतिलिपि बनाने से बचने के लिए एक लोकप्रिय समाधान फ़ाइल स्तर की प्रतिलिपि प्रणाली का उपयोग करना है - और क्लोनज़िला स्टैंडअलोन है, सीडी से बूट करने योग्य है, ye olde Norton Ghostलेकिन क्लोनज़िला लिनक्स (और अधिक) फ़ाइल सिस्टम का समर्थन करता है। तो, यह केवल उन फ़ाइलों की प्रतिलिपि करेगा जो उपयोग में हैं और केवल उन फ़ाइलों से एक कंटेनर बनाएँ। आकार काफी कम कर देता है!


1

मेरे पास यह एक ही सटीक प्रश्न था और एक आसान उपकरण का उपयोग करना चाहता था। खोज करने और न खोजने के बाद मैंने mkimg.sh लिखा । मैं उस प्रक्रिया को रेखांकित करता हूं जिसका मैंने उपयोग किया था: /raspberrypi//a/37899/32585

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