एसडी कार्ड पर लिखने से पहले एक छवि फ़ाइल का आकार कैसे बदल सकता है?


13

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

क्या एसडी कार्ड में लिखने से पहले छवि और फाइल-सिस्टम का आकार बदलना संभव है ताकि मैं अंतरिक्ष से बाहर चले बिना अधिक अनुकूलन कर सकूं?


यह सवाल शायद आपकी मदद करेगा।
Jivings

1
@ शिष्टाचार: इन सभी उत्तरों में वर्णन किया गया है कि एसडी कार्ड में लिखे जाने के बाद छवि का आकार कैसे बदलना है । मुझे पता है कि कैसे करना है; मुझे रुचि है कि एसडी कार्ड में लिखने से पहले छवि का आकार कैसे बदल सकता हूं ।
DrAl

जवाबों:


8

यह एक कच्ची छवि फ़ाइल का आकार बदलने के लिए है। मुझे पता है कि यह मूर्खतापूर्ण लगता है, लेकिन यह काम करेगा।

एक रिक्त छवि बनाएं, उस आकार का जिसे आप मूल का विस्तार करना चाहते हैं (मेरे उदाहरण में मैं 5 जीबी का उपयोग करता हूं);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

इसे मूल छवि में जोड़ें:

cat /path/to/temp_image >> /path/to/rasperrypi.img

उस फाइलसिस्टम का आकार बदलें जो डिस्क के अंत में रहता है (आमतौर पर यह वह है जिसे आप बड़ा चाहते हैं):

resize2fs -f /path/to/rasperrypi.img

किया हुआ! आपकी डिस्क अब 5GB बड़ी होनी चाहिए!


यह सही लगता है, धन्यवाद: मैं आज रात का परीक्षण करूँगा।
DrAl

5
मैंने अभी-अभी यह कोशिश की है और जब मैं resize2fs स्टेज (फाइल में 1GB जोड़ने के बाद) में पहुंचता हूं, तो मुझे 2012-12-16-wheezy-raspbian.img cann 'खोलने की कोशिश करते हुए "सुपर-ब्लॉक में खराब मैजिक नंबर मिलता है।" t वैध फाइलसिस्टम सुपरब्लॉक नहीं खोजे। " किसी भी सुझाव के रूप में मैं क्या गलत कर रहा हूँ?
19

यह मुझे ऐसा लगता है कि यह इस तथ्य के साथ एक मुद्दा है कि मैं विभाजन के बजाय पूरी छवि (/ देव / sda के समतुल्य) का आकार बदलने की कोशिश कर रहा हूं (/ dev / sda2 के बराबर)। हालांकि, मैं गलत हो सकता है और मैंने सफलता के बिना कुछ अन्य चीजों की कोशिश की है (जैसे कि fdisk के साथ विभाजन का आकार बदलना, जो काम करने लगता है लेकिन मुझे फ़ाइल सिस्टम का आकार बदलने में मदद नहीं करता है)।
DrAl

3
ठीक है, मैंने थोड़ी सी गुगली के साथ आखिरी बिट का उत्तर पाया है: मुझे छवि में विभाजन की ओर इशारा करते हुए एक लूप डिवाइस बनाने की आवश्यकता थी। मैंने यह दूसरे विभाजन के प्रारंभ क्षेत्र fdisk -l file.img(यह 122880 था) से प्राप्त करके और फिर किया losetup --offset $((122880 * 512)) /dev/loop0 file.img। मैं तो इस्तेमाल कर सकते हैं resize2fsपर /dev/loop0और के साथ साफ losetup -d /dev/loop0। यदि आप इसे शामिल करने के लिए अपने उत्तर को अपडेट करते हैं, तो मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करूंगा। मुझे सही दिशा बताने के लिए धन्यवाद।
DrAl

1
@DrAl अरे, मैं अपने समाधान उपयोग करने की कोशिश resize2fsपर /dev/loop0, लेकिन मैं कह superblock आकार और विभाजन आकार से मेल नहीं खाते बूट पर एक कर्नेल आतंक मिल गया: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksआप कुछ इस तरह भर में आया है?
ग्यूसॉफ्ट

4

यह ऊपर और कहीं और मेरे लिए काम करने वाले उत्तर का संश्लेषण है - यदि आप गलती करते हैं तो अपनी छवि का बैकअप लें:

सबसे पहले छवि फ़ाइल को बड़ा करें (यहाँ हम अंत में 1GB जोड़ रहे हैं):

truncate -s +1G ./image.img

अगली छवि को पूरी तरह से एक लूप डिवाइस के रूप में मैप करें ताकि हम विभाजन तालिका में प्रहार कर सकें

sudo losetup /dev/loop0 ./image.img

भविष्य के संदर्भ के लिए इसे डंप करने देता है:

sudo fdisk -l /dev/loop0

आउटपुट जैसा दिखता है:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

अब हम इसे हटाकर अंतिम विभाजन का रीमेक करेंगे, फिर इसे उसी आरंभ स्थान, उसी प्रकार लेकिन अलग-अलग अंतिम स्थान पर पुनः बनाएंगे। तो loop0p2 (विभाजन 2 - लिनक्स विभाजन) के लिए "स्टार्ट" कॉलम पर ध्यान दें - हम इसे बाद में उपयोग करेंगे - इसके 12282 यहाँ।

sudo fdisk /dev/loop0

निम्नलिखित दर्ज करें - वे दर्ज करने के लिए सुरक्षित हैं - जब तक आप मेरे स्पष्टीकरण को पढ़ नहीं लेते, तब तक कुछ भी स्थायी नहीं होता है:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. डिफ़ॉल्ट को स्वीकार करने के लिए बस हिट दर्ज करें
  9. p

चरण 1 - वर्तमान तालिका प्रिंट करें। चरण 2-3 - विभाजन 2 को हटाएं, चरण 4-8 - नए अंत बिंदु के साथ विभाजन 2 को पुनः बनाएं (डिफ़ॉल्ट छवि का अंत है), चरण 9 - नई तालिका का प्रिंट आउट लें।

मान लें कि आपकी नई मुद्रित तालिका मूल मान और ब्लॉक मान (यानी आकार बदल गया है) को छोड़कर मूल तालिका के समान है, तो आप प्रतिबद्ध होने के लिए तैयार हैं।

wअपना परिवर्तन करने के लिए दर्ज करें , फिर qछोड़ने के लिए दर्ज करें।

आप उस लूपबैक डिवाइस को हटा सकते हैं, हम दूसरे विभाजन के लिए एक और बना देंगे। याद रखें कि आपके द्वारा नोट किए गए और ऊपर उपयोग किए जाने वाले स्टार्ट ऑफ़ - हम इसे फिर से उपयोग करेंगे:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

यह /dev/loop0सिर्फ विभाजन 2 पर इंगित करने पर एक नया मानचित्रण बनाएगा - संदर्भ 512 के लिए आप पहले fdiskआउटपुट में देख सकते हैं सेक्टर-आकार है ।

अब उपलब्ध स्थान को भरने के लिए विभाजन का आकार बदलें:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

हो गया - अब साफ करें:

sudo losetup -d /dev/loop0

धन्यवाद ... उपरोक्त निर्देश मेरे लिए काम नहीं किया, लेकिन यह किया। विभाजन तालिका लिखते समय मुझे कुछ चेतावनी मिली: `` कमांड (मदद के लिए एम): डब्ल्यू विभाजन तालिका बदल दी गई है। विभाजन तालिका को फिर से पढ़ने के लिए ioctl () को कॉल करना। विभाजन तालिका को पुनः पढ़ना विफल रहा। अमान्य तर्क कर्नेल अभी भी पुरानी तालिका का उपयोग करता है। नई तालिका का उपयोग अगले रिबूट पर या आपके द्वारा partprobe (8) या kpartx (8) चलाने के बाद किया जाएगा। `` `मैंने इसे अनदेखा कर दिया और यह ठीक था।
StFS

अति उत्कृष्ट! आप ही सही उत्तर देने वाले हैं! धन्यवाद।
yushulx

3

Oracle VM VirtualBox चलाने वालों के लिए यह काफी आसान है।

विंडोज मशीन पर चीजें इस प्रकार हैं:

input.imgयहाँ वह छवि है जिसका आकार कम किया जाना चाहिए और output.imgअंतिम छवि है - इस उदाहरण में जिसे 7000 एमबी बड़ा माना गया है।

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

उम्मीद है इससे कुछ मदद मिली होगी।


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

मुझे कर्नेल पैनिक एरर मिला। Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

ध्यान दें कि यह छवि को छोटा कर रहा है - यदि 7000MB का कोई भी अतीत है तो आप डेटा खो देंगे - कमांड चेतावनी नहीं देंगे या शिकायत नहीं करेंगे।
बजे माइक रेडब्रिज

2

यह एक कच्ची छवि फ़ाइल का आकार बदलने के लिए है। मुझे पता है कि यह मूर्खतापूर्ण लगता है, लेकिन यह काम करेगा।

एक रिक्त छवि बनाएं, उस आकार का जिसे आप मूल का विस्तार करना चाहते हैं (मेरे उदाहरण में मैं 5 जीबी का उपयोग करता हूं);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

इसे मूल छवि में जोड़ें:

cat /path/to/temp_image >> /path/to/rpi.img

अगला विभाजन और फाइल सिस्टम का आकार बदल रहा है। सबसे पहले, विभाजन की ऑफसेट प्राप्त करें;

fdisk -l /path/to/rpi.img

इस तरह से एक तालिका में परिणाम:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

दूसरे विभाजन की शुरुआत ऑफसेट पर ध्यान दें

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

अंत में अनमाउंट / देव / लूप

losetup -d /dev/loop0

किया हुआ! आपकी डिस्क अब 5GB बड़ी होनी चाहिए!

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