Ubuntu 全盘备份
好,那我给你做一个 Ubuntu 全盘备份(dd 方法) 的完整实操步骤,从准备、备份到恢复都写清楚。
一、确认要备份的硬盘
先确认你的系统安装在哪个硬盘上,比如 /dev/sda
、/dev/nvme0n1
等。
lsblk
示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 50G 0 part /
└─sda3 8:3 0 415.3G 0 part /home
sdb 8:16 0 931.5G 0 disk
上面 sda
是系统盘,sdb
是另一块空盘,可以用来保存备份。
⚠️ 确认系统盘名字,千万不要选错,不然恢复的时候会毁掉数据。
二、挂载备份存放位置
建议用另一块硬盘、U 盘、或 NAS 保存备份,不要放到同一块硬盘。
例如 /dev/sdb1
挂载到 /mnt/backup
:
sudo mkdir /mnt/backup
sudo mount /dev/sdb1 /mnt/backup
检查挂载是否成功:
df -h /mnt/backup
三、执行全盘备份
最简单的完整备份命令:
sudo dd if=/dev/sda of=/mnt/backup/ubuntu.img bs=64K status=progress
参数解释:
if=/dev/sda
:输入文件是系统盘of=/mnt/backup/ubuntu.img
:输出镜像文件保存位置bs=64K
:一次读写 64KB(速度和稳定性的平衡)status=progress
:实时显示进度
可选:加压缩减少文件大小
sudo dd if=/dev/sda bs=64K status=progress | gzip > /mnt/backup/ubuntu.img.gz
压缩后的文件会更小,尤其适合 SSD/HDD 存在大量空闲空间时。
可选:备份 MBR(引导扇区)
如果只想备份引导信息(512字节):
sudo dd if=/dev/sda of=/mnt/backup/mbr.img bs=512 count=1
四、恢复步骤
恢复会完全覆盖目标盘,所以非常危险,一定要确认磁盘名!
sudo dd if=/mnt/backup/ubuntu.img of=/dev/sda bs=64K status=progress
如果是压缩的:
gzip -dc /mnt/backup/ubuntu.img.gz | sudo dd of=/dev/sda bs=64K status=progress
恢复完成后,直接重启就能进入原系统(分区、数据、引导全都一样)。
五、安全建议
- 千万确认磁盘名:恢复时如果写错磁盘,会瞬间覆盖数据。
- 备份文件尽量放在不同设备,不要和源盘同一个硬盘。
- 备份过程可能会花很久(几十分钟到几个小时,取决于硬盘大小)。
- 建议在 Live USB 模式(Ubuntu 安装盘)下做备份,这样系统不会在运行中改变数据。
如果你愿意,我可以帮你画一个全盘 dd 备份/恢复的操作流程图,这样做时可以直接照图走,几乎不会出错。
要我帮你画吗?这样你一眼就能看懂每一步。
好,那我给你写一个 带防误操作机制的 Ubuntu dd 全盘备份/恢复脚本,加了多重确认和校验功能,避免误操作抹掉数据。
脚本功能
- 自动检测本机磁盘
- 区分系统盘和外部存储
- 让用户选择 备份 或 恢复 模式
- 至少 2 次确认磁盘名
- 自动生成 SHA256 校验文件(备份时)
- 恢复前自动验证校验码(可选)
- 带
conv=sync,noerror
防止坏扇区导致中断
脚本内容(backup_restore_dd.sh)
#!/bin/bash
# Ubuntu 全盘备份/恢复脚本(带防误操作机制)set -eBACKUP_DIR="/mnt/backup"echo "==== 检测可用磁盘 ===="
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
echo "====================="read -p "请输入系统盘(源盘)设备名,例如 sda: " SRC_DISK
read -p "请再次确认系统盘设备名(必须和上面相同): " SRC_DISK_CONFIRMif [ "$SRC_DISK" != "$SRC_DISK_CONFIRM" ]; thenecho "❌ 磁盘名不一致,退出!"exit 1
fiSRC_PATH="/dev/$SRC_DISK"if [ ! -b "$SRC_PATH" ]; thenecho "❌ $SRC_PATH 不是有效磁盘!"exit 1
firead -p "请输入外部存储分区(用于保存备份),例如 sdb1: " EXT_PART
EXT_PATH="/dev/$EXT_PART"if [ ! -b "$EXT_PATH" ]; thenecho "❌ $EXT_PATH 不是有效分区!"exit 1
fi# 挂载外部硬盘
sudo mkdir -p "$BACKUP_DIR"
sudo mount "$EXT_PATH" "$BACKUP_DIR"echo "已挂载外部存储到 $BACKUP_DIR"
df -h "$BACKUP_DIR"echo "请选择模式:"
echo "1) 备份系统盘"
echo "2) 恢复系统盘"
read -p "请输入选项 (1/2): " MODEDATE=$(date +%Y%m%d_%H%M%S)if [ "$MODE" == "1" ]; then# 备份模式BACKUP_FILE="$BACKUP_DIR/ubuntu-$DATE.img.gz"echo "⚠️ 备份将创建文件:$BACKUP_FILE"read -p "确认执行备份吗?(yes/no): " CONFIRMif [ "$CONFIRM" != "yes" ]; thenecho "❌ 已取消"exit 1fiecho "开始备份..."sudo dd if="$SRC_PATH" bs=64K status=progress conv=sync,noerror | gzip > "$BACKUP_FILE"echo "生成 SHA256 校验文件..."sha256sum "$BACKUP_FILE" > "$BACKUP_FILE.sha256"echo "✅ 备份完成!文件保存在 $BACKUP_FILE"elif [ "$MODE" == "2" ]; then# 恢复模式echo "⚠️ 恢复将完全覆盖 $SRC_PATH 的数据!"read -p "请输入要恢复的备份文件路径(.gz 格式): " RESTORE_FILEif [ ! -f "$RESTORE_FILE" ]; thenecho "❌ 文件不存在!"exit 1fi# 如果有校验文件,先验证if [ -f "$RESTORE_FILE.sha256" ]; thenecho "检测到校验文件,开始验证..."sha256sum -c "$RESTORE_FILE.sha256"elseecho "⚠️ 没有校验文件,跳过验证"firead -p "最后确认恢复吗?这会覆盖 $SRC_PATH (yes/no): " FINAL_CONFIRMif [ "$FINAL_CONFIRM" != "yes" ]; thenecho "❌ 已取消"exit 1fiecho "开始恢复..."gzip -dc "$RESTORE_FILE" | sudo dd of="$SRC_PATH" bs=64K status=progress conv=sync,noerrorecho "✅ 恢复完成!"elseecho "❌ 无效选项"exit 1
fisudo umount "$BACKUP_DIR"
echo "已卸载外部存储"
使用方法
-
保存为
backup_restore_dd.sh
-
赋予执行权限:
chmod +x backup_restore_dd.sh
-
运行:
./backup_restore_dd.sh
安全特性
- 两次确认磁盘名 → 避免
of=
写错盘 - 自动挂载外部存储 → 防止写到系统盘
- 模式选择 → 明确是备份还是恢复
- 恢复前可校验 SHA256 → 确保数据完整
- conv=sync,noerror → 遇坏扇区继续备份/恢复
- 挂载完成才操作 → 避免空路径误写
我建议你以后所有 dd
相关操作都用这个脚本,因为它帮你加了防呆保护。
如果你愿意,我可以帮你再加一个 Live USB 自动运行版本,这样插入启动盘就能直接执行全盘备份/恢复,不必进入系统。这样出错几率几乎为零。
你要我帮你做这个 自动运行 Live USB 版本 吗?这样连命令都不用敲了。