《树莓派4B家庭服务器搭建指南》第二十期:在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份

news2025/1/21 20:22:42

title: 020《树莓派4B家庭服务器搭建指南》第二十期:在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份

我的天翼云服务器有/opt/usr/share/nginx两个目录, 用来存储网站的内容, 数据无价, 为了避免珍贵的数据丢失,我决定使用树莓派运行 rsnapshot, 为网站内容做定期备份。

为什么选择rsnapshot ?

  • rsnapshot是基于rsync的开源软件, 原理简单,无后门, 无需强制加密, 备份后的数据所见即所得
  • rsnapshot通过硬链接管理文件, 处于不同文件夹的同一个文件, 只占用一份存储空间, 节省磁盘
  • rsnapshot默认进行增量备份, 节省带宽。
  • rsnapshot长期维护(从2015年开始维护), 功能稳定,在Github的开源仓库https://github.com/rsnapshot/rsnapshot 有2.9k Star,广受好评

安装rsnapshot

 sudo apt install rsnapshot

image-20230817161316501

配置树莓派免密登录云服务器

cd ~/.ssh
ssh-keygen

image-20230817162637385

# 设置密钥权限 
# 公钥644
sudo chmod 644  ~/.ssh/fangyuanxiaozhan.com.pub
# 私钥600
sudo chmod 600  ~/.ssh/fangyuanxiaozhan.com

image-20230817163241171

将公钥发送的远程主机

ssh-copy-id -i ~/.ssh/fangyuanxiaozhan.com.pub 远程主机用户名@远程主机ip或域名

image-20230817164729349

在树莓派创建 ~/.ssh/config 并给与权限600

# 如果已经存在~/.ssh/config 则无需创建
touch ~/.ssh/config
chmod 600 ~/.ssh/config

~/.ssh/config 中填入以下内容

Host 主机ip或域名
HostName 主机ip或域名
User root
IdentityFile ~/.ssh/fangyuanxiaozhan.com

image-20230817164556148

ssh可以免密登录,基于rsync的rsnapshot也可以免密从服务器传输文件了。

按需求修改配置文件

  • 在树莓派创建rsnapshot备份文件夹
# 创建rsnapshot存储数据的根目录
mkdir /opt/rsnapshot
# 创建存储我天翼云服务器数据的目录
mkdir /opt/rsnapshot/CTYun
  • 设置根目录
    修改rsnapshot配置文件/etc/rsnapshot.conf, 将snapshot_root 对应的字段修改为在树莓派创建的根目录
snapshot_root   /opt/rsnapshot/

配置文件配置行之间使用Tab填充,空格会报错,比如snapshot_root(这里用Tab填充)/opt/rsnapshot/

  • 屏蔽本机备份配置

查看/etc/rsnapshot.conf 的底部,我们可以看到很多backup开头的配置行,其中默认的几行,是对树莓派本机的几个目录备份,可以前面添加#屏蔽掉

image-20230817184148071

  • 移除对ssh绝对路径的注释

由于rsnapshot从服务器备份数据依赖了rsync,而rsync又依赖了ssh,所以我们需要将ssh的绝对路径告诉rsnapshot, 也就是将cmd_ssh 所在行开头的#去掉

cmd_ssh /usr/bin/ssh
  • 改变锁文件的位置

lockfile的作用是防止同时运行两个rsnapshot实例,相当于一把锁,这把锁的位置可以由我们自己定义,lockfile的默认位置为/var/run/rsnapshot.pid ,我想以用户名ubuntu的身份运行rsnapshot实例,就要把锁文件位置配置到 ubuntu用户有权限修改的位置,我的处理方式是,新建 /home/ubuntu/.rsnapshot 文件夹

mkdir /home/ubuntu/.rsnapshot

然后将lockfile改为

lockfile /home/ubuntu/.rsnapshot/rsnapshot.pid
  • 备份文件夹的配置

在配置文件尾部追加

# CTYun
backup  root@fangyuanxiaozhan.com:/etc/nginx    ./
backup  root@fangyuanxiaozhan.com:/opt  ./      exclude=/opt/before,exclude=/opt/EasyTypora/node_modules
backup  root@fangyuanxiaozhan.com:/usr/share/nginx/fangyuanxiaozhan.com ./

测试配置文件格式是否正确

rsnapshot configtest

image-20230817191012225

我最终的配置文件(供参考)

