ddを使用してGrubのインストールを復元できますか?

ddを使用してGrubのインストールを復元できますか?

次のパーティションレイアウトを備えたデュアルブートシステムがあります。

# fdisk -l
Disk /dev/sda: 596.2 GiB, 640135028736 bytes, 1250263728 sectors
Disk model: SAMSUNG HM640JJ 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x08c427b9

Device     Boot      Start        End   Sectors   Size Id Type
/dev/sda1            80325   30800324  30720000  14.7G  7 HPFS/NTFS/exFAT
/dev/sda2         30800325  440400559 409600235 195.3G  7 HPFS/NTFS/exFAT
/dev/sda3        440403966 1132820479 692416514 330.2G  f W95 Ext'd (LBA)
/dev/sda4  *    1132820480 1250263039 117442560    56G 83 Linux
/dev/sda5        440403968 1116043263 675639296 322.2G  7 HPFS/NTFS/exFAT
/dev/sda6       1116045312 1132820479  16775168     8G 82 Linux swap / Solaris

Partition table entries are not in disk order.

これはpartedMBRに基づいていますgdisk。 Linuxのインストール後にWindowsから起動したことがなく、ライブLinuxイメージから起動したddときに、Linuxの60Gパーティション全体とHDDの最初の63セクタを外部HDDに定期的にバックアップしました。

dd if=/dev/sda4 of=linux.img bs=4096 conv=fdatasync
dd if=/dev/sda of=boot.img bs=512 count=63 conv=fdatasync

私のLinuxが(最初に)クラッシュした後、上記のリバースブートを使用して回復しようとしました。

dd if=linux.img of=/dev/sda4 bs=4096 conv=fdatasync
dd if=boot.img of=/dev/sda bs=512 conv=fdatasync

ddエラーは報告されておらず、Linuxパーティションが期待どおりに復元されました。ただし、起動できません(Grubに問題があるため、システムは再起動し、カーソルが点滅してから突然再起動します)。最後にライブを使用しchrootて再起動してくださいgrub-install。その後、再び正常に起動できました。

Grubはそれをコアイメージとして使用するので、最初の63セクターをバックアップしました(私の記憶が正しい場合)。起動後に最初に行うことは、newboot.imgファイルにダンプしてから、次のことです。

 diff boot.img newboot.img

何も返されません。つまり、grubを再インストールした後も領域が同じであることを意味します。

  • この場合、開始できない根本原因は何ですか?
  • バックアップはどうすればよいですか(サードパーティの防止)?

私が知っている限り、パーティションの変更やUUIDはありません。両方の画像が一緒に作成されます。グラブコードはセクタ63以降のどこかで続行できますか?どこで、どれくらいかかりますか?

ありがとうございます。

答え1

dd if=/dev/sda of=boot.img bs=512 count=63 conv=fdatasync

マスターブートレコードと他の62セクタ(31.5KB)をバックアップしようとしています。ただし、MBRの次のディスクの最初のトラックに含まれているGRUB2部分は、これより簡単に大きくなる可能性があります。

はい、寸法を確認して/boot/grub/i386-pc/core.imgからそれより小さい場合があります。しかし、これはcore.imgMBRと最初のパーティションの先頭の間にスペースを挿入することのすべてではありません。少なくとも最新のGRUB2には、一部のGRUBモジュールも含まれています。

  • fshelp.mod、さまざまなファイルシステムのための共通サポートモジュール
  • part_msdos.mod、MBRパーティションテーブルのサポート
  • Linuxディレクトリを含むファイルシステムと一致するファイルシステムサポートモジュール/boot

core.img私のシステムでは、/bootファイルシステムがext2/3/4(つまり、サポートされているファイルシステムが非常に小さい)であると仮定すると、これらの最小モジュールの合計サイズはext2.mod36KBを超えます。 Linuxディストリビューションでは、より多くの機能を提供するために、より多くのモジュールを含めることを選択できます。上記のモジュールは非常に単純なモジュールのセットです。

これらのモジュールはLZMAアルゴリズムを使用して圧縮することで全体のサイズを減らすことができますが、最新のGRUB2はReed-Solomonエラー訂正コードを使用してビットエラーから埋め込まれたコードを保護し、サイズを再び増やします。

私はさまざまなブートローダを検出し、診断/法医学の目的でその下位レベルの設定を読み取るプログラムを開発しようとしてきました。既定では、次の機能を複製したことがわかりました。bootinfoscript(若干の違いがあります)。ただし、ディスクの構造を正しく読み取ると、システムに含まれるGRUB2コードの合計サイズは102セクタ、つまり51KBです。

関連情報