Alain's Blog

  1. 首页
  2. 虚拟机
  3. Proxmox VE
  4. 正文

Proxmox VE(PVE) 自动快照;自动备份到NAS的SMB/NFS

2022年8月13日 11824点热度 9人点赞 4条评论

proxmox ve 7

转载请注明出处,本文仅用于学习交流,不对之处,恳请指正,部分图片摘取网络,如有侵权请联系

因为经常对各种虚拟机或LXC进行一些操作,比如系统升级、软件升级、安装新的软件等等。往往我们会在进行这些操作之后,导致虚拟机或者LXC出现一些异常。加之我内网的大部分虚拟机都是通过Frp(高性能反向代理应用)设置为外网可以访问,比如你现在正在访问的我的博客就是搭建在我内网的虚拟机之上的,故而也存在可能被攻击的情况。所以我编写了一些脚本来进行每日定时自动快照,与设置了系统的定时备份功能。

Proxmox VE(PVE) 自动快照

PVE的QM虚拟机命令官方文档
PVE的LXC容器命令官方文档

  1. 创建存放脚本的目录

    mkdir /usr/script
  2. 编写以下脚本

    根据网友openc的提醒,定时脚本最好还是不包含.sh
    目前我暂时未遇到相关问题,但对以下代码进行了调整

    nano /usr/script/snapshot-script

    写入以下代码

    #!/bin/bash
    # author alain
    # site:https://www.alainlam.cn
    # Proxmox VE(PVE) 自动快照,保留7天
    
    # 当前日期
    date=$(date +"%Y%m%d")
    # 需要删除的日期
    deldate=$(date -d "7 days ago" +%Y%m%d)
    
    # 在此写入你想要备份的QVMIDs
    # 如 qvmids=(100 101 102)
    qvmids=(100 101 102 106 107)
    
    # 开始创建与删除过期快照
    for qvmid in ${qvmids[@]}
    do
        /usr/sbin/qm delsnapshot $qvmid snapshot_$deldate
        /usr/sbin/qm snapshot $qvmid snapshot_$date --description 'Automatic snapshot creation on '$date --vmstate 0
    done
    
    # 在此写入你想要备份的LXC ids
    # 如 lxcids=(100 101 102)
    lxcids=(103 104 105)
    
    # 开始创建与删除过期快照
    for lxcid in ${lxcids[@]}
    do
        pct delsnapshot $lxcid snapshot_$deldate
        pct snapshot $lxcid snapshot_$date --description 'Automatic snapshot creation on '$date
    done
  3. 修改文件权限

    chmod 700 /usr/script/snapshot-script
  4. 创建定时任务

    nano /etc/crontab

    追加以下代码

    # 每日五点执行脚本
    0  5    * * *   root    bash /usr/script/snapshot-script

    其他定时任务的格式请参考Linux Crontab 定时任务

Proxmox VE(PVE) 挂载Samba/NFS

在设置自动备份之前,我们先完成PVE的NFS/SMB挂载,以便我们将备份文件存放到我们的NAS之中。

相信使用Proxmox VE(PVE)系统的同学都会在其中安装NAS虚拟机,或者拥有另一台专门的NAS设备。一般来讲,NAS系统的容量都会大于宿主机的容量。那么我们可以将NAS的容量共享给我们的Proxmox VE(PVE)来使用,甚至可以将虚拟机的磁盘映像设置到该路径(但是我不推荐使用网络磁盘作为虚拟磁盘)。

Proxmox VE(PVE) 使用系统自带功能的挂载Samba/NFS

