SUSE linux的快照和恢复

snapper用于创建和管理文件系统快照,并在需要时实现回滚,它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。
btrfs是一种copy-on-write文件系统,它原生支持subvolumes文件系统快照。subvolumes是物理分区内可单独安装的文件系统。你也可以直接从btrfs快照启动系统。

1 默认设置

在openSUSE Leap中,snapper通常用于系统修改的撤销和恢复的工具。默认情况下,系统的根分区被格式化成了btrfs文件系统。如果根分区足够大(大于16G),快照功能是默认开启的。其他分区默认关闭了快照功能。

SUSE15:~ # df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs          tmpfs     974M     0  974M   0% /dev/shm
tmpfs          tmpfs     390M   12M  379M   3% /run
tmpfs          tmpfs     4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /boot/grub2/i386-pc
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /.snapshots
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /home
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /opt
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /root
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /boot/grub2/x86_64-efi
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /srv
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /tmp
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /var
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /usr/local
tmpfs          tmpfs     195M   48K  195M   1% /run/user/1000
tmpfs          tmpfs     195M   36K  195M   1% /run/user/0

CentOS7的根分区默认采用了XFS,默认情况下没有开启快照功能。

如果在系统安装时关闭了快照功能,可以通过下面的命令开启:

SUSE15:~ # snapper -c root create-config /

创建快照时,快照和原始快照都指向文件系统中的相同块。因此,最初快照不会占用额外的磁盘空间。如果原始文件系统中的数据被修改,则更改的数据块被复制,而旧的数据块保留用于快照。因此,快照与修改的数据占用的空间量相同。因此,随着时间的推移,快照分配的空间量不断增长。因此,从包含快照的Btrfs文件系统中删除文件可能无法释放磁盘空间!

快照始终驻留在已拍摄快照的同一分区或子卷上。无法将快照存储在不同的分区或子卷上。因此根分区的磁盘大小决定了能够保存多少份快照,一旦空间不够,系统会自动删除一部分快照(从最旧的开始删除)。

1.1 默认设置

  • Disks larger than 16 GB
	Configuration file: /etc/snapper/configs/rootUSE_SNAPPER=yesTIMELINE_CREATE=no
  • Disks smaller than 16 GB
	Configuration file: not createdUSE_SNAPPER=noTIMELINE_CREATE=yes

1.2 快照类型

根据触发它们的事件,快照分为了三种类型:

  1. Timeline Snapshots

每小时创建一个快照,旧的快照将会自动被删除。默认情况下,过去10天,一个月和一年的第一份快照将会被保留。默认情况下该快照是关闭的。

  1. Installation Snapshots

安装软件后,会创建一对快照:安装前(pre)的和安装后的(post)。如果是安装比较重要的包比如内核,快照对还会被标记上important。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。

  1. Aministration Snapshots

当你使用YaST管理系统时,会创建一对快照:管理前(pre)的和管理后的(post)。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。

1.3 被排除的目录

/boot/grub2/i386-pc, /boot/grub2/x86_64-efi, /boot/grub2/powerpc-ieee1275, /boot/grub2/s390x-emu

boot loader配置是无法回滚的,这里列出的目录是针对不同硬件架构的boot loader目录

/home

如果/home不驻留在单独的分区上,排除掉它是为了避免回滚时数据丢失。

/opt

第三方应用通常安装在该目录下。排除掉它是为了避免回滚时应用被删除。

/srv

该目录包含了web和FTP服务器的数据。排除掉它是为了避免回滚时数据丢失。

/tmp

临时文件夹,没必要做快照。

/usr/local

手工安装软件的目录,排除掉它是为了避免回滚时应用被删除。

/var

该目录包含了很多变量文件,比如日志,缓存,/var/opt中的第三方软件,而且还是虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些可变数据,并禁用了写时复制。

1.4 自定义设置

openSUSE默认提供了通用场景下的快照设置,你也可以根据需要进行修改。

1.4.1 开启和关闭快照
timeline snapshots
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=yes"
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=no"
installation snapshots

开启该快照功能需要安装软件,安装后自动开启,删除软件后关闭该快照功能

SUSE15:~ # zypper install snapper-zypp-plugin
SUSE15:~ # zypper remove snapper-zypp-plugin
administration snapshots
SUSE15:~ # vim /etc/sysconfig/yast2## Type: list(yes,no)
## Default: "no"
# Enable use of snapper for YaST.
USE_SNAPPER="yes"		#设置为yes就是开启,改为no即可关闭,默认是开启状态
1.4.2 控制installation snapshots

安装软件的快照对创建依赖于插件snapper-zypp-plugin。配置文件是/etc/snapper/zypp-plugin.conf。配置文件如下:

SUSE15:~ # cat /etc/snapper/zypp-plugin.conf
<?xml version="1.0" encoding="utf-8"?>
<snapper-zypp-plugin-conf><solvables>
#match属性代表使用UNIX shell风格的通配符(w)还是使用python正则表达式(re)
#important属性代表是否被标记为重要快照,这取决于软件包的标记
#括号中间的字符如下一行的kernel-*,用于匹配软件包名,根据match属性的设置,特殊字符会被解释为shell通配符或正则表达式。<solvable match="w" important="true">kernel-*</solvable><solvable match="w" important="true">dracut</solvable><solvable match="w" important="true">glibc</solvable><solvable match="w" important="true">systemd*</solvable><solvable match="w" important="true">udev</solvable><solvable match="w">*</solvable>			#无条件的匹配所有软件包,注释掉这一行代表非重要的软件安装将不会做快照</solvables>
</snapper-zypp-plugin-conf>
4.3 创建和挂载新的子卷

系统支持在根下创建一个新的子卷并永久挂载,但是这样的子卷将会被快照排除掉。你需要确保不在现有快照中创建它,因为回滚后将无法再删除快照。
openSUSELeap配置了/@/子卷,它作为/opt、/srv、/home等永久子卷的独立根。您创建和永久安装的任何新子卷都需要在此初始根文件系统中创建。
下面的列子是从/dev/sda2中新创建一个/usr/important子卷:

SUSE15:~ # mount /dev/sda2 -o subvol=@ /mnt
SUSE15:~ # btrfs subvolume create /mnt/usr/important
SUSE15:~ # umount /mnt

永久挂载配置

SUSE15:~ # vim /etc/fstab/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0

子卷可能包含不断变化的文件,例如虚拟化磁盘映像、数据库文件或日志文件。如果是这样,请考虑禁用此卷的写时复制功能,以避免磁盘块重复。使用/etc/fstab中的nodatacow挂载选项来执行此操作:

/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0

命令行下的操作:

SUSE15:~ # chatter +C /usr/important
1.4.4 控制快照归档

快照会占据大量的磁盘空间,因此为了避免快照占据整个磁盘空间,多余的快照将会自动被删除。默认情况下,系统会保存10个重要的安装和管理快照,以及10个常规的安装和管理快照,如果快照占据了超过50%的分区空间,那么数量会相应的减少,但**至少会保存10个重要快照加2个常规快照**。

1.4.5 在精简置备LVM卷中使用快照

快照还支持的文件系统包括XFS、EXT3和EXT4,需要专门为这些文件系统创建一个快照配置。在创建时需要在--fstype="lvm(xfs)"中指明文件系统名,例如:

SUSE15:~ #  snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm

2 快照用于撤销修改

snapper还有一个作用是撤销zypper和YaST做的修改,因此在zypper和YaST做修改时,snapper会产生一对快照(修改前和修改后)。也可以用于恢复意外丢失的系统文件。要达到这个目的,需要开启Timeline snapshots


撤销修改和回滚的区别

  • 撤销修改:当使用撤销修改功能是,系统会比较两个快照的区别,然后取消掉修改的部分。撤销修改还可以只针对某个文件。
  • 回滚:整个系统将会恢复到原来快照的状态。

撤销修改也可以和当前系统状态进行对比,如果所有文件都做了快照,那么实际上撤销修改和回滚就没啥区别了。当然首选的还是回滚,因为回滚允许在操作之前查看系统,并且速度更快。


注意:创建快照时没有机制保证数据的一致性。如果在创建快照的同时写入文件(例如,数据库),就会导致文件损坏或部分写入。恢复这样的文件会导致问题。此外,不得恢复某些系统文件,例如/etc/mtab。因此,强烈建议始终仔细查看已更改文件的列表及其差异。仅还原真正需要还原的操作的文件。

2.1 撤销YaST和zypper的修改

一旦在安装时将根分区配置为btrfs文件系统,针对YaST和zypper的快照就会被自动配置,因此每次操作YaST和zypper时,就会创建一对快照。可以通过YaST中的snapper模块和snapper命令来操作修改的撤销。文件的对比也可以通过命令diff来进行查看。

2.1.1 YaST操作
1.通过root账户进入YaST,打开Miscellaneous(杂项)中的snapper(文件系统快照)模块
2.选择类型为Pre & Post的快照,描述中会显示通过什么工具来造成的修改。

在这里插入图片描述

在清单里面,还可以看到最后一个快照只有Pre,因为登陆了YaST做操作,而操作还没有完成,因此没有post快照。

3.选择一对快照,然后点击查看修改

在这里插入图片描述

这里可以看到所有的修改内容

4.选择所有,或者某一个文件夹进行恢复

在这里插入图片描述

2.1.2 CLI操作
1.首先列出所有的快照
SUSE15:~ # snapper list -t pre-post
Pre # | Post # | Pre Date                 | Post Date                | Description  | Userdata    
------+--------+--------------------------+--------------------------+--------------+-------------3  |     4  | Tue Aug 17 16:35:58 2021 | Tue Aug 17 16:36:06 2021 | zypp(zypper) | important=no5  |     6  | Tue Aug 17 16:51:45 2021 | Tue Aug 17 16:51:55 2021 | zypp(zypper) | important=no7  |     8  | Tue Aug 17 16:53:16 2021 | Tue Aug 17 16:53:53 2021 | zypp(zypper) | important=no9  |    10  | Tue Aug 17 17:38:10 2021 | Tue Aug 17 17:39:00 2021 | zypp(zypper) | important=no11  |    12  | Tue Aug 17 17:39:09 2021 | Tue Aug 17 17:39:10 2021 | zypp(zypper) | important=no
2.查看某一快照的具体修改内容
SUSE15:~ # snapper status 3..4	#需要使用两个ID才能具体匹配某一个快照
c..... /etc/products.d/Leap.prod
+..... /etc/zypp/repos.d/repo-backports-debug-update.repo
+..... /etc/zypp/repos.d/repo-backports-update.repo
+..... /etc/zypp/repos.d/repo-sle-debug-update.repo
+..... /etc/zypp/repos.d/repo-sle-update.repo
c..... /usr/lib/sysimage/rpm/Basenames
c..... /usr/lib/sysimage/rpm/Conflictname
c..... /usr/lib/sysimage/rpm/Dirnames
c..... /usr/lib/sysimage/rpm/Group
c..... /usr/lib/sysimage/rpm/Installtid
c..... /usr/lib/sysimage/rpm/Name
c..... /usr/lib/sysimage/rpm/Obsoletename
c..... /usr/lib/sysimage/rpm/Packages
c..... /usr/lib/sysimage/rpm/Providename
c..... /usr/lib/sysimage/rpm/Recommendname
c..... /usr/lib/sysimage/rpm/Requirename
c..... /usr/lib/sysimage/rpm/Sha1header
c..... /usr/lib/sysimage/rpm/Sigmd5
c..... /usr/lib/sysimage/rpm/Suggestname

快照中总共有三种标记:

  • c:有修改
  • +:增加的内容
  • -:删除的内容
3.查看具体的修改内容
SUSE15:~ # snapper diff 3..4 /etc/products.d/Leap.prod
--- /.snapshots/3/snapshot/etc/products.d/Leap.prod	2021-05-24 19:41:40.000000000 +0800
+++ /.snapshots/4/snapshot/etc/products.d/Leap.prod	2021-06-04 16:43:53.000000000 +0800
@@ -98,7 +98,7 @@</buildconfig><installconfig><defaultlang>en_US</defaultlang>
-    <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.138.1"/>
+    <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.146.1"/><distribution>openSUSE</distribution></installconfig><runtimeconfig/>

如果不指定文件,则会显示所有的修改内容。

4.撤销修改操作
SUSE15:~ # snapper -v undochange 3..4 /etc/products.d/Leap.prod
create:0 modify:1 delete:0
modifying /etc/products.d/Leap.prod

如果不指定文件,则会撤销所有的修改。


不建议通过使用Snapper撤消更改来恢复用户添加。由于某些目录被排除在快照之外,属于这些用户的文件将保留在文件系统中。如果创建了与已删除用户具有相同用户ID的用户,则该用户将继承这些文件。因此强烈建议使用YaST用户和组管理工具删除用户。