#################################################
# rsnapshot.conf - rsnapshot configuration file #
#################################################
#                                               #
# PLEASE BE AWARE OF THE FOLLOWING RULE:        #
#                                               #
# This file requires tabs between elements      #
#                                               #
#################################################

#######################
# CONFIG FILE VERSION #
#######################

config_version  1.2

###########################
# SNAPSHOT ROOT DIRECTORY #
###########################

# All snapshots will be stored under this root directory.
#
snapshot_root   /opt/rsnapshot/CTYun/

# If no_create_root is enabled, rsnapshot will not automatically create the
# snapshot_root directory. This is particularly useful if you are backing
# up to removable media, such as a FireWire or USB drive.
#
#no_create_root 1

#################################
# EXTERNAL PROGRAM DEPENDENCIES #
#################################

# LINUX USERS:   Be sure to uncomment "cmd_cp". This gives you extra features.
# EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility.
#
# See the README file or the man page for more details.
#
cmd_cp          /bin/cp

# uncomment this to use the rm program instead of the built-in perl routine.
#
cmd_rm          /bin/rm

# rsync must be enabled for anything to work. This is the only command that
# must be enabled.
#
cmd_rsync       /usr/bin/rsync

# Uncomment this to enable remote ssh backups over rsync.
#
cmd_ssh /usr/bin/ssh

# Comment this out to disable syslog support.
#
cmd_logger      /usr/bin/logger

# Uncomment this to specify the path to "du" for disk usage checks.
# If you have an older version of "du", you may also want to check the
# "du_args" parameter below.
#
#cmd_du         /usr/bin/du

# Uncomment this to specify the path to rsnapshot-diff.
#
#cmd_rsnapshot_diff     /usr/bin/rsnapshot-diff

# Specify the path to a script (and any optional arguments) to run right
# before rsnapshot syncs files
#
#cmd_preexec    /path/to/preexec/script

# Specify the path to a script (and any optional arguments) to run right
# after rsnapshot syncs files
#
#cmd_postexec   /path/to/postexec/script

# Paths to lvcreate, lvremove, mount and umount commands, for use with
# Linux LVMs.
#
#linux_lvm_cmd_lvcreate /sbin/lvcreate
#linux_lvm_cmd_lvremove /sbin/lvremove
#linux_lvm_cmd_mount    /bin/mount
#linux_lvm_cmd_umount   /bin/umount

#########################################
#     BACKUP LEVELS / INTERVALS         #
# Must be unique and in ascending order #
# e.g. alpha, beta, gamma, etc.         #
#########################################

retain  alpha   6
retain  beta    7
retain  gamma   4
#retain delta   3

############################################
#              GLOBAL OPTIONS              #
# All are optional, with sensible defaults #
############################################

# Verbose level, 1 through 5.
# 1     Quiet           Print fatal errors only
# 2     Default         Print errors and warnings only
# 3     Verbose         Show equivalent shell commands being executed
# 4     Extra Verbose   Show extra verbose information
# 5     Debug mode      Everything
#
verbose         2

# Same as "verbose" above, but controls the amount of data sent to the
# logfile, if one is being used. The default is 3.
# If you want the rsync output, you have to set it to 4
#
loglevel        3

# If you enable this, data will be written to the file you specify. The
# amount of data written is controlled by the "loglevel" parameter.
#
#logfile        /var/log/rsnapshot.log

# If enabled, rsnapshot will write a lockfile to prevent two instances
# from running simultaneously (and messing up the snapshot_root).
# If you enable this, make sure the lockfile directory is not world
# writable. Otherwise anyone can prevent the program from running.
#
lockfile        /home/ubuntu/.rsnapshot/rsnapshot.pid

# By default, rsnapshot check lockfile, check if PID is running
# and if not, consider lockfile as stale, then start
# Enabling this stop rsnapshot if PID in lockfile is not running
#
#stop_on_stale_lockfile         0

# Default rsync args. All rsync commands have at least these options set.
#
#rsync_short_args       -a
#rsync_long_args        --delete --numeric-ids --relative --delete-excluded

# ssh has no args passed by default, but you can specify some here.
#
#ssh_args       -p 22

# Default arguments for the "du" program (for disk space reporting).
# The GNU version of "du" is preferred. See the man page for more details.
# If your version of "du" doesn't support the -h flag, try -k flag instead.
#
#du_args        -csh

