एक .img फ़ाइल में ग्रब कैसे स्थापित करें?


26

मैंने निम्नलिखित कार्य किया:

  1. dd के साथ एक खाली .img फ़ाइल बनाई
  2. इसे losetup के साथ / dev / loop0 से जोड़ा गया
  3. fdisk के साथ इसमें एक पार्टीशन बनाया
  4. mke2fs के साथ इस तरह के विभाजन को स्वरूपित किया
  5. उस विभाजन में एक कस्टम GNU / Linux सिस्टम कॉपी किया

अब मैं अपने एमबीआर और बूट निर्देशिका में ग्रब स्थापित करके .img फ़ाइल को बूट करने योग्य बनाना चाहूंगा। मेरा लक्ष्य qemu के साथ .img फ़ाइल लोड करना है। यह बेहतर होगा कि ग्रब 2 का उपयोग ग्रब विरासत के बजाय किया जाए।

धन्यवाद।


जवाबों:


24

यह ग्रब-पीसी संस्करण 1.98 + 20100804-5ubuntu3 (Maverick Meerkat) के साथ है।

Grub2 इंस्टॉलर लूपबैक उपकरणों पर इंस्टॉल हो सकता है, लेकिन यदि आप डिवाइस मैपर का उपयोग करके माउंट करते हैं तो यह भ्रमित हो जाएगा और विश्वास करें कि आपके पास एक LVM योजना है, जो लापता एब्सट्रैक्शन के बारे में शिकायत के साथ रहस्यमय तरीके से विफल है।

इसके बजाय, आपको विभाजन के लिए लूपबैक डिवाइस को स्वयं सेटअप करना चाहिए, एक ऐसे नाम के साथ, जो पैटर्न "/ देव / लूप [0-9]" से मेल खाना चाहिए , अर्थात अंत में बिना किसी विभाजन के

kpartx -v -a /dev/loop0
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 /mnt

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

चूंकि आपने छवि को विभाजित करने के लिए fdisk का उपयोग किया है, इसलिए आपके पास एक msdos -style विभाजन तालिका (उर्फ लेबल) है, और एक BIOS का उपयोग करके बूट करें। MB1 में stage1 / boot.img डालने के अलावा, stage1.5 / core.img को अनपार्ट किए गए स्थान में एक एम्बेडिंग क्षेत्र में रखा जाएगा (ठीक!) उसके ठीक बाद, और इसके लिए स्थान होना चाहिए।

ट्रिक अब grub2 इंस्टॉलर को डिवाइस मैप के माध्यम से बताती है कि वर्चुअल मशीन में आपका लूपबैक सेटअप BIOS ड्राइव में कैसे जाएगा। (Grub1 विरासत में यह सीधे शेल में किया गया था)। आप शायद पहली डिस्क के रूप में इस छवि को बूट करने की योजना बना रहे हैं, इसलिए मुझे लगता है कि उपयुक्त मानचित्रण होगा:

mkdir -p /mnt/boot/grub
cat > /mnt/boot/grub/device.map <<EOF
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
EOF

यहाँ मैंने डिवाइस डिस्क को गेस्ट डिस्क इमेज के अंदर रखा है, ताकि आप बूट कॉन्फ़िगरेशन फ़ाइल grub.cfg जनरेट कर सकें:

mount --bind /dev /mnt/dev
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg

(ध्यान रखें कि ग्रब-पीसी पैकेज का पोस्ट-इंस्टॉलर एक जांच चलाएगा जो डिवाइस के नक्शे को ओवरराइट करता है (!), इसलिए आपको इसे इंस्टॉलेशन के बाद लिखना होगा और ग्रब-एमकॉन्फिग / अपडेट-ग्रब को स्वयं चलाना होगा)।

अब अतिथि स्थापना की ओर इशारा करते हुए होस्ट से इंस्टॉलर चलाएं :

grub-install --no-floppy --grub-mkdevicemap=/mnt/boot/grub/device.map --root-directory=/mnt /dev/loop0

अंत में, अपनी छवि पर qemu शुरू करने से पहले सब कुछ यहाँ सेट करें:

umount /mnt/dev
umount /mnt
losetup -d /dev/loop1
kpartx -v -d /dev/loop0

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

1
अच्छा जवाब, दुर्भाग्य से chroot /mnt grub-mkconfig -o /boot/grub/grub.cfgविफल रहता है क्योंकि grub-mkconfig.img डिस्क में उस मामले के लिए कोई या कोई बाइनरी नहीं है , और /mntपहले से ही माउंट है। यह बहुत अच्छा होगा यदि आप इसे कदम से कदम उठाएंगे और सभी विवरण / आदेश लिखेंगे।
फ्लाविस

@ रोलकौ: इस उत्कृष्ट प्रलेखन के लिए धन्यवाद! नीचे टो के संशोधनों के साथ मिलकर यह कई मुद्दों को हल करता है जो मुझे चबाने वाले वातावरण में से एम्बेड करते समय ग्रब के साथ वर्षों से था।
स्पार्कली