2.2 恢复文件

timeline snapshot可以帮助你恢复以外删除的文件或是回退文件版本。snapper的diff选项也可以帮你找出具体的修改内容。

2.2.1 YaST操作
  1. 从YaST中的“杂项”部分或输入“yast2 Snapper”启动“Snapper*”模块。
  2. 选择要从中选择快照的“当前配置”。
  3. 选择要从中恢复文件的时间轴快照,然后选择“显示更改”。时间轴快照的类型为Single,描述值为Timeline
  4. 单击文件名,从文本框中选择一个文件。显示了快照版本与当前系统之间的差异。激活复选框以选择要还原的文件。对所有要恢复的文件执行此操作。
2.2.2 CLI操作

  1. 通过以下命令获取特定配置的时间轴快照列表:
sudo snapper -c CONFIG list -t single | grep timeline

CONFIG需要替换为现有Snapper配置。使用snapper列表配置来显示列表。

  1. 通过以下命令获取给定快照的更改文件列表:
sudo snapper -c CONFIG status SNAPSHOT_ID..0

将SNAPSHOT_ID替换为要从中恢复文件的快照的ID。

  1. 可以选择通过运行以下命令列出当前文件版本与快照中的文件版本之间的差异
sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME

如果未指定,则会显示所有文件的差异。

4.恢复一个或多个文件

sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2

不指定名字则会保存所有的修改

----

3 从快照启动实现回滚

openSUSE Leap中的GRUB2可以直接从btrfs快照中引导。只有默认snapper配置(不能修改)创建的快照(root)才能实现引导。
启动快照时,快照中包含的文件系统部分以只读方式挂载; 从快照中排除的所有其他文件系统和部分都以读写方式挂载并且可以修改。
要从可引导快照回滚,必须满足以下要求。进行默认安装时,系统会进行相应设置。

  1. 根文件系统必须是btrfs,不支持LVM卷
  2. 根文件系统必须是一个单独的设备,分区或子卷。快照中排除的部分分区如/srv可能驻留在单独的分区上。
  3. 系统需要能够通过已安装的引导加载程序进行引导。
回滚操作步骤:
  1. 启动系统后,选择*Bootable snapshots *并选择需要启动的快照,快照会以时间为前缀命名。
  2. 登陆系统,检查系统工作是否正常。
  3. 决定是否回滚。
  • 如果不想要回滚到这个快照,重启并引导现有的系统,或者是选择其他快照。
  • 如果想回滚,执行命令snapper rollback,然后重启系统,选择默认启动项以重新启动到恢复的系统。

注意:如果在安装时没有禁用快照,安装完成后会有一个叫做after installztion的快照,你可以随时回滚到这个状态。启动系统升级到Service Pack或新的主要版本时,也会创建可引导快照。

3.1 回滚后的快照

在执行回滚之前,会创建正在运行的文件系统的快照。该描述引用了在回滚中恢复的快照的ID。
由回滚创建的快照接收Cleanup属性的值编号。因此,当达到设置的快照数量时,回滚快照会自动删除。如果快照包含重要数据,请在删除之前从快照中提取数据。

3.1.1 回滚快照举例

在新安装一个系统后,系统中会有如下快照

SUSE15:~ # snapper --iso list# | Type   | Pre # | Date                | User | Used Space | Cleanup | Description           | Userdata     
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------0  | single |       |                     | root |            |         | current               |              1* | single |       | 2021-08-17 15:04:56 | root | 129.47 MiB |         | first root filesystem |              2  | single |       | 2021-08-17 15:16:30 | root |  24.12 MiB | number  | after installation    | important=yes

在执行回滚后3号快照会被创建并且包含了回滚前的状态,快照4是新的默认Btrfs子卷,因此是重新启动后的系统。

SUSE15:~ # snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     | number  | first root filesystem |
single | 2 |     | number  | after installation    | important=yes
single | 3 |     | number  | rollback backup of #1 | important=yes
single | 4 |     |         |                       |

3.2 访问和识别快照

启动时选择Start Bootloader from a read-only snapshot,就会看到快照列表,最新的在最前面,可以使用上下箭头进行选择。从引导菜单激活快照不会立即重新启动机器,而是打开所选快照的引导加载程序。

在这里插入图片描述

快照的命名格式如下:

[*]OS (KERNEL,DATETTIME,DESCRIPTION)
  1. 如果快照被标记为important,则会有*标记
  2. 操作系统名称和版本
  3. 内核版本
  4. 快照创建日期
  5. 快照创建时间
  6. 快照的描述。手工创建的描述可以通过--description选项来添加描述。

可以通过修改的方式对现有的自动创建的快照进行描述调整。例如要将快照5的描述修改为post-initial,可以使用命令snapper modify --userdata "bootloader=post-initial" 5。自定义的描述不能超过25个字符,否则会无法启动。

3.3 限制条件

由于系统随时在产生临时文件,因此是不可能完全回滚到某一个状态的。

3.3.1 快照排除的目录

由于根文件系统不可能包含所有的目录,因此这些目录是无法恢复的,因此快照会有如下限制:

  1. 附加的和第三方软件可能会在回滚后无法使用,解决的办法只有重新安装应用。

  2. 文件访问问题,如果做了快照后应用修改了文件的权限或属组(用户),那么回滚可能会导致应用无法访问这些文件。这样就只能在回滚后重置权限设置。

  3. 不兼容的数据格式。如果在做了快照后服务或应用建立了新的数据格式。在回滚后应用可能不能读取收到影响的数据。

  4. 混合代码和数据的子卷。一些子卷如/srv可能既包含代码也包含数据。回滚可能会导致出现无法执行的代码。例如,PHP版本的降级可能会导致Web服务器的PHP脚本损坏。

  5. 用户数据。如果回滚导致用户被删除,但相关的数据由于被排除在快照之外而没有被删除。如果系统又创建了相同user ID的用户,那么这个用户将会继承旧的数据,可通过find命令找到并删除这些文件。

3.3.2 引导加载数据无法回滚

系统无法实现引导加载程序的回滚。

4 开启用户家目录快照

家目录的快照是支持,它支持多种用例:

  1. 个人用户管理自己的快照和回滚
  2. 系统用户,如想要跟踪配置文件、文档等副本的数据库、系统和网络管理员。
  3. samba与家目录和btrfs后端共享