# If this is enabled, rsync won't span filesystem partitions within a
# backup point. This essentially passes the -x option to rsync.
# The default is 0 (off).
#
#one_fs         0

# The include and exclude parameters, if enabled, simply get passed directly
# to rsync. If you have multiple include/exclude patterns, put each one on a
# separate line. Please look up the --include and --exclude options in the
# rsync man page for more details on how to specify file name patterns.
#
#include        ???
#include        ???
#exclude        ???
#exclude        ???

# The include_file and exclude_file parameters, if enabled, simply get
# passed directly to rsync. Please look up the --include-from and
# --exclude-from options in the rsync man page for more details.
#
#include_file   /path/to/include/file
#exclude_file   /path/to/exclude/file

# If your version of rsync supports --link-dest, consider enabling this.
# This is the best way to support special files (FIFOs, etc) cross-platform.
# The default is 0 (off).
#
#link_dest      0

# When sync_first is enabled, it changes the default behaviour of rsnapshot.
# Normally, when rsnapshot is called with its lowest interval
# (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest
# intervals. With sync_first enabled, "rsnapshot sync" handles the file sync,
# and all interval calls simply rotate files. See the man page for more
# details. The default is 0 (off).
#
#sync_first     0

# If enabled, rsnapshot will move the oldest directory for each interval
# to [interval_name].delete, then it will remove the lockfile and delete
# that directory just before it exits. The default is 0 (off).
#
#use_lazy_deletes       0

# Number of rsync re-tries. If you experience any network problems or
# network card issues that tend to cause ssh to fail with errors like
# "Corrupted MAC on input", for example, set this to a non-zero value
# to have the rsync operation re-tried.
#
#rsync_numtries 0

# LVM parameters. Used to backup with creating lvm snapshot before backup
# and removing it after. This should ensure consistency of data in some special
# cases
#
# LVM snapshot(s) size (lvcreate --size option).
#
#linux_lvm_snapshotsize 100M

# Name to be used when creating the LVM logical volume snapshot(s).
#
#linux_lvm_snapshotname rsnapshot

# Path to the LVM Volume Groups.
#
#linux_lvm_vgpath       /dev

# Mount point to use to temporarily mount the snapshot(s).
#
#linux_lvm_mountpath    /path/to/mount/lvm/snapshot/during/backup

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
#backup /home/          localhost/
#backup /etc/           localhost/
#backup /usr/local/     localhost/
#backup /var/log/rsnapshot              localhost/
#backup /etc/passwd     localhost/
#backup /home/foo/My Documents/         localhost/
#backup /foo/bar/       localhost/      one_fs=1,rsync_short_args=-urltvpog
#backup_script  /usr/local/bin/backup_pgsql.sh  localhost/postgres/
# You must set linux_lvm_* parameters below before using lvm snapshots
#backup lvm://vg0/xen-home/     lvm-vg0/xen-home/

# EXAMPLE.COM
#backup_exec    /bin/date "+ backup of example.com started at %c"
#backup root@example.com:/home/ example.com/    +rsync_long_args=--bwlimit=16,exclude=core
#backup root@example.com:/etc/  example.com/    exclude=mtab,exclude=core
#backup_exec    ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql"
#backup root@example.com:/var/db/dump/  example.com/
#backup_exec    /bin/date "+ backup of example.com ended at %c"

# CVS.SOURCEFORGE.NET
#backup_script  /usr/local/bin/backup_rsnapshot_cvsroot.sh      rsnapshot.cvs.sourceforge.net/

# RSYNC.SAMBA.ORG
#backup rsync://rsync.samba.org/rsyncftp/       rsync.samba.org/rsyncftp/
# CTYun
backup  root@fangyuanxiaozhan.com:/etc/nginx    ./
backup  root@fangyuanxiaozhan.com:/opt  ./      exclude=/opt/before,exclude=/opt/EasyTypora/node_modules
backup  root@fangyuanxiaozhan.com:/usr/share/nginx/fangyuanxiaozhan.com ./

配置行内的空余部分,不要用空格,一定要用Tab填充

  • 关于备份数量上限的解释

在以上配置文件中,有以下几行

retain  alpha   6
retain  beta    7
retain  gamma   4

以alpah为例, retain alpha 6代表最多进行六个备份,比如alpha.0 alpha.1 alpha.2 alpha.3 alpha.4 alpha.5 , 其中alpha.0为最新的备份,alpha.5为最老的备份,超过了6次备份,最早的一份将会从磁盘清除,首次运行备份指令后,alpha.0 文件夹会生成在根目录下面,也就是/opt/rsnapshot/CTYun/alpha.0, /opt/rsnapshot/CTYun/alpha.0文件夹里存放着备份好的文件目录。

  • 手动进行备份