1
losetup -Pएकल विभाजन को
बढ़ाने

मैं हो रहा हूँ: /usr/sbin/grub-probe: warning: the device.map entry 'hd0,1' is invalid. Ignoring it. Please correct or delete your device.map.तो यह जवाब बेकार है।
कैलमेरियस

11

इन स्पष्टीकरणों के लिए बहुत बहुत धन्यवाद। मैंने निम्नलिखित संशोधनों के साथ अपनी स्वयं की लिपियों में आपके समाधान को एकीकृत किया (आपके अंकन / चर में अनुवादित):

modprobe dm_mod
kpartx -va /root/rootfs.img # *.img is setup elsewhere
# normally you now would mount /dev/loop0p1 directly. BUT
# grub specialists didn't manage to work with loop partitions other than /dev/loop[0-9]
losetup -v -f --show /dev/mapper/loop0p1
mount /dev/loop1 /mnt
mkdir -p /mnt/boot/grub

# change into chrooted environment. all remaining work will be done from here. this differs from the howto above.
LANG=C chroot /mnt /bin/bash
set -o vi
mount -t sysfs sysfs /sys
mount -t proc  proc  /proc
# avoid grub asking questions
cat << ! | debconf-set-selections -v
grub2   grub2/linux_cmdline                select   
grub2   grub2/linux_cmdline_default        select   
grub-pc grub-pc/install_devices_empty      select yes
grub-pc grub-pc/install_devices            select   
!
apt-get -y install grub-pc
# don't setup device.map prior to this point. It will be overwritten by grub-pc install
#corrected the /mnt/boot/grub/device.map to /boot/grub/device.map
cat > /boot/grub/device.map << !
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
!
# install here to fill /boot/grub for grub-mkconfig (update-grub)
grub-install /dev/loop0
# generate /boot/grub/grub.cfg
update-grub

यह कम से कम डेबियन निचोड़ पर काम करता है। शुद्धता के लिए '/boot/grub/grub.cfg' की जाँच करें।


1
क्या cat > /mnt/boot/grub/device.mapचिरस्थायी वातावरण में किया जाना चाहिए ? यदि हां, तो रास्ता होना चाहिए /boot/grub/device.map
सिलबर्ड

0

यहाँ एक त्वरित चलना है कि कैसे स्थापित करें और मैन्युअल रूप से QEMU डिस्क छवि में GRUB बूट करें। मैंने इसे grub.cfg के साथ अगले चरण में नहीं लिया है, लेकिन मुझे लगता है कि यह मुख्य सेटअप पूरा हो जाने के बाद यह बहुत सीधा है।

मान्यताओं:

  • 'ग्रब-इनस्टॉल --version' "ग्रब-इनस्टॉल (GRUB) 2.02 ~ beta2-36ubuntu.2" है
  • 'qemu-system-x86_64 --version' "QEMU एमुलेटर संस्करण 2.5.0 (डेबियन 1: 2.5 + dfsg-5ubuntu10.6), कॉपीराइट (c) 2003-2008 फेब्रिस बेलार्ड"
  • वर्तमान निर्देशिका में "डिस्क 1" नामक एक डिस्क छवि
  • / dev / loop0 में "Disklabel type: dos" है (यानी fdisk के साथ)
  • / dev / loop0p1 एक बूट करने योग्य विभाजन है, जो पहले से ही ext4 के साथ तैयार किया गया है

इस प्रकार मैंने GRem मेनू में qemu को बूट किया:

    # losetup -fP disk1
    # ls /dev/loop0*
    /dev/loop0  /dev/loop0p1  /dev/loop0p2  /dev/loop0p3
    # mount /dev/loop0p1 /mnt
    # cat > loop0device.map <<EOF
    (hd0) /dev/loop0
    EOF
    # grub-install --no-floppy --grub-mkdevicemap=loop0device.map \
    --modules="part_msdos" --boot-directory=/mnt /dev/loop0 -v
    # umount /mnt
    # losetup -d /dev/loop0
    # qemu-system-x86_64 -m 512 -curses -hda disk1 -enable-kvm

फिर GRUB शेल ऊपर आता है:

                        GNU GRUB  version 2.02~beta2-36ubuntu3.2

       Minimal BASH-like line editing is supported. For the first word, TAB
       lists possible command completions. Anywhere else TAB lists possible
       device or file completions.


    grub> ls
    (hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (fd0)
    grub>

यदि आपने एक कर्नेल और RAM डिस्क को / dev / loop0p1 पर कॉपी किया था, तो आप इसे बूट कर सकते हैं:

    grub> linux (hd0,msdos1)/vmlinuz
    grub> initrd (hd0,msdos1)/initrd
    grub> boot

और यहाँ डिफ़ॉल्ट लिनक्स शेल (क्योंकि इस मामले में कोई / sbin / init उपलब्ध नहीं था)

    BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

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