tar 不能直接备份 /proc /sys /dev,因它们是虚拟文件系统,内容由内核实时生成,非真实磁盘数据,读取会导致报错、体积膨胀或卡死;需用 --exclude 排除或仅备份 /etc、/home 等实际数据目录。

tar 打包压缩时为什么不能直接备份 /proc /sys /dev
因为这些是虚拟文件系统,内容由内核实时生成,不是真实磁盘数据。tar 会尝试读取它们,但多数文件无法正常读取,导致报错或备份体积异常膨胀(比如 /proc/kcore 看似几 TB),甚至卡死。
实操建议:
- 必须用
--exclude排除:tar --exclude='/proc' --exclude='/sys' --exclude='/dev' -czf backup.tar.gz / - 更稳妥的做法是只备份实际配置和用户数据目录,例如
/etc、/home、/root、/var/www等 - 若真要全盘归档,应先
mount --bind到临时目录并去掉虚拟挂载点,再tar
rsync 克隆系统时如何避免遗漏权限、软链和 SELinux 上下文
rsync 默认不保留所有元数据,直接 rsync -av / /mnt/backup/ 可能导致恢复后服务起不来(比如 SSH 拒绝登录、Apache 报 Permission denied)。
实操建议:
- 加
-a是基础,但还需显式补充:rsync -aHAXS --delete / /mnt/backup/ -
-H保留硬链接,-A保留 ACL,-X保留扩展属性(含 SELinux context),-S支持稀疏文件(如虚拟机镜像) - 目标分区必须已启用 SELinux(
mount -o remount,context=system_u:object_r:root_t:s0 /mnt/backup),否则-X无效 - 不要在运行中的根分区上直接 rsync 克隆;优先用 Live USB 启动后操作
dd 克隆整盘时遇到“设备忙”或“输入/输出错误”怎么办
dd if=/dev/sda of=/dev/sdb 类操作失败,常见于源盘有活动分区、目标盘被系统自动挂载、或硬盘存在坏道。
实操建议:
- 确认无挂载:
lsblk和mount | grep sda,用umount /dev/sda*卸载全部子分区 - 目标盘提前清空:用
dd if=/dev/zero of=/dev/sdb bs=1M count=100覆盖开头 MBR/GPT 区域,避免旧分区表干扰 - 坏道处理:加
conv=noerror,sync让dd遇错跳过并填零,但需配合ddrescue更可靠——它会多次扫描、优先复制好区段 -
dd不适合 SSD 或 LVM 卷克隆,这类场景优先用lvcreate --snapshot或厂商工具
恢复备份后系统无法启动,grub 和 initramfs 哪里容易出问题
即使文件完整复制过去,grub 的设备映射(如 (hd0))、initramfs 中的 root 设备路径(如 root=UUID=...)可能与新环境不匹配,导致黑屏或 dracut 提示找不到根文件系统。
实操建议:
- 恢复后必须 chroot 进新系统重装 grub:
grub-install /dev/sdX+update-grub(Debian/Ubuntu)或grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS) - 检查
/etc/fstab和grub.cfg中的 UUID 是否与blkid输出一致;不一致就用sudo blkid更新 - 重新生成 initramfs:
mkinitcpio -P(Arch)或dracut -f(RHEL/Fedora)或update-initramfs -u(Debian/Ubuntu) - UEFI 系统还要确认
/boot/efi是否正确挂载,且efibootmgr中有对应启动项
真正麻烦的不是打包或克隆本身,而是元数据一致性、设备标识变化、以及 bootloader 与内核初始化阶段的隐式依赖。一次看似完整的备份,可能只在原硬件上能跑通。