rsnapshot -c /etc/rsnapshot.conf alpha

上面命令汇总,我们使用alpha策略进行备份,并指定了配置文件的位置。

执行完成后,查看目录结构

image-20230818133222842

可以看到alpha.0成了真的的根目录。

我们多运行几次rsnapshot -c /etc/rsnapshot.conf alpha , 可以看到在/opt/rsnapshot/CTYun 文件夹下有几个并列的alpha.* 文件夹

image-20230818133341387

由于配置了retain alpha 6,无论我们运行多少次,alpha.*都不会超过六个

image-20230818140155944

自动化备份

crontab是一款可以创建定时任务的工具,我们可以在crontab中添加每四小时运行rsnapshot -c /etc/rsnapshot.conf alpha 的任务,这样就相当于每天执行了6次备份。

ubuntucrontab默认对所有用户进行了安装,所以我们无需sudo权限就能创建任务,操作方法如下, 打开cron表

crontab -e

首次打开可以选择编辑器,我选择了vim 打开,添加每四小时运行一次命令的配置

0 */4 * * * rsnapshot -c /etc/rsnapshot.conf alpha

image-20230818141456454

写入配置后,退出编辑器即可;

优化: 创建每日执行,保留31天的备份任务

我希望每天凌晨4点能生成新备份,保留31天,但又不希望和每隔4小时的的备份有冲突(两个任务共用logfile会相互影响)。

于是我新开一个配置文件/home/ubuntu/.rsnapshot/mouthly.conf, 添加retain monthly 31, 修改filelock 为lockfile /home/ubuntu/.rsnapshot/monthly.pid

这里的monthly 完全可以自定义,并没有特殊性,可以是monthly001monthly002, 只要运行命令时,对应即可。

内容为

#################################################
# rsnapshot.conf - rsnapshot configuration file #
#################################################
#                                               #
# PLEASE BE AWARE OF THE FOLLOWING RULE:        #
#                                               #
# This file requires tabs between elements      #
#                                               #
#################################################

#######################
# CONFIG FILE VERSION #
#######################

config_version  1.2

###########################
# SNAPSHOT ROOT DIRECTORY #
###########################

# All snapshots will be stored under this root directory.
#
snapshot_root   /opt/rsnapshot/CTYun/

# If no_create_root is enabled, rsnapshot will not automatically create the
# snapshot_root directory. This is particularly useful if you are backing
# up to removable media, such as a FireWire or USB drive.
#
#no_create_root 1

#################################
# EXTERNAL PROGRAM DEPENDENCIES #
#################################

# LINUX USERS:   Be sure to uncomment "cmd_cp". This gives you extra features.
# EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility.
#
# See the README file or the man page for more details.
#
cmd_cp          /bin/cp

# uncomment this to use the rm program instead of the built-in perl routine.
#
cmd_rm          /bin/rm

# rsync must be enabled for anything to work. This is the only command that
# must be enabled.
#
cmd_rsync       /usr/bin/rsync

# Uncomment this to enable remote ssh backups over rsync.
#
cmd_ssh /usr/bin/ssh

# Comment this out to disable syslog support.
#
cmd_logger      /usr/bin/logger

# Uncomment this to specify the path to "du" for disk usage checks.
# If you have an older version of "du", you may also want to check the
# "du_args" parameter below.
#
#cmd_du         /usr/bin/du

# Uncomment this to specify the path to rsnapshot-diff.
#
#cmd_rsnapshot_diff     /usr/bin/rsnapshot-diff

# Specify the path to a script (and any optional arguments) to run right
# before rsnapshot syncs files
#
#cmd_preexec    /path/to/preexec/script

# Specify the path to a script (and any optional arguments) to run right
# after rsnapshot syncs files
#
#cmd_postexec   /path/to/postexec/script

# Paths to lvcreate, lvremove, mount and umount commands, for use with
# Linux LVMs.
#
#linux_lvm_cmd_lvcreate /sbin/lvcreate
#linux_lvm_cmd_lvremove /sbin/lvremove
#linux_lvm_cmd_mount    /bin/mount
#linux_lvm_cmd_umount   /bin/umount

