Linux 现场镜像的做法
在 Linux 服务器上做现场镜像,本质是把块设备按字节原样复制成文件,同时保证源设备不被写入。与通用 dd 用法相比,现场作业要额外判断三件事:镜像是整盘还是单个分区(决定能否保留分区表)、源设备是否已挂载(已挂载的在用文件系统会有缓存不一致)、以及输出文件写到哪块盘上(不能写回源设备本身)。完成采集后立即计算哈希并两次记录,形成可校验的镜像文件。
基本信息
| 适用平台 | Linux(coreutils 的 dd;取证向替代工具 dc3dd、dcfldd) |
|---|---|
| 设备识别 | lsblk -o NAME,SIZE,SERIAL,MOUNTPOINT、blkid、findmnt |
| 常用命令 | dd if=<源> of=<镜像> bs=4M conv=noerror,sync status=progress |
| 整盘与分区 | if=/dev/sdb 含分区表;if=/dev/sdb1 只有该分区数据 |
| 特殊设备 | LVM 用 /dev/vg/lv,加密卷用 /dev/mapper/xxx,云盘用对应块设备 |
| 输出位置 | 写到外接存储或网络挂载目录,绝不能落在源盘上 |
典型使用场景
- 服务器被入侵后固定整盘镜像,供后续离线分析
- 只采集受影响分区,缩短采集时间与存储占用
- 采集系统盘前先记录分区布局,便于后续按偏移解析
- 云主机现场:确认块设备名与挂载关系后再采集
- 与易失数据采集配合:先取内存与连接,再做镜像
- 为合规交付提供可校验的镜像与校验清单
采集与校验
采集与校验
# 先确认设备名、容量、序列号与挂载点,避免拷错盘
lsblk -o NAME,SIZE,SERIAL,FSTYPE,MOUNTPOINT
findmnt -o TARGET,SOURCE,FSTYPE
# 能卸载的先卸载(无法卸载的系统盘需说明一致性限制)
# sudo umount /dev/sdb1
# 采集:4M 块大小,遇错继续并填充,显示进度
dd if=/dev/sdb of=/mnt/ev/disk.img bs=4M conv=noerror,sync status=progress
# 立即计算哈希,写入清单并保留输出
sha256sum /mnt/ev/disk.img | tee /mnt/ev/disk.img.sha256
# 记录分区布局,供后续分析按扇区偏移解析
sfdisk -d /dev/sdb > /mnt/ev/disk.sfdisk.txt 2>/dev/null
# 采样期间避免对源盘做任何写操作(挂载、fsck、touch)现场判断要点
| 判断项 | 含义 | 处理建议 |
|---|---|---|
| 整盘还是分区 | 是否包含分区表与引导区 | 需要恢复删除文件或做分区级分析时采整盘 |
| 是否已挂载 | 在用文件系统存在缓存未落盘 | 可能时先卸载;不能卸载要在记录中说明一致性限制 |
| 输出介质容量 | 镜像文件大小约等于源设备容量 | 留出空间并确认输出介质无坏道 |
| bs 取值 | 影响速度与读取错误粒度 | 机械盘常用 1M-4M,过大反而影响错误定位 |
| 校验方式 | 镜像哈希与源设备哈希 | 源设备仍在位时两侧都记录,并注明范围 |
dc3dd、dcfldd 可在采集同时输出哈希与错误统计,比原生 dd 更适合规范流程;使用时报明工具与版本,便于他人复现采集过程。
conv=noerror 会让 dd 在坏扇区处跳过或填充内容,可能导致镜像长度与源设备不一致。报告中要引用错误统计并说明缺口,不能简单声称「完整镜像」。