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/root

	USE_SNAPPER=yes

	TIMELINE_CREATE=no
  • Disks smaller than 16 GB
	Configuration file: not created

	USE_SNAPPER=no

	TIMELINE_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=no
   5  |     6  | Tue Aug 17 16:51:45 2021 | Tue Aug 17 16:51:55 2021 | zypp(zypper) | important=no
   7  |     8  | Tue Aug 17 16:53:16 2021 | Tue Aug 17 16:53:53 2021 | zypp(zypper) | important=no
   9  |    10  | Tue Aug 17 17:38:10 2021 | Tue Aug 17 17:39:00 2021 | zypp(zypper) | important=no
  11  |    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_snapper

1 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-session

session 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 --all

Config: 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=yes
 5  | 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络命令:网络速度测试工具 speedtest-cli 详解

目录 一、概述 二、安装 speedtest-cli 1、在基于 Debian 的系统上安装 2、在基于 Red Hat 的系统上安装 三、命令语法 1、基本命令语法 2、查看帮助 3、常用选项 四、 speedtest-cli使用示例 1. 基本测试 2. 列出所有可用的服务器 3. 指定服务器进行测试 …

kotlin集合框架

1、集合框架的接口类型对比 2、不可变和可变List fun main() {// 不可变List - 不能删除或添加元素val intList: List<Int> listOf(1,2,3)intList.forEach{println(it) // 1 2 3}println("")// 可变List - 可以删除或添加元素val mutableList mutableListO…

【SpringBoot】RSA加密(非对称加密)

一、关于RSA RSA是一种非对称加密算法&#xff0c;广泛应用于数据加密和数字签名领域。 RSA算法是由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;在1977年提出的。…

单元测试很难么?

前言 你可能会用单元测试框架&#xff0c;python的unittest、pytest&#xff0c;Java的Junit、testNG等。 那么你会做单元测试么&#xff01;当然了&#xff0c;这有什么难的&#xff1f; test_demo.py def inc(x): return x 1 def test_answer(): assert inc(3) 4 i…

BLE-蓝牙广播

蓝牙广播&#xff1a;

KVB投资安全小知识:你知道情绪面、技术面与基本面的关系吗?

摘要&#xff1a;当涉及到金融市场分析时&#xff0c;情绪面、技术面和基本面是三个重要的方面。它们相互交织&#xff0c;共同影响着市场的走势和投资者的决策。下面我来详细解释它们之间的关系。 情绪面的影响 情绪面指的是投资者情绪和市场情绪&#xff0c;它反映了市场参与…

基于自编码器的滚动轴承异常检测方法(NASA-IMS数据,Python)

代码较为简单。 import numpy as np import pandas as pd from tensorflow import keras from tensorflow.keras import layers from matplotlib import pyplot as plt df_stats_Ch1_test2 pd.read_csv("estadisticos_test2_ch1.csv" , sep ,) X_Ch1 df_stats_Ch…

scratch编程03-反弹球

这篇文章和上一篇文章《scratch3编程02-使用克隆来编写小游戏》类似&#xff08;已经完全掌握了克隆的可以忽略这篇文章&#xff09;&#xff0c;两篇文章都使用到了克隆来编写一个小游戏&#xff0c;这篇文章与上篇文章不同的是&#xff0c;本体在进行克隆操作时&#xff0c;不…

Linux系统安装Ruby语言

Ruby是一种面向对象的脚本语言&#xff0c;由日本的计算机科学家松本行弘设计并开发&#xff0c;Ruby的设计哲学强调程序员的幸福感&#xff0c;致力于简化编程的复杂性&#xff0c;并提供一种既强大又易于使用的工具。其语法简洁优雅&#xff0c;易于阅读和书写&#xff0c;使…

FQC外检机使用Profibus转Modbus网关提升工作效率

一、简介 控制器通过Profibus转Modbus网关&#xff08;XD-MDPB100&#xff09;与视觉传感器实现通讯&#xff0c;在FQC外检机的应用为生产流程的自动化和优化提供了重要支持。在工业自动化领域&#xff0c;PLC常被用作控制器&#xff0c;通过采用在PLC与执行设备中间添加Profi…

WordPress模板推荐

WordPress外贸主题 wordpress跨境电商独立站主题&#xff0c;wordpress外贸建站模板。 手机配件wordpress外贸网站模板 充电器、移动电源、手机膜、手机电池、手机壳、手机转接头等手机配件wordpress外贸网站模板。 毛巾WordPress外贸主题 毛巾、面巾、婴童毛巾、浴巾、方巾、…

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想&#xff0c;设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码&#xff0c;把人折腾的很痛苦&#xff0c;所以我就在想&#xff0c;能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件&#xff0c;会自…

得物面试:什么是零复制?说说 零复制 底层原理?(吊打面试官)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的零复制的问题&#xff1a; 说一说Rocketmq、是如何实现每秒上百万数据的超…

前端页面实现【矩阵表格与列表】

实现页面&#xff1a; 1.动态表绘制&#xff08;可用于矩阵构建&#xff09; <template><div><h4><b>基于层次分析法的权重计算</b></h4><table table-layout"fixed"><thead><tr><th v-for"(_, colI…

Antd - 上传图片 裁剪图片

目录 本地上传方法【input type"file"】&#xff1a;upload组件【antd】默认接口上传&#xff1a;自定义接口上传&#xff1a;【取消默认上传接口】antd的upload组件beforeUpload还有个比较坑的地方 upload结合裁剪1、antd官方裁剪组件&#xff1a;![在这里插入图片描…

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系 flyfish 单位圆 &#xff1a;单位圆表示在标准正交基下的分布。 椭圆 &#xff1a;通过协方差矩阵的特征向量和特征值变换得到的椭圆&#xff0c;表示数据在新的坐标系下的分布。 特征向量 &#xff1a;红色箭头表示特征…

打造一个属于你的桌面天气 超级有个性的天气桌面

打造一个属于你的桌面天气 超级有个性的天气桌面。大家好&#xff0c;今天我们带来一个非常有趣的桌面天气工具&#xff0c;喜欢桌面diy的你&#xff0c;快点用上它吧&#xff01; 桌面上的美化&#xff0c;是许多爱美用户的心血和热爱。每个地方的美化&#xff0c;都是自己亲…

电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法

在数字化时代&#xff0c;多媒体文件的处理已经成为我们日常生活和工作中不可或缺的一部分。在计算机使用过程中&#xff0c;丢失ffmpeg.dll文件是一个特定但常见的问题&#xff0c;尤其是对于那些经常处理视频编解码任务的用户来说。下面小编讲全面分析ffmpeg.dll丢失原因以及…

Go语言day1

下载go语言的安装程序&#xff1a; All releases - The Go Programming Language 配置go语言的环境变量&#xff1a; 写第一个go语言 在E:\go_workspace当前窗口使用cmd命令: 输入 go run test.go

vscode + CMake编译(opencv显示图片工程)

1.opencv 2.Cmake 2.1 简介 CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件&#xff1b;Cmake 并不直接建构出最终的软件&#xff0c;而是产生标准的建…