#########################################
#     BACKUP LEVELS / INTERVALS         #
# Must be unique and in ascending order #
# e.g. alpha, beta, gamma, etc.         #
#########################################

retain	monthly	31
retain  alpha   6
retain  beta    7
retain  gamma   4
#retain delta   3

############################################
#              GLOBAL OPTIONS              #
# All are optional, with sensible defaults #
############################################

# Verbose level, 1 through 5.
# 1     Quiet           Print fatal errors only
# 2     Default         Print errors and warnings only
# 3     Verbose         Show equivalent shell commands being executed
# 4     Extra Verbose   Show extra verbose information
# 5     Debug mode      Everything
#
verbose         2

# Same as "verbose" above, but controls the amount of data sent to the
# logfile, if one is being used. The default is 3.
# If you want the rsync output, you have to set it to 4
#
loglevel        3

# If you enable this, data will be written to the file you specify. The
# amount of data written is controlled by the "loglevel" parameter.
#
#logfile        /var/log/rsnapshot.log

# If enabled, rsnapshot will write a lockfile to prevent two instances
# from running simultaneously (and messing up the snapshot_root).
# If you enable this, make sure the lockfile directory is not world
# writable. Otherwise anyone can prevent the program from running.
#
lockfile        /home/ubuntu/.rsnapshot/monthly.pid

# By default, rsnapshot check lockfile, check if PID is running
# and if not, consider lockfile as stale, then start
# Enabling this stop rsnapshot if PID in lockfile is not running
#
#stop_on_stale_lockfile         0

# Default rsync args. All rsync commands have at least these options set.
#
#rsync_short_args       -a
#rsync_long_args        --delete --numeric-ids --relative --delete-excluded

# ssh has no args passed by default, but you can specify some here.
#
#ssh_args       -p 22

# Default arguments for the "du" program (for disk space reporting).
# The GNU version of "du" is preferred. See the man page for more details.
# If your version of "du" doesn't support the -h flag, try -k flag instead.
#
#du_args        -csh

# If this is enabled, rsync won't span filesystem partitions within a
# backup point. This essentially passes the -x option to rsync.
# The default is 0 (off).
#
#one_fs         0

# The include and exclude parameters, if enabled, simply get passed directly
# to rsync. If you have multiple include/exclude patterns, put each one on a
# separate line. Please look up the --include and --exclude options in the
# rsync man page for more details on how to specify file name patterns.
#
#include        ???
#include        ???
#exclude        ???
#exclude        ???

# The include_file and exclude_file parameters, if enabled, simply get
# passed directly to rsync. Please look up the --include-from and
# --exclude-from options in the rsync man page for more details.
#
#include_file   /path/to/include/file
#exclude_file   /path/to/exclude/file

# If your version of rsync supports --link-dest, consider enabling this.
# This is the best way to support special files (FIFOs, etc) cross-platform.
# The default is 0 (off).
#
#link_dest      0

# When sync_first is enabled, it changes the default behaviour of rsnapshot.
# Normally, when rsnapshot is called with its lowest interval
# (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest
# intervals. With sync_first enabled, "rsnapshot sync" handles the file sync,
# and all interval calls simply rotate files. See the man page for more
# details. The default is 0 (off).
#
#sync_first     0

# If enabled, rsnapshot will move the oldest directory for each interval
# to [interval_name].delete, then it will remove the lockfile and delete
# that directory just before it exits. The default is 0 (off).
#
#use_lazy_deletes       0

# Number of rsync re-tries. If you experience any network problems or
# network card issues that tend to cause ssh to fail with errors like
# "Corrupted MAC on input", for example, set this to a non-zero value
# to have the rsync operation re-tried.
#
#rsync_numtries 0

# LVM parameters. Used to backup with creating lvm snapshot before backup
# and removing it after. This should ensure consistency of data in some special
# cases
#
# LVM snapshot(s) size (lvcreate --size option).
#
#linux_lvm_snapshotsize 100M

# Name to be used when creating the LVM logical volume snapshot(s).
#
#linux_lvm_snapshotname rsnapshot

# Path to the LVM Volume Groups.
#
#linux_lvm_vgpath       /dev