使用此方式挂载的目录所有者为root账号,如果你想要将该目录共享给非特权LXC容器使用(LXC的运行用户id为10000),且非创建虚拟磁盘的方式,则不适合使用此方法。

  1. 选中数据中心(Datacenter),选中存储(Storage),选中你想要的挂载方式,比如NFS或者SMB

    Proxmox VE(PVE) 挂载Samba/NFS

  2. 根据提示填入你的配置信息,比如SMB的账号密码,或者NFS的IP地址。理论上NFS的性能是要比SMB的性能要好的。

    需要注意的是,我们需要在内容的选项上选中需要支持的类型,该项为多选。我一般选中ISO镜像,容器模板,VZDump备份文件这三项。

    1. 磁盘映像/Disk image(用来支持创建虚拟磁盘)
    2. ISO镜像/ISO image(用来存放iso镜像)
    3. 容器模板/Container template(用来存放lxc模板)
    4. VZDump备份文件/VZDump backup file(用来存放备份文件)
    5. 容器/Container(用来存放LXC文件)
    6. 片段/Sinppets(snippets文件目录)

Proxmox VE(PVE) 使用脚本挂载Samba(共享到非特权LXC容器中使用)

使用本方法的目的主要还是因为我想将挂载的目录直接共享到非特权LXC容器中使用,因为我使用非特权LXC容器来编译Openwrt,后面也想编译AOSP,Openharmony之类的系统玩一下,而编译好的文件我希望可以直接拷贝到NAS中保存起来,所以便有了以下方法。

  1. 创建存放脚本的目录

    mkdir /usr/script
  2. 编写以下脚本,本脚本与上一篇Proxmox VE(PVE) 7.x下,LXC中安装Jellyfin,开启硬转码等中的脚本存在细微不同,主要是加入了登录用户,请不要混淆使用

    nano /usr/script/nasname-smb.sh

    写入以下代码

    #!/bin/bash
    # author alain
    # site:https://www.alainlam.cn
    # 循环检测Samba服务器是否在线,并自动挂载
    # 本脚本会将日志写入到系统日志,如果你的NAS不是长时间在线,请酌情修改脚本内容,以免日志文件过多
    
    server_ip="你的IP地址"
    server_path="/你需要存放PVE文件的路径"
    mount_point="/mnt/pve/挂载到PVE本地的目录"
    # 是否循环检查是否在线(没有挂载时)
    online_check=true
    # 循环检查是否在线的间隔时间(没有挂载时)
    online_check_interval=10
    # 离线检查
    offline_check=true
    # 离线检查间隔时间
    offline_check_interval=60
    # 挂载用户,非特权LXC容器的用户为100000
    uid=100000
    # 挂载分组,非特权LXC容器的用户组为100000
    gid=100000
    # 挂载权限
    dir_mode="0755"
    file_mode="0644"
    # SMB账号
    smb_username="你的SMB账号"
    # SMB密码
    smb_pwd="你的SMB密码"
    
    # 是否已经挂载
    isMounted=false
    
    while :; do
    
        if mountpoint -q $mount_point; then
            if ! $isMounted; then
                # 设置为挂载状态
                isMounted=true
                echo "SMB挂载成功"
                if $offline_check; then
                    echo "开启在线状态检测,间隔时间${offline_check_interval}s"
                fi
            fi
            if $offline_check; then
                sleep $offline_check_interval
                continue
            fi
        else
            # 设置为非挂载状态
            isMounted=false
            echo "SMB没有挂载,ping ${server_ip} ..."
            if (ping -c 1 -w 5 $server_ip >/dev/null 2>&1); then
                echo "${server_ip}在线,尝试挂载"
    
                # 判断挂载目录是否存在
                if [ ! -d $mount_point ]; then
                    echo "挂载目录不存在,新建目录"
                    mkdir -p $mount_point
                fi
    
                if [ ! -d $mount_point ]; then
                    echo "挂载目录不存在,取消挂载,请检查权限, code:403"
                    exit 403
                fi
    
                # 挂载SMB网络硬盘
                mount.cifs -o ,uid=$uid,gid=$gid,dir_mode=$dir_mode,file_mode=$file_mode,vers=2.1,username=$smb_username,password=$smb_pwd //$server_ip$server_path $mount_point
    
                if mountpoint -q $mount_point; then
                    continue
                else
                    echo "挂载失败"
                    if $online_check; then
                        echo "继续尝试挂载${server_ip},间隔时间${online_check_interval}s"
                        sleep $online_check_interval
                        continue
                    else
                        echo "不继续尝试挂载,退出脚本,code:404"
                        exit 404
                    fi
                fi
            else
                if $online_check; then
                    echo "${server_ip}离线,上线检查间隔时间${online_check_interval}s"
                    sleep $online_check_interval
                    continue
                else
                    echo "不循环检查,退出脚本,code:404"
                    exit 404
                fi
            fi
        fi
    
    done
  3. 加入执行权限

    chmod +x /usr/script/nasname-smb.sh
  4. 编写开机启动服务

    nano /etc/systemd/system/nasname-smb.service

    写入以下代码

    [Unit]
    Description=Automatically mount the SMB folder from nasname
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/usr/script/nasname-smb.sh
    
    [Install]
    WantedBy=multi-user.target
  5. 设置开机启动

    systemctl enable --now nasname-smb.service
  6. 查看运行效果

    延迟挂载Samba

  7. 将该目录挂载到Proxmox主机

    与上面挂载SMB/NFS方式相同,只是我们需要选择的添加方式需要修改为目录,其他内容请参考上方的Proxmox VE(PVE) 挂载Samba/NFS小节

    Proxmox VE(PVE) 挂载SMB

