必须导出/etc/fstab、/etc/default/grub与/boot/grub/grub.cfg、/etc/systemd/system/下service单元、/etc/environment及~/.bashrc、/proc/sys/中修改的内核参数,以及systemctl show --property=environment --all获取的实际环境变量。

哪些配置必须导出才能还原运行环境
只备份 /etc 目录远远不够,很多关键参数分散在不同位置,且部分是运行时生成的。真正影响服务复原的包括:/etc/fstab(磁盘挂载)、/etc/default/grub 和 /boot/grub/grub.cfg(启动参数)、/etc/systemd/system/ 下的自定义 service 单元、/etc/environment 和用户级 ~/.bashrc 中的环境变量、/proc/sys/ 下被修改过的内核参数(如 net.ipv4.ip_forward)。特别注意:systemctl show --property=Environment --all 能抓到 systemd 服务实际加载的环境,比单纯看文件更准。
用 rsync 做增量式配置快照比 tar 更实用
tar 适合一次性归档,但日常维护中更需要可比对、可回退的轻量快照。rsync 配合 --archive --one-file-system --exclude 能精准控制范围,避免误拉 /proc 或 /dev 这类虚拟文件系统:
rsync -a --one-file-system \ --exclude='/proc' --exclude='/sys' --exclude='/dev' \ --exclude='/tmp' --exclude='/run' \ /etc/ ./backup/etc_$(date +%Y%m%d)/
关键点:--one-file-system 防止跨挂载点蔓延;/run 和 /tmp 是内存文件系统,不存盘;每次快照保留时间戳目录,方便 diff -r 对比变更。
环境变量导出要区分作用域和生效时机
全局环境变量不等于所有进程都能读到。比如 /etc/environment 只被 PAM 登录会话读取,而 systemd 服务默认不加载它。正确做法是:
- 对 shell 用户:用
set -o vi检查当前有效变量,再用env > env_snapshot.sh导出(注意这不含 source 链) - 对 systemd 服务:用
systemctl show --property=Environment --no-pager <service></service>单独抓取 - 对内核参数:用
sysctl -a | grep -v "kernel.random" | grep "=" > sysctl.conf.backup(过滤掉动态熵值等不可持久化项)
还原时最常被忽略的权限与 SELinux 上下文
直接 cp -r 或 rsync -a 恢复后,/etc/shadow 权限可能变成 644,sshd_config 的 SELinux type 可能丢失,导致服务起不来。必须补两步:
- 权限修复:
chmod 600 /etc/shadow && chmod 644 /etc/passwd - SELinux 恢复:
restorecon -Rv /etc(需提前用sestatus确认系统启用了 SELinux) - 若用
rsync备份时没加-X(保留扩展属性),SELinux context 就无法还原,这点极易遗漏
复杂点在于:有些配置依赖硬件指纹(如 /etc/machine-id),重装后不能直接覆盖,得留空或用 systemd-machine-id-setup 重生成。