# Mount point to use to temporarily mount the snapshot(s).
#
#linux_lvm_mountpath    /path/to/mount/lvm/snapshot/during/backup

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
#backup /home/          localhost/
#backup /etc/           localhost/
#backup /usr/local/     localhost/
#backup /var/log/rsnapshot              localhost/
#backup /etc/passwd     localhost/
#backup /home/foo/My Documents/         localhost/
#backup /foo/bar/       localhost/      one_fs=1,rsync_short_args=-urltvpog
#backup_script  /usr/local/bin/backup_pgsql.sh  localhost/postgres/
# You must set linux_lvm_* parameters below before using lvm snapshots
#backup lvm://vg0/xen-home/     lvm-vg0/xen-home/

# EXAMPLE.COM
#backup_exec    /bin/date "+ backup of example.com started at %c"
#backup root@example.com:/home/ example.com/    +rsync_long_args=--bwlimit=16,exclude=core
#backup root@example.com:/etc/  example.com/    exclude=mtab,exclude=core
#backup_exec    ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql"
#backup root@example.com:/var/db/dump/  example.com/
#backup_exec    /bin/date "+ backup of example.com ended at %c"

# CVS.SOURCEFORGE.NET
#backup_script  /usr/local/bin/backup_rsnapshot_cvsroot.sh      rsnapshot.cvs.sourceforge.net/

# RSYNC.SAMBA.ORG
#backup rsync://rsync.samba.org/rsyncftp/       rsync.samba.org/rsyncftp/
# CTYun
backup  root@fangyuanxiaozhan.com:/etc/nginx    ./
backup  root@fangyuanxiaozhan.com:/opt  ./      exclude=/opt/before,exclude=/opt/EasyTypora/node_modules
backup  root@fangyuanxiaozhan.com:/usr/share/nginx/fangyuanxiaozhan.com ./

测试月度备份配置文件

rsnapshot -c /home/ubuntu/.rsnapshot/monthly.conf configtest

image-20230818145242293

运行crontab -e ,将以下配置添加为每日凌晨四点运行的定时任务

0 4 * * * rsnapshot -c /home/ubuntu/.rsnapshot/monthly.conf monthly

monthly任务备份后,会产生以monthly开头的文件夹

rsnapshot -c /home/ubuntu/.rsnapshot/monthly.conf monthly

image-20230818150447397

小结

云服务商的硬盘还是蛮贵的,对于个人开发者而言,同时能省一些钱总是好的。

2023年的机械硬盘算是很便宜了,1千块能买16TB的全新盘,搞一块插到树莓派,定期对服务器数据做增量备份,成本比云服务商的低很多。

如果你是一个上班族,办公室和家里各部署一套rsnapshot备份,也算是支持数据分布式异地容灾了。

为什么要把服务器数据备份到本地?目前的ICP备案搞的风风火火,买了服务器,由于备案的限制,也不能马上使用80,443等端口,即使服务器备了案,解析的域名也会受到限制,如果有一天,由于某种不可抗力,把个人备案关联的服务器的数据全部封存,也不是不可能,所以,做好本地数据备份,总是没错的,反正成本也不高。

本文属于《树莓派不吃灰》系列的第二十期,《树莓派不吃灰》系列教程开源地址 github.com/zhaoolee/pi

本文永久更新地址(欢迎来读留言,写评论):

https://www.v2fy.com/p/2023-08-17-rsnapshot-1692258217000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TikTok或将于8月底关闭半闭环、速卖通或将推出“半托管”模式

《出海周报》是运营坛为外贸企业主和外贸人独家打造的重要资讯栏目,聚焦企业出海、海外市场动态、海外监管政策等方面,以简捷的方式,提升读者获取资讯的效率。 接下来运营坛为大家带来第15期出海周报,快来看看这周国内外市场发生了…

【经验】VScode远程连接Ubuntu出错的解决办法(2023年,完整的排查思路)

用VScode常常会碰到以下情况,Could not establish connection。 先介绍一下VScode远程连接和终端SSH连接的区别:终端直接用SSH连接时,只需要开启SSH服务,并消耗少量的内存即可;VScode连接时,会自动在服务器…

HCIP实验之MPLS

目录 一,实验题目 ​编辑 拓扑与IP地址规划如图所示 二,实验思路 三,实验步骤 3.1 私网部分IP地址配置 3.2 LSP部分配置 3.3 启动OSPF协议 3.4 启动MPLS协议 3.5 启动MPLS VPN 3.6 实现公网私网互通 3.7 配置BGP 3.8 双向重发布 …

Python软件外包开发框架

