Grub bir .img dosyasına nasıl kurulur?


26

Aşağıdakileri yaptım:

  1. dd ile boş bir .img dosyası oluşturuldu
  2. losetup ile / dev / loop0 ile ilişkilendirildi
  3. fdisk ile içinde bir bölüm oluşturdu
  4. mke2fs ile böyle bir bölümü biçimlendirilmiş
  5. Özel bir GNU / Linux sistemini bu bölüme kopyaladı.

Şimdi grubunu MBR ve / boot dizinine kurarak .img dosyasını önyüklenebilir yapmak istiyorum. Amacım .img dosyasını qemu ile yüklemek. Grub mirası yerine grub2 kullanılması daha iyi olur.

Teşekkürler.


Yanıtlar:


24

Bu grub-pc versiyon 1.98 + 20100804-5ubuntu3 (Maverick Meerkat) ile.

Grub2 yükleyici geridöngü aygıtlarına yükleyebilir, ancak aygıt eşleyicisini kullanarak bağlarsanız, kafanız karışır ve bir LVM planınız olduğuna inanır ve gizemli bir şekilde eksik bir soyutlamadan şikayet edemezsiniz.

Bunun yerine, bölüm için geridöngü aygıtını kendiniz kurmalısınız , yani "/ dev / loop [0-9]" deseniyle eşleşmesi gereken bir ad , yani sonunda herhangi bir bölüm belirleyici yok:

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

(Eğer grub-mkconfig / update-grub bu birimde çalışmak istiyorsanız, o zaman bölme geri döngü altında / dev diski geri döngüsü bağlı ve gerektiği Not değil görüntü dosyasına doğrudan).

Görüntüyü bölümlemek için fdisk kullandığınızdan, bir msdos- style bölümleme tablosu (aka label) ve bir BIOS kullanarak önyükleme yaparsınız . Stage1 / boot.img dosyasının MBR'sine yerleştirilmesine ek olarak stage1.5 / core.img, hemen ardından bölümlenmemiş alana (!) Yerleştirme alanına yerleştirilir ve bunun için boşluk olması gerekir.

Püf noktası artık grub2 yükleyicisine bir cihaz haritası üzerinden geri döngü kurulumunuzun sanal makinedeki BIOS sürücülerine nasıl eşleneceğini anlatmak. (Grub1 mirasında bu doğrudan kabuğun içinde yapıldı). Muhtemelen bu görüntüyü ilk disk olarak başlatmayı planlıyorsunuz, bu nedenle uygun eşlemenin şu olacağını düşünüyorum:

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

Burada aygıt haritasını konuk disk görüntüsünün içine koydum, böylece grub.cfg önyükleme yapılandırma dosyasını oluşturabilirsiniz:

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

(Grub-pc paketinin kurulum sonrası programının cihaz haritasının üzerine yazılan bir prob kullanacağına dikkat edin (!), Bu yüzden kurulumdan sonra yazmanız ve grub-mkconfig / update-grub komutunu çalıştırmanız gerekir).

Şimdi yükleyiciyi ana bilgisayardan çalıştırın, misafir kurulumuna işaret edin:

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

Son olarak, resminizde qemu'yu başlatmadan önce burada ayarlanan her şeyi çıkarın:

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

Vaov! Neden cevap verdim, neden mount-loop, chrooted bir resim dosyasını güncelleyemediğimi anlamaya çalışırken. Bu benim sorunum için geçerli olup olmadığını göreceğim, ama bu kesinlikle ilginç bir parça ve benim çok fazla benim lehime değer. Teşekkürler!
filofel

1
Güzel cevap, ne yazık ki chroot /mnt grub-mkconfig -o /boot/grub/grub.cfgbaşarısız olur, çünkü grub-mkconfig.img diskinde bu konuda hiçbir ikili dosya yoktur ve /mntzaten monte edilmiştir. Adım adım alıp tüm detayları / komutları yazarsanız çok iyi olur.
Flavius,

@RolKau: Bu mükemmel dökümantasyon için teşekkürler! Aşağıda toh'un modifikasyonları ile birlikte, chrootlu ortamların içinden gömülürken yıllarca grubumla yaşadığım birçok sorunu çözdüm.
sparkie

1
losetup -Ptek bir bölmeyi monte etmenin başka bir iyi yoludur: stackoverflow.com/a/15200862/895245
Ciro Santilli

Ben alıyorum: /usr/sbin/grub-probe: warning: the device.map entry 'hd0,1' is invalid. Ignoring it. Please correct or delete your device.map.Yani bu cevap işe yaramaz.
Calmarius

11

Bu açıklamalar için çok teşekkürler. Çözümünüzü aşağıdaki modifikasyonlarla (gösteriminize / değişkenlerinize çevrilmiş olarak) kendi senaryomuza entegre ettim:

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

Bu en azından debian sıkma çalışır. Doğruluk için '/boot/grub/grub.cfg' dosyasını kontrol edin.


1
Meli cat > /mnt/boot/grub/device.mapchroot edilmiş alanda yapılması? Eğer öyleyse, yol olmalı /boot/grub/device.map.
cbliard

0

İşte GRUB'u manuel olarak bir QEMU disk görüntüsüne nasıl kuracağınız ve önyükleyeceğinizle ilgili hızlı bir adım. Bir grub.cfg ile bir sonraki adıma geçmedim, ancak bu ana kurulum tamamlandığında bunun oldukça basit olduğunu varsayıyorum.

Varsayımlar:

  • 'grub-install --version', "grub-install (GRUB) 2.02 ~ beta2-36ubuntu3.2" şeklindedir.
  • 'qemu-system-x86_64 --version', "QEMU emulator sürüm 2.5.0 (Debian 1: 2.5 + dfsg-5ubuntu10.6), Telif Hakkı (c) 2003-2008 Fabrice Bellard" dır.
  • Geçerli dizindeki "disk1" adlı bir disk görüntüsü
  • / dev / loop0 "Disklabel type: dos" dır (yani fdisk ile)
  • / dev / loop0p1 zaten ext4 ile oluşturulmuş, önyüklenebilir bir bölümdür

QEMU'yu GRUB menüsüne şu şekilde başlattım:

    # 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

Sonra GRUB kabuğu ortaya çıkıyor:

                        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>

Bir çekirdek ve ram diskini / dev / loop0p1'e kopyalamış olsaydınız, onu önyükleyebilirsiniz:

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

Ve işte varsayılan Linux kabuğu (çünkü bu durumda / sbin / init yoktu)

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

    (initramfs)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.