私は次のことをしました:
ここで、MBRおよび/ bootディレクトリにgrubをインストールして、.imgファイルを起動可能にしたいと思います。私の目標は、.imgファイルをqemuでロードすることです。 grub legacyの代わりにgrub2を使用するほうがよいでしょう。
ありがとう。
これは、grub-pcバージョン1.98 + 20100804-5ubuntu3(Maverick Meerkat)での使用です。
Grub2インストーラーはループバックデバイスにインストールできますが、デバイスマッパーを使用してマウントすると混乱し、LVMスキームがあると信じて、不思議なことに、抽象化の欠如に関する不満で失敗します。
代わりに、自分でパーティションのループバックデバイスをセットアップし、パターン「/ dev/loop [0-9]」と一致する必要があります(つまり、パーティション指定子なし)。最後に:
kpartx -v -a /dev/loop0
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 /mnt
(grub-mkconfig/update-grubでこのボリュームを操作する場合は、パーティションループバックを/ devの下のディスクループバックに接続し、に直接接続しないでください画像ファイル)。
Fdiskを使用してイメージをパーティション分割したため、msdosスタイルのパーティションテーブル(別名ラベル)があり、BIOSを使用して起動します。 MBRにstage1/boot.imgを配置することに加えて、stage1.5/core.imgは、パーティション化されていないスペースの埋め込み領域に配置されます(!)直後に続き、そのためのスペースが必要です。
トリックは、ループバックセットアップが仮想マシンのBIOSドライブにどのようにマップされるかをデバイスマップを通じてgrub2インストーラーに伝えることです。 (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-pcパッケージのポストインストーラーがデバイスマップを上書きするプローブを実行することに注意してください(!))、それをインストール後にインストールして実行する必要がありますgrub-mkconfig/update-grubをご利用ください)。
Hostからインストーラーを実行し、ゲストインストールを指定します。
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
これらの説明に感謝します。以下の変更を加えて、ソリューションを自分のスクリプトに統合しました(表記/変数に変換)。
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
これは少なくともdebian squeezeでは機能します。 「/boot/grub/grub.cfg」が正しいことを確認してください。
ここでは、QEMUディスクイメージに手動でGRUBをインストールして起動する方法を簡単に説明します。grub.cfgを使用して次のステップに進んだわけではありませんが、このメインセットアップが完了すると、簡単です。
仮定:
これがqemuを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
次に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
そして、これがデフォルトのLinuxシェルです(この場合、/ 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)