Python有许多流行的开发框架,用于不同类型的应用开发,包括Web应用、数据科学、人工智能等。以下分享一些常见的Python开发框架及其特点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流…

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键: 追…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

IDEA连接MySQL数据库错误

说明&#xff1a;使用IDEA连接云服务器中的MySQL数据库时&#xff0c;报下面的这个错误&#xff1b; [08S01] Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the serve…

docker cURL error 6: Could not resolve host

场景&#xff1a; 微信小程序 获取 用户 openpid&#xff0c;在此之前&#xff0c;我需要先 "获取稳定版接口调用凭据"&#xff0c;根据手册提示的&#xff0c;要先调用 https://api.weixin.qq.com/cgi-bin/stable_token 我这边就开始了请求&#xff0c;结果返回了…

上班族的高效时间管理软件,可一直显示在电脑桌面上

在现代职场中&#xff0c;相信工作党都深有体会&#xff0c;繁忙的工作带来的压力和任务都堆积如山&#xff0c;如果没有一个良好的时间管理系统&#xff0c;我们可能会一筹莫展。而高效管理时间的好处也是显而易见的&#xff0c;它不仅可以帮助我们更好地安排工作&#xff0c;…

Linux Day09

目录 一、进程替换 二、Linux信号的使用 2.1 kill() 发送信号 2.2 signal() 改变进程对信号的响应方式 2.3 处理僵死进程 2.3.1 在信号处理函数中调用wait 2.3.2 Linux特有的 2.3.3 结果 一、进程替换 linux上创造一个新进程&#xff0c;没有create创建方法&#xf…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Android3:布局

一。线性布局 创建项目Linear Layout Example activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"an…

微信转账警示!切莫在此时输入密码

微信已经成为我们日常生活中不可或缺的社交工具&#xff0c;通过微信红包和转账完成支付也变得非常普遍。 然而&#xff0c;正如人们常说的&#xff0c;树大招风。随着微信的广泛使用&#xff0c;骗子们也愈发猖獗&#xff0c;他们利用微信进行诈骗活动&#xff0c;使许多人遭受…

手把手教你快速使用java与cpp的互相调用

在jni的开发过程中&#xff0c;如果需要实现java和c之间的接口调用&#xff0c;就要定义一个方法来实现&#xff0c;如果有多个接口调用&#xff0c;就需要定义多个方法来实现&#xff0c;这里介绍一种抽象的接口&#xff0c;只需要分别定义一个javaCallCpp和cppCallJava方法就…

Spring框架入门以及 ioc的三种注入方式

目录 一、Spring是什么&#xff0c;它能够做什么 spring的组成 二、什么是控制反转&#xff08;或依赖注入&#xff09; 三、 如何在spring当中定义和配置一个JavaBean 四、注入方式 1.构造函数注入 2.Setter方法注入 3.自动装配 五、简单属性配置与复杂属性配置 简单…

AIGC:【LLM(六)】——Dify:一个易用的 LLMOps 平台

文章目录 一.简介1.1 LLMOps1.2 Dify 二.核心能力三.Dify安装3.1 快速启动3.2 配置 四.Dify使用五.调用开源模型六.接通闭源模型七.在 Dify.AI 探索不同模型潜力7.1 快速切换&#xff0c;测验不同模型的表现7.2 降低模型能力对比和选择的成本 一.简介 1.1 LLMOps LLMOps&…

vue vs react

vue 简介&#xff1a;渐进式 JavaScript 框架 来源&#xff1a;最初由 Evan You &#xff08;尤雨溪&#xff09;于2014年开发。Evan You之前在Google研究过AngularJS&#xff0c;并提取了Angular的部分特性以提供一个更轻量级的框架 版本&#xff1a; vue 1x&#xff1a;2014…

Android 源码下载(详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 一、下载AOSP前的准备 二、国内网络下 clone 清华大学开源软件镜像 三、编写Python脚本,开始下载android-10.0.0_r40 源码 四、源码下载工具包 五、参考文献 一、下载AOSP前的准备 想在国内网络下载AOSP源码,需要电脑配置如…

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…

Nginx 配置文件的完整指南 (一)

文章目录 一、简介1.1 配置文件一览 二、全局配置2.0 user2.1 worker_processes2.2 events模块2.3 http模块 三、server模块3.1 listen3.2 server_name3.3 location&#xff1a;请求处理位置 Nginx 配置文件的完整指南 (二) 一、简介 Nginx是一款高性能的Web服务器和反向代理服…