不能跳过 /proc、/sys、/dev、/run 是因它们为内核动态生成的虚拟文件系统,非真实磁盘数据,运行中扫描会触发 i/o 错误、卡死或损坏备份;/var/log 不需排除但须静默服务,swap 必须先关闭(sudo swapoff -a),否则 dd 可能报 i/o 错误。

不能直接“排除虚拟内存和日志”来克隆系统镜像——因为克隆操作本身不处理运行时内存或日志内容,真正要规避的是“正在写入的日志文件”和“挂载的 swap 分区”,否则会导致数据不一致或 dd 失败。
为什么不能跳过 /proc、/sys、/dev、/run 这些目录
这些是内核动态生成的虚拟文件系统,不是真实磁盘数据。如果在运行中用 tar 或 rsync 扫描它们,会触发错误(如 /proc/kcore: Input/output error)、卡死,甚至损坏备份完整性。尤其是 /proc 下的内存映射信息,根本不能被当作文件复制。
-
/proc、/sys、/dev、/run必须显式--exclude掉 -
/var/log不需要“排除”,但必须确保服务已静默(比如停掉rsyslog或用logrotate -f强制轮转) - swap 分区必须先关闭:
sudo swapoff -a,否则dd读取底层块设备时可能遇到 I/O 错误
用 tar 做文件级克隆:快、可控、跳过虚拟内容
这是最常用且安全的方式,适合从一台运行中的 Linux 系统快速制作可启动镜像(需目标环境硬件/驱动兼容)。关键在于正确排除 + 保留关键元数据。
- 使用 Live CD 或单用户模式更稳妥;若必须在线,请先停关键服务:
sudo systemctl stop rsyslog nginx mysql - 执行命令示例(注意路径结尾无斜杠,
/是根目录):sudo tar cvpzf system-backup.tar.gz \ --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run \ --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/log/journal \ --exclude=/var/cache/apt/archives /
-
/var/log/journal占空间大且易变,建议排除;其他日志可保留,因tar是按文件快照,不关心内容是否“最新” - 恢复时用
sudo tar xvpzf system-backup.tar.gz -C /mnt/target,再重装引导(grub-install)
用 dd 克隆整块设备:快照级但必须关机或卸载
dd 不识别文件系统,它只按块复制。所以它天然“跳过”日志内容和内存——但它也完全不管你在写什么。只要源分区正被挂载为读写,就极大概率产生不一致镜像(例如 ext4 journal 未提交)。
- 唯一安全方式:进 Live 环境,或先
sudo sync && sudo echo 3 | sudo tee /proc/sys/vm/drop_caches,再sudo umount /dev/sdX1 - 命令示例(目标盘需 ≥ 源盘容量):
sudo dd if=/dev/sdX of=/path/to/image.img bs=4M status=progress conv=noerror,sync
-
conv=noerror,sync能跳过坏块,但会填充零,可能导致引导失败;生产环境慎用 - 别指望用
dd“排除日志”——它连/var/log在哪都不知道,只认设备号
克隆后最容易被忽略的三件事
很多人以为 tar/dd 完就结束了,结果新系统起不来、网络不通、磁盘识别错乱——问题往往出在这些地方:
- 克隆后首次启动前,必须更新 initramfs:
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut -f(RHEL/CentOS),否则可能找不到 root 分区 - 网卡名可能变化(
ens3→enp0s3),需检查/etc/netplan/或/etc/sysconfig/network-scripts/ifcfg-*中的设备名是否匹配ip link输出 - 若原系统用了 LVM 或加密卷,克隆后需手动运行
sudo vgscan && sudo vgchange -ay激活卷组,否则/根目录无法挂载