非特权LXC容器挂载Samba目录

!!!注意!!!,挂载目录的容器是无法备份与使用快照功能的

修改目标LXC容器的配置文件

nano /etc/pve/lxc/100.conf

追加以下代码

mp0: /mnt/pve/挂载到PVE本地的目录/,mp=/mnt/挂载到LXC容器中的目录

Proxmox VE(PVE) 自动备份

Proxmox VE(PVE)本身支持自动备份的功能,所以我们无需自行编写代码。

  1. 选中数据中心(Datacenter),选择二级菜单中的Backup,点击添加按钮(Add)

    Proxmox VE(PVE) 自动备份

  2. 选择你要备份到的目录(比如我是备份到我的子虚拟机中的NAS系统)

    Proxmox VE(PVE) 自动备份

  3. 选择你的备份计划(比如我是选择了每月第一天)

    Proxmox VE(PVE) 自动备份

  4. 选择你要备份的虚拟机(比如我是选中了全部虚拟机)

    Proxmox VE(PVE) 自动备份

  5. 单击创建之后,你的Proxmox VE(PVE) 则会在你选中的计划时间内自动备份你所选中的虚拟机

最后

我还使用了WebDAV的方式将NAS的文件加密备份到了阿里云盘,作为异地容灾使用。具体操作请参考:群晖通过WebDAV备份到阿里云盘

标签: Proxmox VE
最后更新:2023年3月11日

Alain

看了我的文,就是我的人,点个赞再走成不成

点赞
< 上一篇
下一篇 >

文章评论

  • openc

    补充一下另外的定时任务创建方式, 在合适的位置放置脚本, 然后做符号链接到`/etc/cron.daily`即可实现每日00:00自动执行 `ln -s /root/user_script/auto_snapshot.sh /etc/cron.daily/`

    2023年2月14日
    回复
    • Alain

      @openc 但是12点我一般还没睡觉,想尽可能在没啥东西运行的时候执行快照

      2023年2月14日
      回复
  • openc

    昨天出了个问题, 据说脚本不允许包含'.', 否则执行不成功.
    >https://www.cnblogs.com/hongdoudou/p/12696737.html
    另外, 每天执行的时间可以在`/etc/crontab`修改, 这种添加定时任务的方式对于批处理或者组合任务很友好, 只是提示一种方法

    2023年2月16日
    回复
    • Alain

      @openc 感谢您的提醒,因为运行很长时间了,我倒是没关注到这个细节

      2023年2月16日
      回复
  • 取消回复

    文章目录
    • Proxmox VE(PVE) 自动快照
    • Proxmox VE(PVE) 挂载Samba/NFS
      • Proxmox VE(PVE) 使用系统自带功能的挂载Samba/NFS
      • Proxmox VE(PVE) 使用脚本挂载Samba(共享到非特权LXC容器中使用)
    • Proxmox VE(PVE) 自动备份
    • 最后

    COPYRIGHT © 2022 Alain's Blog. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang