एक विभाजन की छवि को डिस्क की छवि में विभाजन तालिका के साथ बदलें


20

मेरे पास एक मौजूदा विभाजन की एक छवि है, जिसके साथ उत्पन्न हुई है dd if=/dev/sdXN of=image.bin। अब मैं इस छवि का उपयोग वर्चुअल मशीन के आधार के रूप में करना चाहता हूं। मुझे पता है कि छवि को एक प्रारूप में कैसे परिवर्तित किया जाए जिसे VirtualBox उपयोग कर सकता है।

समस्या यह है कि "डिस्क" छवि वास्तव में सिर्फ एक विभाजन की छवि है और इस प्रकार इसमें एमबीआर या विभाजन तालिका नहीं है। यह VM को बूट करने के लिए बहुत कठिन बनाता है।

क्या एक सरल तरीका है, विभाजन की एक छवि दी गई है, एक विभाजन तालिका सहित एक उचित डिस्क छवि बनाने के लिए?

जवाबों:


13

आप यह मेजबान मशीन पर कर सकते हैं। अधिकांश उपकरण जैसे fdiskफाइलें फाइलों पर काम करेंगे, और kpartxआपको एक फ़ाइल में विभाजन तक पहुंच प्रदान करेंगे।

  1. एक नई खाली 100GiB विरल छवि बनाएं (इसे विभाजन छवि के आकार से थोड़ा बड़ा करें)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. छवि फ़ाइल के साथ विभाजन fdisk

    fdisk myvm.img
    
  3. उपलब्ध छवि फ़ाइल में विभाजन अलग-अलग डिवाइस हैं

    sudo kpartx -a myvm.img
    
  4. पार्टीशन इमेज को पार्टीशन में कॉपी करें

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. संपूर्ण विभाजन को भरने के लिए फाइलसिस्टम का विस्तार करें

    sudo resize2fs /dev/mapper/loop0p1
    
  6. विभाजन बंद करें

    sudo kpartx -d myvm.img
    
  7. लूपबैक डिवाइस को हटा दें

    sudo losetup -D
    

क्या यह छवि में बनाए गए विभाजन को "विभाजन से मेल नहीं खाता" है जो कि imaged विभाजन की लंबाई है? और क्या इसका समाधान करने का कोई तरीका है? और, क्या एक "स्मार्ट पर्याप्त" फाइलसिस्टम प्रबंधक यह बताने में सक्षम होगा कि यह पूरे विभाजन आकार का उपयोग नहीं कर रहा है और खुद को फिट करने के लिए विस्तार कर रहा है?
हत्यारे

@killermist अद्यतित उत्तर।
मॉर्गन

यह एक अच्छा जवाब है। क्या आप इस प्रक्रिया में पूरी चीज़ की नकल करने से बचने का कोई तरीका जानते हैं?
मिका फिशर

@MikaFischer दुर्भाग्य से नहीं, क्योंकि विभाजन तालिका को विभाजन से पहले मौजूद होना चाहिए, और मुझे किसी फ़ाइल को डेटा प्रस्तुत करने के लिए किसी भी तंत्र का पता नहीं है।
मॉर्गन

मुझे लगता है कि हारुन का जवाब बेहतर है क्योंकि यह करना आसान है और इसे स्क्रिप्ट किया जा सकता है।
दार्शनिकोर्न

9

मुझे यकीन है कि मूल समस्या बहुत पहले हल हो गई थी, लेकिन ऐसी ही समस्या वाले किसी व्यक्ति के लिए:

संपूर्ण छवि की प्रतिलिपि बनाने से बचने का एक तरीका एक .vmdk प्रारूप छवि बनाना होगा जो विभाजन तालिका के लिए और विभाजन सामग्री के लिए अलग-अलग फ़ाइलों को संदर्भित करता है।

मेरे पास यह स्निपेट एक .vmdk फ़ाइल के आसपास पड़ा है, जो मैंने कुछ समय पहले की गई एक परीक्षा से लिया था:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

इसका मतलब है कि ऑफसेट 0 से शुरू होने वाले 63 सेक्टरों को कच्ची फ़ाइल "parttable.bin" से पढ़ा जाता है, लेकिन सेक्टर 63 और ऊपर की तरफ कच्चे विभाजन डंप "पार्टीशन-इमेज.बिन" से आते हैं। (बेशक, 63 को वास्तविक विभाजन के साथ पहले विभाजन में बदल दें, आमतौर पर इन दिनों 2048)।

अंतिम परिणाम यह है कि, VBox के अंदर से, ऐसा लगता है कि आपने विभाजन छवि के मोर्चे पर विभाजन तालिका को लंबा कर दिया है, बिना लंबी कॉपी ऑपरेशन के।

VM के भीतर से ड्राइव को विभाजन करें और, यदि आपको अपना ऑफ़सेट सही मिलता है, तो आपको अपनी विभाजन छवि सामग्री को नए बनाए गए विभाजन के अंदर देखना चाहिए।


2
मुझे लगता है कि यदि विभाजन-छवि.बिन एक विभाजन छवि है, तो दूसरी पंक्ति पर '63' को 0 होना चाहिए। मैंने ऐसा ही कुछ किया है और मुझे विभाजन छवि फ़ाइल में इस ऑफसेट को शून्य पर सेट करने की आवश्यकता है। philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn


प्रतिभा। मुझे लिनक्स होस्ट पर वीएम के लिए विंडोज विभाजन का उपयोग करने के लिए बस यही करना था, और यह केवल एक ही चीज़ है, जो @philcolbourn के चरणों का उपयोग करके काम करता है: superuser.com/a/804396/93066
bmaadin

बाकी vmdk फाइल में क्या होना चाहिए?
गोजिल्ली

1
@gozzilli फ़ाइल का शेष भाग फ़ाइल संस्करण संख्याओं, डिस्क एडेप्टर प्रकार, uuids और डिस्क ज्यामिति जैसे विवरणों का एक गुच्छा है। मुझे नहीं पता कि उन बिट्स को कैसे लिखना है। मैं डिस्क छवि पर इंगित करने के लिए एक vmdk बनाने के लिए सिर्फ एक उपकरण का उपयोग करने की सलाह दूंगा और फिर अतिरिक्त विभाजन शीर्षलेख प्राप्त करने के लिए वर्णन करने वाली केवल पंक्तियों को संशोधित करूंगा।
हारुन

3

दिलचस्प समस्या है। यहाँ मैं क्या करूँगा:

  1. VM को डिस्क के साथ उचित रूप से बड़ा बनाएं और फिर उसे रिकवरी सीडी से बूट करें।
  2. किसी भी तरह अपनी मौजूदा डिस्क छवि तक पहुंच (nfs, cifs, आदि)।
  3. VM की स्थानीय डिस्क पर आपके द्वारा आवश्यक विभाजन बनाएँ।
  4. विभाजन डिस्क में विभाजन छवि लिखने के लिए dd का प्रयोग करें।

ऐसा करने के बाद आपको अपने बूट लोडर को अपडेट करना होगा। मान लें कि आप GRUB का उपयोग कर रहे हैं, तो नए लिखित विभाजन को माउंट करें और उसमें चुरोट चलाएं update-grub(हालांकि सावधान रहें, आपको सही काम करने से पहले इसकी कॉन्फ़िगरेशन फ़ाइलों को समायोजित करने की आवश्यकता हो सकती है)।

सौभाग्य!


2

आप GParted के साथ फाइल सिस्टम को आकार बदल सकते हैं।

परीक्षण छवि बनाएँ:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

मैं resize2fs का उपयोग नहीं कर रहा हूँ, क्योंकि यह खाली स्थान छोड़ने के बजाय फ़ाइल का आकार बदलता है।

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

शुरू में मुफ्त 1 एमबी।

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

अंत में, विभाजन तालिका बनाएं।

fdisk extfs

पहले सेक्टर को 2048 (2048 सेक्टर * 512 बी / सेक्टर = 1 एमबी) पर सेट करें, आखिरी सेक्टर डिफॉल्ट (यानी इमेज का अंत)।


1

मैं व्यक्तिगत रूप से उपयोग करना चाहते हैं dd

मैं यहां 512-बाइट क्षेत्रों को मान रहा हूं। 2048-बाइट क्षेत्रों के लिए एक मामला हो सकता है, इसलिए बस संख्याओं को स्वैप करें और गणित करें।

प्रत्येक मामले में मैं उदाहरण के लिए 512MB परीक्षण फ़ाइल का उपयोग कर रहा हूँ:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

एमबीआर

छवि की रचना

मैं व्यक्तिगत रूप से अपनी शुरुआत के पहले एमबी (2048 क्षेत्र) को जोड़ना चाहता हूं:

dd if=testfs.img skip=2048 bs=512 of=full.img

अंत में विभाजन तालिका (या अपने आप में प्रतिलिपि) बनाने के लिए fdisk चलाएं, मैंने डिफ़ॉल्ट मानों का उपयोग करके 1 विभाजन बनाया।

सत्यापन

सत्यापित करने के लिए, लूप विभाजन और ऑटोडेट बनाएं:

sudo losetup -fP full.img

और fileपरिणामी विभाजन लूपबैक डिवाइस पर चलाएं :

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

छवि की रचना

मैं व्यक्तिगत रूप से पहले एमबी (2048 सेक्टर) को जोड़ना पसंद करता हूं, क्योंकि जीडीआईएससी इस संख्या के लिए डिफ़ॉल्ट होगा क्योंकि यह शुरुआत में एमबीआर के लिए इसकी शुरुआत के लिए 1 एमबी () और इसके अंत में 34 सेक्टर (या पूर्ण एमबी के लिए 2048) है। GPT (अंतिम क्षेत्र अलग हो सकता है)। जीपीटी को समाप्त करने से आपको डेटा खोना पड़ सकता है:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

अंत में विभाजन तालिका (या अपने आप में प्रतिलिपि) बनाने के लिए gdisk चलाएं, मैंने डिफ़ॉल्ट मानों का उपयोग करके 1 विभाजन बनाया।

सत्यापन

सत्यापित करने के लिए, लूप विभाजन और ऑटोडेट बनाएं:

sudo losetup -fP full.img

और fileपरिणामी विभाजन लूपबैक डिवाइस पर चलाएं :

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) यह विधि कोई अनुमान लगाना, आकार बदलना या मैन्युअल रूप से संरेखित करना सुनिश्चित करती है।


आप छवि के अंत क्षेत्र को gpt में कैसे पाते हैं
अनवर

जब मैं इसे चलाता sudo file -s /dev/loop11p1हूं तो मुझे मिल जाता है /dev/loop11p1: data। जो पहले एक ext4 फाइल सिस्टम था। और परिणामस्वरूप पूर्ण .img छोटा है। मुझे लगता है कि आपने समाधान उलट दिया है।
अनवर

मुझे लगता है कि आप seek=2048इस कमांड dd में अगर = testfs.img स्किप = 2048 bs = 512 = full.img
अनवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.