Bagaimana cara menginstal grub ke file .img?


26

Saya melakukan yang berikut:

  1. membuat file .img kosong dengan dd
  2. mengaitkannya dengan / dev / loop0 dengan losetup
  3. membuat partisi di dalamnya dengan fdisk
  4. memformat partisi tersebut dengan mke2fs
  5. menyalin sistem GNU / Linux khusus ke partisi itu

Sekarang saya ingin membuat file .img dapat di-boot dengan menginstal grub ke direktori MBR dan / boot. Tujuan saya adalah memuat file .img dengan qemu. Akan lebih baik jika grub2 digunakan daripada warisan grub.

Terima kasih.


Jawaban:


24

Ini dengan grub-pc versi 1.98 + 20100804-5ubuntu3 (Maverick Meerkat).

Pemasang grub2 dapat menginstal ke perangkat loopback, tetapi jika Anda memasang menggunakan perangkat mapper itu akan menjadi bingung dan percaya bahwa Anda memiliki skema LVM, gagal secara misterius dengan keluhan tentang abstraksi yang hilang.

Sebagai gantinya, Anda harus mengatur sendiri perangkat loopback untuk partisi tersebut, dengan nama yang harus cocok dengan pola "/ dev / loop [0-9]", yaitu tanpa perancang partisi pada akhirnya:

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

(Perhatikan bahwa jika Anda ingin grub-mkconfig / update-grub beroperasi pada volume ini, maka loopback partisi harus terhubung ke loopback disk di / dev, dan tidak langsung ke file gambar).

Karena Anda menggunakan fdisk untuk mempartisi gambar, Anda memiliki tabel partisi gaya- msdos (label alias), dan boot menggunakan BIOS. Selain menempatkan stage1 / boot.img di MBR, stage1.5 / core.img akan diletakkan di area embedding di ruang unpartitioned (!) Setelahnya , dan harus ada ruang untuk ini.

Caranya sekarang adalah memberi tahu installer grub2 melalui peta perangkat bagaimana pengaturan loopback Anda akan dipetakan ke drive BIOS di mesin virtual. (Dalam grub1 legacy ini dilakukan langsung di shell). Anda mungkin berencana untuk mem-boot gambar ini sebagai disk pertama, jadi saya kira pemetaan yang sesuai adalah:

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

Di sini saya telah meletakkan peta perangkat di dalam disk image tamu, sehingga Anda dapat membuat file konfigurasi boot grub.cfg:

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

(Hati-hati bahwa post-installer dari paket grub-pc akan menjalankan probe yang menimpa peta perangkat (!), Jadi Anda harus menulisnya setelah instalasi dan menjalankan sendiri grub-mkconfig / update-grub).

Sekarang jalankan penginstal dari host , arahkan ke instalasi tamu:

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

Terakhir, lepaskan semua yang diatur di sini sebelum memulai qemu pada gambar Anda:

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

Wow! Saya baru saja berlari ke jawaban Anda sambil mencoba memahami mengapa saya tidak dapat memperbarui-grub file gambar mount-looped, chroot. Saya akan melihat apakah ini dapat diterapkan untuk masalah saya, tapi itu jelas merupakan lagu yang menarik dan sangat berharga untuk saya upvote. Terima kasih!
filofel

1
Jawaban yang bagus, sayangnya chroot /mnt grub-mkconfig -o /boot/grub/grub.cfggagal karena tidak ada grub-mkconfigatau biner dalam hal .img disk, dan /mntsudah terpasang. Akan sangat bagus jika Anda akan mengambil langkah demi langkah dan menulis semua detail / perintah.
Flavius

@RolKau: terima kasih atas dokumentasi yang luar biasa ini! Bersama dengan modifikasi toh di bawah ini memecahkan banyak masalah yang saya miliki selama bertahun-tahun dengan grub ketika menanamkan dari dalam lingkungan chroot.
sparkie

1
losetup -Padalah cara lain yang baik pemasangan partisi tunggal: stackoverflow.com/a/15200862/895245
Ciro Santilli新疆改造中心法轮功六四事件

Saya mengerti: /usr/sbin/grub-probe: warning: the device.map entry 'hd0,1' is invalid. Ignoring it. Please correct or delete your device.map.Jadi jawaban ini tidak berguna.
Calmarius

11

terima kasih banyak untuk penjelasan ini. Saya mengintegrasikan solusi Anda ke dalam skrip saya sendiri dengan modifikasi berikut (diterjemahkan ke notasi / variabel Anda):

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

ini bekerja setidaknya pada debian squeeze. Periksa '/ boot / grub / grub.cfg' untuk kebenaran.


1
Haruskah cat > /mnt/boot/grub/device.mapdilakukan di lingkungan chroot? Jika demikian, jalannya seharusnya /boot/grub/device.map.
cbliard

0

Berikut ini penjelasan singkat tentang cara memasang dan mem-boot GRUB secara manual ke dalam disk image QEMU. Saya belum mengambil langkah selanjutnya dengan grub.cfg, tapi saya berasumsi itu cukup mudah setelah pengaturan utama ini selesai.

Asumsi:

  • 'grub-install --version' adalah "grub-install (GRUB) 2.02 ~ beta2-36ubuntu3.2"
  • 'qemu-system-x86_64 --version' adalah "QEMU emulator versi 2.5.0 (Debian 1: 2.5 + dfsg-5ubuntu10.6), Hak Cipta (c) 2003-2008 Fabrice Bellard"
  • Gambar diska bernama "disk1" di direktori saat ini
  • / dev / loop0 memiliki "Disklabel type: dos" (yaitu dengan fdisk)
  • / dev / loop0p1 adalah partisi bootable, sudah diformat dengan ext4

Inilah cara saya mem-boot qemu ke menu GRUB:

    # 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

Kemudian shell GRUB muncul:

                        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>

Jika Anda telah menyalin kernel dan ram disk ke / dev / loop0p1, Anda bisa mem-bootnya:

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

Dan inilah shell Linux default (karena tidak ada / sbin / init tersedia dalam kasus ini)

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

    (initramfs)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.