温馨提示×

centos vnc如何进行备份恢复

小樊
39
2025-12-25 06:01:24
栏目: 智能运维

CentOS VNC 备份与恢复

一、备份清单与命令

  • 建议按用户与实例维度备份,核心内容包括:systemd 服务单元、VNC 密码文件、会话目录、桌面启动脚本、以及防火墙/SELinux 放行策略。以下以实例 :1 为例,实际可按需扩展到 :2、:3…
  • 备份命令示例(以 root 操作为例,其他用户将路径中的 /root 替换为对应用户家目录):
#!/usr/bin/env bash
set -e

USER=root
DISPLAY=:1
BAK_DIR="/root/vnc_backup_$(date +%F_%H-%M-%S)"
mkdir -p "$BAK_DIR"

# 1) systemd 服务单元
cp -a /lib/systemd/system/vncserver@.service "/etc/systemd/system/vncserver@${DISPLAY}.service" 2>/dev/null || true
cp -a "/etc/systemd/system/vncserver@${DISPLAY}.service" "$BAK_DIR/"

# 2) VNC 密码文件(存在才备份)
[ -f "$HOME/.vnc/passwd" ] && cp -a "$HOME/.vnc/passwd" "$BAK_DIR/"

# 3) 会话目录(含日志、pid 等)
[ -d "$HOME/.vnc" ] && cp -a "$HOME/.vnc" "$BAK_DIR/"

# 4) 桌面启动脚本
[ -f "$HOME/.vnc/xstartup" ] && cp -a "$HOME/.vnc/xstartup" "$BAK_DIR/"

# 5) 防火墙规则导出(firewalld)
if command -v firewall-cmd >/dev/null 2>&1; then
  firewall-cmd --list-all > "$BAK_DIR/firewalld-rules.txt"
fi

# 6) SELinux 布尔值快照(若使用 SELinux)
if command -v getsebool >/dev/null 2>&1; then
  getsebool -a > "$BAK_DIR/selinux-booleans.txt"
fi

# 7) 当前监听端口快照
ss -lntp | grep -E '590[0-9]' > "$BAK_DIR/vnc_ports.txt" || true

echo "VNC 备份完成:$BAK_DIR"
  • 说明:
    • 常见服务文件模板位于 /lib/systemd/system/vncserver@.service,实际启用的是 /etc/systemd/system/vncserver@:1.service 等实例文件。
    • 首次设置 VNC 密码通常使用 vncpasswd,其生成的密码文件位于对应用户的 ~/.vnc/passwd

二、恢复步骤与命令

  • 恢复命令示例(仍以实例 :1 为例,先停止旧会话并恢复文件,再重载 systemd 并启动服务):
#!/usr/bin/env bash
set -e

USER=root
DISPLAY=:1
BAK_DIR="/root/vnc_backup_2025-12-25_10-00-00"   # 替换为你的备份目录

# 0) 如已有会话,先停止
su - "$USER" -c "vncserver -kill $DISPLAY" >/dev/null 2>&1 || true

# 1) 恢复 systemd 服务单元
cp -a "$BAK_DIR/vncserver@${DISPLAY}.service" "/etc/systemd/system/"

# 2) 恢复 VNC 密码与会话目录
[ -f "$BAK_DIR/passwd" ] && cp -a "$BAK_DIR/passwd" "$HOME/.vnc/passwd"
[ -d "$BAK_DIR/.vnc" ] && rsync -a "$BAK_DIR/.vnc/" "$HOME/.vnc/"

# 3) 恢复 xstartup(若存在)
[ -f "$BAK_DIR/xstartup" ] && cp -a "$BAK_DIR/xstartup" "$HOME/.vnc/xstartup"

# 4) 若备份了 firewalld 规则,按需恢复(示例为开放 5901/tcp)
# firewall-cmd --permanent --add-port=5901/tcp
# firewall-cmd --reload

# 5) 重载 systemd 并启动
systemctl daemon-reload
systemctl enable "vncserver@${DISPLAY}.service"
systemctl start  "vncserver@${DISPLAY}.service"

echo "VNC 恢复完成,实例:$DISPLAY"
  • 说明:
    • 恢复后首次启动若报端口占用,可先确认并清理旧进程或旧 socket(见下一节排错)。
    • 若使用云厂商安全组/本机防火墙,请同步放行对应端口(见下一节端口说明)。

三、端口与防火墙要点

  • 显示号与端口映射:DISPLAY :1 → 端口 5901DISPLAY :2 → 5902,以此类推。
  • firewalld 放行示例(永久生效):
firewall-cmd --permanent --add-port=5901/tcp
firewall-cmd --reload
  • 云服务器安全组需同样放行对应 TCP 5901 端口;客户端连接地址形如 服务器IP:1

四、常见问题与验证

  • 验证服务与端口:
systemctl status "vncserver@:1.service"
ss -lntp | grep -E '590[0-9]'
  • 常见排错要点:
    • 端口被占用或残留 socket:清理旧会话后再启
      vncserver -kill :1
      rm -f /tmp/.X11-unix/X1
      
    • 启动失败先查看日志定位:
      journalctl -u "vncserver@:1.service" -xe
      
    • 桌面未显示或黑屏:检查 ~/.vnc/xstartup 是否启动了桌面会话(如 mate-session &gnome-session &),并确保已安装对应桌面环境。

0