grubを.imgファイルにインストールする方法は?


26

私は次のことをしました:

  1. ddで空の.imgファイルを作成しました
  2. losetupで/ dev / loop0に関連付けます
  3. fdiskでパーティションを作成しました
  4. そのようなパーティションをmke2fsでフォーマットしました
  5. カスタムGNU / Linuxシステムをそのパーティションにコピーしました

ここで、grubをそのMBRおよび/ bootディレクトリにインストールして、.imgファイルをブート可能にします。私の目標は、qemuで.imgファイルをロードすることです。grubレガシーの代わりにgrub2を使用する方が良いでしょう。

ありがとう。


回答:


24

これは、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は、直後に続くパーティション化されていないスペース(!)の埋め込み領域に配置されます。これにはスペースが必要です。

ここでのトリックは、デバイスマップを通じて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-PCパッケージのポストインストーラはデバイスマップを(上書きされたプローブを実行することに注意してください!)、あなたはそれを記述する必要がありますので、のインストールと実行のgrub-mkconfig /更新-grubの自分)。

ホストからインストーラーを実行しますし、ゲストインストールを指定します。

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

うわー!マウントループされたchrootされたイメージファイルを更新-grubできなかった理由を理解しようとしたときに、あなたの答えに出会いました。これが私の問題に当てはまるかどうかを確認しますが、それは間違いなく興味深いトラックであり、私の賛成に値します。ありがとう!
フィロフェル

1
いい答えです。残念ながら、.imgディスクにはその問題のバイナリがchroot /mnt grub-mkconfig -o /boot/grub/grub.cfgないgrub-mkconfigか、または/mnt既にマウントされているため、失敗します。あなたが一歩一歩それを取り、すべての詳細/コマンドを書いたら素晴らしいでしょう。
フラビウス

@RolKau:この素晴らしいドキュメントをありがとう!以下のtohの修正と合わせて、chrootされた環境から埋め込むときにgrubで長年抱えていた多くの問題を解決しました。
スパーキー

1
losetup -P単一のパーティションをマウントする別の良い方法です:stackoverflow.com/a/15200862/895245
Ciro Santilli新疆改造中心法轮功六四事件

私が得ている:/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

これは少なくともdebian squeezeでは機能します。「/boot/grub/grub.cfg」が正しいことを確認してください。


1
cat > /mnt/boot/grub/device.mapchrooted環境で行うべきですか?その場合、パスはである必要があります/boot/grub/device.map
cbliard 14

0

以下に、GRUBをQEMUディスクイメージに手動でインストールして起動する方法を簡単に説明します。grub.cfgを使用して次のステップに進みませんでしたが、このメインのセットアップが完了したら、それは非常に簡単だと思います。

仮定:

  • 「grub-install --version」は「grub-install(GRUB)2.02〜beta2-36ubuntu3.2」です
  • 「qemu-system-x86_64 --version」は「QEMUエミュレーターバージョン2.5.0(Debian 1:2.5 + dfsg-5ubuntu10.6)、Copyright(c)2003-2008 Fabrice Bellard」
  • 現在のディレクトリにある「disk1」という名前のディスクイメージ
  • / dev / loop0には「Disklabel type:dos」があります(fdiskを使用)
  • / dev / loop0p1はブート可能なパーティションで、すでにext4でフォーマットされています

これは、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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.