用户目录都是btrfs目录/home的子卷,可以手工设置快照。但是更方便的方式是使用pam_snapper,pam_snapper包安装了pam_snapper.so模块和帮助程序脚本,它们可以自动创建用户和配置Snapper。
pam_snapper集成了useradd命令,pam和snapper。它默认会在用户登录和注销时创建快照,并且还会在某些用户长时间保持登录状态时创建基于时间的快照。 通过Snapper命令或修改配置文件更改默认值。

4.1 安装pam_snapper并创建用户

  1. 安装软件
SUSE15:~ # zypper in pam_snapper
Loading repository data...
Reading installed packages...
Resolving package dependencies...The following NEW package is going to be installed:pam_snapper1 new package to install.
Overall download size: 27.9 KiB. Already cached: 0 B. After the operation, additional 29.1 KiB
will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package pam_snapper-0.8.16-1.1.x86_64         (1/1),  27.9 KiB ( 29.1 KiB unpacked)
Retrieving: pam_snapper-0.8.16-1.1.x86_64.rpm ..........................................[done]Checking for file conflicts: ...........................................................[done]
(1/1) Installing: pam_snapper-0.8.16-1.1.x86_64 ........................................[done
  1. 添加配置文件
SUSE15:~ # vim /etc/pam.d/common-sessionsession optional        pam_snapper.so		#添加到最后一行
  1. 使用脚本文件创建新用户和家目录,脚本默认是试运行状态,因此需要先关闭。
SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_useradd.sh DRYRUN=0		#默认是1,改为0

修改配置后再执行脚本:

SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_useradd.sh wolf wolf passwd=123456
Create subvolume '/home/wolf'
useradd: warning: the home directory /home/wolf already exists.
useradd: Not copying any file from skel directory into it.
chown: invalid user: ‘wolf.wolf’
  1. 在用户第一次登陆时,/etc/skel文件夹中的文件将会被复制到用户的家目录中,
SUSE15:~ # snapper list --allConfig: home_wolf, subvolume: /home/wolf# | Type   | Pre # | Date                     | User | Used Space | Cleanup | Description | Userdata                                
---+--------+-------+--------------------------+------+------------+---------+-------------+-----------------------------------------
0  | single |       |                          | root |            |         | current     |                                         
1  | pre    |       | Sun Aug 22 20:36:03 2021 | wolf |  16.00 KiB |         | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2
2  | post   |     1 | Sun Aug 22 20:36:06 2021 | wolf |  16.00 KiB |         | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2

由于已经使用wolf登陆过一次系统,因此创建了两个快照。wolf用户可以通过snapper命令管理属于自己的快照。

4.2 删除用户

和添加用户一样,也需要先修改脚本,然后再执行删除操作。

SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_userdel.sh DRYRUN=0		#默认是1,改为0

执行删除:

SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_userdel.sh jack
Delete subvolume (no-commit): '/home/jack'
no crontab for jack
userdel: jack home directory (/home/jack) not found

4.3 手工开启家目录快照

SUSE15:~ # btrfs subvolume create /home/jack
Create subvolume '/home/jack'
SUSE15:~ # snapper -c home_jack create-config /home/jack
SUSE15:~ # sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"jack\"/g"  /etc/snapper/configs/home_jack
SUSE15:~ # yast users add username=jack home=/home/jack password=123456
SUSE15:~ # chown jack.jack /home/jack
SUSE15:~ # chmod 755 /home/jack/.snapshots

5 创建和修改snapper配置

snapper的配置文件统一存放在/etc/snapper/configs/下,其中root为默认创建的,主要针对YaST和zypper的操作,当根分区磁盘空间足够大时就会自动创建。
你也可以为挂载到btrfs格式子卷下的任何目录创建自己定义的快照配置,

SUSE15: # snapper -c tmp-data create-config /tmp	#-c后面跟配置名称,最后跟目录
SUSE15: # ls /etc/snapper/configs/
home_jack  home_wolf  root  tmp-data

配置将会根据模板/etc/snapper/config-templates/default来进行创建。也可以使用-t来指定自己定义的模板。

5.1 管理已有的配置

snapper提供了很多子命令来管理配置。

列出配置
SUSE15:/opt # snapper list-configs
Config    | Subvolume 
----------+-----------
home_jack | /home/jack
home_wolf | /home/wolf
root      | /         
tmp-data  | /tmp  
查看配置
SUSE15:/opt # snapper -c home_wolf get-config
Key                    | Value     
-----------------------+-----------
ALLOW_GROUPS           |           
ALLOW_USERS            | wolf      
BACKGROUND_COMPARISON  | yes       
EMPTY_PRE_POST_CLEANUP | yes       
EMPTY_PRE_POST_MIN_AGE | 1800      
FREE_LIMIT             | 0.2       
FSTYPE                 | btrfs     
NUMBER_CLEANUP         | yes       
NUMBER_LIMIT           | 50        
NUMBER_LIMIT_IMPORTANT | 10        
NUMBER_MIN_AGE         | 1800      
QGROUP                 |           
SPACE_LIMIT            | 0.5       
SUBVOLUME              | /home/wolf
SYNC_ACL               | no        
TIMELINE_CLEANUP       | yes       
TIMELINE_CREATE        | yes       
TIMELINE_LIMIT_DAILY   | 10        
TIMELINE_LIMIT_HOURLY  | 10        
TIMELINE_LIMIT_MONTHLY | 10        
TIMELINE_LIMIT_WEEKLY  | 0         
TIMELINE_LIMIT_YEARLY  | 10        
TIMELINE_MIN_AGE       | 1800  
修改配置

根据列出来的配置中的选项,修改其参数:

SUSE15:/opt # snapper -c home_wolf set-config NUMBER_LIMIT=20
SUSE15:/opt # snapper -c home_wolf get-config
Key                    | Value     
-----------------------+-----------
ALLOW_GROUPS           |           
ALLOW_USERS            | wolf      
BACKGROUND_COMPARISON  | yes       
EMPTY_PRE_POST_CLEANUP | yes       
EMPTY_PRE_POST_MIN_AGE | 1800      
FREE_LIMIT             | 0.2       
FSTYPE                 | btrfs     
NUMBER_CLEANUP         | yes       
NUMBER_LIMIT           | 20     	#默认为50,已经修改成了20   
NUMBER_LIMIT_IMPORTANT | 10        
NUMBER_MIN_AGE         | 1800      
QGROUP                 |           
SPACE_LIMIT            | 0.5       
SUBVOLUME              | /home/wolf
SYNC_ACL               | no        
TIMELINE_CLEANUP       | yes       
TIMELINE_CREATE        | yes       
TIMELINE_LIMIT_DAILY   | 10        
TIMELINE_LIMIT_HOURLY  | 10        
TIMELINE_LIMIT_MONTHLY | 10        
TIMELINE_LIMIT_WEEKLY  | 0         
TIMELINE_LIMIT_YEARLY  | 10        
TIMELINE_MIN_AGE       | 1800   
删除配置
SUSE15:/opt # snapper -c home_jack delete-config
SUSE15:/opt # snapper list-configs
Config    | Subvolume 
----------+-----------
home_wolf | /home/wolf
root      | /         
tmp-data  | /tmp 
5.1.1 配置数据
1. ALLOW_GROUPS, ALLOW_USERS - 授予普通用户使用快照的权限。默认值为空。
2. BACKGROUND_COMPARISON - 定义在创建快照后,快照对是否在后台被比较。默认为`Yes`
3. EMPTY_* - 定义具有相同前后快照的快照对的清理算法
4. FSTYPE - 分区的文件系统类型,不要修改它。默认为`btrfs`
5. NUMBER_* - 定义安装和管理快照的清理算法
6. QGROUP/SPACE_LIMIT - 为清理算法添加配额支持
7. SUBVOLUME - 分区或子卷快照的挂载点,不要修改它。默认是`/`
8. SYNC_ACL - 如果快照用在常规用户上,该用户必须能够访问`.snapshot`目录和读取里面的文件。如果设置为`yes`,Snapper会自动使用来自ALLOW_USERS或ALLOW_GROUPS条目的用户和组的ACL来访问它们。默认值是`no`
9. TIMELINE_CREATE - 如果设置为`yes`,每小时会创建一个快照。默认值为`no`
10. TIMELINE_CLEANUP/TIMELINE_LIMIT_* - 为基于时间的快照定义清理算法
5.1.2 普通用户使用snapper

默认情况下,快照只能由root用户使用,但是总会有一些使用需求:

  • 网站的管理员想要为/srv/www创建快照
  • 用户想为自己的家目录创建快照

可以创建快照配置,为用户/组添加相关的权限,并保证用户/组能够访问快照数据。最好的办法就是将SYNC_ACL 选项设置为yes

操作步骤(注意需要使用root用户执行以下操作):

  1. 创建配置
SUSE15: # snapper -c tmp-data create-config /tmp
  1. 根据需要调整配置参数

  2. 通过设置ALLOW_USERS``ALLOW_GROUPS来给用户/组授权,多个条目使用空格隔开。

SUSE15:/opt # snapper -c tmp-data set-config ALLOW_USERS=wolf SYNC_ACL="yes"
  1. 查看配置
wolf@SUSE15:~> snapper -c tmp-data list# | 类型   | 前期 # | 日期 | 用户 | 已用空间 | 清空 | 描述    | 用户数据
---+--------+--------+------+------+----------+------+---------+---------
0  | single |        |      | root |          |      | current |      

6 手工创建和管理快照

snapper支持手工创建快照,由于快照都是针对已存在的配置,因此手工创建快照同样需要基于已有的配置。默认情况下,root配置已经被使用了,因此手工创建快照时,首先需要创建快照配置。

6.1快照元数据

每个快照都有自己的元数据,创建快照时需要指定快照的元数据,修改快照就是在修改快照的元数据。

snapper --config root list - 列出基于该配置创建的所有快照(由于root是默认配置,因此这里可以省去)。
snapper list -a - 列出基于所有存在的配置创建的所有快照。
snapper list -t pre-post - 列出所有的基于默认配置的pre and post快照
snapper list -t single - 列出所有的基于默认配置的single快照

以下元数据可用于每个快照:

  1. Type:快照类型,不可修改。
  2. Number:快照的唯一编号,不可修改
  3. Pre Number:指定对应的pre快照编号。 仅适用于post类型的快照。不可修改
  4. Description:快照描述
  5. Userdata:指定用户数据的扩展描述,使用逗号隔开。例如reason=testing, project=foo,也用来标示快照是否重要,以及列出快照的创建者。
  6. Cleanup-Algorithm:快照的清理算法。
6.1.1 快照类型

快照有三种类型,它们在物理上没有区别,但Snapper处理它们的方式不同。


- pre - 文件系统修改前的快照。每个快照都会对应一个post快照
- post - 文件系统修改后的快照。每个快照都会对应一个pre快照
- single - 单独的快照,这是快照创建的默认类型。

6.1.2 清理算法

snapper提供了三种清理算法,这些算法将会在日常的cron中执行。可以定义要保留在Snapper配置中的不同类型快照的数量


- number - 达到一定的数量后删除旧的快照
- timeline - 超出一定的时限后删除旧的快照,但保留几个每小时、每天、每月和每年的快照。
- empty-pre-post - 删除两者无差异的pre/post快照

6.2 创建快照

在命令行下使用snapper create或者在YaST的Snapper模块下点击Create创建快照。下面是命令行下的快照创建举例。


- snapper create --from 17 --description "with package2" 从现有的快照(指定了id为17)创建一个single类型的独立快照
- snapper create --description "Snapshot for week 2 2014" 根据默认配置创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Cleanup in ~tux" 根据配置home创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline> 根据配置home创建一个带有描述的single类型的独立快照,当快照满足为配置中的时间线清理算法指定的条件时,将自动删除该快照。
- snapper create --type pre --print-number --description "Before the Apache config cleanup" --userdata "important=yes" 创建一个类型为pre的快照,并输出快照编号。这是创建用于保存“before”和“after”状态的一对快照所需的第一个命令。快照会被标记为重要
- snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --userdata "important=yes" 创建一个和ID号为30的pre快照配对的post快照,这是创建用于保存“before”和“after”状态的一对快照所需的第二个命令。快照会被标记为重要
- snapper create --command *COMMAND* --description "Before and after COMMAND" 在运行*COMMAND*命令的前后自动创建一对快照。这种创建方式只能在命令行下使用。

6.3 修改快照元数据

Snapper只允许修改快照的描述、清理算法和用户数据。通过命令行和YaST都可以完成修改操作。下面是命令行下的举例:


- snapper modify --cleanup-algorithm "timeline" 10 修改快照的清理算法
- snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline" 120 修改快照的清理算法和描述

6.4 删除快照

命令行和YaST都可以执行快照删除操作,但是不允许删除当前默认子卷的快照。
使用Snapper删除快照时,释放的空间将被后台运行的Btrfs进程占用。因此,空闲空间的可见性和可用性被延迟。如果想要立即可用,将选项--sync与删除命令一起使用。


- snapper delete 65 删除一个快照
- snapper -c home delete 89 90 删除指定配置下的两个快照
- snapper delete --sync 23 删除快照并立即释放空间

有时Btrfs快照存在,但包含Snapper元数据的XML文件丢失。在这种情况下,快照对Snapper不可见,需要手动删除:btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot rm -rf /.snapshots/SNAPSHOTNUMBER

如果想删除快照以释放硬盘空间,先删除旧快照。快照越旧,它占用的磁盘空间就越多。

7 快照自动清理

自动清理的目的在于防止快照占据过大的空间,可以结合磁盘配额来做清理,保证根分区有足够的可用空间。

7.1 清理编号的快照

清理编号快照(管理和安装快照对)由Snapper配置的以下参数控制。


- NUMBER_CLEANUP 开启或关闭安装和管理快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT 定义最多保留多少个快照,第一个参数的默认值是2-10,第二个参数的默认值是4-10。清理算法会删除超过指定最大值的快照,而不考虑快照和文件系统空间。算法还会删除高于最小值的快照,直到达到快照和文件系统的限制。如果禁用配额支持,则需要提供一个常量值,例如 10,否则清理将失败并显示错误。
- NUMBER_MIN_AGE 定义快照在自动删除之前必须具有的最短时间(以秒为单位)。 无论存在多少快照,都不会删除小于此处指定值的快照。默认值是1800

上面的三个参数都会被参考,只有当条件都满足,才会清除快照。如果不想考虑某个参数,可以将它设置为0,。

7.2 清理时间线快照

下面的参数可以控制时间线快照的清理:


- TIMELINE_CLEANUP 开启或关闭时间线快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- TIMELINE_LIMIT_DAILY,TIMELINE_LIMIT_HOURLY,TIMELINE_LIMIT_MONTHLY,TIMELINE_LIMIT_WEEKLY,TIMELINE_LIMIT_YEARLY 定义小时、日、月和年快照保留的数量,默认值是10。基于周的快照默认值是0。
- TIMELINE_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800

7.3 清理没有变化的快照对

当你运行了zypper命令或者进入了YaST界面又没有做任何修改时,系统仍然会创建一对快照,只是这对快照的变化为空。使用下面的参数来设置自动清除这些快照:


- EMPTY_PRE_POST_CLEANUP 如果设置为yes,那么无变化的快照对将会被删除,默认值为yes
- EMPTY_PRE_POST_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800

7.4 清理手工创建的快照

snapper不会为手工创建的快照提供客户定义的清除算法,但是可以在创建的时候指定算法。如果添加了,快照将会加入你指定算法的清除队列,也可以在创建后修改算法。


- snapper create --description "Test" --cleanup-algorithm number 创建一个单独的快照并指定了number清除算法
- snapper modify --cleanup-algorithm "timeline" 25 修改ID为25的快照清除算法为timeline

7.5 磁盘配额

你还可以为快照指定配额,通过百分比来表示。btrfs配额应用到子卷而不是用户。除了使用Btrfs配额之外,还可以对用户和组应用磁盘空间配额。
配额是自动启用的,也可以使用命令snapper setup-quota来手工开启。
配额有由下面的参数来配置:


- QGROUP Snapper使用的Btrfs配额组,如果没有设置,运行`snapper setup-quota`。如果已经设置,只有在熟悉`man 8 btrfs-qgroup`的情况下才能更改。此值是使用`snapper setup-quota`设置的,不应更改。
- SPACE_LIMIT 限制的配置,以小数表示(如0.1表示10%)

配额仅在现有数量或时间线清理算法之外被激活。如果没有清理算法处于活动状态,则不会应用配额限制。
启用配额支持后,Snapper将根据需要执行两次清理运行。第一次运行将应用为数量和时间线快照指定的规则。只有在本次运行后超过配额时,才会在第二次运行中应用特定于配额的规则。
即使启用了配额支持,Snapper也将始终保留使用NUMBER_LIMIT*TIMELINE_LIMIT*值指定的快照数量,即使会超出配额。因此,建议为NUMBER_LIMIT*TIMELINE_LIMIT*指定范围值(MIN-MAX),以确保可以应用配额。
例如,如果设置了NUMBER_LIMIT=5-20,Snapper将执行第一次清理运行并将常规编号快照的数量减少到20。如果这20个快照超过配额,Snapper将删除一个中最旧的快照。第二次运行,直到达到配额。无论它们占用多少空间,都将始终保留至少五个快照。

8 显示快照占用的磁盘空间

由于快照会共享当前状态的数据,因此常规的dudf命令不能查看快照具体占用的空间大小。当需要释放Btrfs上的磁盘空间时,需要知道每个快照使用了多少独占磁盘空间,而不是共享空间。Snapper 0.6及更高版本在“已用空间”列中报告每个快照的已用磁盘空间:

SUSE15:~ # snapper --iso list# | Type   | Pre # | Date                | User | Used Space | Cleanup | Description           | Userdata     
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------0  | single |       |                     | root |            |         | current               |              1* | single |       | 2021-08-17 15:04:56 | root | 708.00 KiB |         | first root filesystem |              2  | single |       | 2021-08-17 15:16:30 | root |  97.22 MiB | number  | after installation    | important=yes5  | pre    |       | 2021-08-17 16:51:45 | root | 224.00 KiB | number  | zypp(zypper)          | important=no 6  | post   |     5 | 2021-08-17 16:51:55 | root | 512.00 KiB | number  |                       | important=no 7  | pre    |       | 2021-08-17 16:53:16 | root |  48.00 KiB | number  | zypp(zypper)          | important=no 8  | post   |     7 | 2021-08-17 16:53:53 | root |   2.48 MiB | number  |                       | important=no 9  | pre    |       | 2021-08-17 17:38:10 | root | 176.00 KiB | number  | zypp(zypper)          | important=no 
10  | post   |     9 | 2021-08-17 17:39:00 | root |   1.74 MiB | number  |                       | important=no 
11  | pre    |       | 2021-08-17 17:39:09 | root |  64.00 KiB | number  | zypp(zypper)          | important=no 
12  | post   |    11 | 2021-08-17 17:39:10 | root |   1.54 MiB | number  |                       | important=no 
13  | pre    |       | 2021-08-22 16:14:22 | root | 136.57 MiB | number  | yast snapper          |              
14  | pre    |       | 2021-08-22 20:28:38 | root | 112.00 KiB | number  | zypp(zypper)          | important=no 
15  | post   |    14 | 2021-08-22 20:28:41 | root | 316.00 KiB | number  |                       | important=no 
16  | pre    |       | 2021-08-22 20:45:24 | root | 336.00 KiB | number  | yast users            |              
17  | post   |    16 | 2021-08-22 20:45:35 | root | 304.00 KiB | number  |                       |  

btrfs命令也提供了类似的功能:

SUSE15:~ # btrfs qgroup show -p /
qgroupid         rfer         excl parent  
--------         ----         ---- ------  
0/5          16.00KiB     16.00KiB ---     
0/256        16.00KiB     16.00KiB ---     
0/257       180.59MiB    180.59MiB ---     
0/258        40.00KiB     40.00KiB ---     
0/259       192.00KiB    192.00KiB ---     
0/260        16.00KiB     16.00KiB ---     
0/261        10.48MiB     10.48MiB ---     
0/262        16.00KiB     16.00KiB ---     
0/263        34.95MiB     34.95MiB ---     
0/264        16.00KiB     16.00KiB ---     
0/265         2.51MiB      2.51MiB ---     
0/266       160.00KiB    160.00KiB ---     
0/267         5.69GiB    708.00KiB ---     
0/275         5.68GiB     97.22MiB 1/0     
0/278         5.69GiB    224.00KiB 1/0     
0/279         5.69GiB    512.00KiB 1/0     
0/280         5.69GiB     48.00KiB 1/0     
0/281         5.69GiB      2.48MiB 1/0     
0/283         5.69GiB    176.00KiB 1/0     
0/284         5.70GiB      1.74MiB 1/0     
0/285         5.69GiB     64.00KiB 1/0     
0/286         5.69GiB      1.54MiB 1/0     
0/288         5.70GiB    136.57MiB 1/0     
0/289         5.69GiB    112.00KiB 1/0     
0/290         5.69GiB    316.00KiB 1/0     
0/291        16.00KiB     16.00KiB ---     
0/292        16.00KiB     16.00KiB ---     
0/293           0.00B        0.00B ---     
0/294           0.00B        0.00B ---     
0/295        16.00KiB     16.00KiB ---     
0/296        16.00KiB     16.00KiB ---     
0/297        16.00KiB     16.00KiB ---     
0/298           0.00B        0.00B ---     
0/299         5.69GiB    336.00KiB 1/0     
0/300         5.69GiB    304.00KiB 1/0     
0/302        16.00KiB     16.00KiB ---     
0/303        16.00KiB     16.00KiB ---     
0/304        16.00KiB     16.00KiB ---     
0/305        16.00KiB     16.00KiB ---     
0/306        16.00KiB     16.00KiB ---     
0/307        48.00KiB     48.00KiB ---     
0/308        16.00KiB     16.00KiB ---     
0/309        48.00KiB     48.00KiB ---     
1/0           6.59GiB    924.74MiB ---  
  • qgroupid 显示子卷的识别号
  • rfer 显示子卷中引用的数据总量
  • excl 显示每个子卷中的独占数据。
  • parent 显示子卷的父 qgroup

最后一项1/0显示父qgroup的总数。在上面的示例中,如果删除所有子卷,将释放924.97MiB。运行以下命令以查看哪些快照与每个子卷相关联:

SUSE15:~ # btrfs subvolume list -st /
ID	gen	cgen	top level	otime	path	
--	---	----	---------	-----	----	
275	69	69	266		2021-08-17 15:16:30	@/.snapshots/2/snapshot
278	215	215	266		2021-08-17 16:51:45	@/.snapshots/5/snapshot
279	218	218	266		2021-08-17 16:51:55	@/.snapshots/6/snapshot
280	222	222	266		2021-08-17 16:53:16	@/.snapshots/7/snapshot
281	227	226	266		2021-08-17 16:53:53	@/.snapshots/8/snapshot
283	283	283	266		2021-08-17 17:38:10	@/.snapshots/9/snapshot
284	287	287	266		2021-08-17 17:39:00	@/.snapshots/10/snapshot
285	289	289	266		2021-08-17 17:39:09	@/.snapshots/11/snapshot
286	292	292	266		2021-08-17 17:39:10	@/.snapshots/12/snapshot
288	2248	2248	266		2021-08-22 16:14:22	@/.snapshots/13/snapshot
289	2435	2435	266		2021-08-22 20:28:38	@/.snapshots/14/snapshot
290	2438	2438	266		2021-08-22 20:28:41	@/.snapshots/15/snapshot
295	2460	2460	292		2021-08-22 20:36:03	@/home/wolf/.snapshots/1/snapshot
296	2462	2462	292		2021-08-22 20:36:06	@/home/wolf/.snapshots/2/snapshot
299	2493	2493	266		2021-08-22 20:45:24	@/.snapshots/16/snapshot
300	2495	2495	266		2021-08-22 20:45:35	@/.snapshots/17/snapshot
302	2517	2517	292		2021-08-22 21:00:20	@/home/wolf/.snapshots/3/snapshot
304	2583	2583	292		2021-08-22 21:52:30	@/home/wolf/.snapshots/4/snapshot
305	2588	2588	292		2021-08-22 21:53:01	@/home/wolf/.snapshots/5/snapshot
306	2599	2599	292		2021-08-22 22:00:25	@/home/wolf/.snapshots/6/snapshot
307	2602	2601	303		2021-08-22 22:00:25	@/tmp/.snapshots/1/snapshot
308	2679	2679	292		2021-08-22 23:00:25	@/home/wolf/.snapshots/7/snapshot
309	2682	2681	303		2021-08-22 23:00:25	@/tmp/.snapshots/2/snapshot

从一个服务包升级到另一个服务包会导致快照对占据磁盘的大量的磁盘空间,建议在不需要这个快照后立即删除它以释放磁盘空间。

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

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

相关文章

R语言数据分析案例33-基于logistic回归下的信用卡违约情况分析

一、选题背景 随着互联网产业的蓬勃发展&#xff0c;传统金融行业开始向着金融互联网化和互联网金融快速转型。网络信贷、信用卡等凭借门槛低、快速便捷、高收益等特点&#xff0c;借助互联网平台存在的优势&#xff0c;迅速成长。然而高收益的背后也存在着高风险&#xff0c;…

2024年,业绩大爆发的企业,都做对了一件事

作为新质生产力之一的AI技术&#xff0c;已经完成了从实验室到场景应用的“惊险一跃”&#xff0c;这背后离不开云计算、大数据技术的日趋成熟。与此同时&#xff0c;大模型、柔性计算等创新的云基础设施解决方案&#xff0c;为企业降本增效、快速高质量地发展&#xff0c;提供…

Python面向对象编程:类和对象的奥秘

更多Python学习内容&#xff1a;ipengtao.com 在Python的世界中&#xff0c;面向对象编程&#xff08;OOP&#xff09;是构建强大应用程序的基石。本文将带你从零开始&#xff0c;一步步探索类和对象的奥秘&#xff0c;让你的代码更加模块化和可重用。面向对象编程是一种编程范…

【CT】LeetCode手撕—46. 全排列

目录 题目1- 思路2- 实现⭐46. 全排列——题解思路 3- ACM实现 题目 原题连接&#xff1a;46. 全排列 1- 思路 模式识别 模式1&#xff1a;不含重复数字的数组 nums ——> 任意顺序 可能的全排列 ——> 回溯模式2&#xff1a;全排列 ——> 排列问题&#xff0c;不同…

用VPS部署聊天机器人有哪些优势?

VPS足以帮助您将人工智能 (AI) 的功能无缝融入聊天机器人并增强客户支持。聊天机器人已迅速成为改善用户体验的首选解决方案&#xff0c;因为它们全天候在线且可编程回答各种问题。 聊天机器人在客户支持方面的作用不容置疑。但所有出色的解决方案都需要出色的网络托管。 VPS…

高性能并行计算华为云实验二:WordCount算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建wordcount源码 3.1.1 实验说明 3.1.2 文件创建 3.2 Makefile文件创建与编译 3.3 主机配置文件建立与运行监测 3.3.1 主机配置文件建立 3.3.2 运行监测 三、实验结果与分析 4.1 实验结果 4.2 结果分析 4.2.1 …

Nature | 解锁大脑运动控制机理!哈佛大学与DeepMind实现「AI大脑」控制虚拟老鼠

近日&#xff0c;哈佛大学的研究人员与谷歌DeepMind AI 实验室合作&#xff0c;开发出了一种虚拟大鼠模型&#xff0c;以研究大脑如何控制真实老鼠的运动。这个创新的模型准确地模拟了在真实大鼠身上观察到的神经活动&#xff0c;可以用于探讨大脑是如何控制动物的运动行为。 …

杀疯了!PerfXCloud-AI大模型夏日狂欢来袭,向基石用户赠送 ∞ 亿Token!

【澎峰科技重磅消息】 在全球范围内大模型正逐渐成为强大的创新驱动力。在这个充满激情的夏日&#xff0c;PerfXCloud为开发者和企业带来了前所未有的福利&#xff1a; 1. 零成本亲密、深度体验大模型&#xff0c;提供大量示范案例。 2. 向基石用户赠送∞亿Token的激励计划。…

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…

基于SpringBoot+协同过滤算法的家政服务平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

matlab入门基础笔记

1、绘制简单三角函数&#xff1a; 绘制正弦曲线和余弦曲线。x[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); &#xff08;1&#xff09;明确x轴与y轴变量&#xff1a; 要求为绘制三角函数&#xff1a; X轴&#xff1a;角度对应的弧度数组 Y轴&#xff1a;对应sin(x)的值 求…

电商平台生活用品销售数据分析与应用

摘 要 在当前互联网飞速发展的时代&#xff0c;计算机应用给我们的工作生活带来了极大的便利。如今我们的生活离不开电商平台&#xff0c;其随之而来的是各种各样的销售数据与消费者信息&#xff0c;这些数据和信息的分析应用成为了当前互联网领域研究的重要部分。 本论文以基…

python自动化办公工具:自动批量生成奖状的工具(可视化)

&#x1f446;点击关注 获取更多编程干货&#x1f446; 不知道大家有没有注意到一种趋势&#xff0c;现在即便是那些非程序员&#xff0c;甚至对计算机一窍不通的人&#xff0c;也开始学习Python了&#xff0c;其“普及程度”实在让人感到有些惊讶。 那么&#xff0c;对于那些…

如何通过防泄密U盘,实现数据传输的安全性及可控性?

随着信息技术的发展&#xff0c;U盘作为重要的数据存储和传输工具&#xff0c;其安全性越来越受到关注。在日常办公中&#xff0c;经常会遇到这类情况&#xff1a;员工为了方便&#xff0c;随意使用U盘拷贝公司的机密资料。一旦U盘丢失或者被窃取&#xff0c;公司的机密资料就有…

警惕!最新17本期刊(含2本Top)被“镇压”,无影响因子无分区,这是被踢了吗?

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序&#xff08;jdk&#xff09; 2、添加以下JAR包 3、确认配置成自己的数据库 ....

【数据结构与算法】线索二叉树 详解

为什么可在不增加指针域的情况下&#xff0c;对二叉树进行线索化&#xff1f; 不增加指针域&#xff1a;因为可以利用n1个空链域。 在线索二叉树中&#xff0c;为每个节点添加两个标志位&#xff0c;分别表示左指针和右指针是普通的孩子指针还是线索&#xff08;前驱或后继&a…

禅道身份认证绕过漏洞(QVD-2024-15263)复现

禅道项目管理系统在开源版、企业版、旗舰版的部分版本中都存在此安全漏洞。攻击者可利用该漏洞创建任意账号实现未授权登录。 1.漏洞级别 高危 2.漏洞搜索 fofa: title"禅道"3.影响范围 v16.x < 禅道 < v18.12 &#xff08;开源版&#xff09; v6.x <…

《STM32 HAL库》CAN通信系列函数详尽解析——HAL_CAN_Init()

食用指南&#xff1a;本文主要内容为梳理CAN初始化函数主要运行逻辑及重点功能实现代码的详尽解析。函数源码在文末&#xff0c;建议在阅读源码之后观看。 CAN相关寄存器图&#xff1a; 主要逻辑分析&#xff1a; 下面分点梳理函数的主要逻辑&#xff08;注意逻辑序号&#xf…

function包装器和bind包装器

function包装器和bind包装器 包装器function包装器为什么需要functionfunction包装器function包装器的应用场景逆波兰表达式求值 bind包装器bind包装器的应用场景 包装器 包装器是用于给其他编程接口提供更一致或更合适的接口 由于函数调用可以使用函数名、函数指针、函数对象…