当前位置: 首页 > news >正文

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

恢复完成后,直接重启就能进入原系统(分区、数据、引导全都一样)。


五、安全建议

  1. 千万确认磁盘名:恢复时如果写错磁盘,会瞬间覆盖数据。
  2. 备份文件尽量放在不同设备,不要和源盘同一个硬盘。
  3. 备份过程可能会花很久(几十分钟到几个小时,取决于硬盘大小)。
  4. 建议在 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 "已卸载外部存储"

使用方法

  1. 保存为 backup_restore_dd.sh

  2. 赋予执行权限:

    chmod +x backup_restore_dd.sh
    
  3. 运行:

    ./backup_restore_dd.sh
    

安全特性

  • 两次确认磁盘名 → 避免 of= 写错盘
  • 自动挂载外部存储 → 防止写到系统盘
  • 模式选择 → 明确是备份还是恢复
  • 恢复前可校验 SHA256 → 确保数据完整
  • conv=sync,noerror → 遇坏扇区继续备份/恢复
  • 挂载完成才操作 → 避免空路径误写

我建议你以后所有 dd 相关操作都用这个脚本,因为它帮你加了防呆保护。
如果你愿意,我可以帮你再加一个 Live USB 自动运行版本,这样插入启动盘就能直接执行全盘备份/恢复,不必进入系统。这样出错几率几乎为零。

你要我帮你做这个 自动运行 Live USB 版本 吗?这样连命令都不用敲了。

http://www.lryc.cn/news/618527.html

相关文章:

  • Day 38: Dataset类和DataLoader类
  • Labelme从安装到标注:零基础完整指南
  • 【完美解决】在 Ubuntu 24.04 上为小米 CyberDog 2 刷机/交叉编译:终极 Docker 环境搭建指南
  • mimiconda+vscode
  • HeidiSQL 连接 MySQL 报错 10061
  • vue+Django农产品推荐与价格预测系统、双推荐+机器学习预测+知识图谱
  • 跨界重构规则方法论
  • ubuntu24下keychorn键盘连接不了的改建页面的问题修复
  • 深入理解哈希结构及其应用
  • secureCRT ymodem协议连续传输文件速率下降
  • 鸿蒙开发教程实战案例源码分享-好看的SwitchButton
  • [SC]SystemC中的SC_FORK和SC_JOIN用法详细介绍
  • 17、CryptoMamba论文笔记
  • 42.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(一)
  • UNet改进(32):结合CNN局部建模与Transformer全局感知
  • Day45--动态规划--115. 不同的子序列,583. 两个字符串的删除操作,72. 编辑距离
  • DeepSeek-R1-0528 推理模型完整指南:领先开源推理模型的运行平台与选择建议
  • XC7A15T-1FTG256C Xilinx AMD Artix-7 FPGA
  • Linux中Apache与Web之虚拟主机配置指南
  • git config的配置全局或局部仓库的参数: local, global, system
  • 【unity实战】使用Splines+DOTween制作弯曲手牌和抽牌动画效果
  • 有限元方法中的数值技术:行列式、求逆、矩阵方程
  • 【bug 解决】串口输出字符乱码的问题
  • 【Datawhale夏令营】多模态RAG学习
  • 【Bug经验分享】由jsonObject-TypeReference引发的序列化问题
  • 【昇腾】关于Atlas 200I A2加速模块macro0配置3路PCIE+1路SATA在hboot2中的一个bug_20250812
  • STM32_bug总结(TIM定时中断进不去和只进1次)
  • 高性能web服务器Nginx
  • 【Android】【bug】Json解析错误Expected BEGIN_OBJECT but was STRING...
  • linux 开机进入initramfs无法开机