目录
一、实验目的
掌握 Linux 系统下使用 dd 进行磁盘镜像备份与恢复的核心技术
熟悉取证分析中文件删除后的数据恢复流程
理解 ext2 文件系统中 inode 与数据块的关联机制。
二、实验内容
磁盘镜像构建与备份
用 dd 创建 100MB 虚拟磁盘镜像,格式化为 ext2 文件系统,写入测试文件 hello.txt 并记录其 inode 号。
通过 dd 整盘备份并实时压缩,验证压缩率;解压后恢复镜像。
取证场景模拟
删除测试文件 hello.txt ,制造"已删除文件"取证场景。
数据恢复验证
使用 debugfs 分析镜像,定位已删除文件的 inode (如 12 号记录),导出数据块(如 block 265 ),成功恢复 hello.txt 。
三 . 实验仪器及器材
VMware Ubuntu 20.04
四、实验步骤
首先要明确压缩、解压文件需要空间,我的虚拟机数据是放在D盘,我首先查看D盘还剩多少空间,还剩一百多个G
接着打开ubuntu 的终端,查看磁盘整体使用情况
bash
df -h

-
根分区
/只用了 5%,还有 196G 可用; -
/home几乎为空(113M / 265G); -
只有
/boot用了 83%,但 44M 剩余也足够。
查看磁盘
bash
lsblk

-
只有一块物理盘
/dev/sda500 G -
分区情况
-
/dev/sda1220.6 G → 系统根分区/ -
/dev/sda2286 M →/boot -
/dev/sda39 G → 交换分区 -
/dev/sda4270.1 G →/home(几乎空,仅 113 M 已用)
-
备份 /dev/sda4(/home),但因为实际物理机我只剩一百多个G,所以我根本到时候压缩这个盘之后解压没有那么多空间可以放。所以进行以下方案:
创建工作目录
mkdir -p ~/dd-lab && cd ~/dd-lab
造 100 M 空盘
dd if=/dev/zero of=disk-100M.img bs=1M count=100
2. 格式化成「最简 ext2」并指定 1 KiB 块大小(方便小 block 号)
bash
sudo mkfs.ext2 -b 1024 -O ^extent,^dir_index,^sparse_super,^resize_inode disk-100M.img
只写一次文件 → 立即只读卸载
bash
sudo mount -o loop disk-100M.img /mnt
echo "Hello DD+GZIP+DebugFS" | sudo tee /mnt/hello.txt
sudo umount /mnt # 关键:卸载后内核不会再动数据
用 debugfs 内部删除(不触内核回收)
bash
sudo debugfs -w disk-100M.img
debugfs: rm /hello.txt
debugfs: quit
立刻 dd + gzip 备份(不再挂载!)
bash
dd if=disk-100M.img bs=1M status=progress | gzip > disk.gz
解压成恢复镜像
bash
gunzip -c disk.gz > disk-restored.img
找回 inode & block 号
bash
sudo debugfs disk-restored.img
debugfs: lsdel
我这里是12

按 q退出,继续在debugfs界面下输入:注意有空格
bash
debugfs: stat <12>
记下 BLOCKS

我这里是265,记得替换成你们的
输入q退出debugfs界面,回到终端
导出真实数据(开始恢复文件)
bash
sudo dd if=disk-restored.img of=recovered.txt bs=1024 count=1 skip=XXX
skip后面的xxx为实际的上一步的BLOCKS,比如我的就是265
查看回复的文件内容
bash
head -c 22 recovered.txt
确实没错

清理(可选)
bash
cd ~ && rm -rf ~/dd-lab
完整实验截图:


恭喜完成!