web-dev-qa-db-ja.com

GRUBを新しいドライブにインストールする方法は?

CentOSで仮想ボックスを実行しています。

既存のCentOSに新しい仮想ディスクを接続しましたVMそして、この新しく接続されたディスクにGRUBをインストールしようとしています。

後で、2番目のVMを、カスタムルートファイルシステムとカーネルを備えた新しく準備された起動可能なハードディスクで起動します。

私は次の手順を試しました:

  • 既存の稼働中のCentOSマシンに新しい仮想ディスクを接続しました。
  • fdisk /dev/sdbを使用して新しいパーティションを作成しました。パーティション設定中に、プライマリパーティション、パーティション番号1、およびその他のデフォルトオプションを選択しました。
  • mkfs.ext3 /dev/sdb1を使用してディスクをフォーマットしました。
  • ディスクを/media/new_driveにマウントしました。
  • インストール済みGRUB grub-install /dev/sdb1 --root-directory=/media/new_drive/

この後、2番目のVM新しく準備されたハードディスクが起動しませんでした。エラーが発生しました:could not read from the boot mediumgrub-installの後でMBRが更新されていないようです、しかし私はGRUB=が新しいドライブの/boot/grubの下にインストールされていることを確認できます。

しかし、最悪なのは、既存のCentOS GRUBが破損していることです。CentOSVMがハングし、テキストがGRUBのみの黒い画面が表示されます。

grub-install /dev/sdb1がsdb1のMBRを変更しないのはなぜですか?これは新しいドライブにGRUBをインストールする正しい方法ではありませんか?

5
Renjith

私はgrub2のエキスパートではありませんが(申し訳ありません)、grub-install行に--skip-fs-probeを追加してみてください。これにより、grubプロンプトが起動して/boot/grub/device.mapが作成されないことがわかりました。このパラメーターgrub-installがないと、あなたが言うことをする代わりに、それはあなたより賢く、何か違うことをするかもしれないと思います。

もう1つは、正しいgrub-installを使用していることを確認することです(つまり、元のgrubではなく、grub2に対して)。 Centos内であれば問題ありませんが、SystemRecoveryCDでは両方のバージョンを使用できるため、grub2-installを使用する必要があります。私は難しい方法を学びました...

@wurtelが指摘したように(kudos)、パーティションではなくドライブを指定する必要があります。 Grub2はディスクドライブ全体のセクター0にインストールされ、この「スタブ」が起動時に実行されますが、次の起動段階のためにファイルをインストールする必要があるディスク上の場所を知る必要があります。これが--root-directoryパラメータが使用されます。 (おもう。)

man grub-installを読んでグーグルする--root-directoryは実際にはgrub2バージョン1.99 ++で使用するためのものではないようですが、私の経験では機能します。 --boot-directoryを使用して実際のブートディレクトリを参照することを想定しているため、次のようになります。

grub-install /dev/sdb --skip-fs-probe --boot-directory=/media/new_drive/boot
6
gogoud

これは、ブートパーティション/bootとルートパーティション/で構成されるDebianインストールを新しいドライブに移動し、 GNU GRUB を使用してブート可能にした方法です。

パーティションのクローン

  • GParted live CD を使用して、新しいドライブにブートパーティションとルートパーティションを作成します。
  • GPartedのルートコンソールを使用して、古いブートパーティション(/dev/sda1だとしましょう)と新しいパーティション(/dev/sdb1)をマウントします。mount /dev/sda1 /mnt/oldBoot && mount /dev/sdb1 /mnt/newBoot
  • 古いブートパーティションから新しいブートパーティションにデータをコピーします:cp -afv /mnt/oldBoot /mnt/newBootcp -afv:の説明
    • aは、「アーカイブ」を意味します。
    • リンクを逆参照しない
    • 再帰的にコピーする(-Rなど)
    • すべての属性(タイムスタンプ、所有者、権限)を保持する
    • f:強制、既存の宛先ファイルを開くことができない場合は、それを削除して再試行します
    • v:詳細、何が行われているかを説明
  • これにより、現在コピーされているファイルとcpが進行中かどうかを示す出力がコンソールに生成されます
  • 古いルートパーティションから新しいルートパーティションにファイルをマウントしてコピーします。
    • 安全のため:umount /mnt/oldBoot && umount /mnt/newBoot
    • 古いルートパーティションと新しいルートパーティションをマウントします(それが/dev/sda2および/dev/sdb2であると想定):mount /dev/sda2 /mnt/oldRoot && mount /dev/sdb2 /mnt/newRoot
    • 古いルートパーティションのデータを新しいルートパーティションにコピーします:cp -afv /mnt/oldRoot /mnt/newRoot
  • ブート時にマウントするパーティションを定義する filesystem table を編集します(そのためにVimを使用します):

    • vi /etc/fstab
    • 古いパーティションがここで参照されていることがわかります。代わりに新しいパーティションのUUIDを使用してください
    • :r !blkidを使用すると、すべてのUUIDを一時的にfstabに挿入して、簡単にコピーして貼り付けることができます
    • 新しいパーティションのUUIDを使用して、fstabのエントリを変更します。これらは次のようになります。

      # <file system> <mount point> <type> <options> <dump> <pass> # Root partition UUID=76fd1ffd-fb96-4ab4-be1a-42f8e9223983 / ext4 errors=remount-ro 0 1 # Boot partition UUID=e560e29e-8752-4b83-b1ee-4b86c0009f0b /boot ext2 defaults 0 2

    • 以前に:r !blkidを使用して挿入したfstabからblkidの出力を削除します

GRUBをインストールする

  • GPartedライブCDの仮想ファイルシステムをマウントします。

    mount --bind /dev /mnt/newRoot/dev mount --bind /proc /mnt/newRoot/proc mount --bind /sys /mnt/newRoot/sys

  • GRUB GPartedライブCDのユーティリティをルートパーティションで利用できるようにします:mount --bind /usr/ /mnt/newRoot/usr

  • GRUBはその構成を/bootに保存するため、ブートパーティションをルートパーティションにマウントします:mount /dev/sdb1 /mnt/newRoot/boot
  • chroot /mnt/newRootを使用して、新しいルートパーティションを一時的にファイルシステムのルートにします
  • /boot/grub/grub.cfを使用してGRUB構成ファイルをupdate-grub2に作成します
  • 新しいドライブにGRUB=をインストールします:grub-install /dev/sdb。ここでパーティション番号を指定しないでください
  • GPartedライブCDのファイルシステムに戻ります:exit
  • パーティションのアンマウント:umount /mnt/newRoot/*
  • シャットダウンマシン
  • 複数のドライブが接続されている場合は、新しいドライブが起動順序の最初になるようにしてください
  • スタートマシン

これらの手順は those of oaktreepeak.comzeasite.com に触発されています。

あるいは、 Clonezilla を使用して同じことを実現することもできます。

2
Matthias Braun