MBR 結構與備份原理
# MBR 佔用磁盤前 512 字節
# 結構:
# 0-439 字節: 引導載入器代碼 (GRUB Stage1 / Windows Bootloader)
# 440-443 字節: 磁盤簽名 (4 字節)
# 444-445 字節: 保留 (通常 0x0000)
# 446-509 字節: 分區表 (4 個主分區條目,每項 16 字節)
# 510-511 字節: 結束標誌 0x55AA
# 完整備份 (含分區表)
dd if=/dev/sda of=/root/mbr_backup_$(date +%F).bin bs=512 count=1
# 僅備份引導代碼 (不含分區表,跨磁盤恢復較安全)
dd if=/dev/sda of=/root/boot_code.bin bs=446 count=1
# 僅備份分區表
sfdisk -d /dev/sda > /root/partition_table.bak
# 或
dd if=/dev/sda of=/root/part_table.bin bs=1 skip=446 count=64
恢復操作與風險控制
場景一:GRUB 損壞,分區表完好
# 從備份恢復引導代碼
dd if=/root/boot_code.bin of=/dev/sda bs=446 count=1
# 或重新安裝 GRUB (推薦,自動適配當前分區)
grub-install /dev/sda
場景二:分區表損壞,需完整恢復
# 危險操作!確認備份與目標磁盤幾何結構一致
dd if=/root/mbr_backup_20240101.bin of=/dev/sda bs=512 count=1
# 立即驗證
fdisk -l /dev/sda
場景三:誤刪分區,需從備份恢復分區表
# 使用 sfdisk 恢復
sfdisk /dev/sda < /root/partition_table.bak
# 或 testdisk 交互式恢復 (更安全)
testdisk /dev/sda
GRUB 重新安裝標準流程
方法一:系統內重裝 (較安全)
# 確認根分區位置
lsblk -f
# 重裝 GRUB 到磁盤
grub-install /dev/sda
# 更新配置
update-grub
# 或
grub-mkconfig -o /boot/grub/grub.cfg
方法二:LiveCD/救援模式 Chroot 重裝
# 1. 掛載根分區
mount /dev/sda2 /mnt
# 2. 掛載關鍵虛擬文件系統
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
# 3. 進入 chroot
chroot /mnt
# 4. 重裝 GRUB
grub-install /dev/sda
update-grub
# 5. 退出並重啟
exit
reboot
Windows + Linux 雙系統引導修復
問題:Windows 重裝覆蓋 MBR,導致無法進入 Linux
# 方案一:Linux LiveCD 重裝 GRUB (推薦)
# 按上述 Chroot 流程操作,GRUB 會自動檢測 Windows 並添加菜單項
# 方案二:Windows 下使用 EasyBCD 添加 GRUB 引導
# 1. Linux 下備份 GRUB Stage1 (512 字節)
dd if=/dev/sda2 of=/boot/grub.lnx bs=512 count=1 # 假設 /boot 在 sda2
# 2. 複製 grub.lnx 到 Windows C:\
# 3. Windows 下 EasyBCD -> 添加條目 -> Linux/BSD -> GRUB 2 -> 路徑 C:\grub.lnx
# 4. 重啟由 Windows Boot Manager 選單啟動 GRUB 再進 Linux
問題:GRUB 更新後 Windows 項消失
# 1. 掛載 Windows 系統分區 (通常是 sda1)
mkdir -p /mnt/win
mount /dev/sda1 /mnt/win
# 2. 運行 os-prober 掃描
os-prober
# 3. 更新 GRUB
update-grub
# 輸出應包含: Found Windows 10 on /dev/sda1
UEFI 系統特殊說明
- UEFI 無 MBR 概念,引導載入器為 EFI 系統分區 (ESP) 中的 .efi 文件
- 備份關鍵:
cp -a /boot/efi /root/efi_backup/ (整個 ESP 分區)
- 修復:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
- Windows UEFI 修復:安裝介質修復模式 ->
bcdboot C:\Windows /s S: /f UEFI (S: 為 ESP 盤符)
自動化備份腳本 (計劃任務)
# /usr/local/bin/backup_mbr.sh
#!/bin/bash
BACKUP_DIR="/backup/mbr"
mkdir -p "$BACKUP_DIR"
DATE=$(date +%F_%H%M)
DISK="/dev/sda"
# 完整 MBR
dd if="$DISK" of="$BACKUP_DIR/mbr_${DATE}.bin" bs=512 count=1
# 分區表文本
sfdisk -d "$DISK" > "$BACKUP_DIR/part_${DATE}.txt"
# 僅引導代碼
dd if="$DISK" of="$BACKUP_DIR/bootcode_${DATE}.bin" bs=446 count=1
# 保留最近 30 份
find "$BACKUP_DIR" -name "mbr_*.bin" -mtime +30 -delete
find "$BACKUP_DIR" -name "part_*.txt" -mtime +30 -delete
# 設置權限並加入 crontab
chmod +x /usr/local/bin/backup_mbr.sh
echo "0 3 * * * root /usr/local/bin/backup_mbr.sh" >> /etc/crontab
核心工具對比表
| 工具 | 功能 | 適用場景 | 風險等級 |
| dd | 底層塊級備份/恢復 | MBR 完整備份、引導代碼提取 | 高 (覆寫不可逆) |
| sfdisk | 分區表文本化備份/恢復 | 分區表修復、跨磁盤複製分區佈局 | 中 |
| grub-install | GRUB 引導器安裝 | GRUB 損壞修復、新磁盤安裝引導 | 低 |
| testdisk | 交互式分區恢復 | 誤刪分區、分區表損壞掃描恢復 | 低 |
| boot-repair | 圖形化自動修復 | 新手、複雜雙系統 UEFI/Legacy 混合 | 低 |